找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2839|回復(fù): 1
收起左側(cè)

STM32F103串口IAP程序升級(jí)

[復(fù)制鏈接]
ID:346927 發(fā)表于 2021-5-27 15:11 | 顯示全部樓層 |閱讀模式
通常情況下我們給STM32系列的單片機(jī)燒錄程序文件的時(shí)候,使用SWD、J-link或者通過(guò)設(shè)置BOOT引腳后,使用串口進(jìn)行程序下載,這樣的方式直接一次性將程序文件下載到單片機(jī)的flash中,比較適合絕大部分的應(yīng)用。但是有些應(yīng)用中產(chǎn)品裝配完成后,下載口不便引出的情況下,或者是某些設(shè)備需要具有遠(yuǎn)程更新程序情況下,使用串口IAP的方式將會(huì)更加便捷。
    一般我們常見(jiàn)的51單片機(jī)內(nèi)部的flash空間,只能使用下載器進(jìn)行燒錄程序。芯片自身無(wú)法擦寫(xiě)內(nèi)部flash空間。這樣的情況下,如果我們后期需要升級(jí)芯片中的程序時(shí),只能到現(xiàn)場(chǎng)使用下載器重新燒錄程序,這樣比較繁瑣。但是STM32單片機(jī)內(nèi)部的flash可以在程序中讓單片機(jī)自身去擦寫(xiě)編程,同時(shí)官方也提供了相應(yīng)的操作函數(shù)固件庫(kù)。這樣就可以實(shí)現(xiàn)單片機(jī)程序的遠(yuǎn)程升級(jí),通過(guò)芯片外設(shè)的某種通信接口(一般常用串口),將程序文件發(fā)送給芯片,讓芯片自身把程序文件寫(xiě)入內(nèi)部flash,實(shí)現(xiàn)程序的遠(yuǎn)程升級(jí)操作。如果要實(shí)現(xiàn)讓單片機(jī)自身去升級(jí)程序,就必須要將內(nèi)部flash空間進(jìn)行劃分,分不同的區(qū)域?qū)懭氩煌こ痰某绦虼a,才能實(shí)現(xiàn)該功能。
    一般情況下,我們將單片機(jī)的內(nèi)部flash空間劃分為兩大區(qū)域,為了方便理解,我們叫做bootloader區(qū)域和app區(qū)域(這里的bootloader和app為自定義名稱(chēng),也可叫做其他名稱(chēng))。分為兩大區(qū)域的原因是,我們要給一塊芯片(單片機(jī))寫(xiě)入兩個(gè)不同的工程文件,這個(gè)兩個(gè)工程分別是“程序升級(jí)工程(bootloader)”和“應(yīng)用程序工程(app)”。兩個(gè)工程的區(qū)別是:
    “程序升級(jí)工程”存放在flash的bootloader區(qū)域。它的作用:接收新版本的程序文件,將收到的文件寫(xiě)入內(nèi)部flash的app區(qū)域中。這個(gè)工程的任務(wù)比較單一,所以它只占用較小的一部分flash空間”。
    “應(yīng)用程序工程”存放在flash的app區(qū)域。它的作用:執(zhí)行真正的功能操作。如數(shù)據(jù)采集、執(zhí)行一些運(yùn)算等操作。也是單片機(jī)實(shí)際發(fā)揮作用的程序。升級(jí)程序的方式是,可以靈活應(yīng)用,主要看開(kāi)發(fā)人員的編程思路,在這里我們使用上電檢測(cè)的方式進(jìn)行程序的更新。
    單片機(jī)上電后,首先在bootloader區(qū)域運(yùn)行程序升級(jí)函數(shù),檢測(cè)是否有新版本的程序需要升級(jí),如果需要升級(jí)時(shí),就將接收的新版本程序數(shù)據(jù)寫(xiě)入app區(qū)域,之后跳轉(zhuǎn)到app區(qū)域去運(yùn)行正在的應(yīng)用程序函數(shù)。如果不需要升級(jí)程序時(shí),就直接跳轉(zhuǎn)到app區(qū)域去執(zhí)行程序。流程如下:
串口IAP程序的操作方式是,分時(shí)切換flash區(qū)域進(jìn)行執(zhí)行不同功能的函數(shù),而不是兩個(gè)區(qū)域中的程序都在運(yùn)行。任何時(shí)候,單片機(jī)都不能同時(shí)執(zhí)行兩個(gè)工程代碼,我們將flash空間劃分如下(以STM32F103CB為例)flash的總大小是128Kb,劃分bootloader區(qū)域大小為8Kb,app區(qū)域?yàn)?20Kb。示意圖和相關(guān)地址如下:
如果想要將程序按照如上圖所示的flash空間存放的話(huà),就必須對(duì)編譯環(huán)境進(jìn)行一些設(shè)置,才能到達(dá)我們的目的,不再使用默認(rèn)的編譯設(shè)置。bootloader工程設(shè)置在編程軟件keil5中設(shè)置如下:
如果想要將程序按照如上圖所示的flash空間存放的話(huà),就必須對(duì)編譯環(huán)境進(jìn)行一些設(shè)置,才能到達(dá)我們的目的,不再使用默認(rèn)的編譯設(shè)置。bootloader工程設(shè)置在編程軟件keil5中設(shè)置如下:
app工程設(shè)置在編程軟件keil5中設(shè)置如下:
在app工程的程序代碼中除了設(shè)置工程代碼的編譯地址之外,還要將中斷向量表偏移寄存器的值進(jìn)行相對(duì)應(yīng)的設(shè)置。設(shè)置中斷向量表偏移寄存器的方法有兩種:
    ①→可以在app應(yīng)用程序的主程序while循環(huán)之前設(shè)置,設(shè)置格式為:
        CB->VTOR = FLASH_BASE | 0x2000;
    ②→還可以在官方的固件庫(kù)設(shè)置,在固件庫(kù)system_stm32f10x.c文件中,第267行使用了如下的設(shè)置:
而上述表達(dá)式中的“VECT_TAB_OFFSET”在該固件庫(kù)文件的第128行進(jìn)行了聲明和初值定義:
可以看出,默認(rèn)情況下,“VECT_TAB_OFFSET”的值等于0。也就是不進(jìn)行偏移,我們?cè)谶M(jìn)行IAP編程的時(shí)候,可以將此處的初值改為對(duì)應(yīng)的偏移量即可。通常我們不對(duì)官方固件庫(kù)進(jìn)行更改,所以常用第一種方式進(jìn)行設(shè)置中斷偏移量。在這里要注意的是,偏移量不能隨意任意設(shè)置,由于ARM Cortex®-M3內(nèi)核規(guī)定,中斷向量表必須對(duì)齊原則。因此中斷偏移量的值必須是0x200的倍數(shù)。
IAP代碼中關(guān)于跳轉(zhuǎn)部分的詳解:
    在編程中我們要清楚的知道,單片機(jī)任何時(shí)候只能運(yùn)行一個(gè)代碼工程,并不是兩個(gè)區(qū)域的代碼都在運(yùn)行。所以就必須使單片機(jī)要在兩個(gè)區(qū)域(bootloader區(qū)域和app區(qū)域)或者是兩個(gè)工程代碼之間進(jìn)行跳轉(zhuǎn)。跳轉(zhuǎn)之前除了要將app工程代碼中的中斷偏移量進(jìn)行相對(duì)應(yīng)的設(shè)置外,還要在單片機(jī)跳轉(zhuǎn)時(shí),設(shè)置app區(qū)域代碼的主堆棧棧頂?shù)刂。通過(guò)官方手冊(cè)就可以知道,STM32默認(rèn)啟動(dòng)地址是0x08000000,而這個(gè)首地址中保存的就是堆棧的棧頂?shù)刂,這個(gè)地址是在代碼編譯后,有編譯器自動(dòng)產(chǎn)生。同時(shí)根據(jù)相關(guān)手冊(cè)可以看到STM32的程序存放規(guī)則和編譯后的可執(zhí)行文件的規(guī)則是,編譯后的可執(zhí)行文件中第一個(gè)字就是被下載到STM32內(nèi)部flash中的第一個(gè)存儲(chǔ)單元中,而這個(gè)就是我們需要的堆棧棧頂?shù)刂贰?/font>
    重新設(shè)置STM32的堆棧棧頂?shù)刂肥菍儆趦?nèi)核級(jí)別的操作,因此C語(yǔ)言無(wú)法進(jìn)行內(nèi)核操作,只能借助嵌入?yún)R編的形式進(jìn)行操作,一般是使用MSR指令進(jìn)行操作的。MSR指令是用于訪(fǎng)問(wèn)內(nèi)核中特殊功能寄存器(如堆棧棧頂寄存器)專(zhuān)用匯編指令。其編寫(xiě)形式一般為如下:
完成對(duì)工程的設(shè)置與程序代碼的編寫(xiě)之后,我們還需要得到相應(yīng)工程的BIN格式文件,keil軟件自帶輸出BIN文件的功能,但是一般情況下我們不使用BIN文件,所以程序代碼編譯完畢后,軟件默認(rèn)是不輸出BIN格式的文件。如想要keil在編譯完成之后,同時(shí)輸出BIN文件,則需要進(jìn)行設(shè)置,設(shè)置方法是在工程管理的選項(xiàng)卡的User選項(xiàng)中的Run #1處編寫(xiě)命令“fromelf.exe --bin -o "$L@L.bin" "#L"”即可,如圖:

完整的Word格式文檔51黑下載地址:
STM32F103 串口-IAP程序升級(jí).docx (1.85 MB, 下載次數(shù): 42)

回復(fù)

使用道具 舉報(bào)

ID:319585 發(fā)表于 2021-5-29 18:36 來(lái)自觸屏版 | 顯示全部樓層
下載了,看了,這個(gè)不錯(cuò)的,很好的教程
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表