Browse Source

【主线待合】微秒级延时在freeRTOS下改为使用DWT

master
Lizongdi 6 days ago
parent
commit
022128330e
  1. 2
      bspMCU/My_freeRTOS.c
  2. 13
      bspMCU/bsp_pin.c
  3. 5
      bspMCU/include/bsp_pin.h

2
bspMCU/My_freeRTOS.c

@ -26,6 +26,7 @@
#include "string.h" #include "string.h"
#include "stdio.h" #include "stdio.h"
#include "lua_base.h" #include "lua_base.h"
#include "bsp_pin.h"
/*----------------------------------------------* /*----------------------------------------------*
* * * *
@ -206,6 +207,7 @@ void Rd_Delay(uint32_t Delay)
void MyTask_Init(void) void MyTask_Init(void)
{ {
bsp_dwt_init();
#ifndef USE_TALNET #ifndef USE_TALNET
const osThreadAttr_t Lua_attributes = { const osThreadAttr_t Lua_attributes = {
.name = "LuaREPL", .name = "LuaREPL",

13
bspMCU/bsp_pin.c

@ -15,8 +15,20 @@ void bsp_pin_init(GPIO_TypeDef *port, uint16_t pin, uint8_t mode)
HAL_GPIO_Init(port, &GPIO_InitStruct); HAL_GPIO_Init(port, &GPIO_InitStruct);
} }
void bsp_dwt_init(void)
{
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; // 使能 DWT
DWT->CYCCNT = 0; // 清零周期计数器
DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; // 使能周期计数器
}
void delay_us(int nus) void delay_us(int nus)
{ {
#ifdef USE_FREERTOS
uint32_t start = DWT->CYCCNT; // 记录起始计数值
uint32_t ticks = nus * (SystemCoreClock / 1000000); // 计算需要的时钟周期数
while ((DWT->CYCCNT - start) < ticks); // 等待达到目标周期数
#else
uint32_t ticks; uint32_t ticks;
uint32_t told,tnow,tcnt=0; uint32_t told,tnow,tcnt=0;
uint32_t reload=SysTick->LOAD; //LOAD的值 uint32_t reload=SysTick->LOAD; //LOAD的值
@ -33,4 +45,5 @@ void delay_us(int nus)
if(tcnt>=ticks)break; //时间超过/等于要延迟的时间,则退出. if(tcnt>=ticks)break; //时间超过/等于要延迟的时间,则退出.
} }
}; };
#endif
} }

5
bspMCU/include/bsp_pin.h

@ -59,8 +59,8 @@ extern "C"{
/*==============================================* /*==============================================*
* include header files * * include header files *
*----------------------------------------------*/ *----------------------------------------------*/
#include "common.h"
#include "main.h"
/*==============================================* /*==============================================*
@ -80,6 +80,7 @@ extern "C"{
void bsp_pin_init(GPIO_TypeDef *port, uint16_t pin, uint8_t mode); void bsp_pin_init(GPIO_TypeDef *port, uint16_t pin, uint8_t mode);
void delay_us(int nus); void delay_us(int nus);
void bsp_dwt_init(void);
#ifdef __cplusplus #ifdef __cplusplus
#if __cplusplus #if __cplusplus

Loading…
Cancel
Save