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

【RT-Thread】使用RT-Thread Studio 配置BootLoader及App實現(xiàn)OTA功能

這篇具有很好參考價值的文章主要介紹了【RT-Thread】使用RT-Thread Studio 配置BootLoader及App實現(xiàn)OTA功能。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

由于項目需要實現(xiàn)OTA功能學(xué)習(xí)了一下具體實現(xiàn)方法,以備后期查看,有問題的地方隨時指正修改

理論

1.什么是OTA
OTA是“over-the-air”的縮寫,是一種無線技術(shù),用于在不需要接觸設(shè)備的情況下向移動設(shè)備或物聯(lián)網(wǎng)設(shè)備提供更新、補(bǔ)丁或新版本的軟件。OTA更新通常通過無線網(wǎng)絡(luò)(如Wi-Fi或移動數(shù)據(jù))進(jìn)行,這使得設(shè)備可以在不需要任何物理連接的情況下獲得更新。這種技術(shù)在智能手機(jī)、智能家居設(shè)備和車載系統(tǒng)等設(shè)備中得到廣泛應(yīng)用。
2.什么是BootLoader
BOOTloader是一段特殊的程序,在計算機(jī)啟動時運行。它的主要作用是讀取和加載操作系統(tǒng)。

當(dāng)計算機(jī)啟動時,BOOTloader首先加載并啟動操作系統(tǒng)。它負(fù)責(zé)加載內(nèi)存中的系統(tǒng)映像,并初始化基本硬件設(shè)置。BOOTloader還可以提供一些選項,如選擇不同的操作系統(tǒng)版本或進(jìn)入系統(tǒng)恢復(fù)模式。

BOOTloader通常存儲在只讀存儲器(如ROM或flash存儲器)中,因此不容易遭到破壞或更改。它是系統(tǒng)啟動過程中非常重要的一部分,因為如果BOOTloader不能正常工作,則系統(tǒng)將無法啟動。


所以我們想實現(xiàn)BootLoader的話要對flash分區(qū),及對內(nèi)部偏移地址進(jìn)行指定,OTA主要是一種技術(shù)手段,我們主要是實現(xiàn)BootLoader。

正文

本次教程實現(xiàn)的功能是使用網(wǎng)線對STM32F407VGT6進(jìn)行OTA升級。

BootLoader

  1. 新建工程
    根據(jù)自己的實際情況選擇芯片及型號后編譯下載初始代碼,檢查芯片及串口功能是否良好。
    bootloader ota,單片機(jī),stm32,嵌入式硬件
    bootloader ota,單片機(jī),stm32,嵌入式硬件2. 通過Cube配置功能
    我這里使用的SPI3,CSS腳PE1。
    bootloader ota,單片機(jī),stm32,嵌入式硬件

點擊CubeMX Settings 配置時鐘,SPI引腳(片外Flash),串口
bootloader ota,單片機(jī),stm32,嵌入式硬件3.配置RT-Thread
在項目資源管理器中點擊drivers->board.h文件配置 使能SPI、片內(nèi)Flash

#define BSP_USING_SPI3
#define BSP_USING_ON_CHIP_FLASH

點擊RT-Thread Settings 使能SPI、SFUD、FAL、QBOOT驅(qū)動程序
在FAL下要勾選FAL使用SFDU驅(qū)動程序,這個主要是管理片外Flash
在QBOOT組件下根據(jù)自己的需求進(jìn)行勾選相應(yīng)的功能
bootloader ota,單片機(jī),stm32,嵌入式硬件

bootloader ota,單片機(jī),stm32,嵌入式硬件bootloader ota,單片機(jī),stm32,嵌入式硬件

  1. 編寫SFUD驅(qū)動及FAL分區(qū)
    新建w25q.c文件添加如下代碼,這個是使用SFUD驅(qū)動程序通過SPI對W25Q128抽象化管理。
#include <rtthread.h>
#include "drv_spi.h"
#include "spi_flash_sfud.h"

#define SPI_BUS_NAME                        "spi3"
#define W25Q_SPI_DEVICE_NAME                "spi30"
//#define W25Q_FLASH_NAME                      "W25Q128"




