標(biāo)題: 一個(gè)與System Bootloader相關(guān)的話題 [打印本頁(yè)]

作者: taoran    時(shí)間: 2016-6-4 16:39
標(biāo)題: 一個(gè)與System Bootloader相關(guān)的話題

近日,有位STM32用戶在使用STM32芯片內(nèi)置的BOOTLOADER對(duì)芯片進(jìn)行MCU芯片的信息讀取及編程。他發(fā)現(xiàn)通過UART接口使用相關(guān)BOOTLAODER指令對(duì)STM32F1系列芯片的各項(xiàng)功能進(jìn)行讀寫時(shí)都正常。當(dāng)改到STM32F4系列時(shí)發(fā)現(xiàn)有些命令運(yùn)行就不正常,比如通過READ MEMORY指令獲取UID或FLASH SIZE時(shí)就會(huì)出錯(cuò)。


從STM32F4參考手冊(cè)中可以得知:Flash size  Base address: 0x1FFF 7A22;

讀取FLASH SIZE操作步驟及現(xiàn)象如下:

1、啟動(dòng)讀內(nèi)存指令 11 EE            反饋79

2、讀內(nèi)存地址  1F FF 7A 22 B8 反饋79 1F

3、讀內(nèi)存字節(jié)數(shù) 01 FE                 反饋 79 31 00 00 79

上面的現(xiàn)象除了第一步,另外兩步都不是用戶所期待的數(shù)據(jù)或反饋。其中第三步的01 FE正好跟獲取自舉程序版本和讀保護(hù)狀態(tài)的命令相同,用戶懷疑是否發(fā)生了命令沖突。


在談這個(gè)問題之前,我們有必要大致了解一些背景知識(shí)。

STM32芯片的片上FLASH往往由幾部分組成。以STM32F40X/STM32F41X為例,主要由以下幾部分組成:【main memory/system memory/OTP/option bytes

其中SYSTEM MEMORY[系統(tǒng)存儲(chǔ)區(qū)]用來(lái)存放系統(tǒng)啟動(dòng)程序和部分其它芯片特征信息,當(dāng)芯片配置為從SYSTEM MEMORY啟動(dòng)時(shí),芯片復(fù)位后就會(huì)從這里開始執(zhí)行程序。

當(dāng)MCU進(jìn)入系統(tǒng)啟動(dòng)模式后,用戶可以通過多種串行接口與MCU通信。自然,這里就定義了一些相關(guān)協(xié)議的操作命令。


上表是針對(duì)UART接口的BOOTLOADER命令集及說明,比方GO/Get ID/Read Memory/Write memory等。其實(shí)不管你用哪種接口,這些BOOTLOADER協(xié)議命令都是一樣的。


當(dāng)主機(jī)【比如PC】給MCU發(fā)正確命令包時(shí) BOOTLOADER會(huì)反饋一個(gè)ACK, 即0X79

當(dāng)主機(jī)給MCU發(fā)出錯(cuò)誤指令或指令運(yùn)行異常時(shí)它會(huì)反饋NACK,即0X1F。


盡管說不論哪種接口或芯片的BOOTLOADER的協(xié)議命令是一樣的,但這些命令所操作的對(duì)象或參數(shù)可能會(huì)因芯片型號(hào)或bootloader版本的的不同而呈現(xiàn)差異。


也就是說,不同STM32系列的PID數(shù)據(jù)、bootloader命令可訪問的RAM和system memory的存儲(chǔ)空間范圍可能不同。


好,該回到開篇客戶反映的問題了?蛻粝胪ㄟ^READ MEMORY指令讀取片內(nèi)FLASH SIZE.


我們查看STM32F1參考手冊(cè)得知有關(guān)FLASH SIZE寄存器的地址是:0x1fff f7e0;

查看STM32F4參考手冊(cè)得知有關(guān)FLASH SIZE寄存器的地址是:0x1fff 7a22;

現(xiàn)在現(xiàn)象是命令一樣,接口一樣,唯一差別就是二者地址不一樣。結(jié)合前面的介紹,難道是二者SYSTEM MEMORY地址空間不一樣導(dǎo)致?我們可以查看二者的參考手冊(cè)或者ST官方的應(yīng)用筆記AN2606查看二者的信息。


我們可以得知STM32F1的SYSTEM MEMORY地址空間為0x1ffff 000--0x1fff f7ff或0x1fff b000--0x1fff f7ff。STM32F4的SYSTEM MEMORY地址空間為0x1ffff000--0x1fff77ff!驹诒疚牡牡谝粋(gè)表格里就可看到】



到此,不難看出F4的flash size寄存器地址沒有落在自身的SYSTEM MEMORY區(qū),而F1的就落在它自身的SYSTEM MEMORY之內(nèi)。也就是說,在用READMEMORY命令對(duì)STM32F4芯片發(fā)送的那個(gè)地址是非法的,從而導(dǎo)致錯(cuò)誤。當(dāng)然對(duì)于讀STM32F4的UID也有同樣的問題。所以在應(yīng)用中我們要注意這些諸如Read /Write/Go命令是有地址范圍訪問限制的。

下面對(duì)客戶反饋過來(lái)的結(jié)果做個(gè)簡(jiǎn)單解讀:

從STM32F4參考手冊(cè)中可以得知:Flash size  Base address: 0x1FFF 7A22

讀取FLASH SIZE操作步驟及現(xiàn)象如下:

1、讀內(nèi)存指令啟動(dòng) 11 EE 反饋79

2、讀內(nèi)存地址  1F FF 7A22 B8 反饋79 1F

3、讀內(nèi)存字節(jié)數(shù) 01 FE 反饋 79 31 00 00 79


第一步,主機(jī)發(fā)出read memory 指令,MCU反饋ACK,即0X79,這步正確的。

緊跟第二步,主機(jī)發(fā)出地址及地址數(shù)據(jù)的異或碼【藍(lán)色數(shù)據(jù)】。命令本身是沒問題的,MCU反饋ACK,0X79,但地址數(shù)據(jù)非法,隨即反饋NACK即0X1F;此次命令以失敗而結(jié)束。

當(dāng)進(jìn)行到第三步時(shí),01 FE被重新識(shí)別為獲取自舉程序版本和讀保護(hù)狀態(tài)的命令。命令正確并給予ACK確認(rèn),并給出版本號(hào)3.1及相關(guān)選項(xiàng)數(shù)據(jù),最后以ACK 0x79結(jié)束。

經(jīng)過三步下來(lái),最后并沒有出現(xiàn)客戶所期待的結(jié)果。原因很簡(jiǎn)單,命令地址非法。


關(guān)于使用systembootloader的調(diào)試編程,ST官方有篇應(yīng)用筆記AN2606首先需要閱讀,再就是結(jié)合你的通信接口選擇下面羅列出的相應(yīng)筆記進(jìn)行閱讀。


相關(guān)話題鏈接【點(diǎn)擊即可閱讀】

1.一個(gè)關(guān)于STM32 FLASH編程應(yīng)用相關(guān)的話題
2.STM32F0BOOT配置相關(guān)話題
3.聊聊STM32芯片DFU編程相關(guān)話題





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1