HAL庫 通過USB Boot進行APP程序升級

硬件:stm32f407VET6芯片;

軟件:STM32CubeMx、Keil5

上位機:Dfuse DemoV3.06

? ? 這里給出通過在Bootlaoder中使用USB方式來更新APP程序的方法,首先我們編寫一個自己的bootloader,關于bootloader的大致原理可以參考我之前的文章HAL庫執行bootloader跳轉操作:_hal庫bootloader-CSDN博客,這里boot升級我采用單APP升級的方式 ,主要分為三部分講解:

? ? 一、程序配置和Bootlaoder編寫;

? ? 二、Dfuse DemoV3.06上位機和對應USB驅動安裝;

? ? 三、使用上位機配合Boot程序進行USB方式的單APP升級;

一、程序配置和Bootlaoder編寫

? ? 這里我們先打開cubemx配置芯片的USB硬件模式,需要使能USB_OTG_FS,設置如下圖,需要注意開啟USB的NVIC中斷;

? ? 使能完USB硬件后,我們還需要配置USB工作在DFU模式,DFU全稱為Download?Firmware?Update,是ST官方推出的一個通過USB接口進行IAP升級的方案,我們就是通過該模式來進行Boot升級,相關配置如下:

? ? 需要注意的是下圖中關于“USBD_DFU_APP_DEFAULT_ADD(Base_Address)”這里設置的值為我們APP程序的起始地址,這里我將APP程序起始地址設為0x08010000;

? ? ?將上述程序進行生成,然后在生成的文件中找到usbd_dfu_if.c文件并打開,添加Flash操作相關代碼分別是 上鎖、解鎖、擦除、寫入、讀取、返回Flash操作時間,代碼如下:

/* Private functions ---------------------------------------------------------*/
/*** @brief  Memory initialization routine.* @retval USBD_OK if operation is successful, MAL_FAIL else.*/
uint16_t MEM_If_Init_FS(void)
{/* USER CODE BEGIN 0 */HAL_FLASH_Unlock();__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR);return (USBD_OK);/* USER CODE END 0 */
}/*** @brief  De-Initializes Memory* @retval USBD_OK if operation is successful, MAL_FAIL else*/
uint16_t MEM_If_DeInit_FS(void)
{/* USER CODE BEGIN 1 */HAL_FLASH_Lock();return (USBD_OK);/* USER CODE END 1 */
}/*** @brief  Erase sector.* @param  Add: Address of sector to be erased.* @retval 0 if operation is successful, MAL_FAIL else.*/
uint16_t MEM_If_Erase_FS(uint32_t Add)
{/* USER CODE BEGIN 2 */UNUSED(Add);uint32_t error = 0;FLASH_EraseInitTypeDef flash_dat;          //定義一個結構體變量,里面有擦除操作需要定義的變量HAL_FLASH_Unlock();                                    //第二步:解鎖                        flash_dat.TypeErase = FLASH_TYPEERASE_SECTORS;         //擦除類型是“Page Erase” 僅刪除頁面 另外一個參數是全部刪除flash_dat.Sector = FLASH_SECTOR_5;            //擦除地址對應的頁flash_dat.NbSectors = 1;                               //一次性擦除1頁,可以是任意頁flash_dat.Banks=FLASH_BANK_1;flash_dat.VoltageRange=FLASH_VOLTAGE_RANGE_3;HAL_FLASHEx_Erase(&flash_dat,&error);            //第三步:參數寫好后調用擦除函數return (USBD_OK);/* USER CODE END 2 */
}/*** @brief  Memory write routine.* @param  src: Pointer to the source buffer. Address to be written to.* @param  dest: Pointer to the destination buffer.* @param  Len: Number of data to be written (in bytes).* @retval USBD_OK if operation is successful, MAL_FAIL else.*/
uint16_t MEM_If_Write_FS(uint8_t *src, uint8_t *dest, uint32_t Len)
{/* USER CODE BEGIN 3 */UNUSED(src);UNUSED(dest);UNUSED(Len);uint32_t i = 0;for(i=0;i<Len;i+=4){		HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, (uint32_t)(dest + i), *(uint32_t *)(src + i));if(*(uint32_t *)(src + i) != *(uint32_t *)(dest + i)){/* Flash content doesn't match SRAM content */return (USBD_FAIL);}}return (USBD_OK);/* USER CODE END 3 */
}/*** @brief  Memory read routine.* @param  src: Pointer to the source buffer. Address to be written to.* @param  dest: Pointer to the destination buffer.* @param  Len: Number of data to be read (in bytes).* @retval Pointer to the physical address where data should be read.*/
uint8_t *MEM_If_Read_FS(uint8_t *src, uint8_t *dest, uint32_t Len)
{/* Return a valid address to avoid HardFault *//* USER CODE BEGIN 4 */UNUSED(src);UNUSED(dest);UNUSED(Len);uint32_t i = 0;uint8_t *psrc = src;for (i = 0; i < Len; i++){dest[i] = *psrc++;}/* Return a valid address to avoid HardFault */return (uint8_t *)(dest);/* USER CODE END 4 */
}/*** @brief  Get status routine* @param  Add: Address to be read from* @param  Cmd: Number of data to be read (in bytes)* @param  buffer: used for returning the time necessary for a program or an erase operation* @retval USBD_OK if operation is successful*/
uint16_t MEM_If_GetStatus_FS(uint32_t Add, uint8_t Cmd, uint8_t *buffer)
{/* USER CODE BEGIN 5 */UNUSED(Add);UNUSED(buffer);uint16_t FLASH_PROGRAM_TIME = 50;uint16_t FLASH_ERASE_TIME = 50;switch(Cmd){case DFU_MEDIA_PROGRAM:buffer[1] = (uint8_t)FLASH_PROGRAM_TIME;buffer[2] = (uint8_t)(FLASH_PROGRAM_TIME << 8);buffer[3] = 0;break;case DFU_MEDIA_ERASE:default:buffer[1] = (uint8_t)FLASH_ERASE_TIME;}return (USBD_OK);/* USER CODE END 5 */
}

