1、相关配置
主控:MSPM0G3507SPTR(48角)
编译器:Keil,版本:5.33
2、Sysconfig配置
下图需要注意④里面分频的设置,关注⑤中我们能设置的定时范围。也就是说,在⑦中,我们定时器的定时范围不能超过⑤所示的时间。
注意:这里的“Timer Mods”一般不选“One-shot Down Counting”。字面意思就是“射击一次”“只触发一次”,也就是说,定时器第一次计时时间到了,只能进一次中断,之后不会再进了。
在“Start Timer”中,②处的勾可以打,也可以不打。
1、倘若打勾:则意味着在定时器初始化完成后,定时器就会计时。可以理解为“单片机自己就开始计时了”。
2、倘若不打勾:定时器永远都不会开启,除非使用DL_TimerA_startCounter()函数进行开启。
3、打勾与不打勾类似于单片机自启动与人为启动(通过代码在某一时刻开启定时器,而不是初始化完成就计时)。
4、这里一般推荐大家打勾,就不用再额外添加代码了(当然看大家自己需求)。
#include "ti_msp_dl_config.h" #include "config.h" /** * @函数介绍: main函数 * @说明: 无 */ int main(void) { SYSCFG_DL_init(); // 芯片资源初始化,由SysConfig配置软件自动生成 NVIC_EnableIRQ(TIMER_1S_INST_INT_IRQN); // 使能中断 DL_TimerA_startCounter(TIMER_1S_INST); // 开始计时 while(1) { } }
接下来选择“触发事件”和定时器。触发事件这里我没有过多的研究,就默认选择“Zero event”了,大家感兴趣可以去摸索摸索。
至此,Sysconfig的配置就完成啦,记得保存!!!(我另外配置了一个1ms的定时器做对比,大家也可以试试)
3、函数设计
中断函数的名字其实在"ti_msp_dl_config.h"中已经给我们取好了,大家可以去.h文件里面翻翻看,都放在一起。
/* Defines for TIMER_1S */
#define TIMER_1S_INST (TIMA1)
#define TIMER_1S_INST_IRQHandler TIMA1_IRQHandler
#define TIMER_1S_INST_INT_IRQN (TIMA1_INT_IRQn)
#define TIMER_1S_INST_LOAD_VALUE (49999U)
/* Defines for TIMER_1MS */
#define TIMER_1MS_INST (TIMA0)
#define TIMER_1MS_INST_IRQHandler TIMA0_IRQHandler
#define TIMER_1MS_INST_INT_IRQN (TIMA0_INT_IRQn)
#define TIMER_1MS_INST_LOAD_VALUE (99U)
这两个就是1s和1ms定时器的中断函数。
void TIMER_1S_INST_IRQHandler(void)
void TIMER_1MS_INST_IRQHandler(void)
在定时器函数中,我们只需要在中断函数中添加我们自己的代码就行了(不要在中断里面加delay等延时哦!已经看到有同学这么做了,会拖慢运行速度的)。
我们在1s的定时器中添加了红灯翻转的函数,也就是说,红灯每1秒翻转一次。
另外我们在1ms的定时器中增加了一个计数用的变量“time_1ms_cnt”。通过代码我们可以发现。每1毫秒会进一次“TIMER_1MS_INST_IRQHandler”,并且“time_1ms_cnt”累加,每累加500次,蓝灯翻转,且“time_1ms_cnt”清零。这样实现的效果就是蓝灯每500毫秒翻转一次。
#include "config.h"
#include "app_tim.h"
uint16_t time_1ms_cnt = 0; // 1ms计数
/**
* @函数介绍: 定时器1S中断
* @输入参数: 无
* @输出参数: 无
* @说明: 每1S进一次中断,请勿在该函数中添加delay等死循环函数
* 无需将该函数放在main函数中
*/
void TIMER_1S_INST_IRQHandler(void)
{
/* 这里可以放置用户的函数 */
LED_RED_TOGGLE; // 红色LED翻转(测试用)
}
/**
* @函数介绍: 定时器1ms中断
* @输入参数: 无
* @输出参数: 无
* @说明: 每1ms进一次中断,请勿在该函数中添加delay等死循环函数
* 无需将该函数放在main函数中
*/
void TIMER_1MS_INST_IRQHandler(void)
{
/* 这里可以放置用户的函数 */
time_1ms_cnt++;
if (time_1ms_cnt == 500) // 每500ms翻转一次
{
time_1ms_cnt = 0;
LED_BLUE_TOGGLE; // 蓝色LED翻转(测试用)
}
}
4、实验效果
MSPG3507之定时器-测试
通过实验我们可以发现,红灯以2秒的频率闪烁(亮一秒,灭一秒),蓝灯以1秒的频率闪烁(亮500毫秒,灭500毫秒)。
5、总结
在定时器中断中,我们一般设计基准时间为1ms或者1s,如果我们想定时5s,则在1s的定时器中计数5次就行了,毫秒也是同理。相关注意事项:
1、分频的设计
2、 “Start Timer”的选择(推荐勾)
3、定时中断别加delay_ms等类似的函数,例如有同学在中断中进行按键判断,为了实现按键消抖,在中断中delay_ms(10)作为延时消抖,这相当于程序在中断函数中多运行了10ms。
4、中断优先级(本文未做介绍,大家要自行研究了)
2024-6-23-23:40,一下午的雨