×
嵌入式 > 技术百科 > 详情

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

发布时间:2024-05-18 发布时间:
|

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


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
实时控制.安全.如何加速实现未来工厂落地?