《定时器学习》
目的:参加电赛,学习记录,创作者的视角来学习。
使用芯片:LP-MSPM0G3507
例程2:timx_timer_mode_periodic_sleep
定时器的基本工作原理:本质上是计数。
有加法计数,减法计数。通过标志上升脉冲或下降脉冲进行计数。
定时器有: TimerG(general通用计时器), TimerA(advance高级计时器), TimerX(通用计时器)
在syscfg工具里对TIMER配置
Name:名称设置:
Quick Profiles:Timer Profiles:系统提供的预设。
若有特殊要求选择custom。
基础设置:Basic Configuration
Clock Configuration配置时钟
Timer Clock Source(计数所用脉冲信号的来源设置)一般都选用BUSCLK.
Timer Clock Divider分频设置
Timer Clock Prescaler进一步分频。
经过以上设置,最终所用来计数的时钟频率。
高级配置:Advanced Configuration(暂时没用到)
…
使能定时器中断配置:Interrupts Configuration
在开发的过程中能够快速配置时钟,编写中断。
#include "ti_msp_dl_config.h"
int main(void)
{
SYSCFG_DL_init();
NVIC_EnableIRQ(TIMER_0_INST_INT_IRQN);//使能定时器中断 NVIC_EnableIRQ不是所学芯片的特殊外设。
DL_SYSCTL_enableSleepOnExit();//退出时启用睡眠模式
DL_TimerG_startCounter(TIMER_0_INST);// DL_TimerG_startCounter启动开始计数
//括号内是启动具体的那一个定时器
while (1) {
__WFI();//实际上是Wait forinterrupt(等待中断)。从run状态进入sleep状态。
}
}
void TIMER_0_INST_IRQHandler(void)//中断服务函数
{
switch (DL_TimerG_getPendingInterrupt(TIMER_0_INST)) {
case DL_TIMER_IIDX_ZERO://定时器
DL_GPIO_togglePins(GPIO_LEDS_PORT,
GPIO_LEDS_USER_LED_1_PIN | GPIO_LEDS_USER_TEST_PIN);//翻转电平
break;
default:
break;
}
}
在所给的例程代码过程中几个注意点:
NVIC_EnableIRQ()使能中断函数
DL_TimerG_startCounter()开始计数。
为达到低功耗目的:使用到语句
DL_SYSCTL_enableSleepOnExit();当中断返回主函数是,cpu 进入sleep状态
退出时启用睡眠。
当 CPU 从处理程序模式移动到线程模式时,在退出时启用睡眠。通过启用,允许中断驱动的应用程序避免返回到空的主应用程序。
在编写中断函数时如果使用到多个中断,遵循以下格式判断运行那一个:
自己写一个1秒翻转的代码
#include "ti_msp_dl_config.h"
int main(void)
{
SYSCFG_DL_init();
NVIC_EnableIRQ(TIMER_0_INST_INT_IRQN);
DL_TimerA_startCounter(TIMER_0_INST);
while (1) {
}
}
void TIMER_0_INST_IRQHandler(void)
{
DL_GPIO_togglePins(GPIO_LED_PORT, GPIO_LED_PIN_LED_PIN );
}