完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
STM32F407 使用HAL库延时微妙实现方法(STM32CubeMX配置)
不知道大家有没有遇到过这种情况,当你在移植别人的程序的时候,尤其是移植STM32的程序,从标准库移植到HAL库的时候,总是无奈延时微妙函数在HAL库中找不到,delay_us(u8 us); 很多次我都是用毫秒延时代替了, 但是,这样会使得程序的效率大大降低,所以通过参考别人的资料,通过定时器写了延时us函数,延时还是很准确的 1、我所使用的单片机型号及开发环境 **PS**: emmmmm… (这里并不是打广告,只是我个人使用的这个开发板,其他任何的开发板,只要主控芯片一样均可以) 开发环境如图,我是用的Cube+IAR, Keil5也可以的,都一样。 2、使用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电平反转一次,还是很精准的。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1760 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1613 浏览 1 评论
1058 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
721 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1670 浏览 2 评论
1932浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
724浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
564浏览 3评论
591浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
549浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-20 19:13 , Processed in 1.009913 second(s), Total 99, Slave 83 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号