? ? ? 配置好USB升級方式后,我們就需要編寫Boot程序中關于升級的一些判斷,這里的判斷根據不同的交互方式有所不同,有些使用串口通訊交互,有些使用按鍵+指示燈/屏幕交互,這里我使用的是按鍵+屏幕交互,按鍵接入單片機Wake_Up引腳,Bootloader和APP大體程序執行流程如下:

參考文章:

【STM32】HAL庫USB實現軟件升級DFU的功能操作及配置_stm32f205 dfu-CSDN博客

STM32 USB的DFU模式升級_stm32 dfu-CSDN博客

二、Dfuse DemoV3.06上位機和對應USB驅動安裝

1、下載Dfuse DemoV3.06上位機安裝包,下載地址如下:

STSW-STM32080 - DfuSe USB device firmware upgrade (UM0412) - STMicroelectronics

2、點擊下述紅色方框中的安裝文件,一直點“next”直至完成安裝;

3、通過USB線連接電腦和單片機的USB接口,進入單片機BOOT升級模式,此時打開windows設備管理器,查看連接設備,出現下述圖標是因為沒有安裝Dfuse Demo相關驅動,這里我們右鍵有感嘆號的設備,選擇“更新驅動程序”,選擇“瀏覽我的電腦以查找驅動程序”

? 這里驅動程序的路徑如下,根據電腦的系統選擇相應的文件夾,這里由于我的電腦是win10系統,我就選擇“win10”文件夾作為驅動路徑

如下圖,選擇完驅動路徑后點擊“下一步”等待驅動安裝即可,

? ? 安裝完后再在“設備管理器”可以看到下述兩種情況,都表示驅動安裝成功。(針對本人的USB Boot升級程序,驅動安裝成功后單片機仍處于BOOT模式,此時我們只需要長按wake_up鍵3s左右等待單片機關機以退出BOOT模式,后面正常使用即可;)

? ? 三、使用上位機配合Boot程序進行USB方式的單APP升級

? 1、通過USB線連接電腦和單片機的USB接口,使單片機進入BOOT模式,打開Dfuse Demo程序

? 2、程序左上角紅框內顯示設備名稱即表示連接正常,此時點擊上位機下方“Choose...”加載我們提供的.dfu格式的升級文件

? 3、提示加載完畢,并選擇“Verify after download”

4、點擊“Upgrade”按鈕,有個彈窗,選擇“是”,然后等待Boot升級程序

5、出現下述紅框中的內容表示升級成功。(針對本人的Boot程序,需要再次長按wake_up鍵3s左右等待單片機進入深度休眠以退出BOOT模式,后面正常使用即可)

? ? 注意如果未安裝驅動、單片機不處于BOOT模式、電腦未和單片機連接等異常情況,上位機界面左上角是空的;

如何生成.dfu文件:

1、生成app程序bin文件:

2、將bin文件轉化為.dfu文件:

