国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

STM32單片機實現(xiàn)固件在線升級(IAP)

這篇具有很好參考價值的文章主要介紹了STM32單片機實現(xiàn)固件在線升級(IAP)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

固件升級方案綜述

單片機的固件升級方式有很多種,
1、ICP:In Circuit Programing,簡單說就是在單片機開發(fā)時使用燒錄器升級程序,比如使用J-Link燒錄單片機程序。
2、ISP:In System Programing,在單片機內(nèi)部實現(xiàn)了基于通信接口(如串口、I2C、SPI等等)的FLASH引導(dǎo)程序,配合廠家提供的燒錄軟件工具或自行開發(fā)的軟件實現(xiàn)程序燒錄。
3、IAP:In applicating Programing,是指單片機程序開發(fā)好之后在運行過程中由外部用戶發(fā)起的在線升級,這種升級方式一般由用戶自行設(shè)計升級方案,方案靈活性和自由度較高,在智能家居、汽車電子、物聯(lián)網(wǎng)設(shè)備中常用的OTA(Over The Air)即空中下載技術(shù)原理也與之類似。
本文以STM32單片機為例介紹了IAP的設(shè)計原理。

劃分FALSH存儲區(qū)域

在STM32系列單片機中,程序存儲在內(nèi)部FLASH中,按照不同的單片機型號FLASH大小有所不同,有64KB、128KB、512KB等等。以STM32F407VET6系列單片機為例,內(nèi)置FLASH大小為512KB,存儲地址為0x08000000-0x0807FFFF。單片機每次程序復(fù)位時從0x08000000的位置開始執(zhí)行主程序,如果不做IAP則這512KB空間都可以用來存儲用戶編寫的APP程序。
若要實現(xiàn)IAP功能則必須將FLASH空間劃分為幾個部分,每部分都存儲一個可以獨立運行的程序文件(可以理解為幾個獨立的單片機工程):
1、引導(dǎo)程序,每次復(fù)位時程序默認執(zhí)行此程序,在接下來的執(zhí)行過程中可以跳轉(zhuǎn)到用戶編寫的程序,因此這部分程序是固化在以0x08000000為起始的區(qū)域中。在引導(dǎo)程序中可以對電路系統(tǒng)作出一些自檢和初始化檢查的工作,因此該程序又稱為bootloader或boot程序,需要注意的是在設(shè)計bootloader時要提前規(guī)定好程序空間的大小,比如規(guī)定程序存儲區(qū)域為0x08000000-0x8007FFF,則bootlader程序存儲空間為32KB,編寫boot程序時要注意這一點
2、用戶需要升級的新程序,這部分包含了用戶的業(yè)務(wù)代碼,復(fù)雜的運算邏輯和算法實現(xiàn)均在這一部分完成,稱為APP程序,該部分程序一般存儲在bootloader區(qū)域之后的FLASH中。用一個不是特別恰當?shù)睦宇惐萣ootloader和APP:bootloader相當于電腦組裝時的BIOS,APP則相當于操作系統(tǒng),電腦開機時首先運行BIOS,完成后跳轉(zhuǎn)運行到操作系統(tǒng)。
3、升級之前的老版APP備份。這部分相當于電腦系統(tǒng)更新前對老系統(tǒng)的備份,一旦在升級過程中發(fā)生錯誤需要還原到備份系統(tǒng),防止系統(tǒng)升級失敗成磚。同樣的APP與APP備份將剩余的FLASH平分,以上述booloader為例,APP程序及其備份所占區(qū)域為:(512-32)/2=240KB,因此編寫的APP程序編譯后的占用的FLASH空間不得超過240KB,這一點可以通過查驗.map文件確認,對于不同F(xiàn)LASH大小的芯片可以類比以上計算方法確認自己的程序大小上限(在此插入一句,改變編譯器的優(yōu)化等級可以改變最后的程序大小,但是高的優(yōu)化等級對程序編寫規(guī)范要求更高,因此優(yōu)化等級應(yīng)該在一開始設(shè)計APP之前就確定好,中途變更會帶來不可預(yù)測的問題)。
以STM32F407VET6單片機為例劃分后的FALSH存儲框圖如下所示:

