工具/软件:
尊敬的 TI:
我有一个定制电路板、其中 GTC 由 MAIN_PLL3_HSDIV1_CLKOUT 使用 62.5MHz 计时。 我在调试模式下在主域 (MCU2_1) 的 R5 上运行以下代码:
const uint32_t arrayElems = 16; uint32_t counterValueSet[arrayElems] = {0xF0000000, 0xE0000000, 0xD0000000, 0xC0000000, 0xB0000000, 0xA0000000, 0x90000000, 0x80000000, 0x70000000, 0x60000000, 0x50000000, 0x40000000, 0x30000000, 0x20000000, 0x10000000, 0x00000000}; uint32_t counterValueGet[arrayElems]; for(uint32_t i = 0; i < arrayElems; i++) { HW_WR_REG32(CSL_GTC0_GTC_CFG1_BASE + CSL_GTC_CFG1_CNTCR, 0x0); HW_WR_REG32(CSL_GTC0_GTC_CFG1_BASE + CSL_GTC_CFG1_CNTCV_LO, counterValueSet[i]); HW_WR_REG32(CSL_GTC0_GTC_CFG1_BASE + CSL_GTC_CFG1_CNTCR, 0x1); counterValueGet[i] = HW_RD_REG32(CSL_GTC0_GTC_CFG2_BASE); }
我获得的 counterValueGet 值为(2 个运行):
0xF0000017 (hex) 0xF000005C (hex) 0xF00000A2 (hex) 0xC0000017 (hex) 0xB0000017 (hex) 0xA0000017 (hex) 0x90000017 (hex) 0x90000067 (hex) 0x70000017 (hex) 0x60000017 (hex) 0x50000018 (hex) 0x40000017 (hex) 0x30000017 (hex) 0x20000017 (hex) 0x10000017 (hex) 0x10000068 (hex)
0xB2E19CE6 (hex) 0xB2E19D2B (hex) 0xB2E19D71 (hex) 0xC0000017 (hex) 0xB0000018 (hex) 0xA0000017 (hex) 0x90000017 (hex) 0x90000067 (hex) 0x70000017 (hex) 0x60000017 (hex) 0x50000017 (hex) 0x50000067 (hex) 0x30000017 (hex) 0x20000017 (hex) 0x10000017 (hex) 0x00000017 (hex)
因此、有时会捕获到所需的值、有时则不捕获。 因此、按我的方式设置 GTC 值似乎不可靠。
添加额外延迟、如下所示:
const uint32_t arrayElems = 16; uint32_t counterValueSet[arrayElems] = {0xF0000000, 0xE0000000, 0xD0000000, 0xC0000000, 0xB0000000, 0xA0000000, 0x90000000, 0x80000000, 0x70000000, 0x60000000, 0x50000000, 0x40000000, 0x30000000, 0x20000000, 0x10000000, 0x00000000}; uint32_t counterValueGet[arrayElems]; for(uint32_t i = 0; i < arrayElems; i++) { HW_WR_REG32(CSL_GTC0_GTC_CFG1_BASE + CSL_GTC_CFG1_CNTCR, 0x0); for(uint32_t j = 0; j < 32; j++) { asm("nop"); } HW_WR_REG32(CSL_GTC0_GTC_CFG1_BASE + CSL_GTC_CFG1_CNTCV_LO, counterValueSet[i]); for(uint32_t j = 0; j < 32; j++) { asm("nop"); } HW_WR_REG32(CSL_GTC0_GTC_CFG1_BASE + CSL_GTC_CFG1_CNTCR, 0x1); for(uint32_t j = 0; j < 32; j++) { asm("nop"); } counterValueGet[i] = HW_RD_REG32(CSL_GTC0_GTC_CFG2_BASE); }
也不会提高可靠性。 结果如下:
0xE03EA32F (hex) 0xE03EA394 (hex) 0xD0000036 (hex) 0xD000009B (hex) 0xB0000036 (hex) 0xB00000A4 (hex) 0x90000036 (hex) 0x80000036 (hex) 0x800000A5 (hex) 0x80000113 (hex) 0x80000181 (hex) 0x800001F2 (hex) 0x30000037 (hex) 0x20000036 (hex) 0x10000036 (hex) 0x00000036 (hex)
你是否能够重现你这边的问题? 您是否对按我的方式设置 GTC 值时出现的问题有任何看法? HW_WR_REG32 包括一个额外的 HW_SYNC_BILER(DSB 指令)、它会执行以下操作(摘录自 Crtex R5 TRM:
“该指令强制处理器等待所有挂起的显式数据访问完成、然后才能执行任何额外的指令阶段。 对指令的预取没有影响。“
因此、根据我的理解、HW_WR_REG32 只应在实际写入值时返回。
谢谢、此致、
Felix