加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

強(qiáng)烈推薦 | STM32固件IAP升級(jí)實(shí)戰(zhàn)

2020/07/09
1281
閱讀需 11 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

硬件stm32f103cbt6 軟件:STM32F10x_StdPeriph_Lib_V3.5.0

1 預(yù)備知識(shí)

2 Bootloader

  • 2.1 啟動(dòng)流程
  • 2.2 校驗(yàn)跳轉(zhuǎn)地址是否有效
  • 2.3 Keil 工程 IAP 的相關(guān)設(shè)置

3 Application

  • 3.1 啟動(dòng)流程
  • 3.2 IAP 中的引導(dǎo)部分
  • 3.3 關(guān)于 VTOR
  • 3.4 Keil 工程設(shè)置

4 附件

1 預(yù)備知識(shí)

基于標(biāo)準(zhǔn)外設(shè)庫(STM32F10x_StdPeriph_Lib_V3.5.0)的 IAP 升級(jí)相關(guān)資料可以參考 ?IAP ST 官方資料匯總。

STM32 升級(jí)的三種方式:IAP,ICP,ISP;具體有什么區(qū)別可以自行 Google;

本文需要實(shí)現(xiàn) STM32 的 Bootloader(后面 Bootloader/IAP 不加以區(qū)分),文件傳輸基于 ymodem 協(xié)議通過串口進(jìn)行傳輸,這里參考了 ST 官方的 DEMO —— ?STM32F10xxx in-application programming using the USART AN2557,在此基礎(chǔ)上做了部分修改,增加了延時(shí)啟動(dòng)的功能,最終可以實(shí)現(xiàn)想要的效果。

整體架構(gòu)分為兩個(gè)部分;Bootloader 和 Application,具體如下圖所示;

由上圖可知,STM32 內(nèi)置的 Flash 被分成了兩個(gè)部分,分別用來保存 Bootloader 和 Application 程序,這里有兩個(gè)有兩個(gè) FLASH 起始地址 0x8000000 和 0x8003000;

為什么是 0x8000000 這個(gè)地址呢?而不是其他地址呢?這是由 M3 內(nèi)核硬件上的設(shè)計(jì)就已經(jīng)這么做了,人為設(shè)計(jì)好了,可以參考 M3 內(nèi)核權(quán)威指南;

0x8003000 這個(gè)地址則是由我們自己來規(guī)定的,這個(gè)地址的范圍必須在 0x8000000 和 0x8020000 之間,所以一般根據(jù) Bootloader 程序的最終大小,在這范圍之間取一個(gè)比較合理的值即可。如下圖所示;

注意:本文使用的stm32f103cb,屬于中等大小 Flash,128K = 0x20000,所以地址范圍是 0x8000000~0x8020000;

2 Bootloader

2.1 啟動(dòng)流程

這里的 Bootloader 即為 IAP 程序,它具備以下幾個(gè)功能;

支持文件傳輸;本文基于 ymodem 協(xié)議通過串口通訊接收或發(fā)送的 bin 文件;當(dāng)然也可以通過 I2C,SPI,USB,WiFi,藍(lán)牙等等進(jìn)行文件傳輸;

對(duì)內(nèi)置 Flash 進(jìn)行讀寫,擦除和編程;

啟動(dòng) Application 程序;

前面分析 STM32 啟動(dòng)文件的時(shí)候,我們可以知道,正常一個(gè)系統(tǒng)的啟動(dòng)流程,可以參考 《STM32 標(biāo)準(zhǔn)庫 V3.5 啟動(dòng)文件 startup_stm32f10xxx.s 分析》;

由該圖可以知道程序正常啟動(dòng)流程;以下表格一四個(gè)向量是必須的,從圖中也可以了解到;

2.2 校驗(yàn)跳轉(zhuǎn)地址是否有效

在主函數(shù)中可以看到如下程序;甚是不解和迷茫;沉思一會(huì)兒才恍然大悟;

本文中 ApplicationAddress = 0x8000000;那么*(__IO uint32_t*)ApplicationAddress)則是這個(gè)地址中所保存的值,由表格一可以知道,程序起始地址的第一個(gè)向量地址保存的棧頂?shù)模虼?,地?0x800_0000 和 0x800_3000 中保存的值都是指向棧頂,如下圖所示;

棧是在 RAM 上分配,因此 RAM 的有效范圍要做一個(gè)檢測(cè),棧頂?shù)刂泛?0x2FFE0000 做與運(yùn)算可以推算出,要校驗(yàn)的 RAM 范圍是 0x2000_0000—0x2001_FFFF,所以 RAM 大小是 128K,官方 DEMO 默認(rèn)使用 HD 高密度系列,所以是 128K,本文是 CBT6,20K 的 RAM,則需要改成 0x2FFFB000:

計(jì)算方式:20K = 20*1024= 0x5000,0x2FFF_FFFF - (0x5000 - 1) = 0x2FFF_B000

2.3 Keil 工程 IAP 的相關(guān)設(shè)置

2.3.1 修改 Flash 地址

設(shè)置程序起始地址 0x800000 和大小 0x3000;

設(shè)置 Debug 工具燒寫時(shí) Flash 的起始地址 0x800000 和大小 0x3000;

2.3.2 使用自己的鏈接腳本

該項(xiàng)為選配,與上述配置二選一即可,如果仍然想使用自己的鏈接腳本,在 Option-->Linker 下將 Use Memort Layout from Target Dialog 選項(xiàng)勾選去掉,然后選擇自己的鏈接腳本,如下圖進(jìn)行配置;

