DWT काउंटर

एक बहुत ही उपयोगी चीज के बारे में एक छोटा सा नोट जो DWT मॉड्यूल (डेटा वॉचपॉइंट और ट्रेस यूनिट) में stm32 से उपलब्ध है।

DWT मॉड्यूल अपने आप में एक जटिल चीज़ है ( यहाँ पढ़ें पी 75), और वह डिबगिंग के लिए जिम्मेदार है। हालांकि, हम समग्र रूप से मॉड्यूल के बारे में बात नहीं कर रहे हैं, लेकिन इसके घटकों में से एक के बारे में - एक घड़ी काउंटर (इसके बाद 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 मेगाहर्ट्ज की आवृत्ति पर 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/hi476582/


All Articles