Penghitung DWT

Catatan kecil tentang hal yang sangat berguna termasuk dalam modul DWT (Data Watchpoint and Trace unit) yang tersedia dari stm32.

Modul DWT itu sendiri adalah hal yang agak rumit (baca di sini hlm. 75), dan ia bertanggung jawab atas debugging. Namun, kita tidak berbicara tentang modul secara keseluruhan, tetapi tentang salah satu komponennya - penghitung jam (selanjutnya penghitung DWT).

Faktanya, penghitung DWT hanyalah register 32-bit, nilainya bertambah satu dengan setiap siklus clock berikutnya. Kita dapat menulis dan membaca dari daftar ini, yang berarti kita dapat menggunakannya untuk mengukur waktu pelaksanaan beberapa bagian program dalam ukuran, dan mengatur penundaan mikrodetik. Penghitung ini sepenuhnya independen.

Untuk mengukur waktu eksekusi setiap bagian dari program atau fungsi, Anda perlu melakukannya ...

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

gambar
Diukur HAL_Delay (1000) pada frekuensi 72 MHz.

Untuk mengatur jeda mikrodetik, Anda perlu membuat file 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__ 

... dan tambahkan ke proyek.

Di main.c buat inklusi ...

 #include "delay_micros.h" 

Sebelum perulangan tanpa batas, inisialisasi penghitung ...

 DWT_Init(); 

Dan penundaan itu melakukannya ...

 delay_us(100); // 100  

File yang sudah selesai dapat diambil di sini .

Itu saja.

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


All Articles