產(chǎn)品詳情
華大F460支持IAP升級(jí)程序,但一般做IAP程序時(shí)都需要做一個(gè)bootloader,華大官方也提供了一個(gè)IAP demo。
但是這個(gè)demo例程會(huì)有一個(gè)問題:
此demo是基于華大F460官方開發(fā)板制作的,官方開發(fā)板是使用了外部8M晶振。但到了客戶那里,可能不使用外部晶振,使用內(nèi)部HRC晶振。
那么問題就來了,460 在Flash 0x00000400地址上存儲(chǔ)ICG數(shù)據(jù)(ICG配置,請(qǐng)參考華大編程手冊(cè)第6章內(nèi)容)
這個(gè)IGC功能是在MCU上電時(shí),硬件讀取Flash地址0x0400上的系統(tǒng)配置數(shù)據(jù)。
其中ICG1存儲(chǔ)了HRC上電時(shí)是16M RC還是20M的RC。
客戶出現(xiàn)的問題是,每次編譯bootloader后,系統(tǒng)時(shí)鐘一會(huì)是16M,一會(huì)是20M,每次編譯后都隨機(jī)變動(dòng)。
對(duì)比了一下客戶的.map文件和官方SDK內(nèi)例程的.map :
SDK官方例程uart_dma_rx_tx map文件
華大給的IAP
hc32f46x_boot程序(bootloader)map文件
會(huì)發(fā)現(xiàn)在0x00000400地址上,SDK中例子是data區(qū),放入的是默認(rèn)的ICG數(shù)據(jù)信息。而華大IAP bootloader 0x000004000地址范圍內(nèi)是代碼函數(shù),是code區(qū)。
那么MCU上電后從Flash的0x00000400地址開始讀ICG數(shù)據(jù) 設(shè)置MCU硬件,SDK內(nèi)例子沒問題,而IAP bootloader 讀到的卻是code代碼數(shù)據(jù),這樣HRCFREQSEL確定RCH頻率的位就變得不確定。
那么確實(shí),華大官方給的IAP demo中boot代碼工程是由問題的。
那改怎么做呢?看了一下uart_dma_rx_tx例子工程代碼,其中該工程把華大driver中的hc32f46x_icg.c文件加入到了工程參與編譯。
請(qǐng)看hc32f46x_icg.c內(nèi)容:
hc32f46x_icg.c 中把默認(rèn)的ICG信息map到了0x00000400地址上,而且是data分區(qū)(定義成const數(shù)組)。
所以根據(jù)460 MCU上電后硬件自動(dòng)讀取0x00000400地址上數(shù)據(jù) ,把數(shù)據(jù)加載到初始化配置寄存器 這一操作,我們必須把ICG數(shù)據(jù)放入到0x00000400地址上。
那么可以參考SDK中例程的方法,直接在keil或其他IDE中添加hc32f46x_icg.c文件,讓hc32f46x_icg.c文件參與編譯,參與code map。
這樣 在程序下載hex的同時(shí),ICG數(shù)據(jù) 自動(dòng)下載到了地址0x00000400地址上。
當(dāng)然,我們可以根據(jù)我們的需要,更改hc32f46x_icg.c
各個(gè)數(shù)據(jù),以便ICG配置適合我們的使用。
華大官方460 IAP例子 bootloader代碼中沒有加入hc32f46x_icg.c文件:
以上ICG一定要注意添加,而且華大460 IAP demo代碼是沒有添加ICG的,這個(gè)是一個(gè)明顯的錯(cuò)誤。