STM32 HAL库中实现uS延迟的3种方法

CU BEMX的可视化初始化配置与HAL库结合在一起,为我们带来了很多开发上的便利,但是HAL库封装的延迟功能目前仅支持ms级延迟。

Us延迟在许多日常情况下都会使用,尤其是在某些情况下。

传感器的数据读取过程对时序有严格的要求,而us延迟是必不可少的。

基于此要求,我将介绍三种实现美国延迟的方法。

该方法也适用于标准库。

缺点也请指出。

实验的目的是使用普通的定时器来实现我们的延迟。

使用Systick功能实现我们的延迟。

使用for循环来实现我们的延迟。

1.普通计时器实现我们的延迟。

使用定时器TIM2来实现我们的延迟。

使用cubemx配置项目。

时钟是MCU的心脏。

首先配置时钟。

1.1。

内部RC高速时钟也可以用于外部时钟选择。

这次我们主要介绍外部高速时钟的使用。

上图:8M晶体焊接在我的板上。

如果板子不是8M,请根据自己的晶振频率进行配置。

在左侧的圆圈1中,您可以根据自己的晶体频率输入相应的频率。

经过分频和倍频后,系统时钟频率最大设置为168MHZ,APB1的时钟频率为84MHZ,以后也将使用TIM2上安装的时钟源的频率。

1.2。

TIM2基本配置这比较简单,分频系数为83,计数单位为84MHZ / 84 = 1uS,向上计数模式,周期为65535,因为不使用中断,因此无需打开中断。

时钟和计时器的配置已完成,以下是cubemx生成项目时的几种设置,建议您检查它们。

首先是HAL库是否需要包含所有文件。

我们选择只需要使用的文件。

这样可以缩短项目的编译时间,仅编译我们使用的库文件,然后检查以为每个外围设备生成一个单独的.c。

.h文件,必须检查这个建议,这将使代码结构非常清晰,第三点非常重要,使用cubemx的朋友在重新生成项目后是否每次都遇到过,之前添加的文件都消失了,如果这项目被选中,用户文件将被保留。

然后是编译器的选择,您可以根据自己喜欢的IDE进行选择,我选择了KEIL5。

至此,配置工作完成,可以生成项目。

1.3。

代码实现/ *通用计时器实现了我们的延迟* / void user_delaynus_tim(uint32_t& ns){ //设置计时器2的技术初始值__HAL_TIM_SetCounter(& htim2,differ); //启动计时器HAL_TIM_Base_Start(& htim2); while(& nbsp;< 0xffff-5)& nbsp; {& nbsp;& nbsp; differ& nbsp; =& nbsp; __ HAL_TIM_GetCounter(& amp; htim2);& nbsp;}} ; //关闭计时器HAL_TIM_Base_Stop(& amp; htim2);} / * 普通计时器可以实现ms延迟,您可以直接使用HAL库函数HAL_delay()* / void delay_ms_tim(uint16_t& nbsp; nms ){  ; uint32_t& nbsp; i; for(i = 0; i1000);} 1.4。

通过延迟翻转IO来实现效果。

逻辑分析仪测试延迟时间。

延迟时间分别为20us和500ms。

以下是测量图:2. Systick函数实现我们使用Delay 2.1。

Systick CM3和CM4的简介包括系统计数器SysTick,它是一个24位倒数计时器。

当计数达到0时,它将自动从RELOAD寄存器中重新加载时序初始值。

只需将其放入SysTick->清除CTRL中的启用位,它将始终存在。

寄存器介绍:相应代码在core_cm4.h / **中。

rief& nbsp;& nbsp;结构& nbsp;类型& nbsp;访问& nbsp;系统& nbsp; Timer& nbsp;(SysTick)。

& nbsp; * / typedef 结构{& nbsp; & nbsp; __ IOM& nbsp; uint32_t& nbsp; CTRL; / *!& lt;偏移量:0x000(R / W)SysTick控制和状态寄存器* / __IOM / *!& lt;偏移量:0x004(R / W)SysTick重载值寄存器* / __IOM / *!& lt;偏移量:0x008(R / W)SysTick当前值寄存器* / __IM / *!& lt;偏移量:0x00C(R /)SysTick校准寄存器* /} SysTick控制和状态寄存器(0xE000_E010):该寄存器的位0:指示SysTick使能位,0指示关闭; 0指示关闭。

1表示亮; SysTick_CTRL_ENABLE_Mask;位1:指示SysTIck中断使能位0-表示关闭中断; 1-打开中断; SysTick_CTRL_TICKINT_Mask位2:表示

TOP