官方DFU固件更新軟件實現對STM32的USB方式代碼升級簡易說明(STM32-V5開發板) - 開發環境 - 硬漢嵌入式論壇 - Powered by Discuz!

? ? 下面這里的Address填APP的起始地址。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/75414.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/75414.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/75414.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據庫權限獲取

1. into outfile&#xff08;手寫&#xff09; 1.1. 利用條件 ? web 目錄具有寫入權限&#xff0c;能夠使用單引號 ? 知道網站絕對路徑&#xff08;根目錄&#xff0c;或則是根目錄往下的目錄都行&#xff09; ? secure_file_priv 沒有具體值&#xff08;在 mysql/my.ini…

關于ESP系列MCU的UART download原理

GPIO0&#xff0c;即BOOT&#xff0c;工作模式選擇&#xff1a; 懸空/拉高&#xff1a;正常MCU啟動工作狀態 下拉接地&#xff1a;UARTDownload下載模式 如何進入UARTDownload下載模式&#xff1f; 先按下boot按鍵不放&#xff0c;再按下rst按鍵 / en按鍵&#xff0c;隨后釋放…

無需安裝Office進行 Word、Excel操作的微軟開發庫

微軟的確有一些無需安裝完整 Office 就能進行 Word、Excel 操作的開發庫&#xff0c;以下為你介紹&#xff1a; 1. Microsoft Graph API 簡介&#xff1a;Microsoft Graph API 是一個強大的 RESTful API&#xff0c;能讓開發者通過調用接口訪問 Office 365 服務里的各種資源&…

【一起來學kubernetes】34、ReplicaSet使用詳解

Kubernetes ReplicaSet 使用詳解 ReplicaSet 是 Kubernetes 中用于確保指定數量的 Pod 副本持續運行的核心控制器。它通過動態調整 Pod 副本數&#xff0c;保障應用的高可用性和彈性。以下是其核心功能、配置方法及最佳實踐&#xff1a; 一、ReplicaSet 核心作用 維持 Pod 副本…

【力扣hot100題】(034)LRU緩存

做完這題已經沒有任何力氣寫鏈表題了。 思路很簡單&#xff0c;就是調試特別的痛苦。 老是頻頻報錯&#xff0c;唉。 class LRUCache { public:struct ListNode{int key,val;ListNode* next; ListNode* prev;ListNode() : key(0), val(0), next(nullptr), prev(nullptr) {}L…

基于隨機森林算法的信用風險評估項目

引言 這是一個基于隨機森林算法的德國信用風險評估項目&#xff0c;主要目的是構建一個機器學習模型來評估德國客戶的信用風險&#xff0c;判斷客戶是否為高風險客戶。 # -*- coding: utf-8 -*- """ 德國信用風險評估隨機森林模型 """ # 基礎…

亞馬遜云科技攜手 DeepSeek:開啟企業級生成式 AI 新征程

文章目錄 一、DeepSeek-R1模型的技術突破&#xff08;一&#xff09;卓越的性能表現&#xff08;二&#xff09;獨特的訓練方法&#xff08;三&#xff09;豐富的模型生態 二、亞馬遜云科技平臺上的部署與優化&#xff08;一&#xff09;靈活的部署方式&#xff08;二&#xff…

Windows 實戰-evtx 文件分析--筆記

Windows 取證之EVTX日志 - 蟻景網安實驗室 - 博客園 一.evtx日志文件是什么 從 Windows NT 6.0&#xff08;也就是 Windows Vista 和 Windows Server 2008&#xff09;開始&#xff0c;微軟引入了一種全新的日志文件格式&#xff0c;稱為 evtx。這種格式取代了之前 Windows 系…

LangChain/Eliza框架在使用場景上的異同,Eliza通過配置實現功能擴展的例子

LangChain與Eliza框架的異同分析 ?一、相同點? ?模塊化架構設計? 兩者均采用模塊化設計&#xff0c;支持靈活擴展和功能組合。LangChain通過Chains、Agents等組件實現多步驟任務編排?&#xff0c;Eliza通過插件系統和信任引擎實現智能體功能的動態擴展?。模塊化特性降低…

英語口語 -- 常用 1368 詞匯

英語口語 -- 常用 1368 詞匯 介紹常用單詞List1 &#xff08;96 個&#xff09;時間類氣候類自然類植物類動物類昆蟲類其他生物地點類 List2 &#xff08;95 個&#xff09;機構類聲音類食品類餐飲類蔬菜類水果類食材類飲料類營養類疾病類房屋類家具類服裝類首飾類化妝品類 Lis…

