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?