中级会员
 
- 积分
- 378
- 金钱
- 378
- 注册时间
- 2017-11-29
- 在线时间
- 135 小时
|
1金钱
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD=nus*fac_us; //时间加载
SysTick->VAL=0x00; //清空计数器
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16))); //等待时间到达 !逻辑取反
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器 ~按位取反
SysTick->VAL =0X00; //清空计数器
}
---------------
以上是正点原子程序,我觉得while判断条件里这个(temp&0x01)是没有意义的,因为在计数器递减期间使能位一直是1的(SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ),要等计数器到0,countflag被置1后,退出while循环,被这条语句 SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk复位使能位,请老师指点。
另外这个函数delay_us(1)我示波器看过 实际是2.39us,delay_us(10)示波器显示是11.4us,不准,请老师指点。
|
最佳答案
查看完整内容[请看2#楼]
至于延时准不准的问题,代码执行也是需要时间,你要是想要那种绝对的、没有任何错误的延时自己想其他办法实现吧。
|