载重吨柜台

关于stm32可用的DWT模块(数据观察点和跟踪单元)中包含的非常有用的内容的小注释。

DWT模块本身是一件相当复杂的事情(请参见第75页),他负责调试。 但是,这与模块整体无关,而是与模块之一有关-时钟计数器(以下称为DWT计数器)。

实际上,DWT计数器只是一个32位寄存器,其值在随后的每个时钟周期增加一。 我们可以读写该寄存器,这意味着我们可以用它来衡量某些程序的执行时间,并组织微秒的延迟。 该计数器是完全独立的。

要测量程序或功能任何部分的执行时间,您需要这样做...

#define DWT_CYCCNT *(volatile uint32_t*)0xE0001004 #define DWT_CONTROL *(volatile uint32_t*)0xE0001000 #define SCB_DEMCR *(volatile uint32_t*)0xE000EDFC char str[16] = {0,}; uint32_t count_tic = 0; SCB_DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;//   DWT DWT_CONTROL|= DWT_CTRL_CYCCNTENA_Msk; //   DWT_CYCCNT = 0;//   //      count_tic = DWT_CYCCNT; // -  snprintf(str, 16, "Takt %lu\n", count_tic); HAL_UART_Transmit(&huart1, (uint8_t*)str, strlen(str), 1000); 

图片
在72 MHz的频率下测得的HAL_Delay(1000)。

要组织微秒的暂停,您需要创建一个文件delay_micros.h ...

 #ifndef __DELAY_US_H__ #define __DELAY_US_H__ #ifdef __cplusplus extern "C" { #endif /******************************************************************************/ /*      */ #include "main.h" //#define DWT_CONTROL *(volatile unsigned long *)0xE0001000 //#define SCB_DEMCR *(volatile unsigned long *)0xE000EDFC /******************************************************************************/ /* inline func */ __STATIC_INLINE void DWT_Init(void) { CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; //    DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; //   } __STATIC_INLINE void delay_us(uint32_t us) { uint32_t us_count_tic = us * (SystemCoreClock / 1000000U); DWT->CYCCNT = 0U; while(DWT->CYCCNT < us_count_tic); } #ifdef __cplusplus } #endif #endif //__DELAY_US_H__ 

...并将其添加到项目中。

在main.c中创建一个包含项...

 #include "delay_micros.h" 

在无限循环之前,初始化计数器...

 DWT_Init(); 

而延迟是这样做的...

 delay_us(100); // 100  

完成的文件可以在这里获取

仅此而已。

Source: https://habr.com/ru/post/zh-CN476582/


All Articles