Dear TI Development Team
It looks like I found a problem with the 1ms DMTimer. If you clear the overflow flag too early (DMTIMER_1MS_TISR_OVF_IT_FLAG), it looks like the interrupt is fired twice. If a insert a small loop after the timer interrupt is cleared, everything works perfectly as expected!
The timer is configured as recommend in the technical reference manual, please see also this post: e2e.ti.com/.../1316813
Configuration:
TPIR = 232000
TNIR = -768000
TLDR = 0xFFFFFFE0
Clock source: PER PLL @32768KHz (CLK_32KHZ)
ARM Chip Frequency: 600MHz
Osciloscope:
A) Bad Duty Cycle:
B) Good Duty Cycle (with the delay):
Source code:
static bool debugPinState = false; extern "C" void TINT1_1MS_IRQHandler(void) { debugPinState = !debugPinState; GPIO_Write(GPIO1, PIN30, debugPinState); const uint32_t tocr = DMTimer1ms_GetTimerOverflowCount(); if (tocr > 0) { // This hardware bug appears in the 1-ms tick generation section of the GPTIMER blocks on some OMAP3530 chips. // Source: e2e.ti.com/.../297061.aspx DMTimer1ms_ClearTimerOverflowCount(); } // Clear interrupt flag DMTimer1ms_AcknowledgeInterrupt(); // Looks like there is a synchronization issue in hardware: when the timer interrupt is cleared, and the interrupt handler returns too early, the interrupt is fired twice. volatile uint32_t delayCounter = 0U; while(delayCounter < 50U) { ++delayCounter; } }