Part Number:MSPM0L1306
关于定时器我想使用DL_Timer_setCaptureCompareValue(TIMER_0_INST,400,DL_TIMER_CC_0_INDEX);来设置一个比较值。
然后后用DL_Timer_getRawInterruptStatus(TIMER_0_INST, DL_TIMERG_INTERRUPT_CC0_DN_EVENT)&DL_TIMERG_INTERRUPT_CC0_DN_EVENT来判断该中断是否生效。
现在的问题是DL_Timer_setCaptureCompareValue(TIMER_0_INST,400,DL_TIMER_CC_0_INDEX);
DL_TimerG_enableInterrupt(TIMER_0_INST , DL_TIMER_CC_0_INDEX);设置的中断未触发。
且DL_Timer_getRawInterruptStatus(TIMER_0_INST, DL_TIMERG_INTERRUPT_CC0_DN_EVENT)&DL_TIMERG_INTERRUPT_CC0_DN_EVENT一直为true
我使用的是timx_timer_mode_periodic_sleep_LP_MSPM0L1306_nortos_ticlang sdk项目进行测试,下面是我代码
#include "ti_msp_dl_config.h"
#include "uart.h"
int main(void)
{
SYSCFG_DL_init();
NVIC_EnableIRQ(TIMER_0_INST_INT_IRQN);
DL_SYSCTL_enableSleepOnExit();
DL_Timer_setCaptureCompareValue(TIMER_0_INST,400,DL_TIMER_CC_0_INDEX);
DL_TimerG_enableInterrupt(TIMER_0_INST , DL_TIMER_CC_0_INDEX);
DL_TimerG_startCounter(TIMER_0_INST);
while (1) {
__WFI();
}
}
void TIMER_0_INST_IRQHandler(void)
{
switch (DL_TimerG_getPendingInterrupt(TIMER_0_INST)) {
case DL_TIMER_IIDX_CC0_DN:
printk("cc0_dn\n");
break;
case DL_TIMER_IIDX_CC0_DN:
printk("cc0_up\n");
break;
case DL_TIMER_IIDX_LOAD:
if(DL_Timer_getRawInterruptStatus(TIMER_0_INST, DL_TIMERG_INTERRUPT_CC0_DN_EVENT)&DL_TIMERG_INTERRUPT_CC0_DN_EVENT)
{
printk("cc_trigger\n");
}
DL_GPIO_togglePins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN);
break;
default:
break;
}
}
Yale Li:
使用的是这个例程吗?C:\ti\mspm0_sdk_1_00_01_03\examples\nortos\LP_MSPM0L1306\driverlib\timx_timer_mode_periodic_sleep\ticlang
方便说下在例程的基础上做了哪些改动吗?
,
riven:
首先添加了一个uart串口打印调试信息,Timer Clock Divider 设为Divided by 8,Timer Clock Prescaler设为64 设为然后把timermode改为了Periodic Up Counting,并将周期设置为1s.开启DL_TIMER_IIDX_LOAD中断
然后在启动定时器前设置比较值和比较通道,然后开启事件中断DL_Timer_setCaptureCompareValue(TIMER_0_INST,400,DL_TIMER_CC_0_INDEX);
DL_TimerG_enableInterrupt(TIMER_0_INST , DL_TIMERG_INTERRUPT_CC0_DN_EVENT);
然后使用
while(DL_Timer_getRawInterruptStatus(TIMER_0_INST, DL_TIMERG_INTERRUPT_CC0_DN_EVENT));
来使未触发中断时进入死循环。结果就是不管是否设置中断,while(DL_Timer_getRawInterruptStatus(TIMER_0_INST, DL_TIMERG_INTERRUPT_CC0_DN_EVENT));都会直接跳出。
下面是我修改后的代码
#include "ti_msp_dl_config.h"
#include "uart.h"
int main(void)
{
SYSCFG_DL_init();
NVIC_EnableIRQ(TIMER_0_INST_INT_IRQN);
DL_SYSCTL_enableSleepOnExit();
// DL_Timer_setCaptureCompareValue(TIMER_0_INST,400,DL_TIMER_CC_0_INDEX);
// DL_TimerG_enableInterrupt(TIMER_0_INST , DL_TIMERG_INTERRUPT_CC0_DN_EVENT);
DL_TimerG_startCounter(TIMER_0_INST);
while(DL_Timer_getRawInterruptStatus(TIMER_0_INST, DL_TIMERG_INTERRUPT_CC0_DN_EVENT));
printk("out\n");
while (1) {
__WFI();
}
}
void TIMER_0_INST_IRQHandler(void)
{
switch (DL_TimerG_getPendingInterrupt(TIMER_0_INST)) {
case DL_TIMER_IIDX_CC0_DN:
printk("cc_time:%d\n",DL_Timer_getTimerCount(TIMER_0_INST));
break;
case DL_TIMER_IIDX_LOAD:
printk("load_time:%d\n",DL_Timer_getTimerCount(TIMER_0_INST));
break;
default:
break;
}
}
,
Yale Li:
riven said:结果就是不管是否设置中断,while(DL_Timer_getRawInterruptStatus(TIMER_0_INST, DL_TIMERG_INTERRUPT_CC0_DN_EVENT));都会直接跳出。
直接跳出具体是什么现象?
,
riven:
就是用DL_Timer_getRawInterruptStatus(TIMER_0_INST, DL_TIMERG_INTERRUPT_CC0_DN_EVENT来判断中断是否触发,当未触发时条件为false,循环就会进入死循环,而不会进入下面的输出语句。现在是不管我是否设置这个中断,while语句都没有起到效果
,
Yale Li:
1. 首先观察一下TIMER是处在 向上计数模式 还是 向下计数模式。如果是 向上计数模式,试一下把
DL_TIMERG_INTERRUPT_CC0_DN_EVENT换成
DL_TIMERG_INTERRUPT_CC0_UP_EVENT2. 检查一下CC0是否大于周期值;
3. 也可以通过
DL_Timer_getRawInterruptStatus这个函数,来检查一下TIMERG所有的中断。
这个函数是get raw interrupt status,无论是否使能中断,只要相应中断产生,都可以被检测到。也就是说该函数检查的是标志位,与使能位无关。
另外上传代码请通过 插入–>代码–>C