STM32F407 使用HAL库延时微妙实现方法(附CubeMX配置过程)
STM32F407 使用HAL库延时微妙实现方法(STM32CubeMX配置)
作者 : 李剀
出处 :
或者
欢迎转载,但也请保留上面这段声明。 谢谢! (以上两个链接均是我个人的博客,只是在不同的平台上面)
先说一下为什么写这篇博客。
不知道大家有没有遇到过这种情况,当你在移植别人的程序的时候,尤其是移植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配置过程)的更多相关文章
- HAL库延时、SYCCNT与SYSTICK
HAL库驱动中,由于某些外设的驱动需要使用超时判断(比如I2C.SPI.SDIO等),需要精确延时(精度为1ms),使用的是SysTick,但是在操作系统里面,我们需要使用SysTick来提供系统时基 ...
- STM32 HAL库学习系列第1篇 ADC配置 及 DAC配置
ADC工作均为非阻塞状态 轮询模式 中断模式 DMA模式 库函数: HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc);//轮询模式,需放 ...
- STM32 HAL库学习系列第2篇 GPIO配置
GPIO 库函数 基本就是使用以下几个函数 GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); void H ...
- nodejs备忘总结(一) -- node和express安装与配置,新建简单项目(附安装配置过程中遇到问题的解决方法)
安装node 本文以安装node_v8.9.0为例(win10环境),下载node-v8.9.0-x64.msi插件 下载后,安装,安装目录默认为C:\Program Files\nodejs 配置环 ...
- SM32 USART与USB接收不定数据方法,标准库、HAL库都适用
很多时候,我们使用串口或USB接收数据时,往往不知道PC端会发多长的数据下来, 为了解决这个不定数据接收问题,在此各提供一个解决思路. 串口数据不定接收: 由于STM32单片机带IDLE中断,所以利用 ...
- stm32 HAL库笔记(零)
最近在设计四旋翼飞行器,用stm32f407,有三种开发方式可以选择:一.寄存器开发.二:库函数开发.三:HAL库开发,考虑了一下,选择了HAL库,原因如下: 1. 寄存器开发相对较慢,寄存器很多,配 ...
- STM32 之 HAL库(固件库) _
1 STM32的三种开发方式 通常新手在入门STM32的时候,首先都要先选择一种要用的开发方式,不同的开发方式会导致你编程的架构是完全不一样的.一般大多数都会选用标准库和HAL库,而极少部分人会通过直 ...
- STM32 之 HAL库(固件库)
1 STM32的三种开发方式 通常新手在入门STM32的时候,首先都要先选择一种要用的开发方式,不同的开发方式会导致你编程的架构是完全不一样的.一般大多数都会选用标准库和HAL库,而极少部分人会通过直 ...
- STM32 ADC多通道转换DMA模式与非DMA模式两种方法(HAL库)
一.非DMA模式(转) 说明:这个是自己刚做的时候百度出来的,不是我自己做出来的,因为感觉有用就保存下来做学习用,原文链接:https://blog.csdn.net/qq_24815615/arti ...
随机推荐
- js防windos锁屏功能实现
<li class="layui-nav-item"> <a href="javascript:;" id="lock"& ...
- centos 6.5下安装mysql
1.检测系统是否已经安装过mysql或其依赖,若已装过要先将其删除,否则第4步使用yum安装时会报错: 1 # yum list installed | grep mysql 2 mysql-libs ...
- 用Java实现多线程服务器程序
一.Java中的服务器程序与多线程 在Java之前,没有一种主流编程语言能够提供对高级网络编程的固有支持.在其他语言环境中,实现网络程序往往需要深入依赖于操作平台的网络API的技术中去,而Java提供 ...
- Android 画闹钟
1.今天就来模仿一下这个小闹钟的 2.思路: 先画闹钟的圆盘 ,在通过Path来画指针 两个耳朵其实就是用两个圆被一个大圆截取后留下的,并旋转一定度数后生成 3.直接上代码: public class ...
- WPF 简洁的主界面
用的是dev的TileLayouotControl控件. <dxwui:PageAdornerControl Header="" Padding="30" ...
- C# TinyIOC简单用法
先添加一个接口 namespace IContract { public interface IBase { void ShowMessage(); } } 再添加两个实现类 namespace Co ...
- EasyFastCMS系列教学课程——2、底层代码 ModelHelper与SQLHelper简介
从本节课开始,我们开始逐步正式进入实际的编码过程中.本节课的核心内容为SQLHeelper和ModelHelper两个核心类库的介绍. SQLHelper这个类相信大家都很熟悉了,他是微软petsho ...
- 牛客网提高组模拟赛第五场 T1同余方程(异或)(位运算)
区间不好做,但是我们可以转化成前缀来做.转化为前缀之后之后就是二维前缀和. 但是我还是不怎么会做.所以只能去看吉老师的题解 (确定写的那么简单真的是题解???). 我们要求模一个数余0,就等于找它的倍 ...
- NOIP提高组题目归类+题解摘要(2008-2017)
因为前几天作死立了一个flag说要把NOIP近十年的题目做一做,并写一个题目归类+题解摘要出来,所以这几天就好好的(然而还是颓废了好久)写了一些这些往年的NOIP题目. 这篇博客有什么: 近十年NOI ...
- 玩转MongoDB
一.主从复制 1)首先主从服务器在启动的时候,分别要设置master.slave选项,对于slave可以启动中设置源,也可以在启动后设置源. 如:主:mongod --dbpath=/data/mon ...