打印
[STM32F4]

HAL库有us延时函数吗

[复制链接]
10941|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
feiante|  楼主 | 2015-10-22 01:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
看了一下,HAL库中有延时函数,HAL_delay(),这个是延时ms级的,好像没有找到us级的,不知道怎么做us的
沙发
songchenping| | 2015-10-22 08:01 | 只看该作者
HAL库本身执行时就一大堆的判断,要延时us比较费劲啊。

使用特权

评论回复
板凳
yinyue01| | 2015-12-7 20:55 | 只看该作者
试过把HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);改成HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000000);但运行不出来~~~

使用特权

评论回复
地板
lin704932121| | 2015-12-8 22:17 | 只看该作者
#define CPU_FREQUENCY_MHZ    168

static __IO uint32_t TimingDelay;

/* Private function prototypes -----------------------------------------------*/




void delay_us(__IO uint32_t nTime)
{
    int old_val,new_val,val;

    if(nTime > 900)
    {
        for(old_val = 0; old_val < nTime/900; old_val++)
        {
            delay_us(900);
        }
        nTime = nTime%900;
    }

    old_val = SysTick->VAL;
    new_val = old_val - CPU_FREQUENCY_MHZ*nTime;
    if(new_val >= 0)
    {
        do
        {
            val = SysTick->VAL;
        }
        while((val < old_val)&&(val >= new_val));
    }
    else
    {
        new_val +=CPU_FREQUENCY_MHZ*1000;
        do
        {
            val = SysTick->VAL;
        }
        while((val <= old_val)||(val > new_val));

    }
}

这个是我常用的us延时,通过读取滴答定时器的计数值来延时,对滴答定时器的运行和中断没有影响。

使用特权

评论回复
5
libingqing| | 2016-3-11 09:54 | 只看该作者
lin704932121 发表于 2015-12-8 22:17
#define CPU_FREQUENCY_MHZ    168

static __IO uint32_t TimingDelay;

重新加载值是多少呢,看你的代码应该同1000,这个是在哪里加载的呢

使用特权

评论回复
6
lin704932121| | 2016-3-11 10:49 | 只看该作者
libingqing 发表于 2016-3-11 09:54
重新加载值是多少呢,看你的代码应该同1000,这个是在哪里加载的呢

是的,就是 HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000) 这个配置函数。
这个函数将系统滴答定时器时钟源配置为主时钟,并将重载值设置为SysTick->LOAD  = 168000 - 1;
也就是每微秒系统滴答定时器会计168个数,每毫秒系统滴答定时器会中断一次。

使用特权

评论回复
7
libingqing| | 2016-3-11 13:38 | 只看该作者
lin704932121 发表于 2016-3-11 10:49
是的,就是 HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000) 这个配置函数。
这个函数将系统滴答定时器 ...

好吧,嗯嗯,谢谢啦,现在有个问题,在同时调用HAL_Delay和delay_us时其实会有误差存在!其实我也不是很清楚systick定时器在裸机情况下作用到底有多大,有人把它比作心脏,一般配置都是1ms产生一次中断,如果不是1ms呢,或者是一个波动的值呢,会有什么影响么?

使用特权

评论回复
8
youdaowudao| | 2016-3-11 18:38 | 只看该作者
感觉影响不大。。。回去问问我师父。

( qydkfp.wikidot.com 清远 )( qykfp.wikidot.com        清远  )
( ksdkfp.wikidot.com         昆山  )( 江北 jbdkfpiao.wikidot.com )
( 沙坪坝  spbdkfpiao.wikidot.com ) (   wwdkfp.wikidot.com        芜湖  )  
  (  mdkfp.wikidot.com        马鞍山   )  (   wzdkfpiao.wikidot.com 万州   )       
  (  yzdkfpiao.wikidot.com 渝中  )     (  大渡口 ddkdkfpiao.wikidot.com   )
(   九龙坝  jlbdkfp.wikidot.com )          (  南岸区  naqdkfp.wikidot.com )
  (  北培区  bpqdkfp.wikidot.com ) (   渝北区  ybqdkfp.wikidot.com )  
(   巴南区  bnqdkfp.wikidot.com )  (  涪陵区  flqdkfp.wikidot.com )
(   綦江区  qjqdkfp.wikidot.com )  (  大足区  dzqdkfp.wikidot.com )
  (  重庆长寿区   csqdkfp.wikidot.com )   ( 重庆江津区   jjqdkfp.wikidot.com )
(   重庆合川区  hcqdkfp.wikidot.com ) (   永川区    ycqdkfp.wikidot.com )
  (  南川区    ncqdkfp.wikidot.com ) (   璧山区     bsqdkfp.wikidot.com )
  (  铜梁县    tlxdkfp.wikidot.com )  (  潼南县    tnxdkfp.wikidot.com   )
(   荣昌县   rcxdkfp.wikidot.com )  (  重庆     cqdkfpiao.wikidot.com )

使用特权

评论回复
9
lin704932121| | 2016-3-12 09:08 | 只看该作者
libingqing 发表于 2016-3-11 13:38
好吧,嗯嗯,谢谢啦,现在有个问题,在同时调用HAL_Delay和delay_us时其实会有误差存在!其实我也不是很 ...

HAL_Delay()的确有误差存在,误差在0-1ms之间,如果想延时1ms的话还是不要用这个函数。
如果不配置成1ms中断,比如说配置成500us,那么HAL_Delay(1)其实只是延时500us而已,而且还有误差。如果把它配置成波动的值,那么HAL_Delay()更是没法用的。
我的delay_us()也是要求将系统滴答定时器配置成1ms中断,并且运行途中不要再更改。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

30

主题

510

帖子

1

粉丝