/**
* @brief 阻塞的ms延时程序,1ms为一个单位
* @param
* @arg nTime: Blocking_Delay_ms( 1 ) 则实现的延时为 1 * 1ms = 1ms
* @retval 无
*/
void Blocking_Delay_ms(__IO u32 nTime) {
TimingDelay = 1 * nTime;
SysTick_Config(SystemCoreClock / 1000);
// 使能滴答定时器
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
while (TimingDelay != 0) {
}
}
/**
获取节拍程序,定时结束时调取处理函数
在 SysTick 中断函数 SysTick_Handler()调用
*/
void TimingDelay_Decrement(void) {
if ((--TimingDelay) != 0) {
return;
}
My_SysTick_Handler();
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}
void My_SysTick_Handler(void) {
extern uint8_t GLOBAL_LED_X;
LED_x_TOGGLE(GLOBAL_LED_X);
}
/**
* @brief This function handles SysTick Handler.
* @param None
* @retval None
*/
void SysTick_Handler(void) {
TimingDelay_Decrement();
}
一开始设置的滴答计时器间隔为 1um,出现while (TimingDelay != 0) { }
不能退出的错误,原因是间隔太小,处理器光处理中断了,可能TimingDelay
到0后还没来得及退出循环,就又来了中断减为-1跳不出循环了。。。