static int rt_hw_spi_flash_init()
{
    rt_err_t ree = RT_EOK;

    ree = rt_hw_spi_device_attach(SPI_BUS_NAME, W25Q_SPI_DEVICE_NAME, GPIOE, GPIO_PIN_1);
    //ree = rt_hw_spi_device_attach(SPI_BUS_NAME, W25Q_SPI_DEVICE_NAME, GPIOB, GPIO_PIN_6);
    /* 使用 SFUD 探測 spi10 從設(shè)備,并將 spi10 連接的 flash 初始化為塊設(shè)備,名稱 W25Q128 */
    if (RT_NULL == rt_sfud_flash_probe(FAL_USING_NOR_FLASH_DEV_NAME, W25Q_SPI_DEVICE_NAME))
    {
            return -RT_ERROR;
    }
    return ree;
}
INIT_COMPONENT_EXPORT(rt_hw_spi_flash_init);

新建fal_cfg.h文件,對flash引入及分配內(nèi)存,這要注意芯片的flash大小及偏移地址可能不同,我這個是對F404VGT6的,所以要看數(shù)據(jù)手冊進(jìn)行修改。

#ifndef _FAL_CFG_H_
#define _FAL_CFG_H_

#include <rtconfig.h>
#include <board.h>
#include <rtconfig.h>



#define FLASH_SIZE_GRANULARITY_16K      (4 * 16 * 1024)
#define FLASH_SIZE_GRANULARITY_64K      (64 * 1024)
#define FLASH_SIZE_GRANULARITY_128K     (7 * 128 * 1024)

#define STM32_FLASH_START_ADRESS_16K    STM32_FLASH_START_ADRESS
#define STM32_FLASH_START_ADRESS_64K    (STM32_FLASH_START_ADRESS_16K + FLASH_SIZE_GRANULARITY_16K)
#define STM32_FLASH_START_ADRESS_128K   (STM32_FLASH_START_ADRESS_64K + FLASH_SIZE_GRANULARITY_64K)
/* ===================== Flash device Configuration ========================= */
extern const struct fal_flash_dev stm32_onchip_flash_16k;
extern const struct fal_flash_dev stm32_onchip_flash_64k;
extern const struct fal_flash_dev stm32_onchip_flash_128k;
/* ===================== Flash device Configuration ========================= */
extern struct fal_flash_dev nor_flash0;


#define FAL_FLASH_DEV_TABLE                                          \
{                                                                    \
    &stm32_onchip_flash_16k,                                         \
    &stm32_onchip_flash_64k,                                         \
    &stm32_onchip_flash_128k,                                        \
    &nor_flash0,                                                     \
}


/* ====================== Partition Configuration ========================== */
#ifdef FAL_PART_HAS_TABLE_CFG
/* partition table */


//config_data分區(qū)必須是128k的整數(shù)倍,如果設(shè)置為1K,則在OTA升級后會擦除掉config_data分區(qū)的數(shù)據(jù)
//這種配置占用芯片flash太多,如果芯片flash存儲空間不夠可以考慮將config_data分區(qū)放在外部spi flash里

#define FAL_PART_TABLE                                                               \
{                                                                                    \
    {FAL_PART_MAGIC_WORD,       "app",     "onchip_flash_128k",   0,  768*1024, 0}, \
    {FAL_PART_MAGIC_WORD,       "config_data","onchip_flash_128k",768*1024,  128*1024, 0}, \
    {FAL_PART_MAGIC_WORD, "download", FAL_USING_NOR_FLASH_DEV_NAME,0, 1024*1024, 0}, \
}

/*
#define FAL_PART_TABLE                                                               \
{                                                                                    \
    {FAL_PART_MAGIC_WORD,       "config_data",     "onchip_flash_128k",   0,  128*1024, 0}, \
    {FAL_PART_MAGIC_WORD,       "app","onchip_flash_128k",128*1024,  768*1024, 0}, \
    {FAL_PART_MAGIC_WORD, "download", FAL_USING_NOR_FLASH_DEV_NAME,0, 1024*1024, 0}, \
}
*/

#endif /* FAL_PART_HAS_TABLE_CFG */

#endif /* _FAL_CFG_H_ */

修改main.c文件,添加FAL頭文件及初始化

#include <rtthread.h>

#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>

#include <fal.h>

int main(void)
{
    int count = 1;

    fal_init();
    while (count++)
    {
//        LOG_D("Hello RT-Thread!");
        rt_thread_mdelay(1000);
    }

    return RT_EOK;
}

