麻烦技术人员帮忙分析下,最下面的Delay_Ms(10000);不起作用。
用的是EVT里的低速率键盘例程。
麻烦技术人员帮忙分析下,最下面的Delay_Ms(10000);不起作用。
用的是EVT里的低速率键盘例程。
代码不全。建议整个工程文件夹上传。
将
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)函数没有完全执行完成。你可以按照下图将中断函数中延时函数注释掉应该就可以了。
谢谢,已验证可以。
PS.
老师麻烦再请教下,这种中断处理函数与用户函数共享延迟函数状态标志位,导致延迟函数不可重入的问题最好应该怎么解决?
原则上中断快进快出,不要在中断中做耗时操作。如果由于时序等特殊情况不得不延时,可以用两个方案:死循环延时,或是改写循环逻辑,让SysTick只负责记录系统启动以来的ms数,具体延时逻辑写成可重入的;或者是中断里放置标志位提示主循环中需要处理某个延时逻辑。