US-延时的实现方法1-大块切糕

mac2026-04-15  1

参考:

https://blog.csdn.net/qq_22252423/article/details/76468161

核心思想是我做一个TIM他的CNT其实是在0--7200之前跑的

但是我暴力设置CNT为一个数字A--然后让他跑到B的时候停止

大块切糕 就是如此

拿出若干个等分吧。

void delay_us(uint16_t us) { uint16_t differ=0xffff-us-5; /*为防止因中断打断延时,造成计数错误. 如从0xfffE开始延时1us,但由于中断打断 (此时计数器仍在计数),本因计数至0xffff) 便停止计数,但由于错过计数值,并重载arr值, 导致实际延时(0xffff+1)us */ HAL_TIM_Base_Start(&htim14); __HAL_TIM_SetCounter(&htim14,differ); while(differ<0xffff-5) { differ=__HAL_TIM_GetCounter(&htim14); } HAL_TIM_Base_Stop(&htim14); }

他只需要MX-INIT此后直接调用即可。定时器一直都在。只是函数内操作开关

 

 

 

 

 

 

 

 

这种方式比较STM32不能扩展

 

案例 看TIM6做OS

HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) uint32_t uwTimclock = 0; uint32_t uwPrescalerValue = 0; uwTimclock = HAL_RCC_GetPCLK1Freq(); /* Compute the prescaler value to have TIM6 counter clock equal to 1MHz */ uwPrescalerValue = (uint32_t) ((uwTimclock / 1000000) - 1); /* Initialize TIM6 */ htim6.Instance = TIM6; htim6.Init.Period = (1000000 / 1000) - 1; htim6.Init.Prescaler = uwPrescalerValue; htim6.Init.ClockDivision = 0; htim6.Init.CounterMode = TIM_COUNTERMODE_UP;

 

最新回复(0)