STM32F407 使用HAL库延时微妙实现方法(STM32CubeMX配置)

作者 : 李剀
出处 :

https://www.cnblogs.com/kevin-nancy/p/10696681.html

或者

https://blog.csdn.net/Kevin_8_Lee/article/details/89243195

欢迎转载,但也请保留上面这段声明。 谢谢! (以上两个链接均是我个人的博客,只是在不同的平台上面)

先说一下为什么写这篇博客。

不知道大家有没有遇到过这种情况,当你在移植别人的程序的时候,尤其是移植STM32的程序,从标准库移植到HAL库的时候,总是无奈延时微妙函数在HAL库中找不到,delay_us(u8 us);   *很多次我都是用毫妙延时代替了*, 但是,这样会使得程序的效率大大降低,所以通过参考别人的资料,通过定时器写了延时us函数,延时还是很准确的

1、我所使用的单片机型号及开发环境

PS: emmmmm.... (这里并不是打广告,只是我个人使用的这个开发板,其他任何的开发板,只要主控芯片一样均可以)

开发环境如图,我是用的Cube+IAR, Keil5也可以的,都一样。

使用Cube配置定时器TIM7

PS: 每个定时器都可以,但是最好使用最低级的定时器,TIM7和TIM8都只能定时,所以我这里用的TIM7

这里我新建一个工程演示

选择STM32F407zg芯片

RCC和SYS配置就不截图了,大家都会的
时钟树配置如下图

通过查看STM32F407的数据手册可以知道

TIM7的频率就是APB1的频率,84MHz

TIM7配置:预分频系数为84-1 (83)
自动重载值 1

(这里的自动重载(arr)一定要设置为1,不能为0,否则无法得到正确的结果)

则TIM7的溢出频率 = 84MHz / (83 + 1) = 1MHz(1us)

在IAR或者MDK编译器中写代码

在tim.c文件里面添加代码,一定要写在
/* USER CODE BEGIN 1 */

/* USER CODE END1 */
之间,否则下次在Cube中有所更改,再重新生成文件,不在规定区域的代码会消失

 void delay_us(uint16_t us)
{
uint16_t differ=0xffff-us-; HAL_TIM_Base_Start(&htim7);
__HAL_TIM_SetCounter(&htim7,differ);
while(differ < 0xffff-)
{
differ = __HAL_TIM_GetCounter(&htim7);
}
HAL_TIM_Base_Stop(&htim7); }

效果见下图,上面的代码我特别打出来,方便大家复制

不要忘了在tim.h中对函数进行声明

OK, 接下来进行测试并用示波器显示

我们在主函数里面写入测试代码,通过示波器观察波形及周期,看一下延时是否成功及精确。。

在主函数的while(1)循环中写入上图所示测试代码,理论结果是PF9引脚的输出电平每100微妙反转一次

示波器延时的波形如下图

这里我们可以看到,周期为200.8us, 即100.4us电平反转一次,还是很精准的

是梦别怕疼,想赢别喊停!      加油吧!

