江西医院网站建设,如何做聚合类网站,椒江建设局网站,网站首页需求STM32 DWT数据观察触发器作为延时函数的使用 #x1f4d1;DWT(Data Watchpoint and Trace数据观察触发器#xff09;描述 #x1f4dd;DWT是属于处理器内核单元中的调试组件之一#xff0c;由四个比较器组成。它们可配置为#xff1a;硬件监视点或对ETM或PC采样器或数据地… STM32 DWT数据观察触发器作为延时函数的使用 DWT(Data Watchpoint and Trace数据观察触发器描述 DWT是属于处理器内核单元中的调试组件之一由四个比较器组成。它们可配置为硬件监视点或对ETM或PC采样器或数据地址采样器的触发器。DWT还提供了一些方法来提供一些分析信息。为此可以访问一些计数器来提供时钟循环折叠指令加载存储单元LSU操作休眠周期CPI每个指令的时钟中断开销。 DWT似乎除了M0内核的没有其他的都有。具体型号有没有请参考对应的内核参考手册。在数据手册上没有此相关信息。 以下内容引自野火开发文档描述https://doc.embedfire.com/mcu/stm32/f103badao/std/zh/latest/book/DWT.html 在Cortex-M中DWT是用于系统调试及跟踪它有一个32位的寄存器叫CYCCNT 它是一个向上的计数器记录的是内核时钟运行的个数内核时钟跳动一次该计数器就加1精度非常高决定内核的频率是多少 对于F103系列内核时钟是72M那精度就是1/72M 14ns而程序的运行时间都是微秒级别的所以14ns的精度是远远够的。 最长能记录的时间为60s2的32次方/72000000(假设内核频率为72M内核跳一次的时间大概为1/72M14ns) 而如果是H7这种400M主频的芯片那它的计时精度高达2.5ns1/400000000 2.5而如果是 i.MX RT1052这种高速的处理器 最长能记录的时间为 8.13s2的32次方/528000000 (假设内核频率为528M内核跳一次的时间大概为1/528M1.9ns) 。当CYCCNT溢出之后 会清0重新开始向上计数。系统处理框图见图 要实现延时的功能总共涉及到三个寄存器DEMCR、DWT_CTRL、DWT_CYCCNT分别用于开启DWT功能、开启CYCCNT及获得系统时钟计数值。
DWT相关寄存器
DEMCR 想要使能DWT外设需要由另外的内核调试寄存器DEMCR的位24控制写1使能。DEMCR的地址是0xE000EDFC DWT_CYCCNT 使能DWT_CYCCNT寄存器之前先清0。其基地址是0xE0001004复位默认值是0可读写类型。所以往0xE0001004这个地址写就将DWT_CYCCNT清0了。CYCCNTENA 它是DWT控制寄存器的第一位写1使能则启用CYCCNT计数器否则CYCCNT计数器将不会工作。 综上所述想要使用DWT的CYCCNT需要以下3个步骤 先使能DWT外设这个由另外内核调试寄存器DEMCR的位24控制写1使能。使能CYCCNT寄存器之前先清0。使能CYCCNT寄存器这个由DWT的CYCCNTENA 控制也就是DWT控制寄存器的位0控制写1使能。
DWT当定时器使用
初始化寄存器
/**
* brief 初始化时间戳
* param 无
* retval 无
* note 使用延时函数前必须调用本函数
*/
void CPU_TS_TmrInit(void)
{/* 使能DWT外设 */DEM_CR | (uint32_t)DEM_CR_TRCENA;/* DWT CYCCNT寄存器计数清0 */DWT_CYCCNT (uint32_t)0u;/* 使能Cortex-M DWT CYCCNT寄存器 */DWT_CR | (uint32_t)DWT_CR_CYCCNTENA;
}延时函数
/**
* brief 采用CPU的内部计数实现精确延时32位计数器
* param us : 延迟长度单位1 us
* retval 无
* note 使用本函数前必须先调用CPU_TS_TmrInit函数使能计数器或使能宏CPU_TS_INIT_IN_DELAY_FUNCTION最大延时值为60秒即60s2的32次方/72000000
*/
void CPU_TS_Tmr_Delay_US(__IO uint32_t us)
{uint32_t ticks;uint32_t told,tnow,tcnt0;/* 在函数内部初始化时间戳寄存器 */
#if (CPU_TS_INIT_IN_DELAY_FUNCTION)/* 初始化时间戳并清零 */CPU_TS_TmrInit();
#endifticks us * (GET_CPU_ClkFreq() / 1000000); /* 需要的节拍数 */tcnt 0;told (uint32_t)CPU_TS_TmrRd(); /* 刚进入时的计数器值 */while (1) {tnow (uint32_t)CPU_TS_TmrRd();if (tnow ! told) {/* 32位计数器是递增计数器 */if (tnow told) {tcnt tnow - told;}/* 重新装载 */else {tcnt UINT32_MAX - told tnow;}told tnow;/*时间超过/等于要延迟的时间,则退出 */if (tcnt ticks)break;}}
}测试工程
基于hal stm32f103
链接https://pan.baidu.com/s/169wTGNecTqwBXqhuYzSVew?pwdnbx4
提取码nbx4