在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

RT_Thread OTA組件使用記錄

冬至子 ? 來(lái)源:goldengrandpa ? 作者:goldengrandpa ? 2023-11-20 17:22 ? 次閱讀

RT_Thread版本:4.1.0

主控:STM32L471

4G模塊:L610模塊(AT指令方式)

這周花了一點(diǎn)時(shí)間,使用ota_downloader組件實(shí)現(xiàn)http_ota升級(jí)功能,在使用時(shí)遇到了一些坑,特別是到了搭建外網(wǎng)服務(wù)器部分,教程一般都是講到本地使用webserve軟件來(lái)當(dāng)http服務(wù)器的。所以今天簡(jiǎn)單整理一下開發(fā)思路和我遇到的坑。

此處我只是提供思路以及參考文檔鏈接,根據(jù)這些文檔就可以實(shí)現(xiàn)想要的功能的。

1.制作Bootloader

此處如果不想自己寫的話,可以用兩個(gè)選擇。

使用RT_Thread提供的通用bootloader

選擇芯片系列,ROMRAM大小,引腳即可自動(dòng)生成一個(gè)bin文件。

1.jpg

優(yōu)點(diǎn):

? 一站式處理,十分簡(jiǎn)單,資源占用較小

? 缺點(diǎn):

? 閉源,無(wú)法看到源代碼,不支持QSPI(?)這點(diǎn)不是很確定,目前只支持STM32部分系列

使用Qboot等軟件包

優(yōu)點(diǎn):

可以看到源代碼出現(xiàn)問(wèn)題可以自己改(個(gè)人看重的點(diǎn)),如果使用型號(hào)沒有適配可以自己適配

缺點(diǎn):

占用資源相對(duì)更大一些

由于本人還是比較看重程序的可控性,出現(xiàn)問(wèn)題希望自己可以看到代碼解決因此就選擇Qboot的方案

此處需要注意的是加入FAL組件后,發(fā)現(xiàn)沒有添加drv_flash_l4.c是因?yàn)闆]有在Kconfig中增加

menu "On-chip Peripheral Drivers"
    config BSP_USING_ON_CHIP_FLASH
        bool "Enable on-chip FLASH"
        default y

此處已經(jīng)默認(rèn)使能了,直接scons --target=cmake即可

2.APP程序

此處主要使能ota_downloader軟件包

1.jpg

修改中斷向量表和鏈接腳本

鏈接腳本修改

MEMORY
{
ROM (rx) : ORIGIN = 0x08010000, LENGTH = 1024k /* 1024KB flash /
RAM (rw) : ORIGIN = 0x20000000, LENGTH = 96k /
96KB sram */
}

中斷向量表修改

/* 將中斷向量表起始地址重新設(shè)置為 app 分區(qū)的起始地址 /
static int ota_app_vtor_reconfig(void)
{
#define NVIC_VTOR_MASK 0xFFFFFF80
#define RT_APP_PART_ADDR (0x08000000 + 64
1024)//app partition begin address
/* 根據(jù)應(yīng)用設(shè)置向量表 */
SCB->VTOR = RT_APP_PART_ADDR & NVIC_VTOR_MASK;
return 0;
}
INIT_BOARD_EXPORT(ota_app_vtor_reconfig);

之后如果使用ST-Link的話可以選擇STM32CubeProg指定地址燒錄固件

或者可以使用Jlink使用J-Flash進(jìn)行燒錄

需要注意此處燒錄起始地址為app區(qū)地址,不要把bootloader擦除了。

1.jpg

下載后就可以使用RT的rbl打包工具進(jìn)行固件打包放在服務(wù)器中了

打包工具在ota_downloader組件中

打包工具可以選擇為固件進(jìn)行加密,壓縮等操作

并且為固件頭增加了96字節(jié)的頭,固件標(biāo)識(shí)rbl頭,固件大小,CRC,Hash值用于固件校驗(yàn)

