1、定时器的基本原理
1.1、函数使用方法:
/*在没函数中重写回调函数*/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) //重写回调函数
{
if (htim->Instance==TIM2) //判断定时器是否为TIM2
{
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_11); //反转函数,反转PA11端口电平
}
if (htim->Instance==TIM3) //判断定时器是否为TIM2
{
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_12); //反转函数,反转PA12端口电平
}
/*启动定时器函数*/
HAL_TIM_Base_Start_IT(&htim2); //此函数用于启动定时器TIM2
1.2、常见的定时器资源
-
系统滴答定时器 Sys Tick
这是一个集成在Cortex M3内核当中的定时器,它并不属于芯片厂商的外设,也就是说使用ARM内核的不同厂商,都拥有基本结构相同的系统定时器。主要目的是给RTOS提供时钟节拍做时间基准。
-
看门狗定时器 Watch Dog
-
实时时钟寄存器 RTC
-
基本定时器: TIM6、TIM7
-
通用定时器: TIM2、TIM3、TIM4、TIM5
在基本定时器的基础上,实现输出比较、输入捕获、PWM生成、单脉冲模式输出等功能。这类定时器最具代表性,使用也最广泛。
-
高级定时器: TIM1、TIM8
2、STM32通用定时器的重要知识点
2.1、通用定时器的基本结构组成:
STM32的通用定时器,是一个通过可编程预分频器(Prescaler)驱动的16位自动重装主计数器(Counter Period)构成。可以对内部时钟或触发源以及外部时钟或触发源进行计数。
2.2、通用定时器的基本工作原理:
首先,定时器时钟信号送入16位可编程预分配器(Prescaler),该预分配器系数为0~65535之间的任意数值。预分配器溢出后,会向16位的主计数器(Counter Period)发出一个脉冲信号。 预分频器,本质上是一个加法计数器,预分频系数实际上就是加计数的溢出值。
2.3、定时器发生中断时间的计算方法:
定时时间 = (Prescaler+1 ) X (Counter Period+1) X 1/ 定时器时钟频率 时钟信号1KHz,Prescaler为9,Counter Period为999,定时时间?
3、例子
时钟信号32MHz,每个500ms翻转一次PB9的电平。
配置STM32 CubeMX 中关于TIM的相关配置
-
设置Clock Source 时钟源
-
设置Prescaler 和Counter Period 参数
-
设置NVIC嵌套向量中断控制器
中断服务函数重写
-
定时器溢出回调函数
-
用户重写定时器溢出回调函数,实现具体的中断逻辑处理
-
在main 函数中启动相应定时器
4、实训示例
【1】利用TIM2实现间隔定时,每隔0.2秒将LED1的开关状态翻转。
【2】利用TIM3实现间隔定时,每隔1秒将LED2的开关状态翻转。
/*回调函数重写*/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) //重写回调函数
{
if (htim->Instance==TIM2)
{
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_11);
}
if (htim->Instance==TIM3)
{
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_12);
}
/*主函数*/
int main(void)
{
HAL_Init();
SystemClock_Config(); //初始化系统时钟
MX_GPIO_Init(); //初始化GPIO
MX_TIM2_Init(); //时钟2初始化
MX_TIM3_Init(); //时钟3初始化
HAL_TIM_Base_Start_IT(&htim2); //启动定时器2函数
HAL_TIM_Base_Start_IT(&htim3); //启动定时器3函数
while (1)
{
}
}