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

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

mm32-2nd-bootloader技術進階設計:實現(xiàn)Ymodem更新代碼

靈動MM32MCU ? 來源:靈動MM32MCU ? 2023-06-09 09:28 ? 次閱讀

需求

前文中實現(xiàn)了一款簡單的 2nd Bootloader,能夠跳轉執(zhí)行存儲在 QSPI Flash 中的應用程序,但 2nd Bootloader 如果僅僅只是用于跳轉執(zhí)行程序的話,豈不是有些太簡單了?從本章開始,將會講解幾種 2nd Bootloader 進階設計,實現(xiàn)類似 ISP 更新固件的功能,以及在 OTA 升級時避免變“磚”等設計,以及講解一些 2nd Bootloader 的程序設計思路。

本文將以 Ymodem 協(xié)議獲取應用程序的二進制文件為例,實現(xiàn)類似 ISP 更新固件的功能。

需要注意:

下文中提到的 ISP 僅指由 2nd Bootloader 實現(xiàn)的定制 ISP,而非微控制器本身的 ISP。

上位機發(fā)送的文件是二進制(.bin)文件,而不是 Intel Hex 標準的 hex (.hex)文件。

目前僅考慮直接覆蓋的方式燒寫程序,即獲取到一段二進制數(shù)據(jù)后,直接寫入到 QSPI Flash 的對應位置。

Ymodem 介紹

Ymodem 協(xié)議是一個文件傳輸協(xié)議,通常用于在資源受限的設備中傳輸文件,它可以一次傳輸1024字節(jié)的信息塊,同時還支持傳輸多個文件。

Ymodem 協(xié)議有較多的變種,本文使用的是常用的 Ymodem-1K 協(xié)議。

通信時序

通訊時序如圖1:

dc51c724-05f0-11ee-962d-dac502259ad0.png

圖1 Ymodem 通信時序

幀格式

Ymodem 有兩種幀格式:

幀頭為 SOH 時,信息塊長度為128字節(jié),總長度133字節(jié)。

幀頭為 STX 時,信息塊長度為1024字節(jié),總長度1029字節(jié)。

兩種幀的幀格式如表1所示:

dc6bd330-05f0-11ee-962d-dac502259ad0.png

表1 SOH / STX 幀格式

包號從0x00起始,每成功傳輸一幀數(shù)據(jù)后包號加1,計數(shù)到0xFF后,下一次包號重新從0x00開始計數(shù)。

包號反碼是包號取反的數(shù)值,如0x00的包號,包號反碼為0xFF,0x01的包號,包號反碼為0xFE。

信息塊是要傳輸?shù)木唧w數(shù)據(jù)塊,起始幀包含了文件名和文件大小,數(shù)據(jù)幀包含了分段的數(shù)據(jù)內容。

校驗采用 CRC 校驗,僅校驗信息塊的內容。

除了兩種幀格式外,還有 ACK、NAK、CAN、EOT、字符 'C' 五種命令,長度僅有1字節(jié)。

起始幀、數(shù)據(jù)幀、結束幀

起始幀采用幀頭為 SOH 的幀格式傳輸,包號為 0x00,信息塊中包含文件名字符串和文件大小字符串 (十進制表示),字符串以0x00結尾,信息塊剩余部分以0x00填充。

數(shù)據(jù)幀采用幀頭為 STX 的幀格式傳輸,包號從0x01開始計數(shù),信息塊中包含分段的文件內容。

當最后一段要發(fā)送的數(shù)據(jù)塊大小超過128字節(jié)但小于1024字節(jié)時,采用幀頭 STX 的幀格式傳輸,信息塊結尾用 0x1A 填充。小于128字節(jié),采用幀頭為 SOH 的幀格式傳輸,信息塊結尾依然用 0x1A 填充。

結束幀和起始幀一樣,唯一不同的是沒有文件名和文件大小,即信息塊的內容全為 0x00。

通訊指令

通訊指令如表2所示。

dc874642-05f0-11ee-962d-dac502259ad0.png

表2 Ymodem通訊指令

協(xié)議實現(xiàn)

CRC 校驗:

Ymodem 協(xié)議中提供了 CRC 校驗的 C 代碼片段,但由于該協(xié)議發(fā)布時的 C 標準不同于現(xiàn)在,因此不能直接使用,此處提供一份 CRC 校驗的實現(xiàn)代碼,通過調用 crc_calc() 來實現(xiàn)對信息塊內容的校驗:

staticuint16_tcrc_update(uint16_tcrc,uint8_tdata)
{
uint32_tcrc32=crc;
uint32_tdata32=data;

for(uint32_ti=0u;i

當我們需要對一段數(shù)據(jù)進行 CRC 計算時,調用 crc_calc() 函數(shù),傳入數(shù)據(jù)起始地址和數(shù)據(jù)長度即可計算出 CRC 校驗值。

STX 包處理:

通過對 Ymodem 協(xié)議的介紹可知,STX 包只在接收數(shù)據(jù)的過程中使用,因此收到 STX 包時,僅需要進行如下處理:

CRC校驗信息塊。

計算信息塊的有效數(shù)據(jù)長度(需要注意最后一幀數(shù)據(jù)的有效長度不定)。

存儲數(shù)據(jù)。

發(fā)送 ACK 指令或 NAK 指令。

SOH 包處理:

SOH 包的處理要比 STX 包的處理復雜,因為包含了起始幀和結束幀的處理。

起始 / 結束幀和數(shù)據(jù)幀只能通過當前狀態(tài)來判斷,其中,除信息塊長度不同外,數(shù)據(jù)幀的處理同 STX 包的處理一致。

由于 Ymodem 可以多文件傳輸?shù)奶匦裕幱谠撌盏浇Y束幀的狀態(tài)時也有可能收到起始幀,因此起始幀和結束幀需要進行一個判斷:信息塊第一個字節(jié)是否為 0x00。如果不是 0x00 則為起始幀,否則為結束幀。

起始幀要攜帶文件名和文件大小,信息塊的第一個字節(jié)一定是一個可顯示的字符,當收到起始幀時,需進行如下處理:

讀取文件名和文件大小。

進入讀數(shù)據(jù)塊的狀態(tài)。

發(fā)送 ACK。

發(fā)送 字符 'C'。

結束幀的信息塊全為0x00,收到結束幀時,需進行如下處理:

發(fā)送 ACK。

結束 Ymodem 傳輸。

EOT 指令處理:

EOT 代表本次文件傳輸結束(但不代表所有文件都已發(fā)送完畢),因此,收到 EOT 指令時,需將當前狀態(tài)調整為起始狀態(tài),準備接收新的文件,具體處理如下:

進入起始狀態(tài)。

發(fā)送 ACK。

發(fā)送字符 'C'。

CAN 指令處理:

CAN 是 cancel 的縮寫,當收到 CAN 指令后,表示后續(xù)的 Ymodem 傳輸終止,該指令是雙向的,既可以由 Host 發(fā)送, 也可以是 Device 發(fā)送,收到 CAN 指令后,具體操作如下:

退出 Ymodem 傳輸。

接收超時處理:

Device 在接收數(shù)據(jù)前,會先向 Host 發(fā)送字符 'C',但如果此時 Host還沒有將文件準備好,則會卡死在準備接收狀態(tài)。

Device 在接收數(shù)據(jù)過程中,如果少接收到某個字節(jié)數(shù)據(jù),信息不完整,則會卡死在接收數(shù)據(jù)的過程中。

Device 發(fā)送某個指令后,Host 可能沒有收到指令,不會繼續(xù)下一幀數(shù)據(jù)的發(fā)送,Device 還是會卡死在接收的過程中。

因此,需要引入接收超時的操作。

當接收超時后,判斷狀態(tài),如果是起始狀態(tài),且沒有收到任何字節(jié),則可能是 Host 還沒有準備發(fā)送文件,重新發(fā)送字符 'C'。

如果數(shù)據(jù)沒有接收完整,則可能是少收到幾個字節(jié)的數(shù)據(jù),發(fā)送 NAK,讓 Host 重新發(fā)送數(shù)據(jù)。

如果沒有收到數(shù)據(jù),則 Host 可能沒有收到回復的指令,重新發(fā)送上次發(fā)送的指令。

軟件設計

就像是計算機進入 BIOS 設置,需要用戶在開機的瞬間不停按下鍵盤上某個按鍵那樣,為了使 2nd Bootloader 知道自己是該跳轉執(zhí)行應用程序,還是進入 ISP 等模式,需要外界有一個輸入:這個輸入可以是某個引腳的電平變化,也可以是在有限的時間里通過某種通信接口獲取到一段外界指令,當 2nd Bootloader 讀取到這個來自外界的輸入后,才能知道自己接下來要干什么。因此,除了實現(xiàn) ISP 下載的功能外,我們還需要實現(xiàn)選擇工作模式的功能,如圖2所示:

dcaaf9ca-05f0-11ee-962d-dac502259ad0.png

圖2 軟件設計

Ymodem 只是獲取二進制文件的一種方式,除了 Ymodem,我們也可以采用 Xmodem,Zmodem協(xié)議,除了串口,還可以使用 CAN,甚至通過 USB 讀取 U 盤里的文件等方式。

綜上所述,在設計 2nd Bootloader 時,不能綁死選擇工作模式的方式,也不能綁死 ISP 的工作方式,甚至,不能綁死 2nd Bootloader 只能在兩種工作模式下二選一(不要使用 if & else 的語句區(qū)分工作模式,而應使用 switch 語句區(qū)分工作模式),因此,2nd Bootloader 的頂層應用邏輯,只能是下面的設計:

intmain(void)
{
......
switch(get_run_mode())
{
caseEXEC_QSPI:
jump_to_app(QSPI_BASE);
break;
caseISP:
isp();
break;
......
default:
jump_to_app(QSPI_BASE);
break;
}
......
}

如果我們期望從某種工作模式下切換到另一種工作模式,最好的做法是先讓外界輸入保持為目標工作模式的狀態(tài),然后讓微控制器復位,再次進入 2nd Bootloader,這樣的做法是能夠保持微控制器切換工作模式后,仍然保持相對 “干凈” 的環(huán)境狀態(tài),例如,微控制器前一次進入到了 ISP 模式,通過串口更新了應用程序,如果直接跳轉到應用程序,則發(fā)現(xiàn)串口依然保持打開的狀態(tài),這對應用程序而言可能不是期望的結果,那提前關閉串口呢?還有 GPIO 引腳的配置沒有改動……最簡單省事的做法,其實就是直接讓微控制器復位,而串口和串口的 GPIO 引腳也就會在微控制器復位之后,處于默認相對比較 “干凈” 的狀態(tài)。這也是為什么圖x所示的流程圖,ISP 模式的下一步是復位微控制器。

當然,如果在 get_run_mode() 的時候就用到了串口,那還是老老實實在 get_run_mode() 執(zhí)行到 return 之前,就把串口和 GPIO 處理干凈。

這里提一個比較“花”的設計方法,我們可以把 ISP 也做成應用程序,下載到片內 Flash 中 一塊確認好的位置(假設起始地址為 ISP_BASE),然后同樣使用 jump_to_app() 跳轉,只是輸入參數(shù)從 QSPI_BASE 變?yōu)榱?ISP_BASE,這個做法會用在 USB DFU 模式上,因為一旦進入了 USB DFU 模式,USB 就不能再作為其它設備進行工作,當 USB 設備支持 USB DFU 時,就需要使用這種辦法單獨進入到 DFU 模式下。

