前言

软件工程师在在实际项目开发过程中,软件延时想必或多或少都有接触过,诸如delay_s(x); delay_ms(x);delay_us(x)等类型的延时函数大家也一定见过或自已曾经实现过,本节给大家介绍一种在STM32 MCU平台上实现高精度(小于1us)软件延时的方法。本节将接着上一讲 “STM32 进阶教程 3 -  软件实现高精度延时 1” 继续介绍的高精度度软件延时的实现与精度提高。

示例详解

基于硬件平台: STM32F10C8T6最小系统板, MCU 的型号是 STM32F103c8t6, 使用stm32cubemx 工具自动产生的配置工程,使用KEIL5编译代码。

本示例所用的最小系统板原理图:

  1. 关于CUBEMX工具及KEIL工具的操作将不再细讲,如果还有不熟悉的可以查看之前的教程文档。下面直接介绍工程配置:
  1. 系统时钟树

  1. 定时器配置

  1. 引脚配置

  1. 中断配置(保持默认)

  1. 工程代码

    1. 将事先准备好的delay.c和delay.h文件加到工程中,

Delay.h文件放在INC文件夹下即可。

  1. 在main.c 中加入如下图所示代码:

上一讲我们演示了延时50us实际延时效果,发现精度会有一0.5-1us左右的偏差:

这一节我们直看看延时1us及2us的效果:

发现同样有0.5-1us左右的偏差,显然这个时候的延时误差相对于延时量来说有些偏大,我们用如下方式来实现,较上一讲的订要更改为图中红框部分:

  1. 编译工程,下载程序看效果:通过逻辑分析仪工具,可以看到PC13引脚上的波形,1us及2us延时精度得到显著提高:

将main中代码按下图所示进行修改,来看看3us延时及50us延时效果:

通过逻辑分析仪,发现经过优化后的延时函数其3-999us之间的延时精度也得到得高:

通过上面的实例,我们已完成了STM32的高精度延时的实现及低及优化工作。整个Delay.c代码量相当少,只有30多行,里面有三个函数delay_init,delay_us及delay_ms,在使用delay_us及delay_ms之前,有两个先要条件:

一、STM32 MCU的系统定时器开启了且其定时中断时间决定了delay_us()的支持的最大输入值,即nus有效的最大值;

二、delay_init函数已被执行过一次,delay_init函数会自动获取MCU的工作主时钟,并根据主时钟计算出一些函数给delay_us使用,如果调用delay_us函数前未先调用delay_init函数,则delay_us按当前时钟是72MHZ条件下执行。

如上图所示,本Delay.C的delay_ms直接调用HAL_Delay()来实现,当然也可以使用下delay_us()来实现,具体实现如上图中屏蔽部分代码!!另外还有一点,本示例给的delay_us在延时1或2us时不够准确,下一节将续续给大家介绍高精度延时的实现,同时下一节将会解决延时1或2us时不够准确的问题。

当然如果systime 不用于产生定时中断,还可以有如下的延时实现方式(精度未经过优化):

OK,本期实验完成!下期见!同时如果大家有什么疑问或是有想了解的其它内容,也欢迎大家留言!!最后喜欢这个公众号的同学们记得加关注了,会有不定期技术干货推出!!

文中源码资料下载,在公众号里给十三发消息:

下载|STM32进阶教程4

关注十三公众号

