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

STM32 IAP應(yīng)用開發(fā)——自制BootLoader

這篇具有很好參考價值的文章主要介紹了STM32 IAP應(yīng)用開發(fā)——自制BootLoader。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

STM32 IAP應(yīng)用開發(fā)——自制BootLoader

前言

什么是IAP?

IAP(In-Application Programming) 指MCU可以在系統(tǒng)中獲取新代碼并對自己重新編程,即可用程序來改變程序。在應(yīng)用編程(IAP)是用戶的應(yīng)用代碼對片內(nèi)Flash存儲器進(jìn)行擦除/編程的方法。這種方式的典型應(yīng)用就是用一小段代碼來實現(xiàn)程序的下載,實際上單片機(jī)的ISP功能就是通過IAP技術(shù)來實現(xiàn)的,即片子在出廠前就已經(jīng)有一段小的boot程序在里面,片子上電后,開始運行這段程序,當(dāng)檢測到上位機(jī)有下載要求時,便和上位機(jī)通信,然后下載數(shù)據(jù)到數(shù)據(jù)存儲區(qū),從而實現(xiàn)固件升級。

什么是BootLoader?

百度百科:在嵌入式操作系統(tǒng)中,BootLoader是在操作系統(tǒng)內(nèi)核運行之前運行??梢猿跏蓟布O(shè)備、建立內(nèi)存空間映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個合適狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核準(zhǔn)備好正確的環(huán)境。在嵌入式系統(tǒng)中,通常并沒有像BIOS那樣的固件程序(注,有的嵌入式CPU也會內(nèi)嵌一段短小的啟動程序),因此整個系統(tǒng)的加載啟動任務(wù)就完全由BootLoader來完成。

實際上,BootLoader不僅僅在操作系統(tǒng)上使用,在一些內(nèi)存小,功能應(yīng)用較為簡單的單片機(jī)設(shè)備上面也可以通過BootLoader來完成固件升級。

我之前也有發(fā)過一些關(guān)于STM32遠(yuǎn)程升級的文章,但用的是第三方BootLoader,而且是基于操作系統(tǒng)實現(xiàn)的。BootLoader占用的內(nèi)存也比較大,而且不開源。
所以這一講我就來介紹一下如何自己制作一個簡單的BootLoader程序。

1 環(huán)境搭建

關(guān)于STM32以及Keil的環(huán)境這里就不具體介紹了,網(wǎng)上教程也很多,不懂的同學(xué)自行查閱資料。

2 BootLoader工作原理以及常見分區(qū)介紹

不管用的是什么MCU,要實現(xiàn)固件升級都離不開BootLoader,BootLoader是一個統(tǒng)稱,它其實只是一段引導(dǎo)程序,在MCU啟動的時候會先運行這段代碼,判斷是否需要升級,如果不需要升級就跳轉(zhuǎn)到APP分區(qū)運行用戶代碼,如果需要升級則先通過一些硬件接口接收和搬運要升級的新固件,然后再跳轉(zhuǎn)到APP分區(qū)運行新固件,從而實現(xiàn)固件升級。
ota bootloader,OTA,經(jīng)驗分享,單片機(jī)相關(guān),stm32,單片機(jī),嵌入式硬件

常見分區(qū)方式介紹:
1.Application
沒有加入Bootloader之前,我們單片機(jī)內(nèi)部的flash就是一整塊的,所有的應(yīng)用代碼都放在這。
ota bootloader,OTA,經(jīng)驗分享,單片機(jī)相關(guān),stm32,單片機(jī),嵌入式硬件

2.Bootloader + Application
在原有的flash區(qū)域里面劃分出兩個區(qū)域,Bootloader和Application,這種分區(qū)方式的好處在于既可以實現(xiàn)升級功能,App區(qū)又可以分到較大的空間,缺點是沒有存放新固件的區(qū)域,需要從外部導(dǎo)入進(jìn)來,而且一旦傳輸?shù)倪^程被異常打斷,那么原有的App代碼也無法正常運行了,也就是傳說中的“變磚”。
ota bootloader,OTA,經(jīng)驗分享,單片機(jī)相關(guān),stm32,單片機(jī),嵌入式硬件