5,下載驗證
編譯下載驗證,只要開到這幾條打印就代表BootLoader成功了

bootloader ota,單片機(jī),stm32,嵌入式硬件

APP實現(xiàn)

  1. 創(chuàng)建工程
    復(fù)制bootl工程改名為App
    bootloader ota,單片機(jī),stm32,嵌入式硬件2. 測試APP跳轉(zhuǎn)
    在RT-Thread Studio 中刪除所有軟件包,修改main函數(shù),添加中斷向量表跳轉(zhuǎn)函數(shù)
#include <rtthread.h>
#include "fal.h"
#include <drivers/pin.h>




#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>

#define RT_APP_PART_ADDR                0x08020000




int main(void)
{
    int count = 1;

 		fal_init();
//    LOG_D("Hello RT-Thread!");
    while (count++)
    {
        LOG_D("Hello RT-Thread!!!!!!");
        rt_thread_mdelay(1000);
    }

    return RT_EOK;
}


static int ota_app_vtor_reconfig(void)
{
    #define NVIC_VTOR_MASK   0xFFFFFF80
    /* 根據(jù)應(yīng)用設(shè)置向量表 */
    SCB->VTOR = RT_APP_PART_ADDR & NVIC_VTOR_MASK;

    return 0;
}
INIT_BOARD_EXPORT(ota_app_vtor_reconfig);

然后在linkscripts下修改鏈接腳本起始地址,和下載地址這個地址是app的起始地址
bootloader ota,單片機(jī),stm32,嵌入式硬件
bootloader ota,單片機(jī),stm32,嵌入式硬件
下載測試后發(fā)現(xiàn)可以正常跳轉(zhuǎn)到app程序就OK了
bootloader ota,單片機(jī),stm32,嵌入式硬件

  1. 配置驅(qū)動
    接下來實現(xiàn)OTA功能
    點擊CubeMX Settings,添加以太網(wǎng)外設(shè)(根據(jù)自己實際引腳配置)
    bootloader ota,單片機(jī),stm32,嵌入式硬件
    點擊RT-Thread Settings添加ota_download、agile_console、agile_telnet、lwip組件
    lwip組件下設(shè)置為靜態(tài)ipv4

設(shè)置如下:
ota_download
bootloader ota,單片機(jī),stm32,嵌入式硬件

Lwip
bootloader ota,單片機(jī),stm32,嵌入式硬件agile_telnet
bootloader ota,單片機(jī),stm32,嵌入式硬件agile_console
bootloader ota,單片機(jī),stm32,嵌入式硬件

到這里就添加結(jié)束了,保存后在board.h文件下使能ETH并添加網(wǎng)卡型號

#define BSP_USING_ETH
#ifdef BSP_USING_ETH
#define PHY_USING_LAN8720A
/*#define PHY_USING_DM9161CEP*/
/*#define PHY_USING_DP83848C*/
#endif

編譯后會出現(xiàn)一個報錯,將這個報錯注釋掉
bootloader ota,單片機(jī),stm32,嵌入式硬件3.修改main.c函數(shù)
這里添加app的偏移地址,讓中斷向量表跳轉(zhuǎn)及定義phy復(fù)位函數(shù)

#include <rtthread.h>
#include "fal.h"
#include <drivers/pin.h>
#include <board.h>



#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>

#define RT_APP_PART_ADDR                0x08020000


#define PHY_RESET_IO GET_PIN(A, 0)



void phy_reset(void)
{
    rt_pin_mode(PHY_RESET_IO, PIN_MODE_OUTPUT);
    rt_pin_write(PHY_RESET_IO, PIN_HIGH);
    rt_thread_mdelay(50);
    rt_pin_write(PHY_RESET_IO, PIN_LOW);
    rt_thread_mdelay(50);
    rt_pin_write(PHY_RESET_IO, PIN_HIGH);
}


int main(void)
{
    int count = 1;

     fal_init();
    LOG_D("Hello RT-Thread!v1.0");
    while (count++)
    {
        LOG_D("Hello RT-Thread!v1.0");
        rt_thread_mdelay(1000);
    }

    return RT_EOK;
}


