http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3762261&bbs_page_no=1&bbs_id=3020

下面把问题具体化:

1。利用微控制器来产生1M、1K、1Hz的3个方波 
    2。3个方波都必须非常精准(假定系统使用的晶体是非常准确的) 
    3。效率要高,包括代码短,占用CPU的时间少,因为STM32不能产生了3个方波后,其他的事情就做不了。 
    4。最后考虑如何实现3个方波的同步问题

二、问题的讨论与分析 
     
    产生方波,当然是使用T/C了。那么为什么说“T/C溢出中断+中断服务,在中断服务中将某个I/O输出取反......”是“愚蠢的”?大多数的书上不都是这样介绍和举例的吗(尤其是那些只会51的朋友,可能也就认为这是唯一的方法了)。

先说说“枪毙”上面方法的原因。如果是产生1K的方波,或许还能马马乎乎说的过去。可是1M的方波就有问题了。要产生频率为1M的方 波,那么周期是1us,T/C的定时中断间隔为0.5us(取反输出,2次为一个方波周期)。在看STM32的系统时钟,最高为72M。那么在0.5us 内,STM32能执行几条指令?大约36条(按1MPS/1M算)指令执行的时间。如果考虑中断的响应需要的时间,中断现场保护和中断现场恢复,中断退出 的时间,在中断服务中你能做多少事情?

就算你水平高,使用汇编,在中断中能完成1M方波的以及另外2个方波的产生,你的STM32还能做什么事情?已经被这3个方波吊死了! 
  
      因此,正确的方法,应该采用定时器配备的比较匹配输出功能,或PWM波的产生功能(50%的PWM)。由于这2个定时器的增强功能在 51中是没有的,所以很多人不会想到这点。但是新的微控制器中配备定时器都具备这样的功能,10几年前推出的AVR就已经有了,何况是STM32?

当然用STM32,就要认真学习STM32的手册(至少看2份:STM32 103器件手册和硬件参考声明书)。我是要用STM32通用的几个T/C来做这件事,所以重点看TIMx的部分。 
      
     天呀,STM32的通用T/C功能如此的强大和复杂,不得不仔细学习。

经过分析和研究,决定采用TIM2产生1M方波,采用TIM3产生1K方波,具体的思路、方法和具体计算与主要的配置如下:

1。系统采用8M外部晶体产生的时钟,(不使用PLL) 
     2。AHB和APB1的分频系数都是1,时钟为8M。APB1可以提供TIM2、TIM3、TIM4作为计数时钟,本例中只将APB1作为TIM2的计数时钟:8M 
     3。TIM2使用8M的APB1作为计数时钟,TIM2的预分频器为1分频,采用通道4比较匹配,触发取反输出TIM2_OC4(在PA3脚)。 
     4。TIM2的重载寄存器为3(4分频),C4通道比较寄存器为3 
     5。TIM2设置为主定时器,比较相等事件产生触发时钟(2M),作为TIM3的计数时钟 
  
     6。TIM3使用TIM2比较相等事件产生的触发时钟2M作为计数时钟,TIM3的预分频器为1分频,采用通道1比较匹配,PWM方式1工作,输出TIM3_OC1(在PA6脚)。 
     7。TIM3的重载寄存器为1999(2000分频),C1通道比较寄存器为1000 
     8。TIM3设置为副定时器,采用TIM2比较相等事件产生触发时钟(2M)作为计数时钟(由于TIM2、TIM3都是硬件计数,保证TIM2的产生1M方波和的TIM3产生的1K方波完全同步)

简单说明一下: 
      
     TIM2采用比较匹配后自动触发取反输出的工作方式,TIM2从0计数到3后与比较寄存器的值相等了,当第4个计数脉冲到后,自动将 PA3的引脚电平取反,同时由于TIM2的重载值也为3,因此第4个计数脉冲到后TIM2返回0开始计数,所以8个计数脉冲,PA3输出一个方波,相当与 8M/8,产生1M方波。 
      
     TIM2同时为主定时器,产生1M方波,就有2M的比较相等事件发生,该2M事件作为TIM3的计数时钟,由TIM3分频后产生1K方波(参考:STM32F10xxx硬件参考手册的使用一个定时器作为另一个的预分频器部分)。

TIM3采用PWM工作方式产生1K的方波。计数值到1000,与比较寄存器的值相等,会自动把PA6取反,当计数值到达1999后, 与重载寄存器相同,第2000个计数脉冲到达,TIM3自动回0,并再次把PA6取反。这样在PA6脚上产生与PA3上1M方波同步的1K方波。

以上产生1M和1K的方波方法,只要做完TIM的初始化后,在PA3和PA6上自动产生了,不需要使用任何中断,以后程序也不需要做任何的控制和管理(相当硬件产生的方波),CPU可以完全让出做其他的事情。效率极高!

下面是具体工程代码,更具体的配置请参考代码配置和器件手册学习体会吧。我还是使用STM32_Init.c进行初始化配置的,比使用库简单方便,而且易懂。点击此处下载  ourdev_513426.rar(文件大小:303K)   (原文件名:stm32_demo_4.rar)

例程中只是产生1M、1K方波。利用TIM4,采用相同的方法,再产生1个1Hz的方波应该是没有问题的。赶兴趣的自己试试吧。

