/******************************************************************************* * 名 称: Bsp_DelayMS * 功 能: ms级延迟,延迟精度为正负2ms * 入口参数: n : 延迟长度,单位1 ms。 n 应大于2 * 出口参数: 无 * 作 者: Roger-WY * 创建日期: 2014-08-20 * 修 改: * 修改日期: * 备 注: n 应大于2 该函数为死延时 *******************************************************************************/ void Bsp_DelayMS(uint32_t n) { if (n == 0) { return; } else if (n == 1) { n = 2; } DISABLE_SYSTICK_INT(); /* 关中断 */ s_uiDelayCount = n / 2; s_ucTimeOutFlag = 0; ENABLE_SYSTICK_INT(); /* 开中断 */ while (1) { CPU_IDLE(); /* 此处是空操作。用户可以定义,让CPU进入IDLE状态,以降低功耗;或实现喂狗 */ /* 等待延迟时间到 */ /* 注意:编译器认为 s_ucTimeOutFlag = 0,所以可能优化错误 因此 s_ucTimeOutFlag 变量必须申明为_IO_型 */ if (s_ucTimeOutFlag == 1) { break; } } }
/* ********************************************************************************************************* * 函 数 名: bsp_DelayMS * 功能说明: ms级延迟,延迟精度为正负1ms * 形 参:n : 延迟长度,单位1 ms。 n 应大于2 * 返 回 值: 无 ********************************************************************************************************* */ void bsp_DelayMS(uint32_t n) { /* 避免 n = 1 出现主程序死锁 */ if (n <= 1) { n = 2; } __set_PRIMASK(1); /* 关中断 */ g_Tmr[0].count = n; g_Tmr[0].flag = 0; __set_PRIMASK(0); /* 开中断 */ while (1) { CPU_IDLE(); /* 此处是空操作。用户可以定义,让CPU进入IDLE状态,以降低功耗;或实现喂狗 */ /* 等待延迟时间到 */ if (g_Tmr[0].flag == 1) { break; } } }