主题: SysConfig 中讨论的其他器件
工具/软件:
您好:
在 FreeRTOS 中读取 AM625-Q1上的 MCU_TIMER3时、我们始终遇到~24周期差异。 我们在自由运行模式下使用该计时器(溢出时间约为171.8秒)来替代 I2C 驱动器中的 SysTick 计时器。
我们直接读取计时器计数器寄存器(TCRR)、并将值存储在 prevCount
变量中。 在每次迭代中、我们将当前计时器计数与比较 prevCount
以检测溢出(当当前计数小于时 prevCount
)。
我们持续观察到 prevCount
在 实际计时器溢出发生之前、比当前计时器计数大约24个周期的差异。 这种差异似乎来自计时器本身、因为直接从 TCRR 寄存器读取的值不一致。
我们的问题
-
如果先前读取的值有时大于当前值、但不是由于真正的溢出而导致的、那么向上计数计时器如何表现出这种行为? 我们排除了典型的软件问题、如非原子访问或不正确的溢出处理。
-
是否有任何与 AM625-Q1上的 MCU_TIMER3相关的已知限制或勘误表 可能会导致这种周期性的24周期差异? 我们查看了数据表、但找不到任何直接解决此特定行为的方法。 我们使用
CONFIG_TIMER3_CLOCK_SRC_MCU_HFOSC0
作为时钟源。 -
I2C 外设或其驱动程序的交互是否可能会干扰计时器的运行?
我们还附加了相关代码片段和 SysConfig 计时器设置。
-------------------------API to setup timer as free-running-------------- void TimerP_setup(uint32_t baseAddr, TimerP_Params *params) { volatile uint32_t *addr; uint32_t ctrlVal = 0u; DebugP_assert( baseAddr!=0U); (void)params; /* stop timer and clear pending interrupts */ TimerP_stop(baseAddr); /* autoreload timer */ ctrlVal |= (0x1U << 1); /* Compare enable*/ ctrlVal |= (0x1U << 6); /* set timer control value */ addr = (volatile uint32_t *)(baseAddr + TIMER_TCLR); *addr = ctrlVal; /* set timer count value */ addr = (volatile uint32_t *)(baseAddr + TIMER_TCRR); *addr = 0u; /* set reload value */ addr = (volatile uint32_t *)(baseAddr + TIMER_TLDR); *addr = 0u; } ---------------------------API to get Count--------------------------------------- uint32_t TimerP_getCount(uint32_t baseAddr) { volatile uint32_t *addr = (volatile uint32_t *)(baseAddr + TIMER_TCRR); uint32_t count; uintptr_t key; key = HwiP_disable(); // Disable interrupts/enter critical section count = *addr; // First read (dummy read) count = *addr; // Second read (actual value) HwiP_restore(key); // Re-enable interrupts/exit critical section if (prevCount > count && prevCount != 0) { // Check and log only if it's not the initial state DebugP_log("Timer Discrepancy: prevCount=%u, count=%u\r\n", prevCount, count); } prevCount = count; // Update prevCount *after* the check return count; } -------------------------------------------------------------------------
