久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2739|回復: 1
打印 上一主題 下一主題
收起左側

STM32F103串口IAP程序升級

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

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

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:319585 發表于 2021-5-29 18:36 來自手機 | 只看該作者
下載了,看了,這個不錯的,很好的教程
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 免费一二区| 亚洲精品性视频 | 亚洲精品国产第一综合99久久 | 伊色综合久久之综合久久 | 成人免费在线观看 | 激情影院久久 | 国产亚洲精品久久久久动 | 国产区在线观看 | 欧美精品在线播放 | 国产一二区免费视频 | 欧美一区二区在线免费观看 | 在线观看av网站 | 久久av资源网| 免费三级网 | 99精品视频在线观看免费播放 | 91精品91久久久 | 久久亚洲天堂 | 日韩精品成人 | 精品国产一区久久 | 日韩欧美中文字幕在线观看 | 国产精品1 | 国产色网 | 国产精品免费大片 | 91色综合| 国产婷婷在线视频 | 国产一区二区三区在线 | 国产精品一区二区三区四区 | 久久丁香| 成人国产精品久久久 | 国产在线高清 | 99精品免费久久久久久日本 | 亚洲精品一区中文字幕 | 亚洲国产成人精品女人久久久 | 欧美美乳 | 在线观看www视频 | 久热国产精品视频 | 亚洲欧美视频 | 久久久久久亚洲精品 | 日韩一区二区三区在线视频 | 亚洲国产成人在线视频 | 国产三级精品视频 |