參考 ARMCC 的鏈接腳本編寫方法,可以自己編寫的 srt 文件,參考 ARM 分散加載技術(shù);

如果用的 gcc 工具鏈,則要編寫 gcc 的鏈接腳本 ld 文件;

2.3.3 下載固件

配置完成之后進(jìn)行 Build,然后通過 SWD 的方式先下載固件,進(jìn)行實(shí)驗(yàn);

3 Application

3.1 啟動(dòng)流程

用戶的 Application 需要在 IAP 啟動(dòng)完成后,才能正常執(zhí)行;具體啟動(dòng)過程,比正常應(yīng)用的啟動(dòng)多了一個(gè) IAP 啟動(dòng)的過程,并最終通過 IAP 引導(dǎo)進(jìn)入 Application;具體如下圖所示;白色部分為 IAP; 灰色部分為 Application;

圖中的 0x8000004+N+M 就等于 0x8003004,所以 Application 的啟動(dòng)地址需要進(jìn)行修改,另外還有其他需要修改的地方,下面會(huì)詳細(xì)指出。

3.2 IAP 中的引導(dǎo)部分

參考 IAP 中的引導(dǎo)程序;

可以發(fā)現(xiàn)的是 SP 的值為 0x8003000,指向棧頂,而 0x8003004 則為 ResetHander 的地址,系統(tǒng)會(huì)進(jìn)行復(fù)位,然后開始 Application 正常啟動(dòng)流程;

3.3 關(guān)于 VTOR

VTOR 是向量表偏移量寄存器,它將用來告訴 CPU,從 Flash 的哪個(gè)地方去取向量地址,第一個(gè)要取的是 MSP 的值,然后就是復(fù)位向量地址 ResetHandler,如果這里設(shè)置錯(cuò)誤,那么程序是無法正常啟動(dòng)的。下面是標(biāo)準(zhǔn)庫中與其相關(guān)的代碼片段;

所以 Application 中還需要修改 VECT_TAB_OFFSET 的值為 0x3000;

參考 M3 權(quán)威指南:

如果需要?jiǎng)討B(tài)地更改向量表,則對(duì)于任何器件來說,向量表的起始處都必須包含以下向量:

堆棧指針(MSP)的初始值

復(fù)位向量

NMI

硬 fault 服務(wù)例程 后兩者也是必需的,因?yàn)橛锌赡茉谝龑?dǎo)過程中發(fā)生這兩種異常??梢栽?SRAM 中開出一塊空間用于存儲(chǔ)向量表。在引導(dǎo)期間先填寫好各向量,然后在引導(dǎo)完成后,就可以啟用內(nèi)存中的新向量表,從而實(shí)現(xiàn)向量可動(dòng)態(tài)調(diào)整的能力。

3.4 Keil 工程設(shè)置

3.4.1 Flash 地址設(shè)置

與 IAP 工程設(shè)置類似,這里的 Application 是另一個(gè) Keil 工程,同樣的需要對(duì) Flash 進(jìn)行設(shè)置,如下圖所示;

這里 Application 工程的 Flash 地址偏移了 0x3000,正是之前 Bootloader 所占用的 Flash 空間大小,這里和 VTOR 的設(shè)置也必須保持一致;

3.4.2 hex2bin

配置工程最終生成hex文件,如下圖所示;

最終我們需要使用的是 bin 文件,所以,這里需要使用將 hex 文件轉(zhuǎn)成 bin 文件,本文使用 hex2bin 的工具;配置工程運(yùn)行之后執(zhí)行轉(zhuǎn)換文件的腳本;

create_bin.bat

copy_firmware.bat

最終在 Build 之后,可以在 Firmware 中找到 STM321-APP.bin,這個(gè)文件就是要用來 IAP 程序進(jìn)行串口下載的程序。

3.4.3 用戶程序串口下載測(cè)試

SecureCRT 軟件支持 ymodem 協(xié)議,可以安裝該軟件,打開串口連接,設(shè)置 ymodem 的協(xié)議;打開菜單選項(xiàng):Options--Session Options,配置如下;

為了便于測(cè)試,在 STM32F1-APP 進(jìn)行串口發(fā)送以下信息,便于觀察 APP 是否正常啟動(dòng);

usart_printf("?rn?STM32F1-APP?start?running*******************");

打開連接的串口,并根據(jù)終端提示進(jìn)行操作,最終下載固件 STM32F1-APP 成功,并成功運(yùn)行;

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
0705430003 1 Molex Board Connector, 4 Contact(s), 1 Row(s), Male, Straight, Solder Terminal, ROHS AND REACH COMPLIANT

ECAD模型

下載ECAD模型
$1.62 查看
51281-0894 1 Molex Card Edge Connector, 8 Contact(s), 1 Row(s), Female, Right Angle, 0.02 inch Pitch, Surface Mount Terminal, Locking, LEAD FREE

ECAD模型

下載ECAD模型
$1.84 查看
D38999/26WD35SN 1 ITT Interconnect Solutions MIL Series Connector, 37 Contact(s), Aluminum Alloy, Female, Crimp Terminal, Plug,
$57.63 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

CSDN博客專家,公眾號(hào)小麥大叔主筆,資深嵌入式系統(tǒng)工程師,曾從事移動(dòng)終端,智能硬件以及物聯(lián)網(wǎng)等消費(fèi)電子產(chǎn)品的軟硬件研發(fā),分享,總結(jié),提高,相互交流,共同進(jìn)步。