转载来源:技术贴-如何让STM32实现精准NOP延时 (amobbs.com 阿莫电子论坛 - 东莞阿莫电子网站) 对于C语音,实现精准的NOP延时不是很容易,延时时间过短时会有较大误差,但是我们可以通过CM3的调试接口获得精确的NOP延时方式。
首先可以通过读RCC寄存器获得当前系统的时钟值,然后查询DWT寄存器的值之差就能计算出CPU运行时时间,代码如下。
#define DWT_CR *(__IO uint32_t *)0xE0001000 #define DWT_CYCCNT *(__IO uint32_t *)0xE0001004 #define DEM_CR *(__IO uint32_t *)0xE000EDFC #define DEM_CR_TRCENA (1 << 24) #define DWT_CR_CYCCNTENA (1 << 0)
uint32_t uSValue = 0;
void Nop_Conf(void) { RCC_ClocksTypeDef rcc_clocks;
RCC_GetClocksFreq(&rcc_clocks);
uSValue = rcc_clocks.SYSCLK_Frequency / 1000000;
DEM_CR |= (uint32_t) DEM_CR_TRCENA;
DWT_CYCCNT = (uint32_t) 0u;
DWT_CR |= (uint32_t) DWT_CR_CYCCNTENA; }
void usNOPDelay(uint16_t usDly) { uint32_t i = DWT_CYCCNT; uint32_t j = uSValue * usDly; uint32_t k = 0; while (k < j) { k = (DWT_CYCCNT - i); } } DWT_CNT 是一个32位的寄存器,CPU运行时每个时钟周期会自加1,调用 usNOPDelay函数时传入参数大小能获得较好的精度。 更正,查找了手册才明白这个寄存器是 Data Watchpoint and Trace Register,是个很好的方式做系统时钟的tick数做微小时间的查询方式延时,感谢!! 付一个arm论坛的帖子做说明 http://community.arm.com/message/5153#5153 http://infocenter.arm.com/help/i ... 0439c/BABJFFGJ.html http://stackoverflow.com/questio ... ghly-optimized-code |