前言:
通过基本定时器TIM6,让三个LED灯每间隔1s闪烁一次。
目录
1.基本定时器参数配置
1.1框图分析
1.2参数配置
2.软件程序
2.1整体框架
2.2定时器结构体
2.3定时器回调函数
1.基本定时器参数配置
1.1框图分析
TIM6作为基本定时器 它是挂载在APB1总线上的,框图如下所示:
时钟树的框图如下
1.2参数配置
功能介绍:
我们如果想要配置 5ms的进入中断处理一次的话,如果我们不进行分频,对于72M的时钟频率大概是0.00几微妙就要检查一次,而且频率太高,所以我们要进行分频 分频后得到 CK-CNT如果我们预期想要得到1M的话,那就是 其中x作为16位的时钟系数那他取值范围就是 1~65536之间的数值,我们想要得到 1ms 也就是 可以推出X为71 那x + 1 就是72也就是72M分频 。
对于CNT计数器,我们想要得到5ms的时钟 即 * CNT = 5ms = 秒 可以推出 CNT 为50000。至此TIM时钟方面的配置算是完成了。框图如下:
总结:快速计算公式
说明:初始化基本定时器6,自动重载,5ms中断一次。
计算如下:
1、定时器时钟 = 72MHz
2、计算时钟 = 72MHz/(71+1) = 1MHz
3、定时周期 = ((1/1000000Hz)*5000)s = (5/1000)s = 5ms
cubemax参数配置
中断优先级介绍:
首先配置TIM6的优先级,此次实验只有一个时钟中断,所以我们将其抢占优先级设置成2就行,响应随便。如下图所示:
中断时间数配置:
,启动使能NVIC之后,完全按照我们计算好的参数去设置,分频系数。计数器 就能达到我们想要的5ms。
2.软件程序
2.1整体框架
2.2定时器结构体
typedef enum
{
TIMER0_10mS = (uint16_t)2,
TIMER0_50mS = (uint16_t)10,
TIMER0_100mS = (uint16_t)20,
TIMER0_200mS = (uint16_t)40,
TIMER0_500mS = (uint16_t)100,
TIMER0_1S = (uint16_t)200,
TIMER0_2S = (uint16_t)400,
TIMER0_3S = (uint16_t)600,
TIMER0_5S = (uint16_t)1000,
TIMER0_10S = (uint16_t)2000,
TIMER0_3min = (uint16_t)36000,
}TIMER0_Value_t;
//定义结构体类型
typedef struct
{
uint16_t volatile usMCU_Run_Timer; //系统运行定时器
void (*Timer6_Start_IT)(void); //定时器6以中断模式启动
} Timer6_t;
/* extern variables-----------------------------------------------------------*/
extern Timer6_t Timer6;
2.3定时器回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == htim6.Instance)
{
//程序支持运行,led间隔1s闪烁
if(++Timer6.usMCU_Run_Timer >= TIMER0_1S)
{
Timer6.usMCU_Run_Timer = 0;
LED.LED_Flip(LED1);
LED.LED_Flip(LED2);
LED.LED_Flip(LED3);
}
}
}