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

原创 2014年06月27日 12:52:19

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


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


版权声明:本文为博主原创文章,未经博主允许不得转载。

IAR FOR STM8精确延时函数

【整理者】61ic.com 【提供者】llz77 【详细说明】IAR FOR STM8精确延时函数 用的是IAR FOR STM8,有个项目想精确的知道下delay行数的延时时间是多少,上...

STM8S_002_TIM精确延时(阻塞式)

Ⅰ、写在前面在某些特定场合,需要精确的延时(us级),特别是底层驱动。如果使用软件延时,延时会随系统时钟改变及各种因素影响而改变。因此,就需要使用TIM精确延时。 阻塞式延时:从延时开始至结束,程序一...

STM8L1xx利用定时器实现毫秒和微妙延时

采用单片机的定时计数器进行毫秒和微妙级延时,精度较准。检测溢出时产生的标志位来判断延时到达。...
  • hpr1992
  • hpr1992
  • 2016年02月24日 15:42
  • 4083

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

总结一下STM8L101F3P6工作在16MHz下,利用死循环、中断等不同写法的微秒级延时函数精度的情况。 一、死循环空指令的写法,延时函数程序如下:...

单片机存储中的大小端模式

请写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1解答:int checkCPU( ) { { union w ...

STM8 TIM2 定时器的问题

定时50 ms  中断      所用的芯片为STM8S103F3P6,编译器为IAR  ,程序代码如下: // #include "iostm8s105c6.h" #include "iost...

20140624-STM8L101F3P6查询发送中断接收

/******************************Copyright (c)***********************************/ /* ...

stm8s103f3p6的延时函数

使用stm8s时本来期望能够产生1us精度的脉冲,但是调来调去也没能实现。目前的情况是使用内部16MHz的RC时钟源,然后给到timer4,再经 8分频产生一个25us的中断,我能搞出来的最小中断周期...
  • k7arm
  • k7arm
  • 2017年06月25日 18:19
  • 918

20130822-STM8L101F3P6的PD0使用异常,尚未解决~!

问题描述: 在STM8L101F3P6的PD0这个口,初始化函数中设置为推挽输出高电平: GPIO_Init(GPIOD,POWER_UP,GPIO_Mode_Out_PP_High_Fast);  ...

20131007-STM8L101F3P6关于硬件IIC写时序和勘误部分的翻译

写时序 -----------------------------------------------------------------------------------------------...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:20140627-STM8L101F3P6关于微秒级延时函数不同写法的波形
举报原因:
原因补充:

(最多只允许输入30个字)