总结一下STM8L101F3P6工作在16MHz下,利用死循环、中断等不同写法的微秒级延时函数精度的情况。
一、死循环空指令的写法,延时函数程序如下:
/******************************************************************************/
/* Function name: Delay_us */
/* Descriptions: 微秒级延时函数函数,16MHz时钟 */
/* input parameters: nCount延时时间 */
/* output parameters: 无 */
/* Returned value: 无 */
/******************************************************************************/
void Delay_us(unsigned int nCount)
{
for (; nCount != 0; nCount--);
}
调用函数如下:
/******************************************************************************/
/* Function name: main */
/* Descriptions: 主函数 */
/* input parameters: 无 */
/* output parameters: 无 */
/* Returned value: 无 */
/******************************************************************************/
main()
{
BoardInit();
while(1)
{
GPIO_ResetBits(GPIOC,GPIO_Pin_2);
Delay_us(1);
GPIO_SetBits(GPIOC,GPIO_Pin_2);
Delay_us(1);
}
}
Delay_us(1)大约延时3.3微秒。
Delay_us(10)大约延时10.58微秒。
Delay_us(100)大约延时83.465微秒。
Delay_us(1000)大约延时8118.5微秒。
可以看到,这种利用死循环来写的微秒级的延时,其精度实在太低,毫无规律可言。根本原因与指令流水、代码量、编译器优化等均有关系,我现在说不清楚,估计一两句也说不清楚。在微秒级的延时函数如此糟糕的精度下,如果利用该函数来模拟如IIC和SPI的时序,或是其它速度较快的通信协议时,其根本无法保证精度,结果可想而知,事必要花一定的时间来调时序,累时,费力,费人。
Delay_us(1)波形如下:
Delay_us(10)波形如下:
Delay_us(100)波形如下:
Delay_us(1000)波形如下:
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』