測試

選擇工作模式:

在這里,我們通過讀取指定引腳的電平狀態(tài)來確定該進入何種工作模式。

uint32_tget_run_mode()
{
......
if(GPIO_ReadInDataBit(BOARD_BOOT_GPIO_PORT,BOARD_BOOT_GPIO_PIN))
{
returnEXEC_QSPI;
}
else
{
returnISP;
}
......
}

ISP 模式:

當進入 ISP 模式后,開始使用 Ymodem 協(xié)議接收數(shù)據(jù)。

voidisp()
{
......
/*getnewappbin&writetoqspiflash.*/
ymodem_recv_start(&ym,100000);
while(0==(YMODEM_STATUS_DONE&ym.status))
{
ymodem_recv_byte_handler(&ym);
}

/*resetmcu.*/
__set_FAULTMASK(1);
NVIC_SystemReset();
}

生成應用程序的二進制文件:

我們仍然以 MindSDK 的 hello_world 樣例工程為例,修改其 Linker 文件并檢查代碼,使其成為一個可存儲在 QSPI Flash 上的應用程序,隨后在 MDK 工程中,點擊魔術棒(Options for Target...),點擊 User 列表,如圖3所示,在指定位置(紅框中的 User Command)加入下面這句話,并在前面打上對勾:

fromelf.exe --bin -o "@L.bin" "#L"

然后編譯工程,就能在工程文件所在的目錄下找到生成的 bin 文件。

dcc84caa-05f0-11ee-962d-dac502259ad0.png

圖3 生成二進制文件

本文使用 TeraTerm 軟件進行 Ymodem 傳輸文件,如圖4所示:

dcf15e56-05f0-11ee-962d-dac502259ad0.png

圖4 TeraTerm Ymodem 發(fā)送文件

但在測試時發(fā)現(xiàn),當文件傳輸?shù)?100% 時,TeraTerm 并沒有結束傳輸,但對 2nd Bootloader 的代碼進行分析后并沒有發(fā)現(xiàn)存在邏輯問題,因此對 TeraTerm 的 Ymodem 協(xié)議產生了懷疑,如圖5所示。

dd221fb4-05f0-11ee-962d-dac502259ad0.png

圖5 TeraTerm 傳輸文件,總卡在 100% 處

使用兩個 USB 串口模塊,將其 TXD 與 RXD 相連,其中一個串口模塊使用 TeraTerm 打開,另一個使用 SSCOM 打開(為了能夠發(fā)送和顯示一些非字符類的控制指令),使用 TeraTerm 的 Ymodem 協(xié)議發(fā)送文件, SSCOM 接收來自 TeraTerm 的數(shù)據(jù),并按照 Ymodem 協(xié)議回復指令,模擬完整的 Ymodem 傳輸協(xié)議,如圖6所示。

dd491560-05f0-11ee-962d-dac502259ad0.png

圖6 模擬 Ymodem 協(xié)議傳輸文件過程

結果發(fā)現(xiàn),TeraTerm 實現(xiàn)的 Ymodem 協(xié)議在發(fā)送單個文件的時候,存在以下問題:

發(fā)送 EOT 指令后,需接收兩次 ACK 和字符 ‘C’。

沒有發(fā)送 last block。

因此,我們需要針對 TeraTerm 的問題,對 Ymodem 的實現(xiàn)做一些改動,或者使用其它軟件通過 Ymodem 傳輸二進制文件。修改后的時序圖如下:

dd6fc30e-05f0-11ee-962d-dac502259ad0.png

圖7 針對 TeraTerm 的 Ymodem 實現(xiàn)進行的改動

刪去了對 last block 的接收,并且在收到 EOT 后,主動發(fā)送兩次 ACK 和 字符 ‘C’,經過修改后測試,TeraTerm 的 Ymodem 能夠按照傳輸完成的方式正常退出。

下載程序,如圖8所示:

dd95af74-05f0-11ee-962d-dac502259ad0.png

圖8 下載應用程序

運行應用程序,如圖9所示:

ddb781c6-05f0-11ee-962d-dac502259ad0.png

圖9 運行應用程序

結語

本文在 2nd Bootlaoder 的基礎上實現(xiàn)了基于 Ymodem 協(xié)議的 ISP 功能,能夠通過復位后指定引腳的電平狀態(tài)來區(qū)分該執(zhí)行應用程序還是進入 ISP 模式,進入 ISP 模式后,可以使用 TeraTerm 等軟件,通過串口,使用 Ymodem 協(xié)議將二進制文件下載到與微控制器連接的 QSPI Flash 中,實現(xiàn)固件更新的功能。

但本文并沒有對固件更新過程中可能出現(xiàn)的意外進行處理,所以這種 ISP 的辦法不能直接用在 OTA 升級中,在下一章中,我們將會探討 OTA 升級時可能會出現(xiàn)的意外情況,并且進行處理。

