This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

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;
}
}

  • 使用的是这个例程吗?C:\ti\mspm0_sdk_1_00_01_03\examples\nortos\LP_MSPM0L1306\driverlib\timx_timer_mode_periodic_sleep\ticlang

    方便说下在例程的基础上做了哪些改动吗?

  • 首先添加了一个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;

        }

    }

     

  • 结果就是不管是否设置中断,while(DL_Timer_getRawInterruptStatus(TIMER_0_INST, DL_TIMERG_INTERRUPT_CC0_DN_EVENT));都会直接跳出。

    直接跳出具体是什么现象?

  • 就是用DL_Timer_getRawInterruptStatus(TIMER_0_INST, DL_TIMERG_INTERRUPT_CC0_DN_EVENT来判断中断是否触发,当未触发时条件为false,循环就会进入死循环,而不会进入下面的输出语句。现在是不管我是否设置这个中断,while语句都没有起到效果

  • 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