3.Bootloader + Application + Download
這種分區(qū)方式是比較萬能的一種,優(yōu)點是新固件是先存放到Download區(qū)的,哪怕搬運的過程中出現(xiàn)異常中斷的情況,也不會“變磚”,缺點是需要單獨劃分一塊內(nèi)存跟APP區(qū)差不多的區(qū)域用來存放新固件,變相的減少了APP區(qū)的空間,對于內(nèi)存較小的單片機(jī)來說壓力就比較大了。
ota bootloader,OTA,經(jīng)驗分享,單片機(jī)相關(guān),stm32,單片機(jī),嵌入式硬件

4.Bootloader + Application1 + Application2
這種方式可以同時存在兩套App,優(yōu)點在于升級了新固件以后,還保留了原來的舊版固件,必要的時候還可以進(jìn)行版本的回退。
ota bootloader,OTA,經(jīng)驗分享,單片機(jī)相關(guān),stm32,單片機(jī),嵌入式硬件

5.Bootloader + Setting + Application + Download
這種方式跟第3種基本一樣,只是增加了一個區(qū)域用來存放升級相關(guān)的一些參數(shù)以及用戶的一些配置。
ota bootloader,OTA,經(jīng)驗分享,單片機(jī)相關(guān),stm32,單片機(jī),嵌入式硬件

3 BootLoader的制作

BootLoader的制作需要根據(jù)實際的需求來做,不同的運行方式或者升級方式在做法上都是有區(qū)別的,包括BootLoader所需要的內(nèi)存空間也不盡相同。
不過不管是用什么方式,Bootloader都應(yīng)該盡可能做的更小更簡潔,這樣的話內(nèi)存的開銷就更小,對于內(nèi)存較小的MCU來說壓力就沒那么大了。

我下面要做的這個bootloader是上面講的常見分區(qū)方式里面的第5種。
分區(qū)介紹:
我用的是STM32F103,內(nèi)存是128K的(想用內(nèi)存更小的MCU也是可以的,改下各個分區(qū)的內(nèi)存分配就行了)。

分區(qū)表如下:

name offset size
boot 0x08000000 0x00003000
setting 0x08003000 0x00001000
app 0x08004000 0x0000E000
download 0x08012000 0x0000E000

功能描述:
運行bootloader的時候先從setting里面讀一些參數(shù),確定是否需要升級,如果需要,則把download分區(qū)的固件搬運到app分區(qū),如果不需要升級則直接跳轉(zhuǎn)到app分區(qū).
至于新固件的下載傳輸過程,我放到App里面去處理了,這跟我的項目實際需求有關(guān)系,App部分這里就先不往下拓展了,后面我會專門寫一篇博客來介紹。

各個功能模塊的具體講解:
1、分區(qū)定義
先把各個分區(qū)的內(nèi)存地址以及大小定義好,方便后面使用。

#define FLASH_SECTOR_SIZE       1024
#define FLASH_SECTOR_NUM        128    // 128K
#define FLASH_START_ADDR        ((uint32_t)0x8000000)
#define FLASH_END_ADDR          ((uint32_t)(0x8000000 + FLASH_SECTOR_NUM * FLASH_SECTOR_SIZE))

#define BOOT_SECTOR_ADDR        0x08000000     // BOOT sector start address 
#define BOOT_SECTOR_SIZE        0x3000         // BOOT sector size
#define SETTING_SECTOR_ADDR     0x08003000     // SETTING sector start address 
#define SETTING_SECTOR_SIZE     0x1000         // SETTING sector size
#define APP_SECTOR_ADDR         0x08004000     // APP sector start address  
#define APP_SECTOR_SIZE         0xE000         // APP sector size
#define DOWNLOAD_SECTOR_ADDR    0x08012000     // Download sector start address
#define DOWNLOAD_SECTOR_SIZE    0xE000         // Download sector size   

2、程序跳轉(zhuǎn)
Bootloader作為引導(dǎo)程序,最重要的工作之一就是通過內(nèi)存跳轉(zhuǎn)進(jìn)入用戶程序,下面這段代碼可以跳轉(zhuǎn)到任何一個內(nèi)存地址。

