1. 程式人生 > >STM32F10x IAP韌體升級

STM32F10x IAP韌體升級

    前言:這是小編的第一篇部落格,如有格式上的問題或者講的不好的地方敬請諒解。小編之所以想寫部落格,是希望別的童鞋不要像小編那樣走太多的彎路,甚至不惜花錢買了別人毫無參考價值的程式碼。
    關於IAP原理部分,小編相信你應該已經在別的童鞋的部落格上看到過,這裡小編就不重複那些內容,附上一個小編認為寫的不錯的連結供參考IAP原理
    看了IAP原理,相信大家都有自己的理解了,小編的理解用白話說就是:我們通過BootLoader程式,把APP程式存放在0x08000000+offset的flash之中,以後執行程式就是從0x08000000+offset開始。小編是個腦子不好使的人,一開始以為BootLoader是個什麼了不起的東西,一看到BootLoader字眼就雲裡霧裡的,到最後知道其核心就是flash寫入還有程式跳轉部分,一切便變得明瞭起來。其實到這裡,IAP的內容幾乎都差不多了,所以小編最主要是提供自己一路上遇見的問題,還有提供一些資料作為參考。
首先我們要搞清楚自己微控制器的型別,我所講解的是stm32f10x系列的微控制器,雖然這類的微控制器有很大的相似之處,但不一樣的型別總歸有些區別,待會小編會發一個關於stm32f103zet6的例程,當程式設計自己的微控制器時一定要注意其型別是否一樣,這裡的區別會體現在其記憶體大小的不同,啟動檔案的不同,以及外設資源等區別。具體的移植到時可以自己網上搜索。小編第一個卡住的地方就是由於沒注意到兩種晶片不同的型號,還傻傻的不知道為什麼例程都能出錯。
    小編遇到的第二個問題是串列埠助手傳送換行符的問題。我們都知道,一般傳送資訊,我們都會有一定的格式。小編當時也寫了自己的格式,幀頭,資料,校驗,幀尾。問題就在串列埠助手的設定上。在波特率等串列埠配置上,小編相信大家沒問題。但請一定不要傳送換行符。我們接收到幀頭之後,預設接下來的資料是作為資料段的,一開始小編髮送了換行符,所以APP起始地址開頭便存在換行符,導致接下來的校驗if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x20000000)死活通不過。關於這句的解釋,可以在IAP原理中翻閱找到解釋,當然直接百度更快一些。
    小編遇到的第三個問題,也和串列埠有關。由於小編的板子沒有指示燈或者螢幕作為APP程式是否更新成功作為依據,所以小編用的串列埠。在BootLoader程式裡,我設定的波特率為9600,在APP中,我設定的波特率為115200,當我更新完程式時,由於波特率已經更換過了,導致接收到的資料出現錯誤,這也讓小編懵逼了好一會,不過這種粗心的錯誤相信大家是不會犯的。這裡是提醒大家APP的波特率設定最好與BootLoader一樣,否則萬一忘了就又要花冤枉的時間了。
    接下來我將講一下BootLoader工程和APP工程的注意部分。
    關於BootLoader程式:其實這程式和一般的程式沒什麼區別,唯一的區別是存在跳轉至APP的操作,關於flash操作的部分,已經整合為一個庫檔案,所以我們就不糾結於其如何實現,有興趣的童鞋再自己去研究研究。我們需要注意的是FLASH_APP1_ADDR的設定,這是一個巨集,指代你的APP的儲存地址,這個就需要考慮你的BootLoader段的大小了,由於BootLoader佔一定的大小,所以FLASH_APP1_ADDR的設定一定要在你BootLoader所在地址之後,而且由於FLASH讀寫是成塊操作的(1塊大小與晶片有關),所以FLASH_APP1_ADDR的設定應該為0x8000000+n*flash一頁的大小(這點是我之後flash存資料時發現的,自己沒有嘗試過故意寫錯誤的地址)

。並且你也需要注意FLASH的大小,當APP的大小+BootLoader的大小要大於flash的大小時,你IAP升級就會出錯。當然,如果FLASH夠大,就不用擔心這個問題,甚至可以寫多個APP,根據開機時不同的狀態執行不同的APP。我給出的例程中,APP資料是先全部接收到SRAM中,再寫入到FLASH中,這會導致一個問題,就是APP程式超出SRAM的大小時,也將出錯,所以我們可以邊寫入SRAM,邊寫入FLASH,小編本來擔心寫入FLASH不夠快,但實踐證明還是沒問題的。這邊講一個特別重要的問題,就是你BootLoader中的中斷用完後,一定要關閉,不然在APP中用到時會出現不知名的bug,明明程式跳轉了且運行了,但是就是不按照你的想法去運作,這點真的很重要

    關於APP程式:首先我們需要設定APP程式的起始地址和儲存空間大小,這個在我接下來給的資料中會教你如何實現,其次是設定中斷向量表的偏移,同樣在接下來的資料中會指出如何設定。這邊值得注意的是,中斷向量表的偏移一定要0x200的倍數,當然我只是針對了我用的stm32f103c8t6,其他的晶片我不能下此定論。還有,請注意你的中斷向量表只設置一次,因為我的工程是別人的,他所用的模板中存在設定中斷向量表的操作,而我一開始沒發現,最後是他的設定覆蓋了我的設定,導致一直執行不正確。最後是關於生成bin檔案,小編會給出一個小軟體,可以把HEX檔案直接轉換成bin檔案。傳送bin檔案的程式的話,小編用XCOM V2.0,資料中也會給出。最後提醒一句,直接下載按以上步驟配置過的APP的hex工程是不能正常執行的,因為其存放區域從0x08000000開始,而你又配置了它從0x08000000+offset的地方開始執行,所以程式時不能執行的

    第一次部落格的書寫差不多該結束了,有錯誤或者不好的地方歡迎指出,最後附上資料連結:包括stm32f103zet6BootLoader的例程,IAP視訊教程(視訊是關於F4系列stm32的,但是由於程式碼差不多,且我們注重的是原理,所以根本不會影響到學習。況且以小編的智商都能懂,聰明的各位有什麼不能懂的呢。),hex轉bin工具,XCOM V2.0。資源連結