记一次时钟中断间隔太小引发的惨案

/**
 * @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跳不出循环了。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值