Ein kleiner Hinweis zu einer sehr nĂŒtzlichen Sache, die im DWT-Modul (Data Watchpoint and Trace Unit) von stm32 enthalten ist.
Das DWT-Modul selbst ist eine ziemlich komplizierte Sache (siehe
hier, S. 75), und er ist fĂŒr das Debuggen verantwortlich. Es handelt sich jedoch nicht um das Modul als Ganzes, sondern um eine seiner Komponenten - einen TaktzĂ€hler (im Folgenden DWT-ZĂ€hler).
TatsĂ€chlich ist der DWT-ZĂ€hler nur ein 32-Bit-Register, dessen Wert sich mit jedem nachfolgenden Taktzyklus um eins erhöht. Wir können in dieses Register schreiben und daraus lesen, was bedeutet, dass wir damit die AusfĂŒhrungszeit einiger Programmteile in Messungen messen und Mikrosekundenverzögerungen organisieren können. Dieser ZĂ€hler ist völlig unabhĂ€ngig.
Um die AusfĂŒhrungszeit eines Teils eines Programms oder einer Funktion zu messen, mĂŒssen Sie dies tun ...
#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;
Gemessene HAL_Delay (1000) bei einer Frequenz von 72 MHz.Um Mikrosekundenpausen zu organisieren, mĂŒssen Sie eine Datei
delay_micros.h ... erstellen.
#ifndef __DELAY_US_H__ #define __DELAY_US_H__ #ifdef __cplusplus extern "C" { #endif #include "main.h"
... und zum Projekt hinzufĂŒgen.
In main.c erstellen Sie eine Aufnahme ...
#include "delay_micros.h"
Initialisieren Sie vor einer Endlosschleife den ZĂ€hler ...
DWT_Init();
Und die Verzögerung tut dies ...
delay_us(100);
Die fertige Datei kann hier entnommen
werden .
Das ist alles.