溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

STM32遠(yuǎn)程固件更新的方法是什么

發(fā)布時(shí)間:2022-01-18 11:50:03 來(lái)源:億速云 閱讀:311 作者:柒染 欄目:互聯(lián)網(wǎng)科技

這篇文章將為大家詳細(xì)講解有關(guān)STM32遠(yuǎn)程固件更新的方法是什么,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

經(jīng)常有項(xiàng)目要求固件遠(yuǎn)程更新,通過(guò)串口、GPRS、4G等等方式。下面介紹下STM32遠(yuǎn)程固件更新的方法。

IAP是In Application Programming的首字母縮寫(xiě),IAP是用戶自己的程序在運(yùn)行過(guò)程中對(duì)User Flash的部分區(qū)域進(jìn)行燒寫(xiě),目的是為了在產(chǎn)品發(fā)布后可以方便地通過(guò)預(yù)留的通信口對(duì)產(chǎn)品中的固件程序進(jìn)行更新升級(jí)。

通常在用戶需要實(shí)現(xiàn)IAP功能時(shí),即用戶程序運(yùn)行中作自身的更新操作,需要在設(shè)計(jì)固件程序時(shí)編寫(xiě)兩個(gè)項(xiàng)目代碼,第一個(gè)項(xiàng)目程序不執(zhí)行正常的功能操作,而只是通過(guò)某種通信管道(如USB、USART)接收程序或數(shù)據(jù),執(zhí)行對(duì)第二部分代碼的更新;第二個(gè)項(xiàng)目代碼才是真正的功能代碼。這兩部分項(xiàng)目代碼都同時(shí)燒錄在User Flash中,當(dāng)芯片上電后,首先是第一個(gè)項(xiàng)目代碼開(kāi)始運(yùn)行,它作如下操作:

1)檢查是否需要對(duì)第二部分代碼進(jìn)行更新

2)如果不需要更新則轉(zhuǎn)到4)

3)執(zhí)行更新操作

4)跳轉(zhuǎn)到第二部分代碼執(zhí)行

第一部分代碼必須通過(guò)其它手段,如JTAG或ISP燒入;第二部分代碼可以使用第一部分代碼IAP功能燒入,也可以和第一部分代碼一道燒入,以后需要程序更新是再通過(guò)第一部分IAP代碼更新。

對(duì)于STM32來(lái)說(shuō),因?yàn)樗闹袛嘞蛄勘砦挥诔绦虼鎯?chǔ)器的最低地址區(qū),為了使第一部分代碼能夠正確地響應(yīng)中斷,通常會(huì)安排第一部分代碼處于Flash的開(kāi)始區(qū)域,而第二部分代碼緊隨其后。

在第二部分代碼開(kāi)始執(zhí)行時(shí),首先需要把CPU的中斷向量表映像到自己的向量表,然后再執(zhí)行其他的操作。

如果IAP程序被破壞,產(chǎn)品必須返廠才能重新燒寫(xiě)程序,這是很麻煩并且非常耗費(fèi)時(shí)間和金錢(qián)的。針對(duì)這樣的需求,STM32在對(duì)Flash區(qū)域?qū)嵭凶x保護(hù)的同時(shí),自動(dòng)地對(duì)用戶Flash區(qū)的開(kāi)始4頁(yè)設(shè)置為寫(xiě)保護(hù),這樣可以有效地保證IAP程序(第一部分代碼)區(qū)域不會(huì)被意外地破壞。

下面重點(diǎn)介紹這兩個(gè)程序設(shè)計(jì)要點(diǎn)。

BootLoader程序

keil軟件程序存儲(chǔ)區(qū)正常設(shè)置如下

STM32遠(yuǎn)程固件更新的方法是什么

IAP程序主要做跳轉(zhuǎn),主循環(huán)如下

 
#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)
    {
 
    }
}
跳轉(zhuǎn)函數(shù)如下,其中0x8010000是應(yīng)用程序的起始地址。

void iap_load_app(u32 appxaddr)
{
    if((appxaddr&0x8FC0000)==0x8000000)    
    { 
        jump2app=(iapfun)*(vu32*)(appxaddr+4);        
        MSR_MSP(*(vu32*)appxaddr);                    
        jump2app();                                    
    }
}
user application程序要設(shè)置程序的起始地址,與IAP程序里的起始地址要一致,如下圖

STM32遠(yuǎn)程固件更新的方法是什么

程序里要設(shè)置中斷向量表的地址偏移量

int main(void)
{
    NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x10000);
 
 
... ...
燒錄程序時(shí)先燒錄BootLoader程序,再燒入user application程序即可實(shí)現(xiàn)程序的固件升級(jí)

關(guān)于STM32遠(yuǎn)程固件更新的方法是什么就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI