CH32X035延时函数不生效

微信截图_20240904191147.png


麻烦技术人员帮忙分析下,最下面的Delay_Ms(10000);不起作用。

用的是EVT里的低速率键盘例程。

代码不全。建议整个工程文件夹上传。


CH32X035_EVT\EXAM\USB\USBFS\DEVICE\CompositeKM_LowSpeed例程,只改了main函数如上图部分。

icon_rar.gifCompositeKM_LowSpeed.rar



Delay_Ms(10000);

改成:

for(uint8_t i=0;i<10;i++){
    Delay_Ms(1000);
}

会大约延迟5秒;

两个问题:

1、延迟较大数字时整个延迟函数不起作用。

2、延迟较小数字时有作用,但是时间不准。



您好,关于Delay_Ms(10000)没有生效问题,这边具体看了一下是和USB中断函数中挂起下面的延时冲突了,具体原因应该是Delay_Ms(10000)执行的时候进入USB挂起中断,然后中断函数中延时函数执行完成后对应状态标志位被清除导致Delay_Ms(10000)函数没有完全执行完成。你可以按照下图将中断函数中延时函数注释掉应该就可以了。

image.png



谢谢,已验证可以。

PS.

老师麻烦再请教下,这种中断处理函数与用户函数共享延迟函数状态标志位,导致延迟函数不可重入的问题最好应该怎么解决?


原则上中断快进快出,不要在中断中做耗时操作。如果由于时序等特殊情况不得不延时,可以用两个方案:死循环延时,或是改写循环逻辑,让SysTick只负责记录系统启动以来的ms数,具体延时逻辑写成可重入的;或者是中断里放置标志位提示主循环中需要处理某个延时逻辑。


只有登录才能回复,可以选择微信账号登录