STM32基于HAL库实现微秒延时

发布者:TranquilJourney最新更新时间:2024-09-04 来源: elecfans关键字:STM32  HAL库  微秒延时 手机看文章 扫描二维码
随时随地手机看文章

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库实现微秒延时

上一篇:ROS与STM32串口通信代码
下一篇:stm32怎么读取io口输入电平

推荐阅读最新更新时间:2024-11-18 18:28

STM32如何设置定时器
STM32如何设置定时器 下面以stm32的TIM2作为实例一步步配置成为定时器: 第一种 对定时器的基本配置 TIM_TimeBaseStructure.TIM_Period = 1000; //设置自动装载寄存器 TIM_TimeBaseStructure.TIM_Prescaler = 35999; //分频计数 TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //选择向上计数 TIM_TimeBaseInit(TIM2, &TIM_
[单片机]
STM32学习笔记(三)------GPIO口寄存器的操作与使用
1、STM32 的每个 IO 端口都有 7 个寄存器来控制 (1)配置模式的 2 个 32 位的端口 配置寄存器 CRL 和 CRH (2)2 个 32 位的数据寄存器 IDR 和 ODR (3)1 个 32 位的置位/复位寄存器 BSRR (4)一个 16 位的复位寄存器 BRR (5)1 个 32 位的锁存寄存器 LCKR。 2、每个GPIO端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH)分别控制每个端口的高八位和低八位,如果IO口是0-7号的话,则写CRL寄存器,如果IO口是8-15号的话,则写CRH寄存器,两个32位数据寄存器(GPIOx_IDR,GPIOx_ODR)一个是只读作输入数据寄存器,一个
[单片机]
stm32点亮LED灯一(库函数版)
学习51单片机的第一个控制IO口的操作就是流水灯,stm32的学习我也是从一个流水灯开始,是stm32是32位机,里面有很多的寄存器,操作stm32单片机也可以使用寄存器操作,使用寄存器操作的好处就是程序的执行速度快,程序的体积小,但是,问题也有很多,比如不方便移植,stm32不同型号的寄存器是有差别的,同时开发的效率低,因为操作寄存器需要频繁地查芯片手册。 权衡了一下,我选用库函数点亮LED。 第一步,建立环境,我选用的单片机是stm32f103c8,下载器是st-link,编译软件是keil5. 首先,我需要配一个库,因为库我只需要GPIO,所以我就只用GPIO库。开始说正事。 建立几个文件夹先(显得比较专业)
[单片机]
<font color='red'>stm32</font>点亮LED灯一(库函数版)
stm32嵌入式操作系统具有怎样的优缺点
  STM32简单介绍   一、背景   如果你正为项目的处理器而进行艰难的选择:一方面抱怨16位单片机有限的指令和性能,另一方面又抱怨32位处理器的高成本和高功耗,那么,基于 ARM Cortex-M3内核的STM32系列处理器也许能帮你解决这个问题。使你不必在性能、成本、功耗等因素之间做出取舍和折衷。   即使你还没有看完STM32的产品手册,但对于这样一款融合ARM和ST技术的“新生儿”相信你和我一样不会担心这款针对16位MCU应用领域 的32位处理器的性能,但是从工程的角度来讲,除了芯片本身的性能和成本之外,你或许还会考虑到开发工具的成本和广泛度;存储器的种类、规模、性能和容 量;以及各种软件获得的难易,我相信你看完本
[单片机]
<font color='red'>stm32</font>嵌入式操作系统具有怎样的优缺点
stm32专题二十六:测量PWM 频率 + 占空比
实验的基本原理: 利用通用定时器产生4路占空比不同的PWM波形(频率100k,占空比0.5 0.4 0.3 0.2); 利用高级定时器的PWM输入模式来测量PWM参数; 有几个值得注意的地方: 捕获寄存器CCR1和CCR2的值在计算占空比和频率的时候必须加1; 计数周期不能设置的太小,如果我们设置的计数周期 PWM周期,那么就无法捕获PWM脉冲,一般驱动电机的PWM是10k ~ 25kHz,当设置的周期为1ms,对应频率为1kHz,那么就可以捕获1kHz以上的PWM 信号; 下面是测量pwm的代码: bsp_AdvanceTim.c #include bsp_AdvanceTim.h static void
[单片机]
<font color='red'>stm32</font>专题二十六:测量PWM 频率 + 占空比
STM32使用STM32CubeMX配置烧录后无法识别设备的解决方法
近来闲下来了,想用下STM32CubeMX,咱也赶赶潮流,摸索了一下,点了个灯,完美。再把灯灭了吧,但发现找不到SW设备。这是怎么回事?我重新设置了Keil,不行;重新用STM32CubeMX生成,也不行。难道我的板就这样废了吗?我在网上寻找答案,最后锁定应该是SW端口没设置好,导致无法烧录。经过一番搜寻和探索,最终得到了解决方法。 造成SW失效的原因是我在配置STM32CubeMX时没有配置SW,如图所示,找到SYS选项里的Debug,选择你的下载器。 那么在无法下载程序的情况下我们又该如何下载呢?我的方法是按住复位按钮,点Keil的下载。当然有的人是没引出复位按钮的,那么也可以通过设置boot来操作,具体
[单片机]
<font color='red'>STM32</font>使用STM32CubeMX配置烧录后无法识别设备的解决方法
【stm32f407】stm32串口实验
一.串口理论 串口作为MCU的重要外部接口,同时也是软件开发重要的调试手段,其重要性不言而喻。现在基本上所有的MCU都会带有串口,STM32自然也不例外。 STM32F407VGT6内嵌四个通用同步/异步接收器(USART1,USART2,USART3和USART6) 和两个通用异步收发器(UART4和UART5),如图: 另外,usart和uart的差异在于usart是同步串口(亦可用于异步串口),uart是异步串口,差异如下: 同步通信:带时钟同步信号传输。 异步通信:不带时钟同步信号。 按照数据传送方向,分为: 单工:数据传输只支持数据在一个方向上传输 半双工:允许数据在两个方向上传输,
[单片机]
【stm32f407】<font color='red'>stm32</font>串口实验
STM32中断优先级详解
一、STM32中断优先级属性 STM32有两种优先级属性,分别为抢占式优先级和响应式优先级。其中,响应式优先级也称为副优先级。 具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套。 当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。 二、STM32中断优先级数目分组 STM32为了适应不同的优先级组合
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved