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.

MSPM0G3507: Do we need to delay to get timerG counter after starting the timer?

Part Number: MSPM0G3507

I used timerG of MSPM0 with setting as below.

Timer clock source: LFCLK

Timer clock divider: 1

Timer clock prescaler: 1

Timer mode: One-shot Up Counting

Below is code example to test TimerG and output log

int main(void)
{
    SYSCFG_DL_init();

    //Test 1
    uint32_t counter11, counter12;
    bool runFlag11;
    counter11 = DL_TimerG_getTimerCount(I2C_COMMUNICATION_TIMER_INST);
    runFlag11 = DL_TimerG_isRunning(I2C_COMMUNICATION_TIMER_INST);
    delayMs(5);  //delay 5ms
    counter12 = DL_TimerG_getTimerCount(I2C_COMMUNICATION_TIMER_INST);
    printf("[Test 1][Timer not started] counter11 = %d, counter12 = %d, runFlag11 = %d\n", counter11, counter12, runFlag11);

    //Test 2
    uint32_t counter21, counter22, counter23, counter24;
    bool runFlag21, runFlag22;
    DL_TimerG_startCounter(I2C_COMMUNICATION_TIMER_INST);
    counter21 = DL_TimerG_getTimerCount(I2C_COMMUNICATION_TIMER_INST);
    runFlag21 = DL_TimerG_isRunning(I2C_COMMUNICATION_TIMER_INST);
    delayMs(1);  //delay 1ms
    counter22 = DL_TimerG_getTimerCount(I2C_COMMUNICATION_TIMER_INST);
    delayMs(5);  //delay 5ms
    counter23 = DL_TimerG_getTimerCount(I2C_COMMUNICATION_TIMER_INST);
    delayMs(10);  //delay 10ms
    counter24 = DL_TimerG_getTimerCount(I2C_COMMUNICATION_TIMER_INST);
    DL_TimerG_stopCounter(I2C_COMMUNICATION_TIMER_INST);
    runFlag22 = DL_TimerG_isRunning(I2C_COMMUNICATION_TIMER_INST);
    printf("[Test 2][Timer started] counter21 = %d, counter22 = %d, counter23 = %d, counter24 = %d, runFlag21 = %d, runFlag22 = %d\n",
           counter21, counter22, counter23, counter24, runFlag21, runFlag22);
    
    //Test 3
    uint32_t counter31, counter32, counter33, counter34;
    DL_TimerG_startCounter(I2C_COMMUNICATION_TIMER_INST);
    counter31 = DL_TimerG_getTimerCount(I2C_COMMUNICATION_TIMER_INST);
    delayMs(5);  //delay 5ms
    counter32 = DL_TimerG_getTimerCount(I2C_COMMUNICATION_TIMER_INST);
    delayMs(1000);  //delay 1000ms
    counter33 = DL_TimerG_getTimerCount(I2C_COMMUNICATION_TIMER_INST);
    delayMs(100);  //delay 100ms
    counter34 = DL_TimerG_getTimerCount(I2C_COMMUNICATION_TIMER_INST);
    DL_TimerG_stopCounter(I2C_COMMUNICATION_TIMER_INST);
    printf("[Test 3][Counter reach max value] counter31 = %d, counter32 = %d, counter33 = %d, counter34 = %d\n", 
           counter31, counter32, counter33, counter34);

    //Test 4
    uint32_t counter41, counter42, counter43;
    DL_TimerG_setTimerCount(I2C_COMMUNICATION_TIMER_INST, 10000);
    DL_TimerG_startCounter(I2C_COMMUNICATION_TIMER_INST);
    counter41 = DL_TimerG_getTimerCount(I2C_COMMUNICATION_TIMER_INST);
    delayMs(5);  //delay 5ms
    counter42 = DL_TimerG_getTimerCount(I2C_COMMUNICATION_TIMER_INST);
    delayMs(5);  //delay 5ms
    counter43 = DL_TimerG_getTimerCount(I2C_COMMUNICATION_TIMER_INST);
    DL_TimerG_stopCounter(I2C_COMMUNICATION_TIMER_INST);
    printf("[Test 4][Set counter value before start] counter41 = %d, counter42 = %d, counter43 = %d\n", 
           counter41, counter42, counter43);

    //Test 5
    uint32_t counter51, counter52;
    DL_TimerG_startCounter(I2C_COMMUNICATION_TIMER_INST);
    counter51 = DL_TimerG_getTimerCount(I2C_COMMUNICATION_TIMER_INST);
    delayMs(5);  //delay 5ms
    counter52 = DL_TimerG_getTimerCount(I2C_COMMUNICATION_TIMER_INST);
    DL_TimerG_stopCounter(I2C_COMMUNICATION_TIMER_INST);
    printf("[Test 5][Get counter value] counter51 = %d, counter52 = %d\n", 
           counter51, counter52);

    while (1)
    {

    }
}

Output log

[Test 1][Timer not started] counter11 = 0, counter12 = 0, runFlag11 = 0
[Test 2][Timer started] counter21 = 0, counter22 = 32, counter23 = 196, counter24 = 525, runFlag21 = 1, runFlag22 = 0
[Test 3][Counter reach max value] counter31 = 525, counter32 = 164, counter33 = 16383, counter34 = 16383
[Test 4][Set counter value before start] counter41 = 10000, counter42 = 164, counter43 = 328
[Test 5][Get counter value] counter51 = 328, counter52 = 164

I expect that I will get counter value from 0 after calling DL_TimerG_startCounter().

But if DL_TimerG_getTimerCount() is called immediately after calling DL_TimerG_startCounter(), it seems that TimerG need some times to reset counter to 0 and then start to increase counter value (counter31, counter41, counter51 are not 0).

counter31 = 525, counter32 = 164, counter33 = 16383, counter34 = 16383
counter41 = 10000, counter42 = 164, counter43 = 328
counter51 = 328, counter52 = 164

Do I need to add the delay after start the timer (for TimerG resets counter value) before calling DL_TimerG_getTimerCount()?

How much time do I need to delay?