完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
#include "delay_us.h"
delay_us(n_us) { uint32_t load_ms, load_us, n_us_tick, a_tick, end_tick, now_tick; load_ms=systick->LOAD; load_us=systick->LOAD/1000; n_us_tick=n_us*load_us; a_tick=systick->VAL; if(a_tick>=n_us_tick) { end_tick=a_tick-n_us_tick; do { now_tick=systick->VAL; }while (now_tick else { end_tick=load_ms-n_us_tick+a_tick; do { now_tick=systick->VAL; }while ((now_tick>n_us_tick)&&(now_tick } |
|
相关推荐
5个回答
|
|
|
|
|
|
感觉可以这样: systick时钟定义为系统时钟,假设72M, 定义一个全局的U64 Tickcount,systick自动加载值设为0xffffff, systick中断里, Tickcount=Tickcount+(1<<25), 延时函数里当前系统tick值=Tickcount+systick->VAL, 延时2毫秒就等到Tickcount+systick->VAL>=当前系统tick值+2*(72000000/1000), 64位按照72M的 频率计数, 要8千多年, systick中断一秒中断4-5次,系统影响也不大,不过中断级别一定要高,至少要高于任何用到延时的中断优先级,个人感觉这样用问题不大
|
|
|
|
jsdoa 发表于 2019-3-26 14:39 延时2u秒就等到Tickcount+systick->VAL>=当前系统tick值+2*(72000000/1000000) |
|
|
|
有道理, 不过总觉得这是一个bug,万一碰到这个问题,可能要花费很多时间查, 特别是中断后转了很多函数后。。比如USB通信函数里面, 往24C02里写了一个字节,一切行云流水, 不过就在你无意识的情况下发生了中断里延时了10ms,
|
|
|
|
经过优化改成如下:
void delay_us(uint16_t us) { uint32_t load_ms,n_us_tick,a_tick,end_tick; a_tick=SysTick->VAL; load_ms=SysTick->LOAD; n_us_tick=load_ms/1000*us; if(a_tick>=n_us_tick) { end_tick=a_tick-n_us_tick; while(SysTick->VAL>end_tick); } else { end_tick=load_ms-n_us_tick+a_tick; while(SysTick->VAL } } 经测试这个代码在延时1000us内只差内个TICK。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1107 浏览 0 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1055 浏览 2 评论
2159 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1253 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1678 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 13:19 , Processed in 0.610338 second(s), Total 52, Slave 45 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号