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.

[参考译文] LP-MSPM0G3519:关于 DL_Timer_startCounter () 函数的混淆

Guru**** 2886930 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1641454/lp-mspm0g3519-confusion-regarding-dl_timer_startcounter-function

器件型号: LP-MSPM0G3519

您好:  

一般项目信息:

  • 中断会触发每个 100µs 来执行紧急代码、并检查任务是否挂起
  • 在进入 WFI () 之前在主循环内处理挂起的任务

在我们的一个项目中、我们需要测量 CPU 负载、并认为我们可以使用计时器来实现此目的。  

每次进入任何中断时、计时器都会启动 (DL_TIMER_startCounter ())、并且仅在 MCU 进入 WFI () 时才停止、因此计时器会在中断期间以及挂起的任务期间计数。  

每执行第 10 次 100µs 中断、就会读取计时器计数器值、并且计时器会复位、因此我们会在最后 1ms 内使用 CPU。

在第一次触发时、我们使用正常计时器 (TIMG 或 TIMA) 实现了这一点、但我们观察到 DL_TIMER_startCounter () 似乎将计时器计数器寄存器复位为“0“。 这是有意为之、因为在查看 driverlib 时并不明显? 即使将 CVAE-Reg 设置为“无更改“也没有帮助。 这在图 1 中可见。  

图 2 还显示了一种奇怪的行为。 由于某种原因、Buffer_Before_stop 和 Buffer_after_stop 在样本 210 处丢失“同步“、这毫无意义、因为两个缓冲区都被写入同一索引、唯一的区别是在写入之前写入一个缓冲区、而一个缓冲区在停止计时器之后。  

也许有人可以帮助解决这个问题。

 

下面是一个简化的示例、我们在其中观察到了错误行为。  

#include "ti_msp_dl_config.h"

bool exe_task = false;

uint32_t buffer[256u] = {0u}; 
uint8_t i = 0u;

uint32_t buffer_before_start[256u] = {0u}; 
uint32_t buffer_after_start[256u] = {0u}; 
uint8_t i_start = 0u;

uint32_t buffer_before_stop[256u] = {0u}; 
uint32_t buffer_after_stop[256u] = {0u}; 
uint8_t i_stop = 0u;

/* Interrupt triggered by timer every 100µs */
void TIMER_SWTICK_INST_IRQHandler( void ) {
    static uint8_t cnt = 0u;
    
    buffer_before_start [i_start] = DL_Timer_getTimerCount(TIMER_CPU_LOAD_INST);
    DL_Timer_startCounter(TIMER_CPU_LOAD_INST);
    buffer_after_start [i_start] = DL_Timer_getTimerCount(TIMER_CPU_LOAD_INST);
    i_start++;

    DL_GPIO_setPins(DEBUG_PORT,DEBUG_PIN_0_PIN);

    if(0u == cnt) {
        exe_task = true; 
        buffer [i] = DL_Timer_getTimerCount(TIMER_CPU_LOAD_INST);
        i++;
        cnt = 10u;
    }

    cnt--;

    DL_Common_delayCycles(320u); // Do some work
}


int main(void)
{
    SYSCFG_DL_init();

    /* start base timer */
    DL_Timer_startCounter( TIMER_SWTICK_INST );
    DL_Timer_setCounterValueAfterEnable( TIMER_CPU_LOAD_INST, DL_TIMER_COUNT_AFTER_EN_NO_CHANGE );

    /* enable interrupts */
    NVIC_EnableIRQ( TIMER_SWTICK_INST_INT_IRQN );

    while (1) {
        if (true == exe_task ) {
            /* Do normal priority processing here */
        }
        
        buffer_before_stop [i_stop] = DL_Timer_getTimerCount(TIMER_CPU_LOAD_INST);
        DL_Timer_stopCounter(TIMER_CPU_LOAD_INST);
        buffer_after_stop [i_stop] = DL_Timer_getTimerCount(TIMER_CPU_LOAD_INST);
        i_stop++;

        DL_GPIO_clearPins(DEBUG_PORT,DEBUG_PIN_0_PIN);
        __WFI();
    }
}

 

start_counter.png

图 1.  

 

stop_counter.png

图 2.

 

提前感谢!

此致

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Timon、

    我已经进行了测试、发现“启动计数器“和“停止计数器“不会影响当前计数值。 计时器将从当前值继续计数。 您的结果似乎很奇怪。 从 5 月 1 日到 5 月 6 日的国际劳动节回来后,我将尝试更多的测试和分析。

    BR、

    Janz Bai