打印
[开发工具]

【转】STM8L101F3P6关于微秒级延时函数不同写法的波形

[复制链接]
445|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
不会发光的LED|  楼主 | 2016-10-16 14:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

总结一下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)波形如下:


-------------------------------------------------------------------------------------------------------------------------


发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

61

主题

102

帖子

1

粉丝