STM32串口IAP分享

2021-12-27 嵌入式大雜燴
什麼是IAP?

IAP是In Application Programming的首字母縮寫,IAP是用戶自己的程序在運行過程中對User Flash的部分區域進行燒寫,目的是為了在產品發布後可以方便地通過預留的通信口對產品中的固件程序進行更新升級。

在重新編程過程中可以使用任意類型的通信協議,如UART、I2S、SPI等。這篇筆記分享的是使用UART方式IAP。

串口IAP實驗

先理一理流程(本實驗是以STM32F103ZET6為例):

1、實驗說明

做這個實驗需要準備兩個keil工程,一個工程用於編寫IAP程序,另一個工程用於編寫我們的應用程式(要實現某些功能的程序),這裡我們以一個點燈程序為例。最終,兩份工程編譯出來的可執行文件都需要燒寫到晶片的FLASH中。只不過需要燒寫到不同的地址,簡單的示意圖如下:

這裡,使用的STM32的型號為STM32F103ZET6,其FLASH大小是512KB,0x08000000為其FLASH被映射的地址,程序被燒寫到的就是這個地址。此處,我們的IAP程序燒寫到這個地址,根據IAP程序的大小,我們在keil裡可以設置合適的IAP結束地址。

注意:在沒有IAP程序的情況下,0x08000000這個地址就是應用程式燒寫的地址。

2、工程說明

本實驗用到的兩個工程可按照文末的方式獲取,其中IAP工程移植至ST官方例程。下面對兩個工程進行簡單的說明

IAP工程:

(1)需要在target選項卡裡設置我們IAP程序的起始地址與大小,如:

這裡我們的IAP程序起始地址設為0x08000000,大小設為0x3000,即IAP所能用的FLASH空間為12KB。其中IAP所能佔的佔空間的大小可根據IAP的實際大小進行修改。

(2)需要修改程序中我們需要跳轉到的應用程式的地址(即IAP程序的結束地址):

LED工程:

(1)需要在target選項卡裡設置我們LED程序的起始地址與大小,如:

這裡我們的LED程序起地址設為0x08003000,大小設為0x10000,即LED所能用的FLASH空間為64KB。其中結束地址可根據LED應用程式的實際大小進行修改。

(2)生成對應的.bin文件。這需要在User選項卡裡添加如下命令(即編譯後執行的命令):

其中,fromelf.exe是我們keil安裝目錄下的一個可執行程序,可以把.axf文件轉換成.bin文件。要在keil中直接調用fromelf命令,必須要把fromelf.exe所在目錄添加到環境變量中。添加環境變量的方法如下(該方法來自於《【野火】零死角玩轉STM32—F429挑戰者V2.pdf》):

本文以 Win7 系統為例添加工具鏈的路逕到 PATH 環境變量,其它系統是類似的。

(1) 右鍵電腦系統的計算機圖標,在彈出的菜單中選擇屬性 ,如圖:

(2) 在彈出的屬性頁面依次點擊高級系統設置 ->環境變量,在用戶變量一欄中找到名為PATH的變量,若沒有該變量,則新建一個。編輯PATH變量,在它的變量值中輸入工具鏈的路徑,如本機的是;D:\work\keil5\ARM\ARMCC\bin,注意要使用分號;讓它與其它路徑分隔開,輸入完畢後依次點確定,如圖:

(3) 打開 Windows 的命令行,點擊系統的開始菜單,在搜索框輸入cmd,在搜索結果中點擊cmd.exe即可打開命令行, 如圖:

(4) 在彈出的命令行窗口中輸入fromelf回車,若窗口列印出 formelf 的幫助說明,那麼路徑正常,就可以開始後面的工作了;若提示不是內部名外部命令,也不是可運行的程序…信息,說明路徑不對,請重新配置環境變量,並確認該工作目錄下有編譯工具鏈。

這個過程本質就是讓命令行通過「PATH」路徑找到fromelf.exe程序運行 。

