MSPM0G3507之定时器TIM

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,一下午的雨

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值