硬件:stm32f103cbt6 軟件:STM32F10x_StdPeriph_Lib_V3.5.0

 

1 預備知識

2 Bootloader

  • 2.1 啟動流程
  • 2.2 校驗跳轉地址是否有效
  • 2.3 Keil 工程 IAP 的相關設置

3 Application

  • 3.1 啟動流程
  • 3.2 IAP 中的引導部分
  • 3.3 關于 VTOR
  • 3.4 Keil 工程設置

4 附件

 

1 預備知識

基于標準外設庫(STM32F10x_StdPeriph_Lib_V3.5.0)的 IAP 升級相關資料可以參考  IAP ST 官方資料匯總。

 

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

 

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

 


整體架構分為兩個部分;Bootloader 和 Application,具體如下圖所示;

 

 

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

 

為什么是 0x8000000 這個地址呢?而不是其他地址呢?這是由 M3 內核硬件上的設計就已經這么做了,人為設計好了,可以參考 M3 內核權威指南;

 

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

 

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

 

2 Bootloader

2.1 啟動流程

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

 

支持文件傳輸;本文基于 ymodem 協議通過串口通訊接收或發送的 bin 文件;當然也可以通過 I2C,SPI,USB,WiFi,藍牙等等進行文件傳輸;

 

對內置 Flash 進行讀寫,擦除和編程;

 

啟動 Application 程序;

 

前面分析 STM32 啟動文件的時候,我們可以知道,正常一個系統的啟動流程,可以參考 《STM32 標準庫 V3.5 啟動文件 startup_stm32f10xxx.s 分析》;

 

 

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

 

 

2.2 校驗跳轉地址是否有效

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

 

 

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

 

 

棧是在 RAM 上分配,因此 RAM 的有效范圍要做一個檢測,棧頂地址和 0x2FFE0000 做與運算可以推算出,要校驗的 RAM 范圍是 0x2000_0000—0x2001_FFFF,所以 RAM 大小是 128K,官方 DEMO 默認使用 HD 高密度系列,所以是 128K,本文是 CBT6,20K 的 RAM,則需要改成 0x2FFFB000:

 

 

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

 

2.3 Keil 工程 IAP 的相關設置

2.3.1 修改 Flash 地址

 


設置程序起始地址 0x800000 和大小 0x3000;

 

 

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

 

 

2.3.2 使用自己的鏈接腳本

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

 

 

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

 

 

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

 

2.3.3 下載固件

配置完成之后進行 Build,然后通過 SWD 的方式先下載固件,進行實驗;

 

 

3 Application

3.1 啟動流程

用戶的 Application 需要在 IAP 啟動完成后,才能正常執行;具體啟動過程,比正常應用的啟動多了一個 IAP 啟動的過程,并最終通過 IAP 引導進入 Application;具體如下圖所示;白色部分為 IAP; 灰色部分為 Application;

 

 

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

 

3.2 IAP 中的引導部分

參考 IAP 中的引導程序;

 

 

可以發現的是 SP 的值為 0x8003000,指向棧頂,而 0x8003004 則為 ResetHander 的地址,系統會進行復位,然后開始 Application 正常啟動流程;

 

3.3 關于 VTOR

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

 

 

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

 

參考 M3 權威指南:

如果需要動態地更改向量表,則對于任何器件來說,向量表的起始處都必須包含以下向量:

 

主堆棧指針(MSP)的初始值

 

復位向量

 

NMI

 

硬 fault 服務例程 后兩者也是必需的,因為有可能在引導過程中發生這兩種異常。可以在 SRAM 中開出一塊空間用于存儲向量表。在引導期間先填寫好各向量,然后在引導完成后,就可以啟用內存中的新向量表,從而實現向量可動態調整的能力。

 

3.4 Keil 工程設置

3.4.1 Flash 地址設置

與 IAP 工程設置類似,這里的 Application 是另一個 Keil 工程,同樣的需要對 Flash 進行設置,如下圖所示;

 

 

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

 

 

3.4.2 hex2bin

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

 

 

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

 

 

create_bin.bat

 

 

copy_firmware.bat

 

 

 

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

 

3.4.3 用戶程序串口下載測試

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

 

 

為了便于測試,在 STM32F1-APP 進行串口發送以下信息,便于觀察 APP 是否正常啟動;

 

usart_printf(" \r\n STM32F1-APP start running*******************");

 

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