Bootloader 跳轉到 RT-Thread 或 FreeRTOS(基於 STM32)


Bootloader 跳轉到 RT-Thread 或 FreeRTOS(基於 STM32) 作者:猾蟻 QQ:7376220
一、Bootloader 程序
1. 准備好升級程序項目,可以使用 STM32CubeMX 來自動生成代碼,然后自己編
寫代碼實現升級策略。
2. 跳轉代碼實現

/* BOOTLOADER */
#define    BOOT_LOADER_Address    0x08000000
#define    BOOT_LOADER_SIZE       (200*1024) //0x32000(200KB)
#define    BOOT_OS_Address        (BOOT_LOADER_Address+BOOT_LOADER_SIZE)

typedef void (*pFunction)(void);
pFunction    Jump_To_Application;
uint32_t      JumpAddress;
static    void jump_to_os(void);

//重定向 printf
intfputc(intch,FILE*f)
{
    while((USART1->SR&0X40)==0);
    USART1->DR=(uint8_t)ch;
    return   ch;
}
int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_USART1_UART_Init();
    //在這里實現升級策略
    printf("user_init()\r\n");
    //升級完成后程序跳轉到 RT-Thread
    jump_to_os();
}

static void jump_to_os(void)
{
    if(((*__IOuint32_t*)BOOT_OS_Address)&0x2FFE0000)==0x20000000)
    {
        /*Jump to user application*/
        printf("jump_to_os\r\n");
        __disable_irq();//關閉總中斷
        HAL_DeInit();
        JumpAddress=*(__IOuint32_t*)(BOOT_OS_Address+4);
        Jump_To_Application=(pFunction)JumpAddress;
        /*Initializeuserapplication'sStackPointer*/
        __set_MSP(*(__IOuint32_t*)BOOT_OS_Address);
        Jump_To_Application();
    }
    else
    {             
        printf("BOOT_OS_Address:%08X\rn",*__IOuint32_t*)BOOT_OS_Address);
    }
}             
View Code

 


3. Keil 設置
上面的 IROM1 的 Size 設置與前面宏定義 BOOT_LOADER_SIZE 值相同,值為十六
進制
這里的 Start、size 和前面的 IROM1 設置相同
編譯后下載,因為前面未選擇 ResetandRun,下載完成后程序不會運行。
二、RT-Thread 程序
1. 准備好 RT-Thread 項目,確認項目可成功編譯運行。
2. 重定義中斷向量表地址
找 到 stmtem_stm32fnxx.c 文 件 中 的 SystemInit 函 數 , 找 到 SCB->VTOR =
FLASH_BASE | VECT_TAB_OFFSET 這一句,轉到 VECT_TAB_OFFSET 的宏定義,修
改值為前面 BOOT_LOADER_SIZE 的值:#defineVECT_TAB_OFFSET 0x32000
3. 啟用 SystemInit 函數,使上面中斷向量表重定義生效
SystemInit 函數沒有被任何 C 代碼調用,它在啟動匯編代碼中被導入調用。啟用
startup_stm32fnnnxx.s 文件中 SystemInit 被調用的相關代碼(去掉分號注釋即
可) ,啟用后如下圖:
4. Keil 設置
IROM1的Start設置為前面BOOT_OS_Address定義的值, size設置為MCU的Flash
總大小減去 BOOT_LOADER_SIZE 后剩余的大小。
這里的 Start、size 和前面的 IROM1 設置相同
編譯后下載,如果上面選擇了 ResetandRun,下載完成后程序會從 Bootloader
開始運行,實現程序升級過程后跳轉到 RT-Thread 運行,如下圖

 

 TFTP多機升級

其它參考:

https://www.cnblogs.com/michaelHeaven/p/3418705.html

https://blog.csdn.net/m0_37738150/article/details/79498220

http://www.eeworld.com.cn/mcu/2018/ic-news081940856.html

http://www.eeworld.com.cn/mcu/2018/ic-news081940854.html

https://wenku.baidu.com/view/6748673201f69e3143329496.html   振南的znFAT


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM