近期有幸接手了前任工程師遺留的項目,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 又按照既定的方法閃爍起來,其他功能也恢復正常了。