写在前面的话,为什么另需定时器进行微秒级延时。
1.在HAL固件库中只有使用Systick作为延时计数器,毫秒级延时HAL_Delay()。为了增加精确的微秒级延时,一般都是更改Systick配置参数,但HAL固件库许多地方都使用了HAL_Delay()函数,因此建议大家不要修改系统自动配置的Systick参数;
2.个人觉得到加入操作系统时要占用Systick,而MCU系统自身的时基还要选择其他的定时器,综上所述,对Systick做的更改基本白搭;
因此采用定时器控制微妙延时的方法,是比较灵活的。需要用户增加的代码很少,经济实用,节能环保- -;
步骤1.配置时钟
注意,一定要确定红色部分标记的晶振频率要与实际的晶振保持一致。
步骤2.配置定时器
在配置定时器时,需要明确以下几点:
1. 定时器时钟频率;
2. 定时器溢出频率;
首先,我们看一下比较重要的寄存器,如下所示:
用红线标记的地方可得:
定时器工作频率=**经过内部时钟分频的**APBx Timer Clock/PSC寄存器的值+1;
举个栗子,如下:
即定时器的时钟频率为84MHz,不用用内部时钟分频,要使定时器的工作频率为1MHz(1us),如下:
1MHz=84MHz/(83+1);
定时器的溢出频率=定时器的工作频率/arr
关于arr重载值何时载入,即发生溢出更新事件后,才会载入新值;
相关配置如下:
系统时钟配置,见上图;
这里我使用了TIM14通用定时器来进行1us延时,配置如下:
步骤3.编写代码
void delay_us(uint16_t us)
{
uint16_t differ=0xffff-us-5;
/*为防止因中断打断延时,造成计数错误.
如从0xfffE开始延时1us,但由于中断打断
(此时计数器仍在计数),本因计数至0xffff)
便停止计数,但由于错过计数值,并重载arr值,
导致实际延时(0xffff+1)us
*/
HAL_TIM_Base_Start(&htim14);
__HAL_TIM_SetCounter(&htim14,differ);
while(differ<0xffff-5)
{
differ=__HAL_TIM_GetCounter(&htim14);
}
HAL_TIM_Base_Stop(&htim14);
}
因为采用的是向上计数方式,因此需要转换一下,向下计数方式不用;
测试代码如下:
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);
delay_us(5);
}
/* USER CODE END 3 */
实际波形如下:
关键字:STM32 CubeMX 定时器 微秒延时
引用地址:
STM32CubeMX之定时器控制微秒延时详解
推荐阅读最新更新时间:2024-03-16 16:09
大联大友尚集团推出基于ST产品的小体积300W BLDC电机控制方案
2023年6月14日,致力于亚太地区市场的国际领先半导体元器件分销商---大联大控股宣布,其旗下友尚推出 基于意法半导体(ST)STM32G431芯片的小体积300W BLDC电机控制方案。 图示1-大联大友尚基于ST产品的小体积300W BLDC电机控制方案的展示板图 随着人们节能环保的意识不断提升,BLDC电机作为一种高效、环保、智能化的驱动技术,正逐渐成为各种电动化工具的的主流选择。在这种趋势下,大联大友尚推出了基于ST STM32G431 芯片的小体积300W BLDC电机控制方案,该方案有助于提高电动设备的能源效率,从而实现节能减排的目标。 本方案通过使用 STM32G431 撰写PMSM控制算法,并采
[单片机]
STM32之FLASH操作
说到STM32的FLSAH,我们的第一反应是用来装程序的,实际上,STM32的片内FLASH不仅用来装程序,还用来装 芯片 配置、 芯片 ID、自举程序等等。当然, FLASH还可以用来装数据。 自己收集了一些资料,现将这些资料总结了一下,不想看的可以直接调到后面看怎么操作就可以了。 FLASH分类 根据用途,STM32片内的FLASH分成两部分:主存储块、信息块。 主存储块用于存储程序,我们写的程序一般存储在这里。 信息块又分成两部分:系统存储器、选项字节。 系统存储器存储用于存放在系统存储器自举模式下的启动程序(BootLoader),当使用ISP方式加载程序时,就是由这个程序执行。这个区域由芯片厂写入BootLoa
[单片机]
剖析STM32-定时器2
4. 常用库函数 定时器参数初始化: void TIM_TimeBaseInit(TIM_TypeDef* TIMx,TIM_TimeBaseInitTypeDef*TIM_TimeBaseInitStruct); 结构体内部成员: typedef struct { uint16_t TIM_Prescaler; uint16_t TIM_CounterMode; uint16_t TIM_Period; uint16_t TIM_ClockDivision; uint8_t TIM_RepetitionCounter; } TIM_TimeBaseInitTypeDef; 声明方式(一般
[单片机]
【STM32】PWM 输出 (标准库)
一、PWM简介 PWM:脉冲宽度调制(Pulse width modulation,PWM) 脉冲宽度调制是一种模拟控制方式,根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而实现开关稳压电源输出的改变。这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字信号对模拟电路进行控制的一种非常有效的技术。脉冲宽度调制是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。——百度百科 二、PWM输出模式 PWM 输出就是对外输出脉宽(即占空比)可调的方波信号,信号频率由自动重装 寄存器 ARR 的值决
[单片机]
STM32JTAG调试接口PB3、PB4复用问题
JTAG 接口:主要用于芯片内部测试。现在多数的高级器件都支持JTAG协议,标准接线是4根线 TMS:JTAG接口模式选择 TCK:JTAG接口时钟 TDI:JTAG接口数据输入 TDO:JTAG接口数据输出 TRST:JTAG可选引脚,功能为 测试复位、输入引脚、低电平有效 SWD接口:串行调试(Serial Wire Debug),应该可以算是一种和JTAG不同的调试模式,使用的调试协议也应该不一样,所以最直接的体现在调试接口上。标准接线为2线 SWDIO:SWD数据线 SWDCLK:SWD时钟线 SWD与JTAG相比有许多优点: 1. SWD接口相比于JTAG更加可靠 2. 使用更少的GPIO,直
[单片机]
STM32入门之LED控制
为什么要学STM32? STM32是32位的单片机却只要八位单片机的价格,速度也是八位的好几倍。 更重要的是它作为ARM入门级的芯片比较容易掌握,网上资料也很多,很多人都在用。 STM32的IO端口有7个寄存器来控制,但是我们常用的就4个CRL CRH IDR ODR . 端口配置低寄存器(GPIOx_CRL) 端口配置高寄存器(GPIOx_CRH) 端口输入数据寄存器(GPIOx_IDR) 端口输出数据寄存器(GPIOx_ODR) 其中CRL 控制高8位的 IO CRH 低8 这两个实质是一样的。 对照我们AVR来看GPIOx_CRL就相当于DDRx ,GPIOx_ODR就相当于PORTx,G
[单片机]
STM32 关于定时器相关问题的探讨(二)
4.硬件设计 4.1LED驱动电路 利用单片机产生得PWM驱动电路直接驱动LED电路来验证,当输出PWM宽度变化时可以看到此时LED亮度变化,此时只需要将LED上拉就可以实现验证。当输入为低电平时,LED灯发光 4.2 SPWM滤波方案 利用高级定时器,我们能产生一系列PWM脉宽随时间变化的PWM波形,通过简单的RC滤波就可以将SPWM滤波成正弦波 5.软件设计过程 5.1 四路pwm输出配置 5.1.1 GPIO初始化 初始化引脚(PA6、PA7,PB0、PB1),这里拿出初始化PA6例子 GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RC
[单片机]
STM32窗口看门狗详解
本文将介绍窗口看门狗,并通过按键模拟触发程序死机、进而触发提前唤醒中断、并复位程序。 ①窗口看门狗介绍 ②STM32CUBEMX配置工程文件 ③代码实现 ①窗口看门狗介绍 窗口看门狗用来监测由于不可预知的因素或者不可预知的逻辑条件导致程序脱离正常运行序列的软件故障。 窗口看门狗介绍之工作原理框图: 窗口看门狗介绍之配置寄存器: 预分频器用于将RCC传来的PCLK1时钟进行分频,配置寄存器中第7位第8位用来存放预分频器的预分频值,第0位至第6位用于存放窗口看门狗的窗口值,当计数器的值大于窗口值时喂狗会触发复位、即只有计数器的值在0x40与窗口值之间时喂狗不会触发程序复位;所以窗口值需要大于0x40、小于0x7f,否则窗口没有
[单片机]