笔记来源于STM32F103VET6,野火指南者,中文参考手册,HAL库开发手册和b站的野火指南者中级篇视频。观看过好多次高级篇了,但往往理解得不够全面,现记下小笔记,用来回顾。属于个人笔记,不用于商业。
STM32F1系列中,除了互联性的产品,共有8个定时器,分为基本定时器、通用定时器和高级定时器。
基本定时器只能定时,没有外部IO。
通用定时器可以定时,输出比较(如PWM),输入捕获(如脉冲),每个定时器有四个外部IO。
高级定时器可以定时,输出比较(如PWM),输入捕获(如脉冲),三相电机互补输出,每个定时器有八个外部IO。
基本定时器功能框图

定时器时钟TIMxCLK,即内部时钟CK_INT,经APB1预分配器分频提供。根据时钟树,得知如果APB1预分配系数等于1,则频率不变,否则频率系数*2。时钟树的APB1为低速时钟,经AHB2分频所得,即PCLK1=36M。所以定时器时钟TIMxCLK=36M*2=72M。

定时器时钟经过 PSC 预分频器之后,即 CK_CNT,用来驱动计数器计数。 PSC 是一个 16 位的预分频器,可以对定时器时钟 TIMxCLK 进行 1~65536 之间的任何一个数进行分频。具体计算方式为: CK_CNT=TIMxCLK/(PSC+1)。
计数器 CNT 是一个 16 位的计数器,只能往上计数,最大计数值为 65535。
自动重装载寄存器 ARR 是一个 16 位的寄存器,这里面装着计数器能计数的最大数值。当计数达到自动重装载寄存器的时候产生更新事件,并清零从头开始计数。如果使能了中断的话,定时器就产生溢出中断。
如:psc=71,add=999。则计数器在 CK_CNT 的驱动下,计一个数的时间则是 CK_CLK 的倒数,等于:1/72M/72=1us。1000*1us=1ms。

- typedef struct
- {
- uint16_t TIM_Prescaler; //预分配器,0x0000~0xFFFF
-
- uint16_t TIM_CounterMode; //计数模式
-
- uint16_t TIM_Period; //定时周期,0x0000~0xFFFF。
- //实际就是设定自动重载寄存器的值,在事件生成时更新到影子寄存器。可设置范围为 0 至 65535
-
- uint16_t TIM_ClockDivision; //时钟分频
-
- uint8_t TIM_RepetitionCounter; //重复计数器,0x00~0xFF
- } TIM_TimeBaseInitTypeDef;
对于TIM_CounterMode,有。基本定时器只能是向上计数,即 TIMx_CNT 只能从 0 开始递增,并且无需初始化。
- #define TIM_CounterMode_Up ((uint16_t)0x0000) //边沿对齐模式,向上计数
- #define TIM_CounterMode_Down ((uint16_t)0x0010) //边沿对齐模式,向下计数
-
- #define TIM_CounterMode_CenterAligned1 ((uint16_t)0x0020) //中央对齐模式1,计数器交替向上向下计数。
- //产生下溢中断,配置为输出的通道(TIMx_CCMRx寄存器中CCxS=00)的输出比较中断标志位,只在计数器向下计数时被设置。
-
- #define TIM_CounterMode_CenterAligned2 ((uint16_t)0x0040) //中央对齐模式2,计数器交替向上向下计数。
- //产生上溢中断,配置为输出的通道(TIMx_CCMRx寄存器中CCxS=00)的输出比较中断标志位,只在计数器向上计数时被设置。
-
- #define TIM_CounterMode_CenterAligned3 ((uint16_t)0x0060) //中央对齐模式3,计数器交替向上向下计数。
- //产生下溢和上溢中断,配置为输出的通道(TIMx_CCMRx寄存器中CCxS=00)的输出比较中断标志位,在计数器向上和向下计数时均被设置。
对于TIM_ClockDivision,有。设置定时器时钟 CK_INT 频率与数字滤波器采样时钟频率分频比,基本定时器没有此功能,不用设置。
- #define TIM_CKD_DIV1 ((uint16_t)0x0000)
- #define TIM_CKD_DIV2 ((uint16_t)0x0100)
- #define TIM_CKD_DIV4 ((uint16_t)0x0200)
对于TIM_RepetitionCounter。属于高级控制寄存器专用寄存器位,利用它可以非常容易控制输出 PWM 的个数。这里不用设置。
重复计数器的值。 每当RCR下计数为0时,就会产生一个更新事件,并从RCR值(N)重新开始计数。 这意味着在PWM模式下(N+1)对应于:
-边缘对齐模式下的PWM周期数 。
-中心对齐模式下的半PWM周期数 。