找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7308|回复: 4
收起左侧

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

[复制链接]
ID:350579 发表于 2019-4-12 17:52 | 显示全部楼层 |阅读模式
STM32F407单片机使用HAL库延时微妙实现方法


作者 : 李剀
出处 :

或者




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



这是我在其他平台写的博客,现在搬运至51黑,分享给各位小伙伴,同样,如果各位转载的话请务必声明来源


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


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



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

开发板.jpg



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


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





2、使用Cube配置定时器TIM7

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


这里我新建一个工程演示

新建工程.jpg 选择STM32F407zg芯片


选择STM32F407.jpg

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


时钟树配置.jpg

通过查看STM32F407的数据手册可以知道
TIM7的频率就是APB1的频率,84MHz


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


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

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



TIM7配置.jpg



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


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

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



  1. void delay_us(uint16_t us)
  2. {
  3.         uint16_t differ=0xffff-us-5;

  4.         
  5.         HAL_TIM_Base_Start(&htim7);
  6.         __HAL_TIM_SetCounter(&htim7,differ);
  7.         while(differ < 0xffff-5)
  8.         {
  9.                 differ = __HAL_TIM_GetCounter(&htim7);
  10.         }
  11.         HAL_TIM_Base_Stop(&htim7);

  12. }
复制代码

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



延时微妙c.jpg



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


延时声明.jpg



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


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

测试代码.jpg



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


示波器延时的波形如下图
示波器波形.jpg


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

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











评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:212177 发表于 2019-4-13 09:37 来自手机 | 显示全部楼层
我一般用定时器中断来延时,不过你这个方法作为代码移植中的延时也很不错
回复

使用道具 举报

ID:693691 发表于 2020-2-15 21:38 | 显示全部楼层
为什么我实现不了呢?
回复

使用道具 举报

ID:731111 发表于 2020-4-22 11:26 | 显示全部楼层
Error: L6218E: Undefined symbol __HAL_TIM_SetCounter (referred from main.o).
回复

使用道具 举报

ID:448720 发表于 2020-6-16 11:27 | 显示全部楼层
while(differ < 0xffff-5)
        {
                differ = __HAL_TIM_GetCounter(&htim7);
        }

  一直死在这里
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表