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-5;
- HAL_TIM_Base_Start(&htim7);
- __HAL_TIM_SetCounter(&htim7,differ);
- while(differ < 0xffff-5)
- {
- differ = __HAL_TIM_GetCounter(&htim7);
- }
- HAL_TIM_Base_Stop(&htim7);
- }
效果见下图, 上面的代码我特别打出来, 方便大家复制
不要忘了在 tim.h 中对函数进行声明
OK, 接下来进行测试并用示波器显示
我们在主函数里面写入测试代码, 通过示波器观察波形及周期, 看一下延时是否成功及精确..
在主函数的 while(1)循环中写入上图所示测试代码, 理论结果是 PF9 引脚的输出电平每 100 微妙反转一次
示波器延时的波形如下图
这里我们可以看到, 周期为 200.8us, 即 100.4us 电平反转一次, 还是很精准的
是梦别怕疼, 想赢别喊停! 加油吧!
来源: https://www.cnblogs.com/kevin-nancy/p/10696681.html