深挖 DeepSeek 隱藏玩法·智能煉金術2.0版本

前引&#xff1a;屏幕前的你還在AI智能搜索框這樣搜索嗎&#xff1f;“這道題怎么寫”“蘋果為什么紅”“怎么不被發現翹課” &#xff0c;。看到此篇文章的小伙伴們&#xff01;請準備好你的思維魔杖&#xff0c;開啟【霍格沃茨模式】&#xff0c;看我如何更新秘密的【知識煉金…

2025 年浙江危化品經營單位考試攻略分享?

浙江的考試由省應急管理部門主導。理論考試突出危化品在電商、物流等新興業態下的安全管理知識&#xff0c;這與浙江發達的電商產業緊密相關。對危險化學品的環境危害及防治知識考查細致。實際操作考核模擬杭州、寧波等地危化品倉儲物流中心的作業情況。? 報名材料準備齊全后…

【區塊鏈+ 房產建筑】山東省建筑產業互聯網平臺 | FISCO BCOS 應用案例

山東省建筑產業互聯網平臺&#xff08;山東省弘商易盟平臺&#xff09;是基于區塊鏈技術構建的分布式產業互聯網平臺&#xff0c; 旨在把各企業內部的供應鏈協同管理系統&#xff08;包括采購或者SRM 系統&#xff0c; 以及銷售或CRM 系統&#xff09;利用區塊鏈技術鏈接起來&a…

Bash 花括號擴展 {start..end} 進階使用指南——字典生成

Bash 的花括號擴展&#xff08;brace expansion&#xff09;{start..end} 是一個強大而靈活的語法特性&#xff0c;用于生成特定序列或組合。它在腳本編寫、爆破字典生成、文件批量操作以及模式匹配中有著廣泛的應用。本文將從基礎用法到高級技巧&#xff0c;帶你全面掌握這一功…

23種設計模式-結構型模式-享元

文章目錄 簡介問題解決方案享元與不可變性享元工廠 代碼總結 簡介 亦稱&#xff1a;緩存、Cache、Flyweight。享元是一種結構型設計模式&#xff0c;它摒棄了在每個對象中保存所有數據的方式&#xff0c;通過共享多個對象所共有的相同狀態&#xff0c;讓你能在有限的內存容量中…

MFC BCGControlBar

BCGControlBar&#xff08;也稱為 BCGSoft 或 BCGControlBar Library&#xff09;是一個用于 MFC&#xff08;Microsoft Foundation Classes&#xff09; 的擴展庫&#xff0c;主要提供現代化的 UI 控件、Ribbon 界面、工具欄、屬性網格等組件&#xff0c;幫助開發者快速構建專…

【算法手記9】OR26 最長回文子串 NC369 [NOIP2002 普及組] 過河卒

&#x1f984;個人主頁:修修修也 &#x1f38f;所屬專欄:刷題 ??操作環境:牛客網 一.OR26 最長回文子串 牛客網題目鏈接(點擊即可跳轉):OR26 最長回文子串 題目詳情: 本題詳情如下圖: 題目思路: 本題解題思路如下: 本題思路用中心擴展算法,遍歷所有字符,將每個字符作為回文串…

批量刪除或替換文本文件中指定的行,如刪除第一行、刪除最后一行

每一個文本文件中我們都可以插入非常多的行&#xff0c;我們可以對行的內容進行刪除、修改等各種操作。如果文本文件中的某些行的內容需要更新&#xff0c;那我們就需要對其進行修改操作。想要修改文本文件的內容其實是非常方便的&#xff0c;但是如果想要批量的對多個文本文件…

LLM架構解析:詞嵌入模型 Word Embeddings(第二部分)—— 從基礎原理到實踐應用的深度探索

本專欄深入探究從循環神經網絡&#xff08;RNN&#xff09;到Transformer等自然語言處理&#xff08;NLP&#xff09;模型的架構&#xff0c;以及基于這些模型構建的應用程序。 本系列文章內容&#xff1a; NLP自然語言處理基礎詞嵌入&#xff08;Word Embeddings&#xff09…

機構數據服務

一、背景說明 券商/基金/銀行等金融機構的數據中心&#xff0c;基本都外購有數十家各類數據&#xff0c;自有業務每天也在產生海量信息。如何有效管理和使用這些數據&#xff0c;通過數據服務&#xff0c;沉淀數據資產&#xff0c;機構研發和運維部門也在不斷嘗試和改進。 傳…