文章目录
基于STM32CubMX和HAL库的外设开发
第八讲 定时器
8.1 定时器原理
- 在stm32的内部计数寄存器中,有一个寄存器初值,随着时钟每增加一个脉冲,相应的寄存器初值就会减少1
- 当计数到0时,再来一个脉冲就会产生中断,(假设此时过了N个时间脉冲)用户计数器就会加1。因此,用户计数器每加1,就相当于过了N个时间脉冲
- 由此看来,我们可以通过改变寄存器初值来改变用户计数的快慢(即脉冲个数的多少)
8.2基本定时器的单脉冲触发
示例一:用TIME4产生1s定时,1s定时到达时,GPIO-PB5接的LED3反转
8.2.1定时器配置
打开定时器中的单脉冲模式
8.2.2代码实现
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5);
}
HAL_TIM_Base_Start_IT(&htim4);
8.3时基单元
时基单元包括:
● 计数器寄存器 (TIMx_CNT) Counter
● 预分频器寄存器 (TIMx_PSC) Prescaler
● 自动重载寄存器 (TIMx_ARR) Auto-Reload Register
- 预分频器的工作就是对其输入时钟CK_PSC进行分频,产生CK_CNT时钟用于驱动计时器计数。
- 计数器在CK_CNT的驱动下向上或者向下计数, 具体由控制寄存器CR1的DIR位决定。
- 自动重载寄存器定义了计数器只能在0与该寄存器的值ARR之间计数。 每当计数器向上计数到达ARR(或者向下计数到达0时)就会产生一次UEV更新事件,如果开启了中断,将相应的产生中断信号。
8.4通用定时器的基本定时
示例二:用TIME4产生1s定时,LED4以1s频率闪烁
基本定时的配置方法
在时钟中配置输入时钟CK_PSC
配置psc和arr
计算公式:实际频率=总线时钟/(psc+1)/(arr+1)
eg:总线时钟频率为32MHz,预分频系数是3200-1,则CK_CNT频率为10000,因为arr是10000-1,计数10000-1次,所以最后频率为1Hz
使能中断
代码实现
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5);
}
HAL_TIM_Base_Start_IT(&htim4);
8.5通用定时器的外部时钟模式
示例三:用GPIO模式从PE5引脚输出频率为1Hz的脉冲序列信号,用定时器TIME4计算PE5引脚的脉冲数,当脉冲数达到10时,点亮LED3灯
外部时钟模式的配置方法
ETR2从外部引脚获得的脉冲
PE0与PE5相接
代码实现
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5);
}
HAL_TIM_Base_Start_IT(&htim4);
HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_8);
HAL_Delay(500);