![]() |
發布時間: 2022-5-12 17:00
正文摘要:大佬們,雖然說STM32單片機自帶一個嘀嗒定時器可以實現延遲,但是我現在想在KEIL里寫了一個1s的delay延遲函數,然后我想通過debug界面測試這個函數的執行時間,調整delay函數里的循環變量次數使其接近1s,延遲函數代 ... |
munuc_w 發表于 2022-5-13 16:08 感謝您的回復! |
yzwzfyz 發表于 2022-5-14 16:59 感謝您的回復! |
1、程序最終會被編譯成運行代碼,也是匯編程序。 2、在非流水取指的系統中(如51系統),每條指令運行的時間是固定的,是可以事先計算出運行的總時間的。所以仿真器算出來比較準。 3、32系統是指令流水結構,當你執行當前指令時,下條指令就已被取出了,這樣速度快。但前提是必須知道下條指令放在哪里。所以遇到跳轉指令就不好流水了。也就是說,同樣的批令,如果流水執行就快,不流水就慢,如果仿真器無法識別下條指令是不是流水執行,自然就算不準了。 4、1ms的子程序,調用1000次,不會是1S。因為每次調用要判斷是否結束了,會多運行:調用指令1000次、判斷指令1000次。而這些指令也是要占用時間的。 |
軟件延時受程序執行情況及中斷的影響,是不準的。 |
delay_1ms()里面 u16 j,k要加volatile屬性。 |
Y_G_G 發表于 2022-5-12 22:00 感謝您的回復! |
菜菜的周某人 發表于 2022-5-12 21:28 目前為止,我還沒有用過沒有定時器的單片機 對于一個單片機程序,延時時間達1秒的,肯定是不能用軟件延時的,難道你要讓程序什么都不做,就在那干等1秒嗎? 像18b20p 這種需要那么長時間的時序,肯定是要通標志位或者全局變量來處理時序的嘛 如果非得執著于軟件延時1秒,那仿真肯定不行,就像說的一樣,STM32有仿真,那別的單片機不一定能仿真 那肯定是示波器了 先隨便寫一個延時函數,大概是1mS左右,然后用示波器看一下這1mS的真正延時,不斷的調整,直到最接近1mS然后把這個延時循環放到另一個循環中,參數調用就行了 假設,我已經調節好了一個1mS延時,它是這樣的 i = 32; j = 40; do { while (--j); } while (--i); 那就把這循環放到另一個循環中,做成一個函數就可以了, 這樣的函數調用參數會用到一定的時間,整個延時的時間可能會有誤差,再通過微調就差不多了 void Delay_ms(unsigned int a) { unsigned char i, j; for(a;a>0;a--) { i = 32; j = 40; do { while (--j); } while (--i); } } |
Y_G_G 發表于 2022-5-12 19:53 感謝您的回復,我不是執著于1s的軟件延時,我只是在想如果軟件debug查看執行時間這一方法不準確,那么寫IC的開發時序圖(比如DS18B20的單總線時序、TFLCD等)的需要延時時,如何確定我的時序正確呢?當然在32內部有嘀嗒定時器可準確延遲,那么其他MCU呢,其他MCU可沒有嘀嗒定時器。 |
stm32的ms級延遲用systick。 |
明明有穩定精確的延時,為什么要自己寫呢? 哪怕是8051,1秒鐘延時也是不會用軟件延時的 有時間折騰這個,還不如玩幾個DIY小東西 |
xuyaqi 發表于 2022-5-12 18:27 感謝您的回復,我還想問下,如果仿真會影響延時,那是KEIL軟件的問題還是DAP仿真器通信的問題?以及如果這樣說,那豈不是說用Keil軟件debug查看執行時間這一方法根本行不通?或者說我想要得到粗略1s的延遲,除了用定時器外,就沒有其他方法嗎?因為我無法知道我的dealy函數執行時間是多少! |
還是用滴答定時器靠譜 |
仿真會影響延時,調試可以用讓輸出腳翻轉,邏輯分析儀測試。 |