您的位置:首页 > 其它

20140627-STM8L101F3P6关于微秒级延时函数不同写法的波形

2014-06-27 12:52 218 查看
总结一下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)波形如下:



-------------------------------------------------------------------------------------------------------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: