本文讲解的主要是一些概念性的东西,具体内容见下篇博客,如有错误,望不吝指出。
定时器分类
不同芯片定时器个数不同,以STM32F103开发板为例,定时器分类:高级定时器,通用定时器,基本定时器。
定时器种类 | 位数 | 定时器模式 | 产生DMA请求 | 捕获/比较通道 | 互补输出 | 特殊应用场景 |
---|---|---|---|---|---|---|
高级定时器(TIM1、TIM8) | 16 | 向上、向下、向上向下 | 可以 | 4 | 有 | 带死区控制盒紧急刹车,PWM电机控制 |
通用定时器 (TIM2——TIM5) | 16 | 向上、向下、向上向下 | 可以 | 4 | 无 | 通用。定时器计数,PWM输出,输入捕获,输出比较 |
基本定时器(TIM6、TIM7) | 16 | 向上、向下、向上向下 | 可以 | 4 | 无 | 主要应用于驱动DAC |
DMA直接存储器访问,控制主存与I/O设备交换信息,不占用CPU。
PWM脉冲宽度调制,是利用微处理器的数字信号对模拟电路进行控制的一种非常有效的技术。
DAC即数/模转换器的简称,是将数字型号转换为模拟型号的一种装置。
应用:
1.更新:计数器向上溢出/向下溢出,定时器初始化(通过软件或内部/外部触发)
2.触发时间(计数器自动、停止、初始化或者由内部/外部触发计数)
3.输入捕获(测量输入信号的脉冲长度)
4.输出比较(产生输出波形)
5.支持针对定位的增量(正交)编码器和霍尔传感器电路
6.触发输入作为外部时钟或周期的电流管理
ps:使用定时器预分频器和RCC时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒之间调整,且stm32每个通用定时器互相独立,不共享资源。
通用定时器
先看通用定时器的工作原理图,其大概分为四个部分:
时钟
时基单元(自动重装载,更新事件)
输入捕获(通道对应着引脚,捕获电平)
输出比较(pwm输出调整)
比较需要了解的是时钟部分,有关于时钟源的选择:
①内部时钟 //RCC的TIMxCLK(内部时钟信号),一般默认使用
②外部时钟(TIMx_ETR)
③内部触发输入(ITRx)//使用一个定时器作为另一个定时器的预分频器
④ TIMx_CHx(外部通道)
定时器时间计算
时钟频率 = 72MHZ/(时钟预分频+1) = 1/TIM_Period
发生中断时间 = (TIM_Prescaler+1)* (TIM_Period+1)/FLK
时钟频率是指一秒钟会计数多少次,时钟周期是指多少次计数后会中断。比如时钟频率为2000,时钟周期为6000,就是3s中断一次。
这里介绍一下定时器的倍频器,可以从定时器时钟部分原理图看出,定时器的时钟不是直接来自APB1或APB2,而是来自输入为APB1或APB2的一个倍频器:
当APB1的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于APB1的频率
当APB1的预分频系数为其它数值(即预分频系数为2、4、8或16)时,这个倍频器起作用,定时器的时钟频率等于APB1的频率的两倍。
这里我出现的疑惑是为什么不直接让时钟较高频率?原因是除了高速外设外,还有一些低速外设。
更为详细的讲解在这里放一个链接:
STM32通定时器时间设置步骤和计算公式方法寄存器值