HAL只提供了ms级的延时,但有些特殊场景,比如与通信速率较慢的设备通信时,会需要用到us级延时。STM32标准库一般是使用系统嘀嗒定时器来进行微妙级别的延时,而HAL库将SysTick定时器用做了库函数的超时定时器,使用的地方非常多,自己修改代码使用嘀嗒定时器的话就会引起错乱,所以此时就需要自己实现一个us级别延时函数。
这里介绍一种使用定时器设计us级延时函数的方法。
思路:我们将定时器设置为1MHZ的计数频率,这样定时器计一个数就是1us,我们就可以通过定时器计数值得知计时时间。
以使用TIM1为例,这里我们采用STM32F103内部8MHz晶振,故需要设置预分频系数PSC为8-1=7。同时配置PA1为GPIO输出模式,之后用于测试延时函数的效果。
Untitled
编写微秒延时函数:
/* USER CODE BEGIN PD */
#define DLY_TIM_Handle (&htim1) // Timer handle
/* USER CODE END PD */
/* USER CODE BEGIN PFP */
void delay_us(uint16_t nus);
/* USER CODE END PFP */
/* USER CODE BEGIN 4 */
void delay_us(uint16_t nus)
{
__HAL_TIM_SET_COUNTER(DLY_TIM_Handle, 0); // set the counter value a 0
__HAL_TIM_ENABLE(DLY_TIM_Handle); // start the counter
// wait for the counter to reach the us input in the parameter
while (__HAL_TIM_GET_COUNTER(DLY_TIM_Handle) < nus);
__HAL_TIM_DISABLE(DLY_TIM_Handle); // stop the counter
}
/* USER CODE END 4 */
编写微秒延时函数测试程序,使PA1高低电平间隔100us转换一次:
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_1);
delay_us(100);
}
/* USER CODE END 3 */
烧录程序,通过逻辑分析仪观察PA1电平变化:
可以看到PA1高电平持续时间和低电平持续时间都和符合100us的预设,延时效果较好。
关键字:STM32 HAL库 微秒延时
引用地址:
STM32基于HAL库实现微秒延时
推荐阅读最新更新时间:2024-11-12 15:34
STM32 Cubemax(二)——串口实现HC-05蓝牙模块与手机通信
使用的蓝牙 本文使用的蓝牙是市面上常用的HC-05蓝牙模块 其引脚和STM32的连接为 STM32Cubemax配置 前面配置时钟树的基础操作就不演示了 配置串口通信,注意波特率要选择9600,一般出厂的HC-05的默认与单片机通信波特率为9600 我这里还开启了DMA,方便测试蓝牙的接收功能 然后直接生成工程就ok了 手机连接蓝牙 若正常连接上电时,蓝牙模块会有红灯快闪,表示未连接。 手机使用蓝牙调试助手,可以自行在商店下载,然后可以看到出现蓝牙HC-05的名称(默认名称是蓝牙HC-05) 选择连接后,若成功连接,蓝牙模块的红灯会变成一秒两闪,表示连接成功 代码编写 重写printf函数,方便发送
[单片机]
STM32的二乘二取二的光通信系统设计
引言 目前,大量站间传输设备的CPU采用的是Intel 51系列芯片或者。x86系列PC兼容机,而ARMv7系列中Cortex—M4内核在嵌入式系统中应用更加广泛。意法半导体公司STM32是以Cortex—M3处理器为内核的,该处理器具有门数目少、中断延迟短、调试成本低的特点,是为要求有快速中断响应能力的深度嵌入式应用而设计的,STM32从性能到片上资源都比原传输设备的CPU更具有竞争力。综上,采用STM32作为各个板块的CPU,重点对基于STM32的二乘二取二系统进行设计。 1 光通信传输设备位置及作用 基于光通信站间安全信息传输设备是以计算机技术和光通信技术为基础,利用光纤或光通道取代传统的电缆或架空明线作为站间信
[单片机]
STM32开发笔记21: USB驱动的移植
单片机型号:STM32L053R8T6 现在使用的STM32L053R8T6单片机带有USB接口,原先一直使用UART转USB芯片来完成USB功能的支持,现在这款单片机带了就希望使用以下。由于已经建立了自己的工程目录,再重新使用STM32CubeMX生成的工程文件,重新建立是不显示的,所以本文探索将USB驱动文件移植到自己项目中的方法,我使用的是USB的CDCD类,步骤如下: 1、使用STM32CubeMX使能USB,如下图所示: 2、设置时钟,USB需要48M时钟,使用内部和外部均可,我这里使用外部时钟。 3、生成工程文件。 4、在自己的工程目录中加入如下图所示的2个文件,如果此2个文件
[单片机]
STM32定时器之控制LED灯循环显示
/* 名称:STM32定时器之控制LED灯循环显示 说明:对于STM32来说,其定时器要比C51的定时器要多,功能也更复杂。 就数目来说来说,STM32的定时器可以分为基本定时器,通用定时器和高级定时器(还包括Systick、看门口定时器和窗口定时器)。就STM32F103,一般来说,它有2个高级定时器TIM1和TIM8、4个通用定时器TIM2/3/4/5、2个基本定时器TIM6和TIM7。而C51一般只有几个定时器。 就功能来说, STM32中: 对于基本定时器,其功能就是和C51差不多,只有定时功能。 对于通用定时器,它的功能有定时、输出比较、输入捕获。虽然目前,我也不知道后面两个功能是干啥的。 对于高级定
[单片机]
STM32单片机编程printf()函数重定向
在stm32单片机编程中,可以重定向printf()函数来输出调试信息。 编写fputc()函数 其实printf()函数在头文件中被定义成了一个宏,会调用到fputc()函数,但在stm32单片机编程中不可以直接调用标准库的fputc()函数进行输出信息,需要自己编写fputc()函数供printf()函数来调用。编译器进行编译时首先会调用自己编写的fputc()函数,而不是库函数。 int fputc(int ch, FILE*f) { USART_SendData(USART1, (uint16_t)ch); //通过串口输出
[单片机]
STM32 M0时钟配置
本文主要讲STM32 M0的时钟配置。 先来看看M0内核的时钟树(stm32f072) 图中可以看出,M0芯片的时钟源有4个,一个高速内部RC时钟源,频率为8M;一个高速外部时钟源,频率为8到32MHz;一个低速外部时钟源,频率一般为32.768kHz;一个低速内部时钟源,频率为40kHz; 一、HSI 芯片上电的时候默认启用内部RC震荡,即8MHz的内部时钟源,如果对时钟要求不是特尔高的时候,使用内部时钟也够了,省下一个外部晶振的钱。 下面首先说说使用内部时钟的配置,官方提供的demo默认的就是使用内部时钟的,我们先从时钟树分析,HSI(8MHz)启动,经过PLLSRC(锁相环时钟源选择寄存器),然后来到PREDIV(预分频
[单片机]
使用变参函数实现STM32串口的简易printf功能
第一,去掉了原来使用的goto语句,因为C语言中除了错误处理之外,不建议使用goto语句; 第二,fmt和pnt的含义更加明确,它们始终指向下一个需要处理的字符和变参; 第三,整理了程序结构,使它更加清晰。 void uart_printf(USART_TypeDef *USARTx, char *fmt, ...) { char *pnt = (char *)&fmt + sizeof(fmt); int len; while (*fmt != '') { if (*fmt == '%') { if (*(fmt + 1) == 'c') { uart_send_byte(
[单片机]
将STM32的标准库编译成lib库
以前一直使用STM32的标准库,需要一步步地将代码加进去,将编译选项设置好,然后再编译整个工程。这个编译过程是一个相当慢的过程!完全编译大约需要一支烟的时间。每次建立工程都这么编译,是一个相当浪费时间和香烟的过程。 于是,我有了将库编译成lib文件的想法。本文就是我将STM32F4的标准库编译成lib文件并在工程中使用的过程。 适用对象: 熟悉库,不想再看库里边代码 有稳定的库,库文件更新不频繁 库文件多,每次编译时间长 下面是我将STM32F4的标准库编译成lib并在工程中使用的过程: 1、建立创建lib的工程 2、将库文件拷贝到工程目录: 将库里边目录STM32F4xx_StdPeriph_lib v1.0.
[单片机]