最近要将一个模块移植到ucos操作系统上,模块需要us级延时。
但是ucos操作系统会打断延时,使延时不准。
延时函数:
void Delay_us(uint16_t us)
{
uint16_t differ=0;
HAL_TIM_Base_Start(&htim2);
__HAL_TIM_SetCounter(&htim2,differ);
while(differ < us)
{
differ = __HAL_TIM_GetCounter(&htim2);
}
HAL_TIM_Base_Stop(&htim2);
}
cubeMX设置。主频32M,100代表最大延时100us,因为不是使用中断,可以任意设定。
ucos操作系统会打断这个函数,有时while中differ读到的数已经超过了设置的us值,导致延时不准。
解决办法是使用临界区保护,开启临界区,延时,退出临界区。
void Delay_us(uint16_t us)
{
uint16_t differ=0;
CPU_SR_ALLOC();
OS_CRITICAL_ENTER(); //临界区保护
HAL_TIM_Base_Start(&htim2);
__HAL_TIM_SetCounter(&htim2,differ);
while(differ < us)
{
differ = __HAL_TIM_GetCounter(&htim2);
}
HAL_TIM_Base_Stop(&htim2);
OS_CRITICAL_EXIT(); //退出临界区
}
问一下大家有什么好用的us级延时函数吗?