學會配置fromelf.exe,也就學會配置了MinGW。MinGW是一個工具集,包含編譯C與C++的gcc、g++,使用它就可以在Windows命令行下編譯C程序。相關筆記:使用Notepad++來開發C程序

3、IAP源碼說明

(1)主函數:

int main(void)
{
FLASH_Unlock();
KEY_Init();
IAP_Init();


if (GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2) == 0x00)
{
SerialPutString("\r\n======================================================================");
SerialPutString("\r\n= (C) COPYRIGHT 2010 STMicroelectronics =");
SerialPutString("\r\n= =");
SerialPutString("\r\n= In-Application Programming Application (Version 3.3.0) =");
SerialPutString("\r\n= =");
SerialPutString("\r\n= By MCD Application Team =");
SerialPutString("\r\n======================================================================");
SerialPutString("\r\n\r\n");
Main_Menu ();
}

else
{

if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)
{

JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);
Jump_To_Application = (pFunction) JumpAddress;

__set_MSP(*(__IO uint32_t*) ApplicationAddress);
Jump_To_Application();
}
}

while (1){}

return 0;
}

可見,我們按下復位的同時按下PE2對應的按鍵即可觸發應用程式更新操作,否則跳轉到應用程式的起始地址執行應用程式(斷點重啟也是默認執行應用程式),這裡的ApplicationAddress就是我們上面設置的0x08003000。

(2)主菜單函數Main_Menu

這個函數裡就是該IAP程序的功能,根據其中的列印信息:

可以知道,該IAP有三個功能(分別輸入鍵盤上的數字1、2、3進行選擇):一是下載程序(電腦->STM32);二是上傳程序(STM32->電腦);三是執行新程序(即剛下載完成的程序)。

(3)下載程序功能函數SerialDownload

首先,上位機使用Ymodem協議進行數據下發,STM32根據協議解析數據,拿到有用的數據,並把這些數據寫入FLASH對應的地址中,即ApplicationAddress。關於Ymodem協議及SerialDownload函數這裡不展開討論。

4、下載驗證

(1)下載IAP程序

可以使用J-link等調試器進行下載,也可用串口ISP進行下載,我們選用的是串口ISP進行下載,借用的工具是FlyMcu:

這裡下載的是.hex文件,如果下載.bin文件,則會提示如下錯誤:

程序文件不是0x8000000和0x20000000區域的

使用ISP方式下載需要進行的硬體操作是:BOOT0引腳拉高,BOOT1引腳接地。即系統存儲器被選為啟動區域:

在點擊開始編程按鈕後,需要按下板子上的復位鍵,即可下載程序。

(2)通過IAP程序引導下載LED程序

上面提到下載程序使用的是Ymodem協議,所以得選用帶有Ymodem協議傳輸方式的上位機軟體來把應用程式下載到板子裡。可以選用SecureCRT,也可以選用超級終端。這裡選用的是超級終端:

首先按下數字鍵1觸發下載程序操作,此時會不斷列印CCCCC...。然後點傳送->發送文件,選擇要下載的.bin文件及Ymodem協議。下載完成後按下數字3即可執行新下載得應用程式:

終於,LED閃爍起來了,點燈項目成功。斷電重啟之後默認執行的是這個點燈程序,要想下載新的程序,按下復位的同時按下PE2所對應的按鍵(需要一定的手速)即可觸發更新程序操作。

本篇筆記相關的代碼及工具可在後臺回復關鍵詞:串口IAP,進行獲取。

End:以上就是本次的筆記分享,如有錯誤,歡迎之處!如果這篇筆記對你有幫助的話,歡迎收藏、轉發、在看~

