前言
软件工程师在在实际项目开发过程中,软件延时想必或多或少都有接触过,诸如delay_s(x); delay_ms(x);delay_us(x)等类型的延时函数大家也一定见过或自已曾经实现过,本节给大家介绍一种在STM32 MCU平台上实现高精度(小于1us)软件延时的方法。本节将接着上一讲 “STM32 进阶教程 3 - 软件实现高精度延时 1” 继续介绍的高精度度软件延时的实现与精度提高。
示例详解
基于硬件平台: STM32F10C8T6最小系统板, MCU 的型号是 STM32F103c8t6, 使用stm32cubemx 工具自动产生的配置工程,使用KEIL5编译代码。
本示例所用的最小系统板原理图:
-
- 关于CUBEMX工具及KEIL工具的操作将不再细讲,如果还有不熟悉的可以查看之前的教程文档。下面直接介绍工程配置:
-
-
- 系统时钟树
-
-
- 定时器配置
-
-
- 引脚配置
-
-
- 中断配置(保持默认)
-
-
工程代码
- 将事先准备好的delay.c和delay.h文件加到工程中,
Delay.h文件放在INC文件夹下即可。
-
-
- 在main.c 中加入如下图所示代码:
上一讲我们演示了延时50us实际延时效果,发现精度会有一0.5-1us左右的偏差:
这一节我们直看看延时1us及2us的效果:
发现同样有0.5-1us左右的偏差,显然这个时候的延时误差相对于延时量来说有些偏大,我们用如下方式来实现,较上一讲的订要更改为图中红框部分:
-
- 编译工程,下载程序看效果:通过逻辑分析仪工具,可以看到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
关注十三公众号