typedef struct {
char type[4]; /* RBL字符頭 /
rt_uint16_t fota_algo; /
算法配置: 表示是否加密或者使用了壓縮算法 /
rt_uint8_t fm_time[6]; /
原始bin文件的時(shí)間戳, 6位時(shí)間戳, 使用了4字節(jié), 包含年月日信息 /
char app_part_name[16]; /
app執(zhí)行分區(qū)名 /
char download_version[24]; /
固件代碼版本號(hào) /
char current_version[24]; /
這個(gè)域在rbl文件生成時(shí)都是一樣的,我用于表示app分區(qū)當(dāng)前運(yùn)行固件的版本號(hào),判斷是否固件需要升級(jí) /
rt_uint32_t code_crc; /
代碼的CRC32校驗(yàn)值,它是的打包后的校驗(yàn)值,即rbl文件96字節(jié)后的數(shù)據(jù) /
rt_uint32_t hash_val; /
估計(jì)這個(gè)域是指的原始代碼本身的校驗(yàn)值,但不知道算法,無(wú)法確認(rèn),故在程序中未使用 /
rt_uint32_t raw_size; /
原始代碼的大小 /
rt_uint32_t com_size; /
打包代碼的大小 /
rt_uint32_t head_crc; /
rbl文件頭的CRC32校驗(yàn)值,即rbl文件的前96字節(jié) */
} rt_fota_part_head, *rt_fota_part_head_t

由于4G模塊連接的外網(wǎng),本地直接使用webserver是無(wú)法訪問(wèn)的,因此我這個(gè)白嫖了一個(gè)月的阿里云服務(wù)器來(lái)部署

一開始我是使用了python的Flask框架來(lái)寫后端程序,但是后面遇到了一些問(wèn)題,因此就暫時(shí)放棄了。

這個(gè)加深了一下教訓(xùn),調(diào)試時(shí)一定要控制變量,當(dāng)時(shí)我不能確定是STM32程序的問(wèn)題,還是后端的問(wèn)題,兩頭排查還是比較痛苦的

因此這里我建議先使用mywebserver+內(nèi)網(wǎng)穿透工具來(lái)驗(yàn)證stm32的程序。

這里內(nèi)網(wǎng)穿透我建議用Copolar,免費(fèi)并且目前仍在提供服務(wù)。

之后選擇部署在服務(wù)器中的話,我這邊使用的是Nginx可以很方便的搭建一個(gè)http服務(wù)器

遇到最大的坑:

在調(diào)試過(guò)程中發(fā)現(xiàn)OTA下載一次之后,想要OTA升級(jí)第二次時(shí)bootloader就提示app區(qū)寫入固件失敗,但是明明日志中說(shuō)明Flash擦除成功,為何呢?

使用STM32CubeProg讀取Flash時(shí)發(fā)現(xiàn)確實(shí)沒有將APP區(qū)擦除

在packages/ota_downloader的static int http_ota_fw_download(const char* uri)

經(jīng)過(guò)排查原來(lái)我用的芯片F(xiàn)lash使用雙Bank模式,可用于備份升級(jí)的。

1.jpg

我當(dāng)時(shí)分區(qū)的時(shí)候沒有考慮這一點(diǎn)

#define FAL_PART_TABLE
{
{FAL_PART_MAGIC_WORD, "download", "onchip_flash", 1281024, 2981024, 0},
{FAL_PART_MAGIC_WORD, "app", "onchip_flash", 4261024, 2981024, 0},
{FAL_PART_MAGIC_WORD, "factory", "onchip_flash", 7241024, 2981024, 0}
}

剛好app區(qū)是跨bank的,在擦除時(shí)其實(shí)沒有考慮到擦除跨bank的情況,導(dǎo)致擦除失敗。