bootlader設(shè)計

根據(jù)上面的描述,bootloader主要有完成以下功能:
1、系統(tǒng)自檢
2、實現(xiàn)APP程序跳轉(zhuǎn)
3、升級過程中接收APP文件并存儲到對應(yīng)的FLASH區(qū)域
功能1、3對于不同的系統(tǒng)要求不同,自檢的內(nèi)容以及實現(xiàn)文件傳輸?shù)奈锢韺咏涌诤玩溌穮f(xié)議不同,不在此過多描述。下面主要給出APP跳轉(zhuǎn)的部分代碼:

#define  APP_ADDR     0x08008000    //應(yīng)用程序起始地址 
typedef  void (*pFunction)(void);   //重定義pFunction為void(*)(void)函數(shù)指針類型
void jump(void)
{
	uint32_t      APP_ADDR_Buff=0;   //緩存APP地址數(shù)值
	uint32_t      APP_ADDR_Value=0;  //APP地址的內(nèi)容
	uint32_t     Jump_ADDR;        //跳轉(zhuǎn)的目標地址
	pFunction    Jump_APP;        //跳轉(zhuǎn)的目標函數(shù)指針
	APP_ADDR_Buff = APPLICATION_ADDRESS; //用戶程序的首地址
	APP_ADDR_Value = (*(volatile uint32_t*)APP_ADDR_Buff);//取出首地址里面的值
	if (( APP_ADDR_Value & 0x2FFE0000 ) == 0x20000000) //判斷APP首地址里面存的棧頂?shù)刂分凳欠窈戏?	{
			DISABLE_INTERRUPTS(); //關(guān)總中斷,使用不同的庫寫法不同,不可直接復(fù)制
			RCC_DeInit();//將外設(shè)RCC寄存器重設(shè)為缺省值,使用不同的庫寫法不同,不可直接復(fù)制
			Jump_ADDR = *(volatile uint32_t*)(APP_ADDR_Buff + 4);//APP起始地址第二個字為程序開始地址(新程序復(fù)位地址)
		    //指針函數(shù)指向用戶程序地址,也就是PC指針goto到用戶程序起始地址
			Jump_APP = (pFunction)Jump_ADDR; //取出程序地址給指針函數(shù)
			__set_MSP(*(volatile uint32_t*)APP_ADDR_Buff);    //初始化APP的堆棧指針 
			Jump_APP();     //執(zhí)行指針函數(shù),實現(xiàn)程序跳轉(zhuǎn)
	}
    else
    {
        ErrorHandle();  //拋出異常
    }
}
int main(void)
{

	SystemInit();//系統(tǒng)時鐘初始化
	SYSInit();  //系統(tǒng)初始化
	delay_ms(200);	
    if(ReadProgramAPPFlag())  //如果需要更新APP
    {
        APP_FlashWrite(); //接收APP文件數(shù)據(jù),并將APP程序存儲到指定位置
        if(APP_Check())   //APP文件校驗通過,將新的APP程序更新到備份區(qū)域
            APP_Backup(); 
        else			 //否則恢復(fù)備份區(qū)
            APP_Restore();
        ResetProgramAPPFlag();  //對完成升級的標志復(fù)位
    }
    jump();    //正常情況下運行到這一步時APP區(qū)域已經(jīng)正確寫入程序文件
	while(1);	  
}

其中ReadProgramDoneFlag()是判斷程序應(yīng)該是先接收升級文件再跳轉(zhuǎn)還是直接跳轉(zhuǎn)的標志,在APP中如果有升級需求則對這個標志置位,在bootloader中完成文件接收之后對標志復(fù)位,需要注意的時這個標志位不是全局變量也不是局部變量,要保證程序跳轉(zhuǎn),初始化堆棧之后這個標志的值不受影響,因此該標志變量最佳選擇是寫在外部EEPROM或內(nèi)置FLASH中,讀寫標志的操作其實是對EEPROM或FLASH的讀寫。

編寫APP程序

APP程序中實現(xiàn)了用戶的業(yè)務(wù)代碼,和由APP跳轉(zhuǎn)回bootloader的邏輯,實際的操作還是對上文中程序存儲Flag的讀寫,這部分邏輯實現(xiàn)的流程圖如下圖所示:

由于APP程序?qū)?yīng)的是另外一個工程文件,因此在工程設(shè)置中要將FLASH的偏移地址向下移動,空出bootlader的區(qū)域,比如上文中bootloader區(qū)域是0x08000000-0x08008000,因此APP工程的FLASH起始地址是0x8008000,偏移量是0x8000,這一點非常重要。文章來源地址http://www.zghlxwxcb.cn/news/detail-649468.html

到了這里,關(guān)于STM32單片機實現(xiàn)固件在線升級(IAP)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【單片機畢設(shè)選題】stm32實現(xiàn)車牌識別系統(tǒng) -物聯(lián)網(wǎng) 嵌入式 單片機

    【單片機畢設(shè)選題】stm32實現(xiàn)車牌識別系統(tǒng) -物聯(lián)網(wǎng) 嵌入式 單片機

    ?? 這兩年開始畢業(yè)設(shè)計和畢業(yè)答辯的要求和難度不斷提升,傳統(tǒng)的畢設(shè)題目缺少創(chuàng)新和亮點,往往達不到畢業(yè)答辯的要求,這兩年不斷有學弟學妹告訴學長自己做的項目系統(tǒng)達不到老師的要求。 為了大家能夠順利以及最少的精力通過畢設(shè),學長分享優(yōu)質(zhì)畢業(yè)設(shè)計項目,今天

    2024年02月20日
    瀏覽(33)
  • STM32F1 IAP在線升級功能實現(xiàn)(使用串口)及心得

    STM32F1 IAP在線升級功能實現(xiàn)(使用串口)及心得

    公司產(chǎn)品要求,需要做一個能遠程升級程序的功能,找了很多例程,大多都是需要按鍵來完成操作的,而我需要的是通過串口發(fā)送指令來完成,于是東拼西湊最后還是用了四天的時間勉強做出來 整個功能需要的程序是兩個部分。一個是IAP程序,一個是APP程序。對于IAP程序和

    2024年02月10日
    瀏覽(28)
  • 單片機項目分享 單片機自動寫字機器人設(shè)計與實現(xiàn) - 物聯(lián)網(wǎng) 嵌入式 stm32

    單片機項目分享 單片機自動寫字機器人設(shè)計與實現(xiàn) - 物聯(lián)網(wǎng) 嵌入式 stm32

    ?? 這兩年開始畢業(yè)設(shè)計和畢業(yè)答辯的要求和難度不斷提升,傳統(tǒng)的畢設(shè)題目缺少創(chuàng)新和亮點,往往達不到畢業(yè)答辯的要求,這兩年不斷有學弟學妹告訴學長自己做的項目系統(tǒng)達不到老師的要求。 為了大家能夠順利以及最少的精力通過畢設(shè),學長分享優(yōu)質(zhì)畢業(yè)設(shè)計項目,今天

    2024年02月21日
    瀏覽(89)
  • stm32畢設(shè)分享 stm32實現(xiàn)車牌識別系統(tǒng) -物聯(lián)網(wǎng) 嵌入式 單片機

    stm32畢設(shè)分享 stm32實現(xiàn)車牌識別系統(tǒng) -物聯(lián)網(wǎng) 嵌入式 單片機

    ?? 這兩年開始畢業(yè)設(shè)計和畢業(yè)答辯的要求和難度不斷提升,傳統(tǒng)的畢設(shè)題目缺少創(chuàng)新和亮點,往往達不到畢業(yè)答辯的要求,這兩年不斷有學弟學妹告訴學長自己做的項目系統(tǒng)達不到老師的要求。 為了大家能夠順利以及最少的精力通過畢設(shè),學長分享優(yōu)質(zhì)畢業(yè)設(shè)計項目,今天

    2024年02月20日
    瀏覽(28)
  • STM32單片機LED顯示屏驅(qū)動原理與實現(xiàn)

    STM32單片機LED顯示屏驅(qū)動原理與實現(xiàn)

    STM32單片機驅(qū)動LED顯示屏的原理與實現(xiàn)方法與Arduino類似,但涉及到的具體硬件資源和庫函數(shù)可能會有所不同。下面是一個詳細的介紹: ? 原理: STM32單片機驅(qū)動LED顯示屏的原理是通過控制GPIO引腳的電平狀態(tài)來控制LED的亮滅。通過設(shè)置引腳的輸出電平為高電平(VCC)或低電平

    2024年02月10日
    瀏覽(26)
  • 【單片機畢設(shè)選題】 單片機自動寫字機器人設(shè)計與實現(xiàn) - 物聯(lián)網(wǎng) 嵌入式 stm32

    【單片機畢設(shè)選題】 單片機自動寫字機器人設(shè)計與實現(xiàn) - 物聯(lián)網(wǎng) 嵌入式 stm32

    ?? 這兩年開始畢業(yè)設(shè)計和畢業(yè)答辯的要求和難度不斷提升,傳統(tǒng)的畢設(shè)題目缺少創(chuàng)新和亮點,往往達不到畢業(yè)答辯的要求,這兩年不斷有學弟學妹告訴學長自己做的項目系統(tǒng)達不到老師的要求。 為了大家能夠順利以及最少的精力通過畢設(shè),學長分享優(yōu)質(zhì)畢業(yè)設(shè)計項目,今天

    2024年02月02日
    瀏覽(30)
  • 單片機(STM32,GD32,NXP等)中BootLoader的嚴謹實現(xiàn)詳解

    單片機(STM32,GD32,NXP等)中BootLoader的嚴謹實現(xiàn)詳解

    Bootloader( 引導(dǎo)加載程序 )的主要任務(wù)是引導(dǎo)加載并運行應(yīng)用程序,我們的軟件升級邏輯也一般在BootLoader中實現(xiàn)。本文將詳細介紹BootLoader在單片機中的實現(xiàn),包括 STM32、GD32、NXP Kinetis 等等的所有單片機,因為無論是什么樣的芯片,它實現(xiàn)的邏輯都是一樣的。 注意,本篇文章主

    2024年02月02日
    瀏覽(73)
  • 單片機畢設(shè) 基于STM32的智能藥箱系統(tǒng)設(shè)計與實現(xiàn)

    單片機畢設(shè) 基于STM32的智能藥箱系統(tǒng)設(shè)計與實現(xiàn)

    Hi,大家好,今天向大家介紹一個學長做的單片機項目 基于STM32的智能藥箱系統(tǒng)設(shè)計與實現(xiàn) 大家可用于 課程設(shè)計 或 畢業(yè)設(shè)計 照顧老人, 特別是提醒老人準時吃藥已經(jīng)成為了一個社會關(guān)心的問題。長期記錄吃藥種類、 吃藥時間能為分析老人的病理提供有力的依據(jù)。 基于目

    2024年02月04日
    瀏覽(24)
  • 畢業(yè)設(shè)計 單片機心率檢測器設(shè)計與實現(xiàn) - stm32

    畢業(yè)設(shè)計 單片機心率檢測器設(shè)計與實現(xiàn) - stm32

    Hi,大家好,今天向大家介紹一個學長做的單片機項目 基于STM32的心率檢測器的設(shè)計與實現(xiàn) 大家可用于 課程設(shè)計 或 畢業(yè)設(shè)計 主控:STM32F103C8T6 MAX30102傳感器 OLED屏幕:用于顯示實時心率波形 未測試時的狀態(tài):心率波形顯為平穩(wěn)直線,即0 將手指放上進行心率測試: 還可以把

    2024年02月07日
    瀏覽(30)
  • 單片機設(shè)計基于STM32的心率檢測儀設(shè)計與實現(xiàn)

    單片機設(shè)計基于STM32的心率檢測儀設(shè)計與實現(xiàn)

    ??現(xiàn)代科學的發(fā)展,導(dǎo)致越來越多人開始重視自己的身體健康,他們往往會想在能力之余使用健身運動等方式來鍛煉自身。你會發(fā)現(xiàn),在健身房,健身達人或者是教練都會叮囑新手去關(guān)注自己的心率節(jié)奏。一般來說,人的激烈的鍛煉會造成心臟血壓的上升,心率變化從而加

    2024年02月04日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包