相關焦點

  • STM32_IAP詳解(有代碼,有上位機)
    要做iap首先我們要知道stm32的啟動流程,流程如下1、單片機從0x80000000位置啟動,並將該地址當成系統棧頂地址2、運行到中斷向量表中,默認的中斷向量表為0x80000004,該位置存放復位中斷3、跳轉到復位中斷處理函數當中,進行系統初始化,然後運行main函數   當我們準備用iap的時候,單片機內部是有著兩套程序的
  • STM32單片機的Bootloader詳解(1)
    其實如果程序是從0地址(0x0000 0000)運行的話那就不需要偏移,但是STM32的FLASH是0x0800 0000,所以這個入口地址要加上0x0800 0000(關於為什麼stm32的FLASH地址為什麼是0x0800 0000可以查看安富萊的帖子:https://www.bilibili.com/read/cv13767372),而如果是F7的XIP模式,那麼外置
  • STM32 + IAP + Ymodem完美結合
    [來自百度百科]IAP的通信口有許多種:UART串口、ETH乙太網、I2C、SPI.等。按理說只要能傳輸數據的通信口都能實現IAP的功能。本文結合STM32官網提供的例程,利用UART在應用編程(IAP)。YModem是一種文件傳輸的協議,由XModem協議演變而來的,每包數據可以達到1024位元組,是一個非常高效的文件傳輸協議。
  • stm32初學者必會操作----usart串口調試工具
    今天筆者介紹stm32初學者必會的工具 usart的串口設備。usart很重要,可以傳輸數據,可以檢查代碼的錯誤位置,查看輸出數據。下圖就是筆者的藍牙串口下面來介紹串口使用的步驟1.首先是接線–筆者這裡使用的是stm32f103rct6串口用到是USART1 —PA9 、 PA10;晶片與串口設備交錯相連注意:串口正負極不要接反。
  • STM32串口通信基本原理
    收錄於話題 #stm32這樣,兩個晶片之間就可以進行TTL電平通信了。STM32與51單片機串口通信相關實例,請移步此處:STM32與51單片機串口通信實例。
  • STM32通過rosserial接入ROS通訊開發
    作者:良知猶存轉載授權以及圍觀:歡迎添加微信公眾號:羽林君前言主題:串口是一種設備間常用的通訊接口,rosserial將串口字符數據轉發到標準ROS網絡,並輸出到rosout和其日誌文件。本文將記錄如何在ROS上使用其提供的serial包進行串口通信。
  • STM32與Arduino問答集
    www.stm32duino.com       此論壇網專門針對STM32系列晶片板,即時更新相關ArduinoIDE 環境API。 問:我如何開始著手?答:1.在Arduino 1.6.12 環境下安裝stm32duino 支持包視頻:https://www.youtube.com/watch?
  • STM32固件IAP程序實現
    3.自己編寫BootLoader系統Bootloader只能通過特定的接口對程序進行升級,且會增加額外的硬體設計,有時候並不適用。這裡以STM32F1系列單片機為例,採用串口1和通用的Ymodem協議進行介紹。YModem協議YModem協議是一個非常高效的文件傳輸協議,每包數據可以達到1024位元組。YModem協議傳輸的完整的握手過程如下。這裡就不進行詳細介紹了,用戶也可以採用自定義的協議,協議設計要主要發送、反饋和校驗,保證傳輸數據的正確性。
  • 【C++開發Stm32-環境搭建】 Stm32f103c8t6支持Arduino庫開發
    那就用C Plus Plus來寫stm32單片機代碼吧!藉助Arduino的庫,輕鬆使用面向對象的思想開發單片機。本教程分享stm32支持Arduino庫開發的環境搭建。對於stm32選擇generic_boot20前綴的,後面的pa1,pb1,pc13這是什麼意思?其實這是stm32小板上的一個led燈接到的gpio,在這裡只是作為一個bootloader只是燈的作用。這裡使用的小板的燈是接到pc13的,因此選擇generic_boot20_pc13.bin這個文件來燒錄。
  • 手把手教你搭建STM32MP1開發環境
    /stm32mp1-openstlinux-5.10-dunfell-mp1-21-11-17/sdk/st-image-weston-openstlinux-weston-stm32mp1-x86_64-toolchain-3.1.11-openstlinux-5.10-dunfell-mp1-21-11-17.sh -d /home/mculover666/STM32MPU_workspace/
  • STM32 與 Arduino
    stm32duino 對常見的 MCU 做了廣泛的支持,開發板之間的不同大都體現在 MCU 的外圍電路上,去複製同 MCU 的文件夾改動量會小很多。2、讓加入的自定義配置與 Arduino 關聯。
  • STM32MP157開發環境搭建(A7核、M4核)
    /stm32mp1-openstlinux-5.10-dunfell-mp1-21-11-17/sdk/st-image-weston-openstlinux-weston-stm32mp1-x86_64-toolchain-3.1.11-openstlinux-5.10-dunfell-mp1-21-11-17.sh -d /home/mculover666/STM32MPU_workspace/
  • STM32 SPI 注意要點
    問題二:在配置為雙線全雙工的時候,如上面所說,在master寫數據的時候,其實stm32的SPI同時也往master的DR寄存器裡面讀進數據(讀寫雖然都是DR,其實是兩個不同的寄存器)。對這點的忽略,就是這次問題產生的原因。
  • STM32F0xx_USART收發配置詳細過程
    STM32F0系列的晶片,串口根據型號不同,數量也不同,從1個到8個不等。今天主要總結串口簡單且常用的功能,發送字符和中斷接收字符。今天提供的串口發送功能將在後面的各個模塊總結中都需要使用到,主要用於驗證和測試各項功能的正確性。
  • STM32MP157C-DK2公板快速上手
    OpenSTLinux Distribution (STM32MP1Distrib), one or more firmware example(s) for the STM32CubeMP1 package and the tool (STM32CubeProg) to install this image on the STM32MP15xx-EV1 Evaluation boards.
  • 深入理解STM32串口通信
    串口通訊的物理層有很多標準及變種,我們主要講解 RS-232 標準, RS-232 標準主要規定了信號的用途、通訊接口以及信號的電平標準。使用 RS-232 標準的串口設備間常見的通訊結構見圖1。圖1 串口通訊結構圖在上面的通訊方式中,兩個通訊設備的「DB9 接口」之間通過串口信號線建立起連接,串口信號線中使用「RS-232 標準」傳輸數據信號。由於 RS-232 電平標準的信號不能直接被控制器直接識別,所以這些信號會經過一個「電平轉換晶片」轉換成控制器能識別的「TTL 標準」的電平信號,才能實現通訊。1.
  • Qt 串口上位機開發《Rice 上位機 學習開發》
    前幾天分享了一個使用C#開發的串口上位機,那麼今天教你如何100行QT代碼實現一個串口上位機。
  • STM32第五章-串口通訊詳解
    1.使能串口引腳GPIOA的時鐘RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);2.使能串口的時鐘,串口掛載在AHB2RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);3.將串口的引腳復用到串口中斷線上
  • STM32實現USB轉串口功能(含源碼)
    要實現USB轉串口的功能,需要將單片機真實串口(這裡以USART1為例)的收發數據與USB口進行交互。用過USB虛擬串口的朋友可能知道,要實現該功能,還存在以下問題:1.電腦上設置的串口波特率不影響USB接口傳輸的速率。2.怎樣獲取電腦上串口助手設置的波特率,以設置USART1使其波特率與串口助手一致。
  • STM32下載程序新思路--使用串口下載STM32程序
    前期我們下載程序都是使用STlink進行下載的,現在給大家提供一種新的程序下載方法,即使用串口進行程序的下載,下面讓我們一起來看看如何操作的吧!USB 轉串口的驅動晶片是 CH340,要使用串口得先在電腦 中安裝 USB 轉串口驅動—CH340 版本。驅動可在網上搜索下載去某寶店鋪提供的。WIN7 用戶請用管理員身份安裝。