OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4387|回复: 0

探索者开发板库函数版本和HAL库版本的延时函数不一样

[复制链接]

3

主题

6

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2020-4-13
在线时间
6 小时
发表于 2023-3-30 23:00:01 | 显示全部楼层 |阅读模式
3金钱
请问大家,有没有注意到探索者开发板库函数版本和HAL库版本的延时函数不一样,
主要是因为我发现库函数版本的延时函数,无法执行1us的情况,也不是不能执行,而是执行1us的延时需要等比较长的时间,大于1us的都可以,
HAL库版本的1us能正常执行,
我使用的芯片是STM32L431RBT6,下面把两个版本的延时函数贴出来,
库函数版本
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;           //清空计数器
}
HAL库版本
void delay_us(u32 nus)
{  
u32 ticks;
u32 told,tnow,tcnt=0;
u32 reload=SysTick->LOAD;    //LOAD的值      
ticks=nus*fac_us;       //需要的节拍数
told=SysTick->VAL;            //刚进入时的计数器值
while(1)
{
  tnow=SysTick->VAL;
  if(tnow!=told)
  {     
   if(tnow<told)tcnt+=told-tnow; //这里注意一下SYSTICK是一个递减的计数器就可以了.
   else tcnt+=reload-tnow+told;     
   told=tnow;
   if(tcnt>=ticks)break;   //时间超过/等于要延迟的时间,则退出.
  }  
};
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-24 17:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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