三、注意点: 
    1。如果TIMx采用内部系统时钟作为计数时钟的话,还需要经过几关:系统时钟----》AHB时钟(带分频器)----》APB1(带分频器)。APB1的最高频率为36M。 
    2。TIMx本身的分频器,0为1分频,1为2分频,2为3分频...... 
    3。TIMx的重载寄存器中的值,就是计数器的上限值,当计数器工作在单程UP方式时,到达重载寄存器中的值,再下一个脉冲就是溢出, 
    4。自动比较匹配输出或PWM的输出引脚通常为2个,可以通过软件配置选择其中的一个。本例中采用确省的输出脚,没有重新配置。

STM32的TIMx功能非常强大,能提供了多种不同的方式来实现本题3个方波的产生。当然,功能越强,使用也越复杂。希望本应用笔记能起到抛砖引玉的作用。

利用stm32来产生1M,1K,1Hz的3个方波(转)相关推荐

  1. 利用STM32制作红外测温仪之硬件设计

    最近受疫情的影响详细大家都在家里没事干,这里利用stm32最小系统做一个红外测温仪 这篇教程里我们来制作红外测温仪需要用到的硬件,关于PCB的工程文件,后文会给出. (一)系统分析 由于我们的功能比较 ...

  2. 利用stm32+app inventor与esp8266通信

    利用stm32+app inventor与esp8266通信 stm32与esp8266通信 移动端app制作.生成.控制 本章实验的目的是将手机连接上ESP8266提供的WIFI网络,打开自定义的a ...

  3. 利用stm32控制步进电机 速度加速度控制

    因为想申请 CSDN 博客认证需要一定的粉丝量,而我写了五年博客才 700 多粉丝,本文开启关注才可阅读全文,很抱歉影响您的阅读体验 利用stm32控制步进电机 尝试用42系步进电机做倒立摆,总结步进 ...

  4. 利用STM32的定时器中断功能编写线阵CCD(ILX554B)的驱动时序

    利用STM32的定时器中断功能编写线阵CCD(ILX554B)的驱动时序 1.利用定时器完成线阵CCDILX554B的驱动时序,采用两个管脚1个用于产生ROG信号,一个用于产生CLK信号 2.使用一个 ...

  5. 基于I2C协议利用STM32进行温湿度传感器的数据采集

    目录 一.I2C总线通信协议的介绍 1.I2C简介 2.I2C总线时序图 3.五种速率 4.四种信号 5.I2C的优缺点 6.软件IIC和硬件IIC 二.创建工程 1.实验目的 2.工具的选择 3.相 ...

  6. 利用STM32 的串口来发送和接收数据实验

    0目标 1 STM32 串口简介 2 硬件设计 3 软件设计 4 下载验证 0.目标 利用串口  1.STM32 串口简介 串口设置的一般步骤可以总结为如下几个步骤: 1) 串口时钟使能, GPIO  ...

  7. stm32 网络 服务器通信协议,利用stm32的lwip TCP/IP协议栈的通信的思路

    利用stm32f103vet6作为平台,enc28j60网卡,lwip tcp/ip作为协议栈进行相应的程序编写. Stm32作为服务器与stm32作为客户端程序编写的基本步骤,思路清理: 1.stm ...

  8. 利用stm32做一个升级版的电子多功能密码锁

    `自己利用空闲时间制作的电子密码锁,有PCB.原理图,PCB印制电路板.此设计用外部存储器,支持修改密码,本来想添加指纹识别模块,但是12864的数据口被使用了,gpio口不够用.在实际中我发现128 ...

  9. 利用STM32制作红外测温仪之软件设计(MLX90614)

    目录 (一)工程目录如图: (二)main函数实现: (三)MLX90614测温代码实现 前面介绍了使用 STM32制作红外测温仪硬件设计,今天来说一下软件的实现,具体的程序,完整的keil代码我已经 ...

最新文章

  1. Android开源控件ViewPager Indicator的使用方法
  2. Java之JVM的内存分配策略
  3. JS 截取字符串及字符与数字转换
  4. Spring Boot集成Elastic Search
  5. Visual Studio调试之断点技巧篇
  6. java dh算法_https密钥交换DH算法
  7. SAP 电商云 Spartacus UI 的 checkout 场景中的串行请求设计分析
  8. NILMTK——经典数据集REDD介绍和使用
  9. 关于git stash的应用总结
  10. BZOJ:1001狼抓兔子
  11. javascript中的对象之间继承关系
  12. NYOJ 85:有趣的数(打表,规律)
  13. php错误日志和php-frm错误日志,错误amp;日志
  14. HashPasswordForStoringInConfigFile 已过时
  15. linux7设置上下文权限,【CONTEXT】自定义CONTEXT(上下文)
  16. SVG 绘制可交互的中国地图
  17. 黑色家具家居茶几沙发网站源码 织梦dedecms模板 [带手机版数据同步]
  18. javabean+servlet+jsp返利网
  19. 盘点 | AAAI2020中的四篇推荐系统好文
  20. 小曹谈技术之中文拼音输入法

热门文章

  1. 如何在word中制作流程图_如何在Word中创建流程图
  2. bump version
  3. 100个变态的软件测试面试题及答案!——看完变态面试官对你竖起大拇指!
  4. 修改注册表解决Win10 SSD卡顿
  5. 重启php软重启_重启PHP命令
  6. [原创][PowerShell教程][06]PowerShell中格式化命令和输出命令
  7. 北邮计算机类本科人数,北邮!2021全国招收本科生3600多人,北京占10%左右,你怎么看?...
  8. 百度无人驾驶核心技术分享
  9. Linux | Ubuntu 使用 fdisk 无损分区拓容的方法
  10. 婚外情中的背叛和报复