在stm32的freeRTOS上进行微秒级延时(HAL库)



因为时间片的原因freeRTOS自身貌似无法进行微秒级的延时,实测通过以下函数可以进行微秒级的消息

dwt_stm32_delay.h

#ifndef DWT_STM32_DELAY_H
#define DWT_STM32_DELAY_H

#ifdef cplusplus
extern “C” {
#endif

#include “stm32f4xx_hal.h”

/
@brief Initializes DWT_Cycle_Count for DWT_Delay_us function @return Error DWT counter
1: DWT counter Error 0: DWT counter works
*/
uint32_t DWT_Delay_Init(void);

/

@brief This function provides a delay (in microseconds) @param microseconds: delay in microseconds
*/
STATIC_INLINE void DWT_Delay_us(volatile uint32_t microseconds)
{
uint32_t clk_cycle_start = DWT->CYCCNT;

/ Go to number of cycles for system /
microseconds = (HAL_RCC_GetHCLKFreq() / 1000000);

/
Delay till end /
while ((DWT->CYCCNT - clk_cycle_start) < microseconds);
}

#ifdef __cplusplus
}
#endif

#endif
</pre> dwt_stm32_delay.c <pre style="font-size: 1em; font-family: Consolas, Inconsolata, Courier, monospace; line-height: 1.2em; margin: 1.2em 0px;">
#include “dwt_stm32_delay.h”

/**
@brief Initializes DWT_Clock_Cycle_Count for DWT_Delay_us function
@return Error DWT counter 1: clock cycle counter not started
0: clock cycle counter works /
uint32_t DWT_Delay_Init(void) {
/ Disable TRC /
CoreDebug->DEMCR &= ~CoreDebug_DEMCR_TRCENA_Msk; // ~0x01000000;
/ Enable TRC /
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; // 0x01000000;

/ Disable clock cycle counter /
DWT->CTRL &= ~DWT_CTRL_CYCCNTENA_Msk; //~0x00000001;
/ Enable clock cycle counter /
DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; //0x00000001;

/ Reset the clock cycle counter value /
DWT->CYCCNT = 0;

/ 3 NO OPERATION instructions /
ASM volatile (“NOP”); ASM volatile (“NOP”);
__ASM volatile (“NOP”);

/ Check if clock cycle counter has started /
if(DWT->CYCCNT)
{
return 0; /clock cycle counter started/
}
else
{
return 1; /clock cycle counter not started/
}
}
</pre> main.c <pre style="font-size: 1em; font-family: Consolas, Inconsolata, Courier, monospace; line-height: 1.2em; margin: 1.2em 0px;">
/ Includes ——————————————————————/
#include “stm32f4xx_hal.h”
#include “dwt_stm32_delay.h”

int main(void)
{
/ USER CODE BEGIN 1 /

/ USER CODE END 1 /

/ MCU Configuration———————————————————-/

/ Reset of all peripherals, Initializes the Flash interface and the Systick. /
HAL_Init();

/ Configure the system clock /
SystemClock_Config();

/ Initialize all configured peripherals /
MX_GPIO_Init();

/ USER CODE BEGIN 2 /

if(DWT_Delay_Init())
{
Error_Handler(); / Call Error Handler /
}

while(1)
{
/ 10s Delay /
DWT_Delay_us(10000000);

HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
}
}

通过修改stm32f4xx_hal.h头文件 f1系列也适应