通过上一篇的操作,我们对GPIO的控制有了初步的了解,并且实现了对所有LED灯光的点亮控制,并通过延时实现了LED的循环点亮,这一次我们将通过定时器通用定时功能实现LED灯光的循环点亮,以此熟悉MSPM0的定时器的配置和控制。
MSPM0L1306一共有四个定时器,这里选用TIMG0作为学习对象,相关通用定时器的操作可以参考MSPM0 SDK中的timx_timer_mode_periodic_standby。
突然间想起来TI是有syscfg配置文件的,咱们使用这个配置文件进行配置并通过例程中的教程进行程序的编写。
针对于CCS配置文件就是每一个工程下面的.syscfg文件可以直接打开,如下图:
打开后选择通用定时器功能:
进行定时器配置:
定时器的时钟配置可以选择相应的时钟源,本次选中的是总线时钟为32M,经过分频系数和预分频,最终为15.63kHz;
然后是定时器重装值与中断的配置,这里直接通过设定定时时间为1000ms,具体参数由系统自动生成,如果定时的时间与时钟冲突还会有提示。
相关初始化的程序已经自动添加了,这就是这种自动配置功能的好处,自动计算以及错误诊断,注意TI的自动配置没有类似CubeMAX那样有个代码生成按钮,配置完相关功能后直接小锤子编译就可以了。
需要我们自己添加一下代码开启定时器和中断:
NVIC_EnableIRQ(TIMER_0_INST_INT_IRQN);
DL_SYSCTL_enableSleepOnExit();
DL_TimerG_startCounter(TIMER_0_INST);
接下来就是中断处理:
void TIMER_0_INST_IRQHandler(void)
{
switch (DL_TimerG_getPendingInterrupt(TIMG0)) {
case DL_TIMER_IIDX_ZERO:
LED.UpFlag = 1;
LED.state++;
break;
default:
break;
}
}
下面就是while中的处理变化:
void LED_Alter(void)
{
// delay_cycles(32000000);
if(LED.UpFlag == 1)
{
LED.state %= 4;
LED1_RESET;
LED2_Green_RESET;
LED2_Red_RESET;
LED2_Blue_RESET;
switch(LED.state)
{
case 0:
LED1_SET;
break;
case 1:
LED2_Green_SET;
break;
case 2:
LED2_Red_SET;
break;
case 3:
LED2_Blue_SET;
break;
default:
break;
}
LED.UpFlag = 0;
}
}
通过以上代码实现了通过定时器定时功能完成LED的循环点亮,其效果与通过延时实现循环点亮基本 一致,不过现在不是阻塞式的方式了。同时也在本章节对TI的syscfg初始化配置有了基础的认识和接触。syscfg初始化配置还是很便捷,它随着工程走,随时随地进行配置需要,这一点很方便。