[其他ST产品] STM32:定时器中断与优先级

[复制链接]
999|17
 楼主| xiyaoko2365 发表于 2024-1-29 19:42 | 显示全部楼层 |阅读模式
前言
利用HAL库开发实现功能:使用TIM2实现定时,每隔1秒实现双闪功能

一、基础知识
1、常见的定时器资源
1.系统滴答定时器 SysTick
集成在Cortex M3内核的定时器,主要目的是给RTOS提供时钟节拍做时间基准。比如HAL库函数中的HAL_Delay()就是基于这个定时器开发的。如果要做嵌入式Linux的相关项目,要和上位机进行通讯的话,这个函数就不能用了。

2.看门狗定时器 WatchDog

3.实时时钟 RTC

4.基本定时器 TIM6、TIM7

5.通用定时器 TIM2、TIM3、TIM4、TIM5
在基本定时器的基础上,实现输出比较、输入捕获、PWM生成、单脉冲模式输出等功能。这类定时器最具代表性,使用也最为广泛
6.高级定时器 TIM1、TIM8
8167665b78f3002fc7.png

 楼主| xiyaoko2365 发表于 2024-1-29 19:59 | 显示全部楼层
2、定时器中断频率计算
首先,定时器中断频率的设置只需要关注:1)定时器输入时钟的频率;2)预分频值*(Prescaler);3)自动重装值(Counter Period)*
公式: 4087665b79324d0321.png
提示:1M=10的6次方 即:1M=1000000

例:
 楼主| xiyaoko2365 发表于 2024-1-29 19:59 | 显示全部楼层
 楼主| xiyaoko2365 发表于 2024-1-29 20:00 | 显示全部楼层
二、CubeMx硬件配置
1、硬件配置步骤:
1.设置Clock Source时钟源
2.根据需求设置参数Prescaler和Counter Period
3.配置NVIC嵌套向量中断控制器
4.用户重写定时器溢出回调函数,实现具体的中断逻辑
 楼主| xiyaoko2365 发表于 2024-1-29 20:00 | 显示全部楼层
二、CubeMx硬件配置
1、硬件配置步骤:
1.设置Clock Source时钟源
2.根据需求设置参数Prescaler和Counter Period
3.配置NVIC嵌套向量中断控制器
4.用户重写定时器溢出回调函数,实现具体的中断逻辑
 楼主| xiyaoko2365 发表于 2024-1-29 20:01 | 显示全部楼层
2、CubeMx硬件配置 9078365b793812d07e.png 3604465b7938595be7.png
 楼主| xiyaoko2365 发表于 2024-1-29 20:01 | 显示全部楼层
3、定时器配置
由于我们需要使用TIM2定时,所以我们在Timers模块下找到TIM2
【第一步】
设置Clock Source时钟源为Internal Clock(内部时钟),如上图所示
我们的需求定时器频率为32MHz,间隔1秒(1000ms)翻转电平
所以根据定时器发生中断时间计算方法
【第二步】
计算方法看上文
设置参数Prescaler为芯片时钟评率减1(从0开始)
设置参数Counter Period为999,如上图所示(从0开始)
【第三步】
配置NVIC嵌套向量中断控制器,勾选使能TIM2中断
9991765b7939bd0f8d.png
 楼主| xiyaoko2365 发表于 2024-1-29 20:03 | 显示全部楼层
三、proteus仿真电路搭建 1973165b793f8d047f.png
 楼主| xiyaoko2365 发表于 2024-1-29 20:04 | 显示全部楼层
四、代码编写
1、定时器时间间隔参数 6869765b7945134bc3.png
 楼主| xiyaoko2365 发表于 2024-1-29 20:04 | 显示全部楼层
2、虚函数寻找及函数重写
stm32f1xx.it.c文件中找我们的定时器TIM2回调函数然后右键Go To Definition Of 9214765b7945be7094.png
 楼主| xiyaoko2365 发表于 2024-1-29 20:04 | 显示全部楼层
找到时间定时函数HAL_TIM_PeriodElapsedCallback(htim) 5398565b794680c65f.png
 楼主| xiyaoko2365 发表于 2024-1-29 20:05 | 显示全部楼层
然后再次右键Go To Definition Of,找到我们要的虚函数 3710765b79475be2f5.png
 楼主| xiyaoko2365 发表于 2024-1-29 20:05 | 显示全部楼层
将函数复制到main.c文件中,在Private User Code区域重写代码/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if(htim->Instance == TIM2)
        {
                HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_7|GPIO_PIN_8);
        }
}

 楼主| xiyaoko2365 发表于 2024-1-29 20:05 | 显示全部楼层
3、开启定时器
打开stm32f1xx_hal_tim.c文件,找到函数HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim) 3902065b7948dc712e.png
 楼主| xiyaoko2365 发表于 2024-1-29 20:05 | 显示全部楼层
复制,调用,参数设置为&htim2即可

  /* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start_IT(&htim2);
  /* USER CODE END 2 */
 楼主| xiyaoko2365 发表于 2024-1-29 20:05 | 显示全部楼层
五、仿真测试
1、配置芯片晶振频率与CubeMx一致 8145665b794a000835.png
 楼主| xiyaoko2365 发表于 2024-1-29 20:06 | 显示全部楼层
LED不停的闪烁 8623765b794aa0bd86.png
 楼主| xiyaoko2365 发表于 2024-1-29 20:06 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

36

主题

511

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部