文章预览
最近一工程师向我反馈了一个问题,他使用ARM Cortex-M0+的MCU,在使用延时函数std_delayms延时1s时,如果勾选了KEIL中的Use MicroLIB会导致延时有5%的计时偏差,不勾选的话误差只有1%。 首先进行问题的复现,在程序中while(1)里调用std_delayms(1000),通过串口发送一个字符,在上位机上进行接收,可以清楚的看到勾选微库之后误差确实明显增大,每次偏差大约为50ms。 这个现象看着比较奇怪,刚开始时也困扰了我,那么到底是什么原因呢? 首先要看延时函数是如何实现的, std_delayms函数是通过systick定时器来实现,采用的是阻塞的方式,实现代码如下: /** * @brief us级延时函数(阻塞模式) * @param count 计数周期 * @note 延时函数最大值受限于SysTick重载值寄存器的最大值0xFFFFFF(16777216) * @note 该函数为weak函数,用户可选择其他定时器重新定义实现该函数 * @retval
………………………………