int stm32_flash_erase(rt_uint32_t addr, size_t size)
{
rt_err_t result = RT_EOK;
uint32_t FirstPage = 0, NbOfPages = 0, BankNumber = 0;
uint32_t PAGEError = 0;
if ((addr + size) > STM32_FLASH_END_ADDRESS)
{
LOG_E("ERROR: erase outrange flash size! addr is (0x%p)n", (void*)(addr + size));
return -RT_EINVAL;
}
/ Variable used for Erase procedure /
FLASH_EraseInitTypeDef EraseInitStruct;
/* Unlock the Flash to enable the flash control register access ********** * /
HAL_FLASH_Unlock();
/
Clear OPTVERR bit set on virgin samples /
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPTVERR | FLASH_FLAG_PGSERR);
/
Get the 1st page to erase /
FirstPage = GetPage(addr);
/
Get the number of pages to erase from 1st page /
NbOfPages = GetPage(addr + size - 1) - FirstPage + 1;
/
Get the bank /
BankNumber = GetBank(addr);
/
Fill EraseInit structure
/
EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
EraseInitStruct.Banks = BankNumber;
EraseInitStruct.Page = FirstPage;
EraseInitStruct.NbPages = NbOfPages;
if (HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError) != HAL_OK)
{
result = -RT_ERROR;
goto __exit;
}
__exit:
HAL_FLASH_Lock();
if (result != RT_EOK)
{
return result;
}
LOG_D("erase done: addr (0x%p), size %d", (void* )addr, size);
return size;
}

目前簡(jiǎn)單的解決辦法是修改分區(qū),然后分區(qū)跨bank,之后有空的話可以提個(gè)PR修復(fù)一下。

#define FAL_PART_TABLE
{
{FAL_PART_MAGIC_WORD, "app", "onchip_flash", 641024, 4481024, 0},
{FAL_PART_MAGIC_WORD, "download", "onchip_flash", 5121024, 2561024, 0},
{FAL_PART_MAGIC_WORD, "factory", "onchip_flash", 7681024, 2561024, 0}
}

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • FlaSh
    +關(guān)注

    關(guān)注

    10

    文章

    1668

    瀏覽量

    151041
  • OTA
    OTA
    +關(guān)注

    關(guān)注

    7

    文章

    605

    瀏覽量

    36224
  • RT-Thread
    +關(guān)注

    關(guān)注

    32

    文章

    1372

    瀏覽量

    41545
  • STM32L4
    +關(guān)注

    關(guān)注

    1

    文章

    42

    瀏覽量

    9605
  • 4G模塊
    +關(guān)注

    關(guān)注

    1

    文章

    71

    瀏覽量

    9682
收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    怎么實(shí)現(xiàn)RT_thread STM32通用Bootloader做OTA升級(jí)?

    怎么實(shí)現(xiàn)RT_thread STM32通用Bootloader做OTA升級(jí)?
    發(fā)表于 11-26 06:19

    RT_Thread Studio進(jìn)行RT_Thread Setting保存后自己創(chuàng)建的文件夾會(huì)消失是何原因

    RT_Thread Studio 進(jìn)行RT_Thread Setting保存后自己創(chuàng)建的文件夾會(huì)消失,在applications中創(chuàng)建了mcu_sdk文件夾,但是進(jìn)行RT_Thread
    發(fā)表于 10-25 10:28

    基于正點(diǎn)原子精英版stm32f103zet6進(jìn)行rt_thread(3.0.3)的移植

    基于正點(diǎn)原子精英版stm32f103zet6進(jìn)行rt_thread(3.0.3)的移植準(zhǔn)備工作安裝rt_thread nano 3.0.3 軟件包裸機(jī)工程添加rt_thread源碼RT-Thr
    發(fā)表于 12-05 11:21 ?0次下載
    基于正點(diǎn)原子精英版stm32f103zet6進(jìn)行<b class='flag-5'>rt_thread</b>(3.0.3)的移植

    RTthread線程調(diào)度詳解

    rt_schedule(void){ struct rt_thread *to_thread; struct rt_thread *from_th
    的頭像 發(fā)表于 05-19 17:07 ?2820次閱讀

    N32G4FR系列通用MCU RT_Thread設(shè)備注冊(cè)應(yīng)用筆記

    N32G4FR系列通用MCU RT_Thread設(shè)備注冊(cè)應(yīng)用筆記
    發(fā)表于 11-10 19:51 ?1次下載
    N32G4FR系列通用MCU <b class='flag-5'>RT_Thread</b>設(shè)備注冊(cè)應(yīng)用筆記

    N32G457系列通用MCU RT_Thread設(shè)備注冊(cè)應(yīng)用筆記

    N32G457系列通用MCU RT_Thread設(shè)備注冊(cè)應(yīng)用筆記
    發(fā)表于 11-10 19:51 ?3次下載
    N32G457系列通用MCU <b class='flag-5'>RT_Thread</b>設(shè)備注冊(cè)應(yīng)用筆記

    N32G452系列通用MCU RT_Thread設(shè)備注冊(cè)應(yīng)用筆記

    N32G452系列通用MCU RT_Thread設(shè)備注冊(cè)應(yīng)用筆記
    發(fā)表于 11-10 19:51 ?0次下載
    N32G452系列通用MCU <b class='flag-5'>RT_Thread</b>設(shè)備注冊(cè)應(yīng)用筆記

    N32G432系列通用MCU RT_Thread設(shè)備注冊(cè)應(yīng)用筆記

    N32G432系列通用MCU RT_Thread設(shè)備注冊(cè)應(yīng)用筆記
    發(fā)表于 11-10 19:51 ?3次下載
    N32G432系列通用MCU <b class='flag-5'>RT_Thread</b>設(shè)備注冊(cè)應(yīng)用筆記

    N32L43x系列通用MCU RT_Thread設(shè)備注冊(cè)應(yīng)用筆記

    N32L43x系列通用MCU RT_Thread設(shè)備注冊(cè)應(yīng)用筆記
    發(fā)表于 11-10 19:51 ?0次下載
    N32L43x系列通用MCU <b class='flag-5'>RT_Thread</b>設(shè)備注冊(cè)應(yīng)用筆記

    N32L40x系列通用MCU RT_Thread設(shè)備注冊(cè)應(yīng)用筆記

    N32L40x系列通用MCU RT_Thread設(shè)備注冊(cè)應(yīng)用筆記
    發(fā)表于 11-10 19:51 ?0次下載
    N32L40x系列通用MCU <b class='flag-5'>RT_Thread</b>設(shè)備注冊(cè)應(yīng)用筆記

    N32WB452系列通用MCU RT_Thread使用指南

    N32WB452系列通用MCU RT_Thread使用指南
    發(fā)表于 11-10 19:51 ?0次下載
    N32WB452系列通用MCU <b class='flag-5'>RT_Thread</b>使用指南

    N32G4FR系列通用MCU RT_Thread使用指南

    N32G4FR系列通用MCU RT_Thread使用指南
    發(fā)表于 11-11 21:50 ?2次下載
    N32G4FR系列通用MCU <b class='flag-5'>RT_Thread</b>使用指南

    N32G457系列通用MCU RT_Thread使用指南

    N32G457系列通用MCU RT_Thread使用指南
    發(fā)表于 11-11 21:50 ?0次下載
    N32G457系列通用MCU <b class='flag-5'>RT_Thread</b>使用指南

    N32G455系列通用MCU RT_Thread使用指南

    N32G455系列通用MCU RT_Thread使用指南
    發(fā)表于 11-11 21:50 ?5次下載
    N32G455系列通用MCU <b class='flag-5'>RT_Thread</b>使用指南

    N32G452系列通用MCU RT_Thread使用指南

    N32G452系列通用MCU RT_Thread使用指南
    發(fā)表于 11-11 21:50 ?3次下載
    N32G452系列通用MCU <b class='flag-5'>RT_Thread</b>使用指南
    主站蜘蛛池模板: 国产一区国产二区国产三区 | 天天射美女| 免费看啪啪的网站 | 夜夜操com | 亚洲一区在线视频观看 | 亚洲最大的黄色网址 | 午夜噜噜噜私人影院在线播放 | 国产情侣真实露脸在线最新 | 亚洲大尺度视频 | 中文字幕精品一区二区2021年 | 四虎影院免费在线播放 | 国产精品美女久久久 | xxx性欧美 | 天天操天天舔 | 男女爱爱爽爽福利免费视频 | 欧美色图中文字幕 | 人人爱爱 | 国产精品五月天 | 免费在线视频观看 | 黄 色 成 年人在线 黄a大片 | 欧美女同在线观看 | 2021天天操 | 美国一级做a一级爱视频 | 国产精品女丝袜白丝袜 | 视频网站黄 | 天天干夜夜看 | 免费看18污黄| 黄色毛片儿 | 天天视频色版 | 一级片在线播放 | 男女一区二区三区免费 | 污视频18高清在线观看 | 国产精品高清一区二区三区不卡 | 日韩欧美亚洲综合一区二区 | 黄色欧美| 欧美精品videosex极品 | 免费一日本一级裸片在线观看 | 午夜视频黄 | 天天影视欧美综合在线观看 | 四虎影院免费在线播放 | 久久久久久国产精品免费免 |