如何使用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函数就会卡住。
请问高手,如何解决?谢谢
应该是中断频率过高了,你看看 代码没有问题呀!
应该不会导致crash啊!
看看是不是systick还关联了其它函数或操作。 朋友,找到原因了吗? dffzh 发表于 2025-8-15 14:59
朋友,找到原因了吗?
没有 MCU 的主频多少? xch 发表于 2025-8-15 17:21
MCU 的主频多少?
168M 1. 系统里面只有滴答中断么?
2. 若不是只有滴答中断建议看看是不是有更高优先级的中断一直在相应
3.若只有滴答中断的情况下,建议仿真查看软件卡死在什么地方 这种情况一般是重复引用了 SYSTICK 建议改为纯软延时,不用SYSTICK试试 滴答定时器中断频率太高了,占用了大量的mcu时间 延时真的要好好用 Tom952331 发表于 2025-8-16 07:53
168M
把其他中断优先级调低。systick优先级调到最高。
168MHZ 足够响应1MHZ 的中断。有168拍时间,你这中断大约只需要花60拍以内。还有100拍余量。
如果微秒中断和毫秒中断不可能同时存在,改一下服务函数cntUs/cntMs可以共享同一个变量。中断服务也快些。
建议打开速度优化
中断的间隔实在太小了。
小的MCU在us级的延时还是建议使用空指令来实现吧 1us的应用?这是啥场景的应用啊 不是1us systick实现us级的延迟 看样子还是能力不足。 你这代码还是再研究一下吧!
不能仅通过初始化不同的systick频率而改变ms和us的计数使用 小MCU对于us级的定时,估计只能单独使用一个Timer了吧
页:
[1]