static int ota_app_vtor_reconfig(void)
{
    #define NVIC_VTOR_MASK   0xFFFFFF80
    /* 根據(jù)應(yīng)用設(shè)置向量表 */
    SCB->VTOR = RT_APP_PART_ADDR & NVIC_VTOR_MASK;

    return 0;
}
INIT_BOARD_EXPORT(ota_app_vtor_reconfig);

燒入打印如下
bootloader ota,單片機(jī),stm32,嵌入式硬件
4. 驗證OTA功能
使用xshell和mywebServer
xshell配置如下IP地址是設(shè)備ip
bootloader ota,單片機(jī),stm32,嵌入式硬件
點擊連接后會連接上同時打印信息,用法和串口一樣
bootloader ota,單片機(jī),stm32,嵌入式硬件修改main.c函數(shù)主要是為了驗證 OTA不要下載進(jìn)去。
bootloader ota,單片機(jī),stm32,嵌入式硬件將編譯好的bin文件打包好,打包軟件和打包方式在下圖:
bootloader ota,單片機(jī),stm32,嵌入式硬件壓縮算法要與bootloader的壓縮方式一樣,固件分區(qū)名要與fal分區(qū)相同,我要下載到app里,如果填寫錯誤會導(dǎo)致QBoot搬運失敗。
bootloader ota,單片機(jī),stm32,嵌入式硬件

打開mywebserver,設(shè)置如下
服務(wù)目錄是剛才打包好的的目錄,IP地址是本機(jī)IP地址,要注意設(shè)備與本機(jī)IP在同一網(wǎng)段,端口號默認(rèn)即可
bootloader ota,單片機(jī),stm32,嵌入式硬件

在xshell中輸入http_ota http://192.168.1.112:80/rtthread.rbl
這樣mywebserver就偵聽到了請求,然后將文件傳輸?shù)街付ǚ謪^(qū)。
如下看效果。
bootloader ota,單片機(jī),stm32,嵌入式硬件

bootloader ota,單片機(jī),stm32,嵌入式硬件文章來源地址http://www.zghlxwxcb.cn/news/detail-700402.html

