打印

STM32F4滴答定时器 微秒级定时功能问题求助,急急急

[复制链接]
868|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
liusheng1998|  楼主 | 2023-2-25 17:26 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 liusheng1998 于 2023-2-25 19:44 编辑

#每日话题#
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;                                       //清空计数器
}

这是正点原子的代码,作微秒级别延迟,我把它用作CAN报文发送的延时功能,
delay_us(200)可以完美实行次延时,报文发送的时间是平均170us。
但是设置270微秒就出问题了,飘忽不定 200~300us
不知道是不是因为不能做10us级别的判断!
但是函数里面确实是按照us来的,并且200us 能准,不出现210us 190us,就很奇怪
这是定时250的效果。
-------------------------------------------------------------------------------------------------------
1    0000060B         8  17  50  C4  28  7C  EE  44  8F     757.706210 R
1    0000060B         8  17  50  C4  28  7C  EE  44  82     757.706520 R
1    0000060B         8  17  50  C4  28  7C  EE  44  81     757.706720 R
1    0000060B         8  17  50  C4  28  7C  EE  44  8C     757.707030 R
1    0000060B         8  17  50  C4  28  7C  EE  44  8C     757.707240 R
---------------------------------------------------------------------------------------------------------------
1    0000060B         8  17  50  C4  28  7C  EE  44  8F     771.714530 R
1    0000060B         8  17  50  C4  28  7C  EE  44  82     771.714740 R
1    0000060B         8  17  50  C4  28  7C  EE  44  81     771.715040 R
1    0000060B         8  17  50  C4  28  7C  EE  44  8C     771.715250 R
1    0000060B         8  17  50  C4  28  7C  EE  44  8C     771.715560 R

可以看到 延时分别为200us  300us。
并不是设置的250us?
说明只能做百微秒的延迟操作。这只是我的一孔之见。请大家不良赐教,拜谢各位大神。

使用特权

评论回复

相关帖子

13
GlenX| | 2023-3-13 15:19 | 只看该作者
void Delay_us(uint32_t nus)
{
    HAL_SYSTICK_Config(HAL_RCC_GetHCLCKFreq()/1000000);
    HAL_Delay(nus-1);
}
我发的这个你看不见吗?还是说不能用!?

使用特权

评论回复
12
GlenX| | 2023-3-7 18:51 | 只看该作者
本帖最后由 GlenX 于 2023-3-7 19:15 编辑
liusheng1998 发表于 2023-3-7 09:28
我看HAL库是HAL_Delay是 毫秒ms延时

可以自己定义为us:void Delay_us(uint32_t nus)
{
    HAL_SYSTICK_Config(HAL_RCC_GetHCLCKFreq()/1000000);
    HAL_Delay(nus-1);
//    HAL_SYSTICK_Config(HAL_RCC_GetHCLCKFreq()/1000);
//-----------这里可以再改回ms
}


使用特权

评论回复
11
liusheng1998|  楼主 | 2023-3-7 09:28 | 只看该作者
GlenX 发表于 2023-3-5 17:40
我用的HAL库的SysTick,感觉不错。10-270uS可变都用过,没发现问题。

我看HAL库是HAL_Delay是 毫秒ms延时

使用特权

评论回复
10
liusheng1998|  楼主 | 2023-3-6 17:18 | 只看该作者
GlenX 发表于 2023-3-5 17:40
我用的HAL库的SysTick,感觉不错。10-270uS可变都用过,没发现问题。

真的假的 我去看看那个函数怎么写的呢 谢谢
我记得我是 用过的

使用特权

评论回复
9
GlenX| | 2023-3-5 17:40 | 只看该作者
我用的HAL库的SysTick,感觉不错。10-270uS可变都用过,没发现问题。

使用特权

评论回复
8
liusheng1998|  楼主 | 2023-3-4 11:25 | 只看该作者
wcheng13 发表于 2023-2-28 19:53
直接再用个硬件定时器,做1M 运行,一个TICK 就是 1us,就行了,

硬件定时器?单独的模块吗?

使用特权

评论回复
7
GlenX| | 2023-3-3 22:35 | 只看该作者
我感觉问题在:while((temp&0x01)&&!(temp&(1<<16)));
其中的16是否正确???!!!

使用特权

评论回复
6
xch| | 2023-3-2 09:18 | 只看该作者
更新LOAD 值之前,先得禁用SYSTICK

使用特权

评论回复
5
wcheng13| | 2023-2-28 19:53 | 只看该作者
直接再用个硬件定时器,做1M 运行,一个TICK 就是 1us,就行了,

使用特权

评论回复
地板
liusheng1998|  楼主 | 2023-2-28 15:55 | 只看该作者
gyh974 发表于 2023-2-28 15:16
什么延时要求这么精确?

你好,做的是CAN报文回放功能。将现有的雷达数据重新转播一遍。
硬件在换测试功能需要,按照原始报文的时间间隔来实现。

使用特权

评论回复
板凳
gyh974| | 2023-2-28 15:16 | 只看该作者
什么延时要求这么精确?

使用特权

评论回复
沙发
gyh974| | 2023-2-28 15:16 | 只看该作者
什么延时要求这么精确?

使用特权

评论回复
楼主
liusheng1998|  楼主 | 2023-2-25 17:28 | 只看该作者
本帖最后由 liusheng1998 于 2023-2-25 19:21 编辑

有没有好心人看看。帮忙给一个意见大家可以分享一下延时的经验吗。我想要微秒级别延迟效果,10微秒级别的延迟 各位能指教吗?

使用特权

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

本版积分规则

8

主题

70

帖子

1

粉丝