STM32F407 使用HAL库延时微妙实现方法(附CubeMX配置过程)的更多相关文章

  1. HAL库延时、SYCCNT与SYSTICK

    HAL库驱动中,由于某些外设的驱动需要使用超时判断(比如I2C.SPI.SDIO等),需要精确延时(精度为1ms),使用的是SysTick,但是在操作系统里面,我们需要使用SysTick来提供系统时基 ...

  2. STM32 HAL库学习系列第1篇 ADC配置 及 DAC配置

    ADC工作均为非阻塞状态 轮询模式 中断模式 DMA模式 库函数: HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc);//轮询模式,需放 ...

  3. STM32 HAL库学习系列第2篇 GPIO配置

    GPIO 库函数 基本就是使用以下几个函数 GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); void H ...

  4. nodejs备忘总结(一) -- node和express安装与配置,新建简单项目(附安装配置过程中遇到问题的解决方法)

    安装node 本文以安装node_v8.9.0为例(win10环境),下载node-v8.9.0-x64.msi插件 下载后,安装,安装目录默认为C:\Program Files\nodejs 配置环 ...

  5. SM32 USART与USB接收不定数据方法,标准库、HAL库都适用

    很多时候,我们使用串口或USB接收数据时,往往不知道PC端会发多长的数据下来, 为了解决这个不定数据接收问题,在此各提供一个解决思路. 串口数据不定接收: 由于STM32单片机带IDLE中断,所以利用 ...

  6. stm32 HAL库笔记(零)

    最近在设计四旋翼飞行器,用stm32f407,有三种开发方式可以选择:一.寄存器开发.二:库函数开发.三:HAL库开发,考虑了一下,选择了HAL库,原因如下: 1. 寄存器开发相对较慢,寄存器很多,配 ...

  7. STM32 之 HAL库(固件库) _

    1 STM32的三种开发方式 通常新手在入门STM32的时候,首先都要先选择一种要用的开发方式,不同的开发方式会导致你编程的架构是完全不一样的.一般大多数都会选用标准库和HAL库,而极少部分人会通过直 ...

  8. STM32 之 HAL库(固件库)

    1 STM32的三种开发方式 通常新手在入门STM32的时候,首先都要先选择一种要用的开发方式,不同的开发方式会导致你编程的架构是完全不一样的.一般大多数都会选用标准库和HAL库,而极少部分人会通过直 ...

  9. STM32 ADC多通道转换DMA模式与非DMA模式两种方法(HAL库)

    一.非DMA模式(转) 说明:这个是自己刚做的时候百度出来的,不是我自己做出来的,因为感觉有用就保存下来做学习用,原文链接:https://blog.csdn.net/qq_24815615/arti ...

随机推荐

  1. Python之模块二

    10>常用模块: 1>os模块: os.getcwd():获取当前工作目录,即当前python脚本工作的目录路径: os.chdir("dirname"):改变当前脚本 ...

  2. [转发]Oauth 1.0 1.0a 和 2.0 的之间的区别有哪些?

    原文地址:http://www.zhihu.com/question/19851243

  3. 7z文件格式及其源码的分析(二)

    这是第二篇, 第一篇在这里: 这一篇开始分析7z的源码结构. 一. 准备工作: 1. 源码下载: 可以从官方中文主页下载:http://sparanoid.com/lab/7z/. 为了方便, 这里直 ...

  4. [linux] 查看SATA速度和具体设备

    查看SATA速度和具体设备 SATA 速度确认 方法一 dmesg |grep SATA 输出 [ 2.977661] ahci 0000:00:17.0: AHCI 0001.0301 32 slo ...

  5. TSQL--可以在触发器中使用COMMIT吗?

    很多场景中,我们使用触发器来回滚一些不满足业务逻辑的修改,这没有问题,问题是我能在触发器中提交事务吗? 这个问题很小白,当也来测试一下 /*测试中创建三种表,对表 TB2 插入时触发触发器,在触发器中 ...

  6. 微信开发之c#下缓存jssdk的access_token

    因为access_token的寿命只有7200秒,每日获取access_token存在上限,所以在获取access_token后,需要将其缓存起来. 首先建立一个模型 public class Acc ...

  7. 忽略warning 警告

    1

  8. kvm虚拟机磁盘文件读取小结

    kvm虚拟机磁盘挂载还真不是一帆风顺的.xen虚拟化默认就raw格式的磁盘,可以直接挂载,kvm如果采用raw也可以直接挂载,与xen磁盘挂载方式一致. 1.kvm虚拟化相比xen虚拟化来说,工具与方 ...

  9. 【bzoj5084】 hashit(广义SAM+set)

    题面 传送门 题解 后缀平衡树是个啥啊我不会啊-- 那么我们来考虑一下\(SAM\)的做法好了 不难发现它的本义是要我们维护一棵\(trie\)树,并求出\(trie\)树上每一个节点到根的这段串的不 ...

  10. JavaScript 实现用户点击图片放大

    JavaScript 实现用户点击图片放大 一.契机 情况是这样的,之前推荐朋友去建站.后面他专门写了一篇文章说如何实现 "用户点击图片实现放大效果",俺就好好 "拜读& ...