【TouchGFX】海東青電子-簡書 之 《IAR-hex文件的燒寫方法》


IAR ---- 跟KEIL一樣,TouchGFX自動生成的工程項目,在IAR中同樣不能正確燒寫片外flash!不過,經過適當的手動配置,IAR是可以燒寫片外flash的,只是要費些周折。下面以Clock例程為例說明配置過程。

以STM32F769I-DISCO板子為例,創建一個TouchGFX工程,並使用系統自帶的Clock例程:

 

 
圖一

不需要編寫任何代碼,使用Clock例程就行,先運行VS、看看在仿真器上是否能正確跑起來這個Clock。然后,進入IAR,因為使用的是目前最新的IAR版本V8.32,所以要使用 IAR8.x 這個目錄下的IAR工程:

 

 
圖二

這個目錄中還有 .board、.flash等文件,這些文件非常重要,燒寫flash就靠他們了,后面將詳述。雙擊 application.eww ,打開IAR,如果彈出詢問是否升級的窗口:

 

 
圖三

選擇 Yes ,轉換成新版的工程文件,然后就進入了IAR界面。 按下 F7 編譯:

 

 
圖四

IAR正確生成了out 和 hex 目標文件。嘗試下載:

 

 
圖五

彈出一個錯誤信息:

 

 
圖六

大意是:系統在生成flash算法時出錯了,左下方的 Debug Log 中有詳細解釋:

 

 
圖七

圖七中顯示了一個警告:燒寫flash警告,代碼段位於地址 [0x90000000,0x9003CC5F] 范圍的將不能被燒寫。這個地址范圍正是片外flash的地址,檢查一下當前IAR關於燒寫flash的配置情況,Alt+F7 打開工程選項,在  =>調試器=>下載  選項頁下,有一個 .board 文件:

 

 
圖八

IAR項目主目錄下有一個 FlashSTM32F76xxI.board 文件,它描述了目標板子上flash的“配置”情況,在上圖中直接點擊 Edit 按鈕就可以打開這個文件:

 

 
圖九

可以看到,.board 文件中描述了F7片內2個地址段對應的燒寫算法文件(.flash文件),但沒有配置片外地址為0x9000 0000開始的flash對應的算法文件,所以造成燒寫失敗。

通過查找IAR的相關資料,並仿照另外一個IAR支持片外flash燒寫的ST官方開發板的 .board 文件,針對 STM32F769I-DISCO 板子重新編寫了幾個燒寫片外flash的算法文件、一共6個文件如下:

 

 
圖十
 
算法文件下載

鏈接:https://pan.baidu.com/s/16BPxsdbIBEbyMNknpBeB9Q
提取碼:9mkz

將這6個文件全部copy到IAR工程目錄下:

 

 
圖十一

在IAR中重新指定燒寫flash的 .board 文件為 FlashSTM32F769I-DISCO.board :

 

 
圖十二

 

再次點擊 Edit 查看:

 

 
圖十三

地址0x9000 0000已經有對應的算法文件了(並且,去掉了本項目中沒用到的TCM flash)。再次下載,目標板成功燒寫:

 

 
圖十四

板子實際跑的效果:

 

 
圖十五

也許有網友好奇:那個 FlashSTM32F769I-DISCO.board 文件,以及其他5個文件是怎么做出來的?對這些文件制作過程以及分析思路感興趣的朋友請繼續往下看。

 

 

燒寫算法文件制作

我們使用自己修改的 .board 文件成功實現了IAR燒寫片外flash,下面說說這個 .board 文件的制作過程。

KEIL中的flash算法燒寫文件是 *.flm 文件,例如,STM32F769I-DISCO 板子對應的是 STM32F769I_QSPI_Macronix.FLM  文件:

 

 
圖一

這是一個經過編譯的二進制文件,ST的每一個開發板都對應着一個 flm 文件。在IAR中,flash算法燒寫文件是 *.board 文件:

 

 
圖二

這是個文本文件(腳本),內容是若干flash地址對應的 .flash 描述文件。以 FlashSTM32F7xx_STM32F746G-DISCO.board 為例,其中包含了3個 .flash 文件:

1)0x08000000 0x080FFFFF      FlashSTM32F74xxG.flash

2)0x00200000 0x002FFFFF      FlashSTM32F74xxG_TCM.flash

3)0x90000000 0x90FFFFFF     FlashSTM32F7xx_QSPI_STM32F746G-DISCO.flash

.flash 文件也是文本文件(腳本),包括2部分內容:指明如何讀寫flash的二進制算法文件 .out ,以及描述flash總線初始化、芯片pin定義的 .mac 文件。以 FlashSTM32F7xx_QSPI_STM32F746G-DISCO.flash 為例,它描述了片外flash如何燒寫,其中一個文件是 FlashSTM32F7xx_QSPI_MICRON.out ,表明flash品牌是MICRON,這是個二進制文件,所有MICRON的flash都是用它來讀寫;另一個文件是 FlashSTM32F7xx_QSPI_STM32F746G-DISCO.mac,是個文本文件,打開這個文件可以看到 QSPI 接口用到的6個pins :PB2、PB6、PD11、PD12、PD13、PE2。

總結一下IAR燒寫flash過程:先讀取 *.board 腳本文件,再讀取不同地址映射的 *.flash 文件,從中獲得讀寫flash的二進制代碼 *.out 文件,同時讀取 *.mac 宏定義腳本文件、對MCU內部、外部flash初始化,並獲得片外flash接口的pin定義,至此,燒寫片內、片外flash的信息已經齊備,之后就是具體的燒寫操作了。

了解了這個過程,下面可以開始處理如何燒寫 STM32F769I-DISCO 板子了。這個雖然是ST官方的板子,但 IAR V8.32 並不直接支持燒寫。第一步,我們先要弄明白板子上flash的型號和pin定義,在《TouchGFX工程中hex目標文件的燒寫方法(一)使用ST-LINK》中,已經知道片外flash是 MACRONIX 的 MX25L512G ,管腳定義見下圖:

 

 
圖三

 

 
圖四
 
圖五

QSPI接口片外flash的6個pin是:PB2、PB6、PC9、PC10、PE2、PD13。很遺憾,IAR自帶的 STM32F746G-DISCO 板子的算法文件描述的是MICRON的芯片、並且QSPI管腳定義也不兼容,無法直接拿來使用。經過仔細查找,發現 FlashSTM32F7xx_QSPI_STM32F723E-DISCO.mac 文件中定義的6個pin跟  STM32F769I-DISCO 板子上的完全相同!就是說,把 FlashSTM32F7xx_STM32F723E-DISCO.board、FlashSTM32F7xx_QSPI_STM32F723E-DISCO.flash、FlashSTM32F7xx_QSPI_STM32F723E-DISCO.mac 移植過來(幾乎是原樣照搬^_^)就行了。

 

 
圖六

修改過的文件改名為:FlashSTM32F769I-DISCO.board (所有移植后的文件下載地址見文章末尾),在IAR中加載這個 .board 后、可以燒寫片外flash了。

有一個細節需要注意:IAR項目主目錄下有一個自動生成的 FlashSTM32F7xxx_384kB.out 文件,如果使用這個文件,板子可以燒寫、不報錯,但板子reset后並不能正確運行!而使用 FlashSTM32F7xxx_192kB.out 則沒有問題。沒弄明白這是為什么、也不一定有代表性,這里記錄一下、僅供參考。

 
來源


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM