麻煩技術(shù)人員幫忙分析下,最下面的Delay_Ms(10000);不起作用。
用的是EVT里的低速率鍵盤(pán)例程。
麻煩技術(shù)人員幫忙分析下,最下面的Delay_Ms(10000);不起作用。
用的是EVT里的低速率鍵盤(pán)例程。
代碼不全。建議整個(gè)工程文件夾上傳。
將
Delay_Ms(10000);
改成:
for(uint8_t?i=0;i<10;i++){ ????Delay_Ms(1000); }
會(huì )大約延遲5秒;
兩個(gè)問(wèn)題:
1、延遲較大數字時(shí)整個(gè)延遲函數不起作用。
2、延遲較小數字時(shí)有作用,但是時(shí)間不準。
您好,關(guān)于Delay_Ms(10000)沒(méi)有生效問(wèn)題,這邊具體看了一下是和USB中斷函數中掛起下面的延時(shí)沖突了,具體原因應該是Delay_Ms(10000)執行的時(shí)候進(jìn)入USB掛起中斷,然后中斷函數中延時(shí)函數執行完成后對應狀態(tài)標志位被清除導致Delay_Ms(10000)函數沒(méi)有完全執行完成。你可以按照下圖將中斷函數中延時(shí)函數注釋掉應該就可以了。
謝謝,已驗證可以。
PS.
老師麻煩再請教下,這種中斷處理函數與用戶(hù)函數共享延遲函數狀態(tài)標志位,導致延遲函數不可重入的問(wèn)題最好應該怎么解決?
原則上中斷快進(jìn)快出,不要在中斷中做耗時(shí)操作。如果由于時(shí)序等特殊情況不得不延時(shí),可以用兩個(gè)方案:死循環(huán)延時(shí),或是改寫(xiě)循環(huán)邏輯,讓SysTick只負責記錄系統啟動(dòng)以來(lái)的ms數,具體延時(shí)邏輯寫(xiě)成可重入的;或者是中斷里放置標志位提示主循環(huán)中需要處理某個(gè)延時(shí)邏輯。