DWT العداد

ملاحظة صغيرة حول شيء مفيد للغاية مدرج في وحدة DWT (Data Watchpoint and Trace unit) المتاحة من stm32.

وحدة 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); 

صورة
تقاس HAL_Delay (1000) على تردد 72 ميغاهيرتز.

لتنظيم توقف microsecond مؤقتًا ، تحتاج إلى إنشاء 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/ar476582/


All Articles