STM32的bootloader IAP程式設計

2021-08-13 08:05:05 字數 1756 閱讀 5301

**:

不需要拆機就能對產品進行

韌體公升級

是很多人想要的效果,不僅方便而且節省精力和成本。那麼如何完成這項工作呢?接下來所介紹的

bootloader

就可以完成這項工作,通過

bootloader

引導程式完成韌體的公升級。下面來**

stm32

bootloader

設計。首先談談stm32的isp和iap區別和聯絡。

isp(in-system programming)在系統可程式設計,指

tion programming) 指mcu可以在系統中獲取新**並對自己重新程式設計,即可用程式來改變程式。isp和iap技術是未來儀器儀表的發展方向。

1  isp和iap的工作原理

isp的實現相對要簡單一些,一般通用做法是內部的儲存器可以由上位機的軟體通過串列埠來進行改寫。對於

微控制器來講可以通過spi或其它的序列介面接收上位機傳來的資料並寫入儲存器中。所以即使我們將

晶元焊接在電路板上,只要留出和上位機介面的這個串列埠,就可以實現晶元內部儲存器的改寫,而無須再取下晶元。 

iap的實現相對要複雜一些,在實現iap功能時, 微控制器內部一定要有兩塊儲存區,一般一塊被稱為boot區,另外一塊被稱為儲存區。微控制器上電執行在boot區,如果有外部改寫程式的條件滿足,則對儲存區的程式進行改寫操作。如果外部改寫程式的條件不滿足,程式指標跳到儲存區,開始執行放在儲存區的程式,這樣便實現了iap功能。 

2 isp和iap的優點 

isp技術的優勢是不需要程式設計器就可以進行微控制器的實驗和開發,微控制器晶元可以直接焊接到電路板上,除錯結束即成成品,免去了除錯時由於頻繁地插入取出晶元對晶元和電路板帶來的不便。 

iap技術是從結構上將flash儲存器對映為兩個儲存體,當執行乙個儲存體上的使用者程式時,可對另乙個儲存體重新程式設計,之後將程式從乙個儲存體轉向另乙個。 

isp的實現一般需要很少的外部電路輔助實現, 而iap的實現更加靈活,通常可利用微控制器的序列口接到計算機的rs232口,通過專門設計的韌體程式來程式設計內部儲存器,可以通過現有的internet或其它通訊方式很方便地實現遠端公升級和維護。

iap的編寫流程

設計思想

由bootloader負責檢測sd卡中是否有韌體更新所需的bin檔案。如果檢測到所需要的bin檔案,則開始複製檔案更新韌體。更新結束後跳轉到指定的位址開始執行最新的程式。

知識要點

bootloader程式設計

2.bootloader檢測是否有bin檔案

3.複製檔案到指定位址

4.跳轉到新程式執行

更新完程式後就需要跳轉到新程式開始執行,具體實現看下面**:

typedef void (*iapfun)(void); //定義乙個函式型別的引數

__asm void msr_msp(u32 addr) //設定堆疊指標

//跳轉到應用程式段

} 1.編譯軟體需要做出設定:

2.修改system_stm32f10x.c檔案

文中只是簡單的介紹了關於bootloader程式的設計,作為拋磚引玉,大家可以繼續深入,新增資料校驗和程式加密等。

///跳轉函式具體說明

1、函式原型:

void jump_address(void)

}3、經過2的分析,test儲存的就是堆疊位址(並且是應用程式堆疊的棧頂位址),檢視stm32的向量表,可以知道:棧頂位址 + 4 存放的是復位位址,因此jumpaddress存放的是復位位址。

4、呼叫__set_msp函式後,將把使用者**的棧頂位址設為棧頂指標

stm32最簡單的實現BootLoader

bootloader大家應該都知道是幹什麼的,簡單的來說就是程式開始執行前的一段程式。網上有非常多的檔案有介紹過stm32 bootloader的實現。但是講的可能比較深入難以理解,實現更是無從下手。今天這裡注意介紹最簡單實現的方式,關鍵 只有幾行,每錯,真的就只有 幾行。主要實現晶元是stm32f...

STM32 的串列埠

一 串列埠使用 原則 盡量中斷中不要有延時 比如自定義delay 和自定義printf串列埠列印,明顯找事啊這麼慢能不發生溢位error嘛 接收和傳送盡量分開處理 1.串列埠傳送資料丟失 1 通常是因為傳送之前未檢測tc狀態位之前是否處於傳送完成標誌導致,關於stm32之 的測試程式來講會導致第乙個...

stm32 工業按鍵檢測 STM32按鍵的檢測

stm32的按鍵檢測相對比較簡單,首先按部就班的初始化連線的到的i o,然後寫乙個按鍵掃瞄函式,這個和51微控制器的差不多。以下是乙個比較典型的例子 利用按鍵控制led key.件 ifndef key h define key h include sys.h definekey0 gpio rea...