Tom952331 发表于 2025-8-14 13:18

如何使用Delay_us()函数

void Delay_Init(void)
{
    SystemCoreClockUpdate();
}
void Delay_ms(__IO u32 nms)
{
    SysTick_Config(SystemCoreClock / 1000);

    cntMs = nms;
    while(cntMs != 0);
}
void Delay_us(__IO u32 nus)
{
    SysTick_Config(SystemCoreClock / 1000000);

    cntUs = nus;
    while(cntUs != 0);
}
void SysTick_Handler(void)
{
    if(cntMs)
    {
      cntMs --;
    }

    if(cntUs)
    {
      cntUs --;
    }
}我用Delay_ms函数就好使,用Delay_us函数就会卡住。
请问高手,如何解决?谢谢

真的问题不大 发表于 2025-8-14 18:16

应该是中断频率过高了,你看看

海洋凝视 发表于 2025-8-14 19:20

代码没有问题呀!
应该不会导致crash啊!
看看是不是systick还关联了其它函数或操作。

dffzh 发表于 2025-8-15 14:59

朋友,找到原因了吗?

Tom952331 发表于 2025-8-15 15:17

dffzh 发表于 2025-8-15 14:59
朋友,找到原因了吗?

没有

xch 发表于 2025-8-15 17:21

MCU 的主频多少?

Tom952331 发表于 2025-8-16 07:53

xch 发表于 2025-8-15 17:21
MCU 的主频多少?

168M

kai迪皮 发表于 2025-8-16 10:27

1. 系统里面只有滴答中断么?
2. 若不是只有滴答中断建议看看是不是有更高优先级的中断一直在相应
3.若只有滴答中断的情况下,建议仿真查看软件卡死在什么地方

alienmiller 发表于 2025-8-16 12:29

这种情况一般是重复引用了 SYSTICK

alienmiller 发表于 2025-8-16 12:31

建议改为纯软延时,不用SYSTICK试试

dirtwillfly 发表于 2025-8-17 10:26

滴答定时器中断频率太高了,占用了大量的mcu时间

mbutterfly 发表于 2025-8-18 08:00

延时真的要好好用

xch 发表于 2025-8-18 11:14

Tom952331 发表于 2025-8-16 07:53
168M

把其他中断优先级调低。systick优先级调到最高。

168MHZ 足够响应1MHZ 的中断。有168拍时间,你这中断大约只需要花60拍以内。还有100拍余量。
如果微秒中断和毫秒中断不可能同时存在,改一下服务函数cntUs/cntMs可以共享同一个变量。中断服务也快些。

建议打开速度优化

OceanGaze 发表于 2025-9-5 20:47

中断的间隔实在太小了。
小的MCU在us级的延时还是建议使用空指令来实现吧

ShadowDance 发表于 2025-9-6 11:54

1us的应用?这是啥场景的应用啊

Tom952331 发表于 2025-9-6 12:28

不是1us

风暴之眸 发表于 2025-9-6 12:41

systick实现us级的延迟 看样子还是能力不足。

夜幕叙事曲 发表于 2025-9-11 08:44

你这代码还是再研究一下吧!
不能仅通过初始化不同的systick频率而改变ms和us的计数使用

涡流远见者 发表于 2025-9-11 16:14

小MCU对于us级的定时,估计只能单独使用一个Timer了吧
页: [1]
查看完整版本: 如何使用Delay_us()函数