用 IAR 開發 STM8 時,簡單軟件延時不起作用的原因

    近期有幸接手了前任工程師遺留的項目,MCU 選擇的是 STM8L151XX,開發工具使用的是 IAR 。打開祖傳代碼後,通讀了一遍,就用ST-Link燒錄進去跑程序,結果發現和預想的效果不太一致,尤其是初始化LED閃爍的部分。

    代碼中LED閃爍原理比較簡單,就是傳統的更改GPIO電平,再軟件延時幾百毫秒,然後再改變GPIO電平的方法,這種傳統的操作在學單片機第一課就已經開始使用了,按理說不應該出差錯。在確認過晶振頻率,分頻係數,時間週期和機器週期的關係之後,粗略算出的延時函數和代碼中的基本一致,所以排除了算數上的錯誤。延時函數大概是這樣的 ↓

void delay_ms(u16 t)
{
  u16 i;
  u16 j; 
  for(i=0;i<t;i++)
  {
    for(j=0;j<400;j++);
  }
    
}

    剛好手中有ST-Link,不妨就仿真看一下,是不是延時函數寫的不對。在延時函數的前後分別打上斷點,把延時增加到5秒左右,方便觀察,開啓仿真後發現,斷點之間執行的特別快,一眨眼就跳過去了。。。索性在延時的時間後面加幾個零,沒想到也是瞬間就跳過去了,真是活久見!!!

    網絡是最好的老師,在翻過十幾篇帖子之後,我基本確定了問題的所在之處! IAR 編譯時的優化程度不能選擇太高,否則編譯器認爲這段代碼是無用的,就給優化掉了。。。具體設置路徑如下:

在工程上點右鍵,選擇Options ——> C/C++ compiler ——> Optimizations ——> Level 中選擇 None(之前是High)

重新編譯過後,再把程序燒錄進去,延時函數果然生效了,LED 又按照既定的方法閃爍起來,其他功能也恢復正常了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章