写在前面——
本文将介绍嵌入式竞赛实训平台(CT117E-M4)开发板上定时器中断的使用。
目录
一、硬件平台
嵌入式竞赛实训平台(CT117E-M4)是北京国信长天科技有限公司设计、生产的一款“蓝桥杯全国软件与信息技术专业人才大赛–嵌入式设计与开发科目”专用竞赛平台,平台以STM32G431RBT6为主控芯片,预留扩展板接口,可为用户提供丰富的实验场景。
CT117E-M4产片图片
二、软件平台
KEIL5,STM32CubeMX
三、STM32G4系列定时器简介
从数据手册当中我们可以找到,STM32G431x6/x8/xB设备包括两个高级电机控制定时器、最多六个通用定时器、两个基本定时器、一个低功耗定时器、两个看门狗定时器和一个SysTick定时器。下表比较了高级电机控制、通用和基本定时器的功能。
表格中所含的信息大致为:
1.高级电机控制定时器(TIM1、TIM8)
先进的电机控制定时器可以看作是8个通道上的四相PWM多路复用。它们具有可编程插入死区时间的互补PWM输出。它们也可以被视为完整的通用计时器。 4个独立通道可用于:
- 输入捕获
- 输出比较
- PWM生成(边缘或中心对齐模式),具有全调制能力(0-100%)
- 单脉冲模式输出
2.通用定时器(TIM2、TIM3、TIM4、TIM15、TIM16、TIM17)
STM32G431x6/x8/xB设备中最多嵌入六个可同步的通用定时器(差异见上图)。每个通用定时器可用于产生PWM输出,或作为一个简单的时基。
- TIM2、TIM3和TIM4它们是功能齐全的通用定时器:
–TIM2有一个32位自动加载上/下计数器和32位预分频器
–TIM3和TIM4有16位自动加载上/下计数器和16位预分频器。
这些定时器具有4个独立通道,用于输入捕获/输出比较、PWM或单脉冲模式输出。它们可以 一起工作,也可以通过计时器链接功能与其他通用计时器一起工作,以实现同步或事件链接。计数器可以在调试模式下冻结。它们都有独立的DMA请求生成,并支持正交编码器。
- TIM15、16和17它们是具有中频功能的通用定时器:
它们有16位自动重新加载计数器和16位预分频器
–TIM15有2个通道和1个互补通道
–TIM16和TIM17有1个通道和1个互补通道
所有通道可用于输入捕获/输出比较、PWM或单脉冲模式输出。定时器可以通过定时器链接功能进行同步或事件链接。定时器具有独立的DMA请求生成功能。计数器可以在调试模式下冻结。
3.基本计时器(TIM6和TIM7)
基本定时器主要用于DAC触发器的生成。它们也可以用作通用的16位时基。
NOTE:需要注意非常重要的一点就是TIM2、TIM3、TIM4、TIM6、TIM7与APB1总线相连,TIM1、TIM8、TIM15、TIM16、TIM17与APB2总线相连,在下面的配置过程中会介绍到。
四、配置过程
(一)时钟配置
通过官方给的例程我们一般将时钟配置为80MHz,这样APB1总线与APB2总线的时钟都是80MHz了,在使用时就很方便了 ,下面的定时器配置就要以80MHz为基础。
(二)定时器配置
基本配置步骤:
1.选择TIM2
2.定时器时钟选择内部时钟
Clock Source(时钟来源)
- 选项1 :Internal Clock 内部时钟
- 选项2 : ETR2 外部触发输入(ETR)(仅适用TIM2,3,4)
3.配置参数
- Prtscaler (定时器分频系数):7999
- Counter Mode(计数模式):Up(向上计数模式)
- Counter Period(自动重装载值):999
- CKD(时钟分频因子):No Division 不分频 ,选项: 可以选择二分频和四分频
- auto-reload-preload(自动重装载): Enable 使能
- TRGO Parameters:触发输出 (TRGO),不使能,与本节无关
TRGO:定时器的触发信号输出 在定时器的定时时间到达的时候输出一个信号(如:定时器更新产生TRGO信号来触发ADC的同步转换)
4.使能定时器中断
NOTE: 定时器溢出时间是这样计算的
这里我们 arr=999,psc=7999,Tclk=80MHz Tout = (1000*8000)/80us = 100ms
五、编写函数
首先在主函数初始化区域调用:
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start_IT(&htim2); //使能定时器中断
/* USER CODE END 2 */
在中断回调函数中可以这样写:
/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
i++;
if(i==10)
{
i=0;
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, 0);
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, 0);
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, 1);
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, 1);
}
}
/* USER CODE END 4 */
如果出现程序在延时函数中死循环不出来,可以看看https://blog.csdn.net/m0_57147943/article/details/123518122?spm=1001.2014.3001.5501能不能帮你解决
常用函数:
HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim); //使能定时器
HAL_StatusTypeDef HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim); //停止定时器
/* Non-Blocking mode: Interrupt */
HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim); //使能定时器中断,同时使能定时器
HAL_StatusTypeDef HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim); //停止使能定时器中断,同时停止定时器
六、总结
定时器中断就到这里了,如果此文章对你有帮助,欢迎点赞
关注
收藏
转发