審核編輯:湯梓紅

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

    關注

    10

    文章

    1668

    瀏覽量

    151013
  • ISP
    ISP
    +關注

    關注

    6

    文章

    490

    瀏覽量

    52833
  • 應用程序
    +關注

    關注

    38

    文章

    3322

    瀏覽量

    58756
  • bootloader
    +關注

    關注

    2

    文章

    238

    瀏覽量

    46465
  • Ymodem
    +關注

    關注

    0

    文章

    3

    瀏覽量

    3787

原文標題:靈動微課堂 (第259講)|mm32-2nd-bootloader技術白皮書(8)——進階:實現(xiàn) Ymodem 更新代碼

文章出處:【微信號:MindMotion-MMCU,微信公眾號:靈動MM32MCU】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    mm32-2nd-bootloader技術白皮書——配置軟硬件環(huán)境

    MM32F5 系列微控制器具備 QSPI 接口,可以外接 QSPI Flash,擴大可使用的 Flash 空間,從而滿足那些需要大 Flash 空間應用的需求,讓 Flash 空間的大小不再成為限制應用開發(fā)的瓶頸。
    發(fā)表于 03-08 13:49 ?381次閱讀

    stm32 Bootloader設計(YModem協(xié)議)(轉)

    位的win7下超級終端沒辦法使用。 不過SecureCRT工具到是可以在64位win7使用,但是官方代碼不對其支持。SecureCRT下支持的是最原始的YModem協(xié)議,第一幀數(shù)據(jù)包中不包含總字節(jié)數(shù)
    發(fā)表于 01-22 15:12

    談談STM32F4 IAP BOOTLOADER YMODEM

    STM32F4 IAP BOOTLOADER YMODEM XModem、YModem、ZModem
    發(fā)表于 08-23 07:22

    基于ymodem協(xié)議的Bootloader是怎樣通過串口進行傳輸?shù)哪?/a>

    STM32的Bootloader該如何去實現(xiàn)呢?基于ymodem協(xié)議的Bootloader是怎樣通過串口進行傳輸?shù)哪兀?/div>
    發(fā)表于 12-06 06:26

    基于MM32F0140系列MCU實現(xiàn)UDS Bootloader的設計

    而言,如果程序內置有基于FlexCAN Bootloader,則每次更新 ECU 的固件可不必再使用燒錄器進行燒錄,而可直接通過 CAN總線來更新程序,而且隨著汽車智能化的普及,甚至可以對 ECU 進行遠程升級。有無
    發(fā)表于 09-15 16:35

    BK7252更新ymodembootloader功能

    提示: 如果板子還能正常啟動,可以直接更新RBL文件,一、更新ymodembootloader 固件硬件準備:麻雀1號開發(fā)板,配套的無線編程器,typeC 線,PC 電腦軟件準
    發(fā)表于 09-27 10:55

    使用OTA升級的方法更新ymodem bootloader的rbl文件

    前言上次分享了一個需要使用無線編程器燒錄帶 ymodem 功能的 bootloader ,有些朋友反饋說手上沒有無線編程器,so 建議造一個可以通過 ota 更新的帶 ymodem
    發(fā)表于 09-27 10:59

    通過Ymodem創(chuàng)建IAP應用程序

    更新。以上3個步驟,我們就可以得到一個.bin的APP程序,通過bootloader程序即可實現(xiàn)更新。3.4 MCU 與上位機通信流程1. MCU與上位機通過
    發(fā)表于 11-03 20:11

    使用bootloader進行ymodem_ota升級失敗是何原因

    問題描述:在使用官方提供的bootloader進行ymodem_ota升級時發(fā)現(xiàn),在不更新的情況下,boot每次上電都會引導先從download區(qū)將程序寫入app區(qū),在運行。測試環(huán)境:使用官方提供
    發(fā)表于 11-16 10:48

    Bootloader 系統(tǒng)使用新應用代碼和/或數(shù)據(jù)管理組件閃存的更新流程

    Bootloader 系統(tǒng)使用新應用代碼和/或數(shù)據(jù)管理組件閃存的更新流程
    發(fā)表于 10-09 16:17 ?4次下載
    <b class='flag-5'>Bootloader</b> 系統(tǒng)使用新應用<b class='flag-5'>代碼</b>和/或數(shù)據(jù)管理組件閃存的<b class='flag-5'>更新</b>流程

    Bootloader系統(tǒng)使用新應用代碼和/或數(shù)據(jù)管理組件閃存的更新流程

    Bootloader系統(tǒng)使用新應用代碼和/或數(shù)據(jù)管理組件閃存的更新流程
    發(fā)表于 10-10 08:24 ?12次下載
    <b class='flag-5'>Bootloader</b>系統(tǒng)使用新應用<b class='flag-5'>代碼</b>和/或數(shù)據(jù)管理組件閃存的<b class='flag-5'>更新</b>流程

    bootloader如何更新

    BootLoader就是單片機啟動時候運行的一段小程序,這段程序負責單片機固件的更新,也就是單片機選擇性的自己給自己下程序??梢?b class='flag-5'>更新,也可以不更新,
    發(fā)表于 11-10 08:22 ?8055次閱讀
    <b class='flag-5'>bootloader</b>如何<b class='flag-5'>更新</b>

    stm32f103f8t6+keil+IAP+Ymodem(有線傳輸)+keil

    :stm32f103f8t6+Ymodem+Bootloader(有線下載)(單APP程序)文中灰色底色的為摘自其他作者的文章,文章下附鏈接筆者通過參考ST官方Bootloader代碼和正點原子APP
    發(fā)表于 12-17 18:10 ?21次下載
    stm32f103f8t6+keil+IAP+<b class='flag-5'>Ymodem</b>(有線傳輸)+keil

    mm32-2nd-bootloader配置軟硬件環(huán)境

    MM32F5 系列微控制器具備 QSPI 接口,可以外接 QSPI Flash,擴大可使用的 Flash 空間,從而滿足那些需要大 Flash 空間應用的需求,讓 Flash 空間的大小不再成為限制應用開發(fā)的瓶頸。
    的頭像 發(fā)表于 03-08 13:51 ?990次閱讀

    mm32-2nd-bootloader技術白皮書(5)——編譯可在QSPI Flash上運行的程序

    mm32-2nd-bootloader技術白皮書(5)——編譯可在QSPI Flash上運行的程序
    的頭像 發(fā)表于 10-24 16:14 ?644次閱讀
    <b class='flag-5'>mm32-2nd-bootloader</b><b class='flag-5'>技術</b>白皮書(5)——編譯可在QSPI Flash上運行的程序
    主站蜘蛛池模板: 免费播放特黄特色毛片 | 黄色大片视频在线观看 | 717影院理伦午夜论八戒 | 久久羞羞视频 | 天天操天天摸天天射 | 国产男靠女免费视频网站 | 美女被免费网站在线视频九色 | 朋友夫妇和交换性bd高清 | 中文字幕欧美成人免费 | 色综合色综合色综合色综合网 | 在线观看国产一级强片 | 四虎永久免费影院 | 夜夜操天天射 | 好吊色37pao在线观看 | 精品美女在线 | 久久青草91免费观看 | 一区二区三区视频观看 | 国产热| 国产毛片农村妇女aa板 | 色香欲综合成人免费视频 | 国产精品国产主播在线观看 | 久久免费香蕉视频 | 色亚洲色图 | 99精品国产第一福利网站 | 日韩成a人片在线观看日本 日韩成人黄色 | 亚洲一区二区三区免费 | 国产伦子一区二区三区四区 | 免费一看一级毛片全播放 | 色网站综合 | 日本视频色 | 字幕网中文aⅴ资源站 | 午夜免费伦费影视在线观看 | 国产精品久久久久久久久齐齐 | 久久福利影视 | 中文字幕在线看精品乱码 | 在线免费公开视频 | 四虎影院免费在线播放 | 国产产一区二区三区久久毛片国语 | 好男人社区www的视频免费 | 操妞网 | 亚洲一级特黄特黄的大片 |