STM32 进阶教程 3 - 软件实现高精度延时 1

前言

软件工程师在在实际项目开发过程中,软件延时想必或多或少都有接触过,诸如delay_s(x); delay_ms(x);delay_us(x)等类型的延时函数大家也一定见过或自已曾经实现过,本节给大家介绍一种在STM32 MCU平台上实现高精度(小于1us)软件延时的方法。本节介绍的高精度度软件延时方法以STM32 MCU特有的sysTime 定时器主基础,延时度度高,移植性强,通用性好。

 

示例详解

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

 

STM32 进阶教程 3 - 软件实现高精度延时 1_第1张图片

 

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

STM32 进阶教程 3 - 软件实现高精度延时 1_第2张图片

 

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

 

 

      1. 系统时钟树

STM32 进阶教程 3 - 软件实现高精度延时 1_第3张图片

      1. 定时器配置

STM32 进阶教程 3 - 软件实现高精度延时 1_第4张图片

      1. 引脚配置

STM32 进阶教程 3 - 软件实现高精度延时 1_第5张图片

STM32 进阶教程 3 - 软件实现高精度延时 1_第6张图片

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

STM32 进阶教程 3 - 软件实现高精度延时 1_第7张图片

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

STM32 进阶教程 3 - 软件实现高精度延时 1_第8张图片

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

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

STM32 进阶教程 3 - 软件实现高精度延时 1_第9张图片

STM32 进阶教程 3 - 软件实现高精度延时 1_第10张图片

 

    1. 编译工程,下载程序看效果:PC13引脚产生周期为100us 占空比为50%的方波信号,同时可以看到LED是常的,通过逻辑分析仪工具,可以看到PC13引脚上的波形:

 

细心的同学可能会发现延时50us实际上差不多是51us,周其也接近102us,这多出来的时间是哪里来的呢,其实这个多出来的时间是程序调用时间,比如调用delay_us()这个函数其自身是需要一定的时间的,还有HAL_GPIO_WritePin这个函数的调用其实是需要时间的。可以把HAL_GPIO_WritePin函数改成寄存器操作方式来实现可以看到时间小也0.2us左右。

STM32 进阶教程 3 - 软件实现高精度延时 1_第11张图片

通过上面的实例,我们已成功实现us级精度延时,虽然实际延时时会多设定的长一点点,但这已经可以满足绝大多数的软件延时用应需求。在delay.c中除了有delay_us函数外,还有delay_ms(),下面具体来讲解一下delay.c的原理及实现:

STM32 进阶教程 3 - 软件实现高精度延时 1_第12张图片

如上图所示,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时不够准确的问题。

 

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

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

下载|STM32进阶教程 3

STM32 进阶教程 3 - 软件实现高精度延时 1_第13张图片

 

关注十三公众号

 

你可能感兴趣的:(STM32CUBE,高精度延时)