×
单片机 > 单片机程序设计 > 详情

在stm32的freeRTOS上进行微秒级延时

发布时间:2020-05-29 发布时间:
|

因为时间片的原因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


dwt_stm32_delay.c


#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*/

  }

}


main.c


/* 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头文件为stm32f1xx_hal.h, 

f1系列也适应


关键字:stm32  freeRTOS  微秒级延时 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
stm32 总线矩阵介绍