标准库(FreeRTOS)
试用前需要调用 SysTick_Init(SYSCLK)
进行初始化,SYSCLK 一般选择 72。
1 2 3 4 5 6 7 8 9 10 11 12 13
| #ifndef _SysTick_H #define _SysTick_H #include "stm32f10x.h"
void SysTick_Init(uint8_t SYSCLK); void Delay_ms(uint32_t nms); void Delay_us(uint32_t nus); void Delay_xms(uint32_t nms);
#endif
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| #include "SysTick.h" #include "FreeRTOS.h" #include "task.h" static uint8_t fac_us=0; static uint16_t fac_ms=0;
void SysTick_Init(uint8_t SYSCLK) { uint32_t reload; SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK); fac_us=SystemCoreClock/1000000; reload=SystemCoreClock/1000000; reload*=1000000/configTICK_RATE_HZ; fac_ms=1000/configTICK_RATE_HZ;
SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk; SysTick->LOAD=reload; SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; }
void Delay_us(uint32_t nus) { uint32_t ticks; uint32_t told,tnow,tcnt=0; uint32_t reload=SysTick->LOAD; ticks=nus*fac_us; told=SysTick->VAL; while(1) { tnow=SysTick->VAL; if(tnow!=told) { if(tnow<told)tcnt+=told-tnow; else tcnt+=reload-tnow+told; told=tnow; if(tcnt>=ticks)break; } }; }
void Delay_ms(uint32_t nms) { if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED) { if(nms>=fac_ms) { vTaskDelay(nms/fac_ms); } nms%=fac_ms; } Delay_us((uint32_t)(nms*1000)); }
void Delay_xms(uint32_t nms) { uint32_t i; for(i=0;i<nms;i++) Delay_us(1000); }
|
FreeRTOS 的微秒级延时:vTaskDelay()
。
HAL
把系统时钟配置成 72Mhz。这里以使用 TIM1 时钟为例。CubeMX 配置:
1 2 3 4 5 6
| #ifndef _DELAY_H #define _DELAY_H #include "tim.h" void delay_us(uint16_t nus); #endif
|
1 2 3 4 5 6 7 8 9 10 11 12
| #include "delay.h"
void delay_us(uint16_t nus) { __HAL_TIM_SET_COUNTER(&htim1, 0); __HAL_TIM_ENABLE(&htim1); while (__HAL_TIM_GET_COUNTER(&htim1) < nus) { } __HAL_TIM_DISABLE(&htim1); }
|
至于毫秒级延时可以使用 HAL 库方法延时。毫秒级延时 FreeRTOS 还有另一种延时方法 osDelay
。
本文参考