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

2020-03-26来源: eefocus关键字:STM8L101F3P6  微秒级  延时函数  波形

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

关键字:STM8L101F3P6  微秒级  延时函数  波形 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic492651.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32固件库详解
下一篇:STM8L101F3P6串口查询接收

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM8L101F3P6关于毫秒级延时函数不同写法的波形
总结一下STM8L101F3P6工作在16MHz下,利用死循环、中断等不同写法的微秒级延时函数精度的情况。一、死循环空指令的写法,延时函数程序如下:/******************************************************************************//* Function name:       Delay_ms                               
发表于 2020-02-16
STM8L101F3P6关于毫秒级延时函数不同写法的波形
STM8L101F3P-串口发送功能初始化
1.串口初始化函数CLK_MasterPrescalerConfig(CLK_MasterPrescaler_HSIDiv1);GPIO_ExternalPullUpConfig(GPIOC,GPIO_Pin_3|GPIO_Pin_4, ENABLE);CLK_PeripheralClockConfig(CLK_Peripheral_USART, ENABLE);USART_DeInit();USART_Init(9600, USART_WordLength_8D, USART_StopBits_1, USART_Parity_No,USART_Mode_Tx);2.发送一个uint8_t类型的数据USART_SendData8(
发表于 2018-10-08
STM8L101F3P6低功耗
因最近项目用到STM8L101F3P6超低功耗MCU,所以想在这里总结一下相关内容。STM8L101F3P6 供电电压:1.65V - 3.6V,具体的最小电路如下如所示平时编写代码可参考ST官网给的固件例程。在使用该MCU时,为了达到低功耗的目的,平时可注意几个方面:1、使用STM8L101的AWU自动唤醒模块,并尽量是休眠时间较长。2、在进入休眠状态时,需配置好各个GPIO的高低电平状态,因为如果存在端口中存在高低电平的通路,尽管电阻有几十k,但还是会增加几十微安的电流,在休眠状态下,这个电流还是比较大的。举个例子,我是将没有用到的GPIO口都置为上拉输出低,对于中断口我都是用1M的电阻来外部上拉,以减小电流。
发表于 2018-09-08
STM8L101F3P6查询发送中断接收
/******************************Copyright (c)***********************************/ /* */ /* 老李电子工作 */ /* */ /*------------------------------File Info-------------------------------------*/ /* File name: main.c */ /* Last modified Date: 2014-06-23 */ /* Last Version: 1.0 */ /* Descriptions: STM8L103F3P6,内部时钟,16MHz,串口查询发送
发表于 2016-06-14
STM32 CubeMX如何生成微秒(us)级延时
 会自动在tim.c里面生成代码,如下: /* Includes ------------------------------------------------------------------*/#include "tim.h"/* USER CODE BEGIN 0 *//* USER CODE END 0 */TIM_HandleTypeDef htim17;/* TIM17 init function */void MX_TIM17_Init(void){htim17.Instance = TIM17;htim17.Init.Prescaler = 0;htim17.Init.Co
发表于 2018-07-19
STM32 CubeMX如何生成微秒(us)级延时
在stm32的freeRTOS上进行微秒级延时
因为时间片的原因freeRTOS自身貌似无法进行微秒级的延时,实测通过以下函数可以进行微秒级的消息dwt_stm32_delay.h#ifndef DWT_STM32_DELAY_H#define DWT_STM32_DELAY_H#ifdef __cplusplusextern "C" {#endif#include "stm32f4xx_hal.h"/** * @brief  Initializes DWT_Cycle_Count for DWT_Delay_us function * @return Error DWT counter 
发表于 2018-07-19
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved