chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

3天內不再提示

使用DFU方案實現(xiàn)STM32單片機的高級開發(fā)

技術讓夢想更偉大 ? 來源:csdn ? 作者:ArthurZheng150 ? 2022-11-28 09:33 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

什么是 DFU

DFU全稱為Device Firmware update,是ST官方推出的一個通過USB接口進行IAP升級的方案,同串口ISP一樣,他們都集成在了芯片內部的Bootloader區(qū)段,可以通過配置boot引腳來啟動。(具體可參照ST文檔:AN2606)。不過內置DFU的芯片大部分型號都比較新,如果你用的型號沒有內置DFU程序,沒關系我們也可以通過CubeMX來快速生成和移植一個DFU功能程序到你的Flash中來使用。

DFU方案完整的組件包括單片機DFU Demo代碼、PC端升級程序、PC端Demo代碼以及相關資料手冊等。通過使用DFU方案,我們可以快速的集成升級功能到開發(fā)的產品中,同時還能夠快速的開發(fā)與之配套的升級程序。

使用CubeMX生成初始工程

由于官方提供的DFU例程并不多,我們很難找到現(xiàn)成的可已使用DFU程序,但是通過CubeMX我們可以很快速的配置和生成DFU的Bootloader,下面我們正式開始。

新建CubeMX工程

首先選定好IC的型號,進入配置界面,由于只是Bootloader代碼所以這里我們只需要配置USB功能和一個做Bootloader觸發(fā)的引腳就可,其余的時鐘等部分一切按照正常方式配置。

設置USB引腳功能

設定USB模式為Device(HS還是FS并不影響DFU的功能,按照應用選擇就可)。

cae4ea6a-6eb1-11ed-8abf-dac502259ad0.png

開啟DFU組件

在MiddleWares中加入USB DFU組件

caece1ca-6eb1-11ed-8abf-dac502259ad0.png

設置DFU參數(shù)

開啟DFU組件后,CubeMX的程序設置窗口的MiddleWares中就會出現(xiàn)DFU程序設置按鈕。

cb0498c4-6eb1-11ed-8abf-dac502259ad0.png

點開它將APP加載的地址改為0x0800_c000,這個加載地址根據(jù)你實際的應用設置,目前我們選擇讓flash的前三個sector為Bootloader的區(qū)域。

cb0e3366-6eb1-11ed-8abf-dac502259ad0.png

第二個全是字段的參數(shù)是用來在DFU連接升級軟件式傳輸給軟件用來獲取Flash結構字符串數(shù)據(jù),很好理解這個小協(xié)議的內容,點擊設置后,下方的CubeMX的參數(shù)說明也寫的很清晰,這里就不多說了。當然這些參數(shù)也在工程生成后在 usbd_conf.h 和 usbd_dfu_if.c 文件中修改。

cb21e7da-6eb1-11ed-8abf-dac502259ad0.png

最后的設置

最后我們添加一個外部的按鍵作為觸發(fā)單片機啟動時進入DFU的方式,按鍵按下后就啟動DFU模式,否則直接加載后方APP程序,這里選用PA0引腳,給它設置個User Label 就叫 USER_BTN_GPIO_Port。

cb2daafc-6eb1-11ed-8abf-dac502259ad0.png

修改補全工程

實現(xiàn) DFU 功能代碼

打開 src 目錄下的 usbd_dfu_if.c 文件補全其中的功能代碼