uint8_t jump_app(uint32_t app_addr) 
{
    uint32_t jump_addr;
    jump_callback cb;
    if (((*(__IO uint32_t*)app_addr) & 0x2FFE0000 ) == 0x20000000) 
    {  
        jump_addr = *(__IO uint32_t*) (app_addr + 4);  
        cb = (jump_callback)jump_addr;  
        __set_MSP(*(__IO uint32_t*)app_addr);  
        cb();
        return 1;
    } 
    return 0;
}

3、處理函數(shù)
從setting區(qū)里面讀取process狀態(tài)值,然后進(jìn)行對應(yīng)的處理,如果需要升級則把download區(qū)的固件搬運到app區(qū),然后再運行新APP,如果不需要升級則直接跳轉(zhuǎn)到APP。

process = get_boot_state();
switch (process) 
{
    case START_PROGRAM:
        printf("start app...\r\n");
        delay_ms(50);
        if (!jump_app(APP_SECTOR_ADDR)) 
        {
            printf("no program\r\n");
            delay_ms(1000);
        }
        printf("start app failed\r\n");
        break;
    case UPDATE_PROGRAM:
        printf("update app program...\r\n");
        app_addr = APP_SECTOR_ADDR;
        down_addr = DOWNLOAD_SECTOR_ADDR;

        printf("app addr: 0x%08X \r\n", app_addr);
        printf("down addr: 0x%08X \r\n", down_addr);

        printf("erase mcu flash...\r\n");
        mcu_flash_erase(app_addr, APP_ERASE_SECTORS);  
        printf("mcu flash erase success\r\n");
    
        printf("write mcu flash...\r\n");
        // memset(down_buf, 0, sizeof(down_buf));
        for (i = 0; i < APP_ERASE_SECTORS * 8; i++)
        {
            mcu_flash_read(down_addr, &down_buf[0], 128);
            delay_ms(5);
            mcu_flash_write(app_addr, &down_buf[0], 128);
            delay_ms(5);
            down_addr += 128;
            app_addr += 128;
        }
        printf("mcu flash write success\r\n");

        set_boot_state(UPDATE_SUCCESS);
        break;
    case UPDATE_SUCCESS:
        printf("update success\r\n");
        boot_state = UPDATE_SUCCESS_STATE;
        write_setting_boot_state(boot_state);
        set_boot_state(START_PROGRAM);
        break;
    default:
        break;
}

完整代碼下載地址:https://download.csdn.net/download/ShenZhen_zixian/87462312

4 燒錄下載配置

我們的Bootloader做好以后需要燒錄到MCU里面,可以直接用Keil uVison來下載,也可以用J-Flash或者其他,這個都沒關(guān)系,但是要注意內(nèi)存的分配,要把固件燒到對應(yīng)的內(nèi)存地址上。
我這里做出來的bootloader bin只有8K,不過為了方便后續(xù)在這部分增加新功能,我實際分配了12K的空間,地址區(qū)間是0x08000000-0x08003000。

如果是用keil下載的話,需要注意flash的配置,具體如下:
ota bootloader,OTA,經(jīng)驗分享,單片機(jī)相關(guān),stm32,單片機(jī),嵌入式硬件
ota bootloader,OTA,經(jīng)驗分享,單片機(jī)相關(guān),stm32,單片機(jī),嵌入式硬件
如果是用J-Flash或者STlink的工具燒錄的話注意燒錄的起始地址是0x08000000就好了。

5 運行測試

注:這里我沒講解App部分代碼,你們只看Bootloader部分的log就好了,不影響的,想看APP部分可以看我另外一篇文章,或者下載完整的代碼實際跑一下也行。APP部分講解:STM32 IAP應(yīng)用開發(fā)——通過USB實現(xiàn)固件升級

運行結(jié)果:
不需要升級時直接跳轉(zhuǎn)到App區(qū),如下圖:
ota bootloader,OTA,經(jīng)驗分享,單片機(jī)相關(guān),stm32,單片機(jī),嵌入式硬件

