发布时间:2022-09-29 11:00
27.1 定时器分类
STM32F1 系列中,除了互联型的产品,共有8 个定时器,分为基本定时器,通用定时器和高级定时器。
基本定时器:TIM6 和TIM7 是一个16 位的只能向上计数的定时器,只能定时,没有外部IO。
通用定时器TIM2/3/4/5 是一个16 位的可以向上/下计数的定时器,可以定时,可以输出比较,可以输入捕捉,每个定时器有四个外部IO。
高级定时器TIM1/8 是一个16位的可以向上/下计数的定时器,可以定时,可以输出比较,可以输入捕捉,还可以有三相电机互补输出信号,每个定时器有8 个外部IO。
27.2 基本定时器功能框图讲解
27.2.1 定时器时钟源
定时器时钟源TIMxCLK(即内部时钟CK_INT),经APB1 预分频器后分频提供,如果APB1 预分频系数等于1,则频率不变,否则频率乘以2,库函数中APB1 预分频的系数是2,即PCLK1=36M,所以定时器时钟TIMxCLK=36*2=72M。
27.2.2 预分频器
定时器时钟经过PSC 预分频器之后,即CK_CNT,用来驱动计数器计数。PSC 是一个16 位的预分频器,可以对定时器时钟TIMxCLK 进行0~65535 之间的任何一个数进行分频。具体计算方式为:CK_CNT=TIMxCLK/(PSC+1)。
27.2.3 计数器
计数器CNT 是一个16 位的计数器,只能往上计数,最大计数值为65535。当计数达到自动重装载寄存器的时候产生更新事件,并清零从头开始计数。
27.2.4 自动重装载寄存器
自动重装载寄存器ARR 是一个16 位的寄存器,这里面装着计数器能计数的最大数值。当计数到这个值的时候,如果使能了中断的话,定时器就产生溢出中断。
27.2.5 定时时间的计算
定时器的定时时间等于计数器的中断周期乘以中断的次数。计数器在CK_CNT 的驱动下,计一个数的时间则是CK_CLK 的倒数,等于:1/(TIMxCLK/(PSC+1)),产生一次中断的时间则等于:1/CK_CLK * (ARR+1)。如果在中断服务程序里面设置一个变量time,用来记录中断的次数,那么就可以计算出我们需要的定时时间等于:1/CK_CLK * (ARR+1)*time。
27.3 定时器初始化结构体详解
在HAL 库函数头文件stm32f1xx_hal_tim.h 中对定时器外设建立了四个初始化结构体,基本定时器只用到其中一个即TIM_TimeBaseInitTypeDef。
基本定时器初始化结构体有5 个成员,只需设置其中两个就可以。
typedef struct {
uint32_t Prescaler; // 预分频器
uint32_t CounterMode; // 计数模式
uint32_t Period; // 定时器周期
uint32_t ClockDivision; // 时钟分频
uint32_t RepetitionCounter; // 重复计算器
} TIM_TimeBaseInitTypeDef;
(1) Prescaler:定时器预分频器设置,时钟源经该预分频器才是定时器时钟,它设定TIMx_PSC寄存器的值。可设置范围为0 至65535,实现1 至65536 分频。
(2) CounterMode:定时器计数方式,可是在为向上计数、向下计数以及三种中心对齐模式。基本定时器只能是向上计数,即TIMx_CNT 只能从0 开始递增,并且无需初始化。
(3) Period:定时器周期,实际就是设定自动重载寄存器的值,可设置范围为0 至65535。
(4) ClockDivision:时钟分频,设置定时器时钟CK_INT 频率与数字滤波器采样时钟频率分频比,基本定时器没有此功能,不用设置。
(5) RepetitionCounter:重复计数器,属于高级控制寄存器专用寄存器位,利用它可以非常容易控制输出PWM 的个数。这里不用设置。
Deep Learning in Natural Language Processing中文连载(二)
Spark Schema、Hive和Python的数据类型关系,以及Pyspark数据类型详解
Python使用traceback.print_exc()输出异常信息
阿里如何实现100%容器化镜像化?八年技术演进之路回顾(转)
一文带你完全了解线性回归模型的梯度下降算法、多项式回归、正则化
NoSQL 数据库redis(二)---Redis 作 mysql 的缓存服务器
【LeetCode每日一题】——83.删除排序链表中的重复元素