STM32 进阶教程 4 - 软件实现高精度延时 2相关推荐

  1. STM32 进阶教程 7 -  C与C++混合编程

    前言 在嵌入式开发过程中经常会用到第三个芯片/设备,这些第三方的芯片提供的DEMO程序或驱动程序有时候是C++,如果先前的系统用C语言写的就会出现点问题,往往需先将C++的驱动程序自已手动改成C语言再 ...

  2. STM32 进阶教程 6 -  汇编与C混合编程

    前言 在嵌入式开发过程中,有时候为了追求代码性能与效率不得不采用汇编语言来编写代码,但是汇编代码在阅读时表现不如C语言友好,本节给大家介绍一种新的方法,关键代码用汇编语言时行实现,然后用C语言时行接封 ...

  3. STM32 进阶教程 5 - 内联函数

    前言 在计算机科学中,内联函数(有时称作在线函数或编译时期展开函数)是一种编程语言结构,用来建议编译器对一些特殊函数进行内联扩展(有时称作在线扩展):也就是说建议编译器将指定的函数体插入并取代每一处调 ...

  4. STM32 进阶教程 20 - 串口+DMA实现OneWire总线

    前言 One-wire总线使用一根并联总线完成对于多个设备的访问,通过上拉的OD门实现多设备的读写操作,通过ID区别设备,通过CRC5完成数据校验.常见对于one-wire总线的操作代码主要使用包含基 ...

  5. STM32 进阶教程 19 - IQmath数学库的使用

    前言 STM32 M3 系列是不带浮点运算单元的,小数运算都是采用定点转浮点试式实现的,本节给大家介绍一个很好用的定点转浮点数学运算库,IQmath是德州仪器 (TI) 的一个高度优化的高精度数学函数 ...

  6. STM32 进阶教程 16 - ADC1与ADC2同步采样

    前言 STM32中在有2个或以上ADC模块的产品中,可以使用双ADC模式.在双ADC模式里,根据ADC1_CR1寄存器中DUALMOD[2:0]位所选的模式,转换的启动可以是ADC1主和ADC2从的交 ...

  7. STM32 进阶教程 18 – ADC间断模式

    前言 STM32 的ADC拥有连续扫描模式,也有间断模式,间断模式较扫描模式需要更多的触发事件才能完成所有的通道转换操作,在实际工程应用中,可以利用间断模式实现一些特殊应用.关于间断模式,在STM32 ...

  8. STM32 进阶教程 17 - ADC注入通道

    前言 STM32 的ADC的一个强大功能是支持触发注入功能,在103中每个ADC模块支持4个注入通道,每个注入通道具有独立的结果突存器,注入通道具有较规划通道更高的优先级,在实际工程应用中,注入通道更 ...

  9. STM32 进阶教程 15 - 串口DMA收发

    前言 串口操作相信大家一定很熟悉,如果你已经会串口的收发数据,并可以灵活使用轮询及中断方式对串口进行数据收发,那么恭喜你,学完本节内容后,也将可以学会串口的更高级操作方式,DMA方式,DMA操作串口可 ...

最新文章

  1. 三层交换机的热备实验
  2. C++网络包截取开发
  3. iView 实现可编辑表格
  4. STL之Map和MFC之CMap比较学习
  5. mysql表引擎修改
  6. C语言模拟实现标准库函数之qsort() 2
  7. 【树状数组 思维题】luoguP3616 富金森林公园
  8. InstantiationException in hadoop map reduce program
  9. 如何使用计算机改进生产线,计算机系统结构复习资料
  10. VS2010调试——“StdAfx.h“文件打不开
  11. 非常优秀的在线绘图网站分享
  12. 请简述一下”==”和”equals”的区别
  13. 54个提高PHP程序运行效率的方法(转载)
  14. ipc_perm 详解
  15. 北京十大办公室租赁平台,高性价比
  16. 自学通讯工程入门级_通信工程学习方法
  17. Redis入门篇(1)-类型技能
  18. 屏幕时间:管理与限制手机各APP使用时间——又名【限制儿童使用手机攻略】——相关主题【救救网瘾少年】
  19. 【软件工程总复习】第三章 需求分析(结构化分析)(数据分析)
  20. 求长方形的周长和面积c语言两个函数_「长方形的周长」C语言初级-输入长方形的两边长a和b,求长方形的周长和面积 - 金橙教程网...

热门文章

  1. 简单实现支付密码输入框 By HL
  2. visual studio 添加链接文件
  3. Google cpp style guide 之 include
  4. UA MATH567 高维统计II 随机向量9 图的Max-cut问题 0.878近似算法
  5. UA MATH571A 多元线性回归IV 广义线性模型
  6. 一些 Windows 命令行学习
  7. windbg 脚本学习总结
  8. Python+selenium用法 上
  9. 二分图模板(女生赛要用)
  10. python note 11 函数名的使用、闭包、迭代器