到了這里,關(guān)于【RT-Thread】使用RT-Thread Studio 配置BootLoader及App實現(xiàn)OTA功能的文章就介紹完了。如果您還想了解更多內(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)文章

  • RT-Thread Studio使用經(jīng)驗——項目創(chuàng)建及文件介紹

    RT-Thread Studio使用經(jīng)驗——項目創(chuàng)建及文件介紹

    1.創(chuàng)建項目時會有兩種選擇 RT Thread項目 和 RT Thread Nano項目 ,RT Thread項目體量比較大,包含了RT Thread的大部分功能,比如應(yīng)用層開發(fā),驅(qū)動開發(fā),圖形界面開發(fā)等,生成程序的大小大約在50kb左右; RT Thread Nano屬于輕量級的RT Pthread工程開發(fā),只包含了基礎(chǔ)的裸機(jī)開發(fā)的部分庫文

    2024年02月08日
    瀏覽(23)
  • RT-Thread 7. RT-Thread Studio ENV修改MCU型號

    RT-Thread 7. RT-Thread Studio ENV修改MCU型號

    1. 修改MCU型號 2.在ENV界面輸入 3. dist下為更新后完整源代碼 4.導(dǎo)入RT-Thread Studio 發(fā)現(xiàn)GD32F330已經(jīng)生效了。 5. 自己編寫startup_gd32f3x0.S,準(zhǔn)確性待驗證

    2024年02月06日
    瀏覽(28)
  • 使用rt-thread Studio下載固件時出現(xiàn)Unable to enter Isp mode

    使用rt-thread Studio下載固件時出現(xiàn)Unable to enter Isp mode

    根據(jù) 我發(fā)現(xiàn)我缺了圖中的文件夾? 解決方法: 在rt-thread studio的sdk管理包中下載 ?

    2024年02月16日
    瀏覽(26)
  • RT-Thread Studio學(xué)習(xí)(十四)ADC

    RT-Thread Studio學(xué)習(xí)(十四)ADC

    本文將基于STM32F407VET芯片介紹如何在RT-Thread Studio開發(fā)環(huán)境下使用ADC設(shè)備。硬件及開發(fā)環(huán)境如下: OS WIN10 STM32F407VET6 STM32CubeMX v6.10.0 STM32Cube MCU Package for STM32F4 Series v1.28.0 RT-Thread Studio v2.2.7 RT-Thread Source Code v5.0.2 STM32F4 chip support packages v0.2.3 打開RT-Thread Studio軟件新建基于芯片的項

    2024年01月19日
    瀏覽(31)
  • RT-Thread使用PWM實現(xiàn)燈亮度調(diào)節(jié)——STM32F407

    RT-Thread使用PWM實現(xiàn)燈亮度調(diào)節(jié)——STM32F407

    提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 RT-Thread使用PWM實現(xiàn)燈亮度調(diào)節(jié)——STM32F407ZG 作為新入門的嵌入式選手,最近在學(xué)習(xí)RT-Thread操作系統(tǒng),鑒于自己健忘的記性,打算記錄下來后面好回顧學(xué)習(xí)。 今天要總結(jié)的是RT-Thread使用PWM實現(xiàn)燈亮度調(diào)節(jié)

    2024年02月15日
    瀏覽(16)
  • RT-Thread學(xué)習(xí)(一)簡介及基礎(chǔ)環(huán)境配置

    RT-Thread學(xué)習(xí)(一)簡介及基礎(chǔ)環(huán)境配置

    之前學(xué)習(xí)了FreeRTOS,但是一直想深入學(xué)習(xí),但是沒有人指導(dǎo),又不知道該如何學(xué)習(xí),于是再學(xué)習(xí)一個操作系統(tǒng)看看情況。 RT-Thread是一個物聯(lián)網(wǎng)操作系統(tǒng),幾乎支持所有主流的MCU和Wi-Fi芯片,實時多線程操作系統(tǒng),主要用在32位的MCU上面。物聯(lián)網(wǎng)(Internet Of Things,IoT),RT-Threa

    2024年01月17日
    瀏覽(21)
  • RT-Thread入門筆記2-動態(tài)內(nèi)存堆的使用

    棧(stack): 由編譯器自動分配釋放 堆(heap) : 一般由程序員分配和釋放 PS:一個ARM程序包含3部分:RO,RW和ZI RO是程序中的指令和常量 RW是程序中的已初始化變量 ZI是程序中的未初始化的變量 void *rt_malloc(rt_size_t nbytes):rt_malloc函數(shù)會從系統(tǒng)堆空間中找到合適大小的內(nèi)存塊.

    2024年02月02日
    瀏覽(23)
  • RT-Thread 1. GD32移植RT-Thread Nano

    RT-Thread 1. GD32移植RT-Thread Nano

    1. RT-Thread Nano?下載 RT-Thread Nano 是一個極簡版的硬實時內(nèi)核,它是由 C 語言開發(fā),采用面向?qū)ο蟮木幊趟季S,具有良好的代碼風(fēng)格,是一款可裁剪的、搶占式實時多任務(wù)的 RTOS。其內(nèi)存資源占用極小,功能包括任務(wù)處理、軟件定時器、信號量、郵箱和實時調(diào)度等相對完整的實

    2024年02月05日
    瀏覽(29)
  • 雅特力 AT32F437 配置RT-Thread 以太網(wǎng)(UDP/TCP Server)

    雅特力 AT32F437 配置RT-Thread 以太網(wǎng)(UDP/TCP Server)

    好記性不如爛筆頭,既然不夠聰明,就乖乖的做筆記,溫故而知新。 本文檔用于本人對知識點的梳理和記錄。 雅特力 AT32F437 配置RT-Thread 以太網(wǎng)(UDP/TCP Server) 目錄 ????????一、前言 ????????二、ENV配置 ????????三、結(jié)語 ? 一、前言 ENV版本:v1.3.5 rt-thread版本:V5+

    2024年02月12日
    瀏覽(21)
  • 保姆級AT32F437 配置RT-Thread 以太網(wǎng)(UDP/TCP Server)

    保姆級AT32F437 配置RT-Thread 以太網(wǎng)(UDP/TCP Server)

    好記性不如爛筆頭,既然不夠聰明,就乖乖的做筆記,溫故而知新。 本文檔用于本人對知識點的梳理和記錄。 雅特力 AT32F437 配置RT-Thread 以太網(wǎng)(UDP/TCP Server) 目錄 ????????一、前言 ????????二、ENV配置 ????????三、結(jié)語 ? 一、前言 ENV版本:v1.3.5 rt-thread版本:V5+

    2024年02月12日
    瀏覽(19)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包