Flash 解鎖

  1. uint16_tMEM_If_Init_HS(void)
    {
    HAL_FLASH_Unlock();
    return(USBD_OK);
    }
    

    Flash 上鎖

    uint16_tMEM_If_DeInit_HS(void)
    {
    HAL_FLASH_Lock();
    return(USBD_OK);
    }
    

    Flash 擦除

    staticuint32_tGetSector(uint32_tAddress)
    {
    uint32_tsector=0;
    
    if((Address=ADDR_FLASH_SECTOR_0))
    {
    sector=FLASH_SECTOR_0;
    }
    
    ......
    
    }
    elseif((Address=ADDR_FLASH_SECTOR_22))
    {
    sector=FLASH_SECTOR_22;
    }
    else
    {
    sector=FLASH_SECTOR_23;
    }
    returnsector;
    }
    
    uint16_tMEM_If_Erase_HS(uint32_tAdd)
    {
    uint32_tstartsector=0;
    uint32_tsectornb=0;
    /*VariablecontainsFlashoperationstatus*/
    HAL_StatusTypeDefstatus;
    FLASH_EraseInitTypeDeferaseinitstruct;
    
    /*Getthenumberofsector*/
    startsector=GetSector(Add);
    
    eraseinitstruct.TypeErase=FLASH_TYPEERASE_SECTORS;
    eraseinitstruct.VoltageRange=FLASH_VOLTAGE_RANGE_3;
    eraseinitstruct.Sector=startsector;
    eraseinitstruct.NbSectors=1;
    status=HAL_FLASHEx_Erase(&eraseinitstruct,§ornb);
    
    if(status!=HAL_OK)
    {
    return(USBD_FAIL);
    }
    return(USBD_OK);
    }
    

    Flash 寫入

    uint16_tMEM_If_Write_HS(uint8_t*src,uint8_t*dest,uint32_tLen)
    {
    uint32_ti=0;
    
    for(i=0;i4)
    {
    /*Devicevoltagerangesupposedtobe[2.7Vto3.6V],theoperationwill
    bedonebybyte*/
    if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,(uint32_t)(dest+i),*(uint32_t*)(src+i))==HAL_OK)
    {
    /*Checkthewrittenvalue*/
    if(*(uint32_t*)(src+i)!=*(uint32_t*)(dest+i))
    {
    /*Flashcontentdoesn'tmatchSRAMcontent*/
    return(USBD_FAIL);
    }
    }
    else
    {
    /*ErroroccurredwhilewritingdatainFlashmemory*/
    return(USBD_FAIL);
    }
    }
    return(USBD_OK);
    }
    

    Flash 讀取

    uint8_t*MEM_If_Read_HS(uint8_t*src,uint8_t*dest,uint32_tLen)
    {
    /*ReturnavalidaddresstoavoidHardFault*/
    uint32_ti=0;
    uint8_t*psrc=src;
    
    for(i=0;i/*ReturnavalidaddresstoavoidHardFault*/
    return(uint8_t*)(dest);
    }
    

    獲取 Flash 擦寫時間參數(shù)

    uint16_tMEM_If_GetStatus_HS(uint32_tAdd,uint8_tCmd,uint8_t*buffer)
    {
    /*USERCODEBEGIN11*/
    uint16_ttime;
    
    time=TimingTable[GetSector(Add)];
    
    switch(Cmd)
    {
    caseDFU_MEDIA_PROGRAM:
    buffer[1]=(uint8_t)time;
    buffer[2]=(uint8_t)(time<8);
    buffer[3]=0;
    break;
    
    caseDFU_MEDIA_ERASE:
    default:
    buffer[1]=(uint8_t)time;
    buffer[2]=(uint8_t)(time<8);
    buffer[3]=0;
    break;
    }
    return(USBD_OK);
    /*USERCODEEND11*/
    }
    

    usbd_dfu_if.h 文件添加的宏定義

    /*Defineflashaddress*///BLANK1#defineADDR_FLASH_SECTOR_00x08000000#defineADDR_FLASH_SECTOR_10x08004000#defineADDR_FLASH_SECTOR_20x08008000#defineADDR_FLASH_SECTOR_30x0800C000#defineADDR_FLASH_SECTOR_40x08010000#defineADDR_FLASH_SECTOR_50x08020000#defineADDR_FLASH_SECTOR_60x08040000#defineADDR_FLASH_SECTOR_70x08060000#defineADDR_FLASH_SECTOR_80x08080000#defineADDR_FLASH_SECTOR_90x080A0000#defineADDR_FLASH_SECTOR_100x080C0000#defineADDR_FLASH_SECTOR_110x080E0000//BLANK2#defineADDR_FLASH_SECTOR_120x08100000#defineADDR_FLASH_SECTOR_130x08104000#defineADDR_FLASH_SECTOR_140x08108000#defineADDR_FLASH_SECTOR_150x0810C000#defineADDR_FLASH_SECTOR_160x08110000#defineADDR_FLASH_SECTOR_170x08120000#defineADDR_FLASH_SECTOR_180x08140000#defineADDR_FLASH_SECTOR_190x08160000#defineADDR_FLASH_SECTOR_200x08180000#defineADDR_FLASH_SECTOR_210x081A0000#defineADDR_FLASH_SECTOR_220x081C0000#defineADDR_FLASH_SECTOR_230x081E0000/*Flashopratetimefromdatasheetpage128*/#defineFLASH_SECTOR_16KB_WRITE_ERASE_TIME500//500usbframe,means500ms#defineFLASH_SECTOR_64KB_WRITE_ERASE_TIME1100#defineFLASH_SECTOR_128KB_WRITE_ERASE_TIME2000
  2. 修改Main文件

    首先在main文件前添加幾個用于加載APP程序的變量和函數(shù)定義

    typedefvoid(*pFunction)(void);
    
    pFunctionJumpToApplication;
    uint32_tJumpAddress;1234

    然后再 main 函數(shù)中加入 外部按鍵的判斷、APP程序加載以及USB DFU初始化功能

    intmain(void)
    {
    /*Resetofallperipherals,InitializestheFlashinterfaceandtheSystick.*/
    HAL_Init();
    
    /*Configurethesystemclock*/
    SystemClock_Config();
    
    /*Initializeallconfiguredperipherals*/
    MX_GPIO_Init();
    
    if(HAL_GPIO_ReadPin(USER_BTN_GPIO_Port,USER_BTN_Pin)==GPIO_PIN_SET)
    {
    HAL_GPIO_WritePin(GPIOG,LD3_Pin,GPIO_PIN_SET);//Fordebug
    /*Testifusercodeisprogrammedstartingfromaddress0x0800C000*/
    if(((*(__IOuint32_t*)USBD_DFU_APP_DEFAULT_ADD)&0x2FF80000)==0x20000000)
    {
    HAL_GPIO_WritePin(GPIOG,LD4_Pin,GPIO_PIN_SET);//Fordebug
    /*Jumptouserapplication*/
    JumpAddress=*(__IOuint32_t*)(USBD_DFU_APP_DEFAULT_ADD+4);
    JumpToApplication=(pFunction)JumpAddress;
    
    /*Resetofallperipherals*/
    HAL_DeInit();
    
    /*Setinterruptvectortoappcode*/
    SCB->VTOR=USBD_DFU_APP_DEFAULT_ADD;
    
    /*Initializeuserapplication'sStackPointer*/
    __set_MSP(*(__IOuint32_t*)USBD_DFU_APP_DEFAULT_ADD);
    JumpToApplication();
    }
    }
    
    MX_USB_DEVICE_Init();
    
    while(1)
    {
    }
    }
    

編譯程序下載進入單片機

使用DfuSe

從ST官網DfuSe的程序安裝包,并安裝。然后我們按下之前寫的觸發(fā)按鍵并復位單片機,讓單片機初始 USB DFU 功能,這時如果你插著單片機的USB線,系統(tǒng)應該已經識別了。如果沒有右鍵更新驅動程序,手動指定驅動搜索路徑在DfuSe安裝目錄下的 BinDriver 內。如果直接無法識別USB設備,建議在CubeMx配置完工程后就編譯下載測試一下,看看是不是你在移植過程中哪里寫錯了。

然后我們需要生成一個地址設定在0x0800_c000后的測試程序,就先編寫一個 Blink LED 的程序吧,生成bin、hex或S19文件。然后我們打開DfuSe軟件的Dfu file manager來生成DFU軟件用的.dfu格式的文件。選擇第一項,第二個是用來將.dfu反向變換回來的。大概的操作已經標在圖片上了,操作比較簡單就不做詳細介紹了,記得把Address的地址改到偏移后的地址上否則下載會出錯,其他參數(shù)可以不用修改。

然后我們打開DfuSe程序,在Upgrade中選擇生成好的blink.dfu文件,勾選校驗功能,下載程序。成功后復位單片機,LED開始閃爍,移植成功。

更多

仔細區(qū)看看DfuSe的安裝目錄,里面有DFU的資料文檔,還有DFU的工程源代碼,可以用來改寫自己需要的DFU升級程序。

審核編輯:郭婷


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

    關注

    462

    文章

    53499

    瀏覽量

    458567
  • usb
    usb
    +關注

    關注

    60

    文章

    8369

    瀏覽量

    281507
  • STM32
    +關注

    關注

    2305

    文章

    11118

    瀏覽量

    370951

原文標題:STM32高級開發(fā)——使用DFU方案

文章出處:【微信號:技術讓夢想更偉大,微信公眾號:技術讓夢想更偉大】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    為什么單片機還在用C語言編程?

    的存儲空間非常有限,我們使用者需要靠精打細算來設計程序,根本經不起高級語言臃腫的代碼體積。高級語言也無法實現(xiàn)精確的時序控制。 三、C語言是一個折中選擇 其實用C語言開發(fā)單片機
    發(fā)表于 11-28 07:37

    單片機的誤區(qū)

    1.去背寄存器 寄存器不用死記硬背,,當我們去使用單片機外設的時候就要去配置,千萬別去記寄存器,華維單片機編程的導師做開發(fā)這么多年了,一個寄存器都記不住。 何況,單片機的寄存器非常多,
    發(fā)表于 11-14 07:46

    單片機用什么封裝

    。深圳市安凱星科技有限公司在為拓邦、朗科、安徽龍多等客戶開發(fā)方案時,會根據(jù)項目場景精準選擇封裝類型,確保性能與實用性平衡。 常見單片機封裝類型及特點 DIP 封裝:直插式的經典之選 DIP(雙列直插封裝)是最基礎的
    的頭像 發(fā)表于 08-01 13:47 ?883次閱讀

    什么單片機比較耐用

    凱星科技有限公司在多年的單片機應用開發(fā)中,對各類單片機的耐用性有著深入了解,通過為拓邦、朗科、安徽龍多等客戶提供方案,積累了豐富的選型與優(yōu)化經驗。 影響
    的頭像 發(fā)表于 07-31 13:48 ?534次閱讀

    單片機的儲存優(yōu)點是什么

    場景。深圳市安凱星科技有限公司在單片機應用開發(fā)中,充分利用這些儲存優(yōu)點,為拓邦、朗科、安徽龍多等客戶打造了高效穩(wěn)定的解決方案。 1.集成度高,節(jié)省硬件空間 單片機將程序存儲器(ROM)
    的頭像 發(fā)表于 07-31 10:09 ?479次閱讀

    怎么測單片機系統(tǒng)頻率

    單片機系統(tǒng)頻率是指單片機工作時的時鐘頻率,它直接影響單片機的運行速度和處理能力,準確測量系統(tǒng)頻率對單片機應用開發(fā)、程序調試和性能優(yōu)化具有重要
    的頭像 發(fā)表于 07-25 11:39 ?441次閱讀

    單片機怎么驅動電機?

    在各類自動化設備和智能裝置中,電機是重要的執(zhí)行部件,而單片機作為控制核心,需要通過特定的方式驅動電機運轉。單片機驅動電機并非直接連接即可,而是要根據(jù)電機類型和功率,搭配合適的驅動電路,才能實現(xiàn)穩(wěn)定
    的頭像 發(fā)表于 07-25 09:31 ?429次閱讀

    單片機開發(fā)流程包括什么?

    單片機開發(fā)是一個系統(tǒng)性的工程,從需求明確到最終產品落地,需要經歷多個相互關聯(lián)的流程環(huán)節(jié),每個環(huán)節(jié)都對最終產品的性能和質量有著重要影響。 一、需求分析與文檔梳理 開發(fā)流程的第一步是需求分析,這一
    的頭像 發(fā)表于 07-22 11:21 ?610次閱讀

    單片機定制開發(fā)的設計思路

    單片機定制開發(fā)是根據(jù)特定場景和功能需求,量身打造符合要求的單片機應用方案,其設計過程需要兼顧技術可行性與實際應用價值,涉及多個關鍵環(huán)節(jié)。 一、需求分析階段
    的頭像 發(fā)表于 07-17 11:14 ?565次閱讀
    <b class='flag-5'>單片機</b>定制<b class='flag-5'>開發(fā)</b>的設計思路

    KF32A136系列單片機產品介紹

    F32A136 系列單片機是基于 KF32 內核架構開發(fā)單片機。
    的頭像 發(fā)表于 06-27 11:42 ?1633次閱讀
    KF32A136系列<b class='flag-5'>單片機</b>產品介紹

    STM32F10xxx單片機編程手冊

    電子發(fā)燒友網站提供《STM32F10xxx單片機編程手冊.pdf》資料免費下載
    發(fā)表于 04-14 14:56 ?17次下載

    STM32F103x8 STM32F103xB單片機數(shù)據(jù)手冊

    STM32F103x8STM32F103xB單片機數(shù)據(jù)手冊
    發(fā)表于 04-14 14:55 ?6次下載

    STM32單片機最小系統(tǒng)電路設計

    單片機最小系統(tǒng)是指用最少的電路組成單片機可以工作的系統(tǒng),通常最小系統(tǒng)包含:電源電路、時鐘電路、復位電路、調試/下載電路,對于STM32還需要啟動選擇電路。總之,剛開始如果不太懂電路的話,就抄別人的電路,然后自己拼湊。
    的頭像 發(fā)表于 03-12 14:09 ?1.7w次閱讀
    <b class='flag-5'>STM32</b><b class='flag-5'>單片機</b>最小系統(tǒng)電路設計

    32位單片機相關資料和解決方案參考指南

    電子發(fā)燒友網站提供《32位單片機相關資料和解決方案參考指南.pdf》資料免費下載
    發(fā)表于 01-21 14:00 ?0次下載
    32位<b class='flag-5'>單片機</b>相關資料和解決<b class='flag-5'>方案</b>參考指南

    單片機Debug工具性能對比 單片機調試常用命令

    單片機(Microcontroller Unit, MCU)調試是嵌入式開發(fā)中的一個重要環(huán)節(jié),它幫助開發(fā)者發(fā)現(xiàn)和修復代碼中的錯誤,優(yōu)化程序性能。不同的單片機
    的頭像 發(fā)表于 12-19 09:56 ?2140次閱讀