参考:
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;