需要升級時先從download區(qū)搬運新固件到app區(qū),然后再跳轉(zhuǎn)到App區(qū),如下圖:
ota bootloader,OTA,經(jīng)驗分享,單片機(jī)相關(guān),stm32,單片機(jī),嵌入式硬件

結(jié)束語

好了,關(guān)于自制BootLoader的介紹就講到這里,本文只是提供一個思路,不是唯一的方法,關(guān)鍵還是看你自己實際的需求。
還有App那部分這里沒詳細(xì)講,我單獨寫了一篇文章,鏈接在下方,合到一起看就比較清晰了?;蛘吣阋部梢韵螺d完整的源碼自己去跑一下,下面的源碼我把BootLoader和APP都上傳了。

APP部分講解:STM32 IAP應(yīng)用開發(fā)——通過USB實現(xiàn)固件升級
完整代碼下載地址:https://download.csdn.net/download/ShenZhen_zixian/87462312

如果你有什么問題或者有更好的方法,歡迎在評論區(qū)留言。

更多相關(guān)文章:
STM32固件升級系列合集:https://blog.csdn.net/ShenZhen_zixian/article/details/129074047文章來源地址http://www.zghlxwxcb.cn/news/detail-635730.html

到了這里,關(guān)于STM32 IAP應(yīng)用開發(fā)——自制BootLoader的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • STM32 IAP應(yīng)用開發(fā)——通過串口/RS485實現(xiàn)固件升級(方式1)

    STM32 IAP應(yīng)用開發(fā)——通過串口/RS485實現(xiàn)固件升級(方式1)

    什么是IAP? IAP(In-Application Programming) 指MCU可以在系統(tǒng)中獲取新代碼并對自己重新編程,即可用程序來改變程序。在應(yīng)用編程(IAP)是用戶的應(yīng)用代碼對片內(nèi)Flash存儲器進(jìn)行擦除/編程的方法。這種方式的典型應(yīng)用就是用一小段代碼來實現(xiàn)程序的下載,實際上單片機(jī)的ISP功能就

    2024年02月10日
    瀏覽(19)
  • STM32 IAP應(yīng)用開發(fā)——通過內(nèi)置DFU實現(xiàn)USB升級(方式1)

    STM32 IAP應(yīng)用開發(fā)——通過內(nèi)置DFU實現(xiàn)USB升級(方式1)

    什么是IAP? IAP(In-Application Programming) 指MCU可以在系統(tǒng)中獲取新代碼并對自己重新編程,即可用程序來改變程序。在應(yīng)用編程(IAP)是用戶的應(yīng)用代碼對片內(nèi)Flash存儲器進(jìn)行擦除/編程的方法。這種方式的典型應(yīng)用就是用一小段代碼來實現(xiàn)程序的下載,實際上單片機(jī)的ISP功能就

    2024年02月10日
    瀏覽(38)
  • STM32 ——bootloader IAP

    STM32 ——bootloader IAP

    本文使用單片機(jī)型號:STM32F104xx IAP(In Application Programming) 是用戶自己的程序在運行過程中對 User Flash 的部分區(qū)域進(jìn)行燒寫,目的是為了在產(chǎn)品發(fā)布后可以方便地通過預(yù)留的通信口對產(chǎn)品中的固件程序進(jìn)行更新升級。為了實現(xiàn) IAP 功能,系統(tǒng)將分為 bootloader 和 app 兩部分。bo

    2023年04月09日
    瀏覽(20)
  • STM32/GD32 BootLoader升級 IAP升級

    STM32/GD32 BootLoader升級 IAP升級

    如果我們的App 程序起始地址在0x08006000 ,并且App 的中斷向量表在起始地址,那么BootLoader 程序下載App 后,為了App 程序能正確運行,開始App 程序的運行后第一步,就要把中斷向量表重定位到0x08006000 那里。 我們的BootLoader下載App程序后,App程序就需要做同樣的事情。主要有三個

    2024年02月11日
    瀏覽(27)
  • STM32之Bootloader、USB、IAP/DFU下載

    STM32 IAP應(yīng)用開發(fā)——通過內(nèi)置DFU實現(xiàn)USB升級(方式2) STM32 IAP應(yīng)用開發(fā)——通過內(nèi)置DFU實現(xiàn)USB升級(方式1) STM32程序下載4:通過STM32CubePro-USB下載 STM32程序下載3:通過STM32CubePro-UART下載 STM32程序下載2:通過STM32CubePro-ST-Link下載 如何使用串口來給STM32下載程序 通過STM32內(nèi)置的U

    2024年02月02日
    瀏覽(26)
  • 【STM32】IAP升級01 bootloader實現(xiàn)以及APP配置(主要)

    【STM32】IAP升級01 bootloader實現(xiàn)以及APP配置(主要)

    通過之前的了解 之前的了解,我們知道實現(xiàn)IAP升級需要兩個條件: 1.APP程序必須在 IAP 程序之后的某個偏移量為 x 的地址開始; 2.APP程序的中斷向量表相應(yīng)的移動,移動的偏移量為 x; 默認(rèn)條件下的起始地址 默認(rèn)的條件下,圖中 IROM1 的起始地址(Start)一般為 0x08000000,大小

    2024年02月03日
    瀏覽(47)
  • 基于STM32單片機(jī)BOOTLOADER通過串口升級程序IAP——APP方案

    基于STM32單片機(jī)BOOTLOADER通過串口升級程序IAP——APP方案

    ????????????????????????此方法前提是你得有一個EEPROM ? ? ? ? 我用的單片機(jī)是STM32F103ZET6 , 此單片機(jī)FLASH容量為512KB; 在此單片機(jī)里面FLASH的起始地址是0X8000000,BOOT作為引導(dǎo)加載程序一般都是從這個地址開始,單片機(jī)一上點默認(rèn)會從這個地址開始運行,所以將自己

    2024年02月04日
    瀏覽(96)
  • STM32G473 固件升級IAP(BootLoader)CAN/USART。(詳細(xì)步驟)

    STM32G473 固件升級IAP(BootLoader)CAN/USART。(詳細(xì)步驟)

    本例程僅供參考(個人學(xué)習(xí)總結(jié)_有需要文中有的封裝好的跳轉(zhuǎn)函數(shù)可私信), 例程可舉一反三完成FDCAN通信和USART通信。 目錄 簡介 1.APP程序配置步驟 APP 程序起始地址設(shè)置方法 中斷向量表的偏移量設(shè)置方法 KEIL5生成bin文件步驟 2.IAP(BootLoader 程序)配置(HAL庫,Cubemax) 2.1

    2024年02月03日
    瀏覽(80)
  • STM32 ICP、ISP、IAP、Bootloader、SWD、JTAG究竟是什么?它們之間有什么關(guān)系?

    STM32 ICP、ISP、IAP、Bootloader、SWD、JTAG究竟是什么?它們之間有什么關(guān)系?

    從代碼寫入單片機(jī)的方式上去區(qū)分主要分為3種:ICP、ISP、IAP 一、 ICP(In Circuit Programing) :在電路編程,可通過CPU的Debug Access Port 燒錄代碼,比如ARM Cortex的Debug Interface主要是SWD(Serial Wire Debug)或JTAG(Joint Test Action Group); ICP 主要通過CPU的DAP(Debug Access Port) 燒錄代碼,下面以ARM Cor

    2024年02月04日
    瀏覽(20)
  • 國民技術(shù)N32G430開發(fā)筆記(9)- IAP升級 Bootloader的制作

    國民技術(shù)N32G430開發(fā)筆記(9)- IAP升級 Bootloader的制作

    1、上節(jié)提到Flash的分區(qū),0x8000000-0x8004000為Boot分區(qū),我們的bootloader就燒錄到此分區(qū)。 Bootloader很簡單,新建一個普通的工程, 也不用初始化外部設(shè)備,開機(jī)后,直接跳轉(zhuǎn)到 App分區(qū)所在的地址即可, 當(dāng)然App的分區(qū)程序也要提前燒錄進(jìn)去, 否則也是跳不過去的。 代碼 開機(jī)延時

    2024年02月02日
    瀏覽(51)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包