您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關STM32遠程固件更新的方法是什么,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
經常有項目要求固件遠程更新,通過串口、GPRS、4G等等方式。下面介紹下STM32遠程固件更新的方法。
IAP是In Application Programming的首字母縮寫,IAP是用戶自己的程序在運行過程中對User Flash的部分區域進行燒寫,目的是為了在產品發布后可以方便地通過預留的通信口對產品中的固件程序進行更新升級。
通常在用戶需要實現IAP功能時,即用戶程序運行中作自身的更新操作,需要在設計固件程序時編寫兩個項目代碼,第一個項目程序不執行正常的功能操作,而只是通過某種通信管道(如USB、USART)接收程序或數據,執行對第二部分代碼的更新;第二個項目代碼才是真正的功能代碼。這兩部分項目代碼都同時燒錄在User Flash中,當芯片上電后,首先是第一個項目代碼開始運行,它作如下操作:
1)檢查是否需要對第二部分代碼進行更新
2)如果不需要更新則轉到4)
3)執行更新操作
4)跳轉到第二部分代碼執行
第一部分代碼必須通過其它手段,如JTAG或ISP燒入;第二部分代碼可以使用第一部分代碼IAP功能燒入,也可以和第一部分代碼一道燒入,以后需要程序更新是再通過第一部分IAP代碼更新。
對于STM32來說,因為它的中斷向量表位于程序存儲器的最低地址區,為了使第一部分代碼能夠正確地響應中斷,通常會安排第一部分代碼處于Flash的開始區域,而第二部分代碼緊隨其后。
在第二部分代碼開始執行時,首先需要把CPU的中斷向量表映像到自己的向量表,然后再執行其他的操作。
如果IAP程序被破壞,產品必須返廠才能重新燒寫程序,這是很麻煩并且非常耗費時間和金錢的。針對這樣的需求,STM32在對Flash區域實行讀保護的同時,自動地對用戶Flash區的開始4頁設置為寫保護,這樣可以有效地保證IAP程序(第一部分代碼)區域不會被意外地破壞。
下面重點介紹這兩個程序設計要點。
BootLoader程序
keil軟件程序存儲區正常設置如下
IAP程序主要做跳轉,主循環如下
#define IOT_APP_Addr 0x8010000
int main(void)
{
IO_config();
usart_config();
Delay_ms(1000);
Spi_Init();
iap_load_app(IOT_APP_Addr);
while(1)
{
}
}
跳轉函數如下,其中0x8010000是應用程序的起始地址。
void iap_load_app(u32 appxaddr)
{
if((appxaddr&0x8FC0000)==0x8000000)
{
jump2app=(iapfun)*(vu32*)(appxaddr+4);
MSR_MSP(*(vu32*)appxaddr);
jump2app();
}
}
user application程序要設置程序的起始地址,與IAP程序里的起始地址要一致,如下圖
程序里要設置中斷向量表的地址偏移量
int main(void)
{
NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x10000);
... ...
燒錄程序時先燒錄BootLoader程序,再燒入user application程序即可實現程序的固件升級
關于STM32遠程固件更新的方法是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。