TI中文支持网
TI专业的中文技术问题搜集分享网站

MSPM0L1306: 其他微控制器论坛

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_EVENT

2. 检查一下CC0是否大于周期值;

3. 也可以通过

DL_Timer_getRawInterruptStatus

这个函数,来检查一下TIMERG所有的中断。

这个函数是get raw interrupt status,无论是否使能中断,只要相应中断产生,都可以被检测到。也就是说该函数检查的是标志位,与使能位无关。

另外上传代码请通过 插入–>代码–>C

赞(0)
未经允许不得转载:TI中文支持网 » MSPM0L1306: 其他微控制器论坛
分享到: 更多 (0)