Contador DWT

Una pequeña nota sobre algo muy útil incluido en el módulo DWT (unidad de seguimiento y seguimiento de datos) disponible en stm32.

El módulo DWT en sí es algo bastante complicado (lea aquí p. 75), y él es responsable de la depuración. Sin embargo, no se trata del módulo en su conjunto, sino de uno de sus componentes: un contador de reloj (en adelante, el contador DWT).

De hecho, el contador DWT es solo un registro de 32 bits, cuyo valor aumenta en uno con cada ciclo de reloj posterior. Podemos escribir y leer desde este registro, lo que significa que podemos usarlo para medir el tiempo de ejecución de algunas partes del programa en medidas y organizar retrasos de microsegundos. Este contador es completamente independiente.

Para medir el tiempo de ejecución de cualquier parte de un programa o función, debe hacerlo ...

#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); 

imagen
Medido HAL_Delay (1000) a una frecuencia de 72 MHz.

Para organizar pausas de microsegundos, debe crear un archivo 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__ 

... y añádelo al proyecto.

En main.c crea una inclusión ...

 #include "delay_micros.h" 

Antes de un bucle infinito, inicialice el contador ...

 DWT_Init(); 

Y la demora lo está haciendo ...

 delay_us(100); // 100  

El archivo terminado se puede tomar aquí .

Eso es todo

Source: https://habr.com/ru/post/476582/


All Articles