標(biāo)題: STM32F4 IAP升級(jí) Bootloader程序+上位機(jī)下載程序源碼 [打印本頁(yè)]
作者: zhouzhou1 時(shí)間: 2018-10-18 10:06
標(biāo)題: STM32F4 IAP升級(jí) Bootloader程序+上位機(jī)下載程序源碼
IAP更新操作說(shuō)明
第一個(gè)文件夾:bootloader程序
第二個(gè)文件夾:上位機(jī)下載程序源碼
第三個(gè)文件夾:需要更新下載的代碼
第四個(gè)文件:下載工具可執(zhí)行文件
第五個(gè)文件:生成的pbdr.bin文件,用于更新。
一、硬件設(shè)計(jì):升級(jí)下載程序采用外部硬件觸發(fā)的方式。
PB-20M4硬件板 預(yù)留一個(gè)IO口處理代碼下載及更新的功能。
功能簡(jiǎn)介:開(kāi)機(jī)前若將 PB4接口與GND用杜邦線(改進(jìn)硬件后可用跳帽)短接, LED6閃爍狀態(tài),即可進(jìn)入固件下載功能程序,然后等待串口輸入接收APP程序(.bin文件,生成方法見(jiàn)后面說(shuō)明、分段接收每包2K數(shù)據(jù),進(jìn)行CRC校驗(yàn)),在接收完APP程序包后,斷開(kāi)PB4與地線的連接即可進(jìn)入用戶(hù)程序。
用到的資源:
- 指示燈DS6
- 一根短接線,優(yōu)化硬件后 可用跳帽
- 串口(共地)
圖一 硬件指示圖
圖二 串口連接
二、軟件設(shè)計(jì)總共涉及三部分代碼:1、Bootloader;2、Flash App;3、上位機(jī)程序
1.Bootloader;
主函數(shù)進(jìn)行任務(wù)判斷,以及IAP更新和跳轉(zhuǎn)等各項(xiàng)操作。串口中斷中運(yùn)行數(shù)據(jù)處理,數(shù)據(jù)檢測(cè),與上位機(jī)及握手校驗(yàn)等任務(wù)。Bootloader大小僅16K左右。
2、Flash App;
需要下載的程序,設(shè)置flash起始地址偏移量,由bootloader串口中斷中寫(xiě)到flash中去。在初始化的時(shí)候執(zhí)行跳轉(zhuǎn),運(yùn)行該代碼程序。
3、上位機(jī)發(fā)送校驗(yàn)程序
協(xié)議如下:
/*---------------------------------------------------------------------
protocol-----|#|remainSend|#|length|data[]|CRC_check
---------------------------------------------------------------------*/
IAP不是一下子把所有BIN文件都接收過(guò)來(lái)寫(xiě)入FLASH,而是根據(jù)自己硬件的RAM空間,把BIN文件分成若干包,如每1K,2K等傳送一次,傳送當(dāng)中加上幀頭,幀尾,CRC,及總共多少包,及這是第幾包等信息封裝好的數(shù)據(jù)包,每接收一包寫(xiě)相應(yīng)FLASH,下一包對(duì)應(yīng)的FLASH地址++,如此完成固件更新。
三、上位機(jī)設(shè)計(jì):打開(kāi)應(yīng)用程序IAP_Download_USART\IAP_Download_USART\obj\Debug中exe文件。
或直接打開(kāi)附件中IAP_Download_USART.exe應(yīng)用程序
運(yùn)行界面
燒錄過(guò)程:
開(kāi)發(fā)環(huán)境如下:
VS2013上用C#設(shè)計(jì)的簡(jiǎn)單的串口應(yīng)用程序,基于.net4.5。
主要代碼:
詳見(jiàn)附件。
四、IAP說(shuō)明IAP(In Application Programming)即應(yīng)用編程,IAP是用戶(hù)自己的程序在運(yùn)行過(guò)程中對(duì)User Flash的部分區(qū)域進(jìn)行燒寫(xiě),后期可以方便的通過(guò)預(yù)留通信口對(duì)產(chǎn)品進(jìn)行更新升級(jí)。在實(shí)現(xiàn)IAP功能時(shí),需要在設(shè)計(jì)固件程序時(shí)編寫(xiě)兩個(gè)項(xiàng)目的代碼,第一個(gè)項(xiàng)目程序(bootloader程序)不執(zhí)行正常的功能操作,而是只通過(guò)某種通信方式接收程序和數(shù)據(jù),執(zhí)行對(duì)第二部分代碼的更新;第二個(gè)項(xiàng)目代碼是功能代碼(APP程序)。這兩部分項(xiàng)目代碼都同時(shí)燒錄在User Flash中,在芯片上電后,首先執(zhí)行第一個(gè)項(xiàng)目的代碼,進(jìn)行如下操作:
- 檢查是否需要對(duì)第二部分代碼進(jìn)行更新
- 如果不需要更新,則運(yùn)行第二部分代碼
- 若需要更新,執(zhí)行更新操
- 更新完成,執(zhí)行第二部分代碼
Bootloader代碼必須通過(guò)其他手段,如JTAG或ISP燒錄;第二部分代碼使用Bootloader程序IAP功能燒錄,也可以通過(guò)JTAG燒錄,以后需要更新時(shí)可以通過(guò)IAP代碼進(jìn)行燒錄。
兩部分代碼存放在flash不同的地址位置,從最低地址區(qū)開(kāi)始存放Bootloader,在其后指定位置存放APP程序。
STM32F4的內(nèi)部閃存(flash)地址起始于0x08000000,一般情況下,程序文就從此地址開(kāi)始寫(xiě)入。此外STM32是基于Cortex-M4 內(nèi)核的微控制器,其內(nèi)部通過(guò)一張“中斷向量表”來(lái)響應(yīng)中斷,程序啟動(dòng)后,將首先從“中斷向量表”取出復(fù)位中斷向量執(zhí)行復(fù)位中斷程序完成啟動(dòng),而這張“中斷向量表”的起始地址是0x08000004,當(dāng)中斷來(lái)臨,STM32F4 的內(nèi)部硬件機(jī)制亦會(huì)自動(dòng)將PC 指針定位到“中斷向量表”處,并根據(jù)中斷源取出對(duì)應(yīng)的中斷向量執(zhí)行中斷服務(wù)程序。
IAP程序滿足的要求:
- 新程序必須在IAP程序之后的某個(gè)偏移量為x 的地址開(kāi)始;
- 必須將新程序的中斷向量表相應(yīng)的移動(dòng),移動(dòng)的偏移量為x;
1.程序起始地址設(shè)置方法
打開(kāi)pbdr_v110工程,點(diǎn)擊Options for Target /Target選項(xiàng)卡,如圖一所示:
圖一 Flash app target 選項(xiàng)卡設(shè)置
默認(rèn)條件下,圖中IROM1的起始地址(Start)一般為0x08000000,大小1M(Size)為0x100000。而我們?cè)O(shè)置APP程序起始地址為0X08010000,即偏移量為0x10000(64K字節(jié)),留給用戶(hù)flash空間(size)是1024k-64k=960K。偏移量是定義留給bootloader程序的地址空間大小。發(fā)布者可以定義bootloader空間的大小這里我定義的是64K,偏移量為0x200的倍數(shù)即可。(本設(shè)計(jì)的bootloader只有16K左右),這里留有余量,方便bootloader以后的升級(jí)修改。
1.中斷向量表的偏移設(shè)置方法
在pbdr_v110版本中在mian.c中設(shè)置如下:
完成中斷向量表偏移量的設(shè)置
MDK編譯默認(rèn)生成.hex文件,而升級(jí)程序需要生成.bin文件。MDK自帶的格式轉(zhuǎn)換工具fromelf.exe,來(lái)實(shí)現(xiàn).axf文件到.bin文件的轉(zhuǎn)換。該工具在MDK的安裝目錄\ARM\BIN40文件夾下。通過(guò)下一步設(shè)置,可以在MDK編譯成功之后,調(diào)用fromelf.exe (注意,MDK的安裝路徑,我的路徑D:\Keil_v5\ARM\ARMCC\bin),根據(jù)當(dāng)前工程pbdr.axf,生成一個(gè)pbdr.bin文件。存放在OBJ文件夾下。在得到.bin文件后,我們只需要將這個(gè)bin文件通過(guò)串口傳送給單片機(jī),即可執(zhí)行代碼的下載以及升級(jí)。
五、下載驗(yàn)證:將JTDO(PB4)與GND短接,上電后,LED燈D6開(kāi)始閃爍,說(shuō)明進(jìn)入下載更新?tīng)顟B(tài)。
絲印見(jiàn)PB-20背面。
通過(guò)TTL轉(zhuǎn)usb連上電腦端串口,打開(kāi)IAP更新軟件(打開(kāi)應(yīng)用程序IAP_Download_USART\IAP_Download_USART\obj\Debug文件夾中IAP_Download_USART.exe文件或直接打開(kāi)附件中IAP_Download_USART.exe應(yīng)用程序),打開(kāi)串口即可選則發(fā)送BIN文件進(jìn)行代碼下載。

關(guān)閉下載窗口,斷開(kāi)短接線即可運(yùn)行更新后的程序。
stm32 IAP Bootloader V1.4源碼:
- /*--------------------------------------------------------------------------------------
- @file: IAP_Serial
- @version: V1.0
- @author: Shanwu.5_W && Potter_lv
- @Introduction : Unlock flash load_app from serial
- --------------------------------------------------------------------------------------*/
- #include "sys.h"
- #include "delay.h"
- #include "usart.h"
- #include "led.h"
- #include "stmflash.h"
- #include "iap.h"
- void Button_Switch_DFU_Init(void) //按鍵升級(jí)初始化
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- }
- #define GET_BUTTON_STATE GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_3)
- int main(void)
- {
- u8 t;
-
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設(shè)置系統(tǒng)中斷優(yōu)先級(jí)分組2
- delay_init(168); //初始化延時(shí)函數(shù)
- uart_init(115200); //初始化串口波特率為115200
-
- LED_Init(); //初始化LED
- Button_Switch_DFU_Init(); //初始化跳轉(zhuǎn)APP程序接口
-
- while(1)
- {
- t++;
- delay_ms(10);
- if(t==30)
- {
- LED0=!LED0; //D6閃爍 等待更新?tīng)顟B(tài)
- t=0;
- }
- if(GET_BUTTON_STATE != 0x00) //懸空進(jìn)入更新進(jìn)程
- {
- if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000) //判斷是否為0X08XXXXXX.
- {
- USART_Cmd(USART2, DISABLE); //失能串口2 ,防止跳轉(zhuǎn)到App程序時(shí)死機(jī)
- iap_load_app(FLASH_APP1_ADDR); //執(zhí)行FLASH APP代碼
- }else
- {
- printf("非FLASH應(yīng)用程序,無(wú)法執(zhí)行!\r\n");
- }
- }
- }
- }
復(fù)制代碼
0.png (45.22 KB, 下載次數(shù): 156)
下載附件
2018-10-18 14:32 上傳
全部資料51hei下載地址:
IAP_release.rar
(2.24 MB, 下載次數(shù): 1053)
2018-10-18 14:39 上傳
點(diǎn)擊文件名下載附件
iap升級(jí)的例子
下載積分: 黑幣 -5
作者: ever343 時(shí)間: 2018-11-15 14:30
謝謝分享
作者: bingnuo1023 時(shí)間: 2018-11-16 15:10
感謝分享
作者: dkydkyshow 時(shí)間: 2018-12-13 14:13
謝謝分享
作者: shenme 時(shí)間: 2018-12-18 21:53
贊一個(gè),不錯(cuò)
作者: 煙花綻放 時(shí)間: 2018-12-21 11:52
謝謝分享
作者: ztin0501 時(shí)間: 2019-1-2 16:51
感謝分享~~
作者: dsc78 時(shí)間: 2019-1-8 09:47
感謝分享~~
作者: m4416202 時(shí)間: 2019-1-17 09:59
希望可以下來(lái)用用
作者: yutian2017 時(shí)間: 2019-1-17 21:08
謝謝分享
作者: 等等biu 時(shí)間: 2019-1-22 17:29
大家有下載的嗎?可以分享一下嗎
作者: doube08 時(shí)間: 2019-1-26 11:37
用起來(lái)了么
作者: laifengjian 時(shí)間: 2019-2-12 19:40
學(xué)習(xí)學(xué)習(xí)
作者: hellowC8051 時(shí)間: 2019-2-15 08:44
謝謝分享
作者: xiaosir 時(shí)間: 2019-4-7 17:03
好東西,學(xué)習(xí)了!
作者: hpdell 時(shí)間: 2019-4-8 16:40
謝謝分享
作者: ahai0306 時(shí)間: 2019-4-9 15:17
非常好,感謝分享。
作者: topdream 時(shí)間: 2019-4-9 16:54
這是大佬!
作者: zixiaguying 時(shí)間: 2019-4-14 12:35
上位機(jī)源碼沒(méi)有
作者: 474344468 時(shí)間: 2019-5-29 18:08
謝謝分享!
作者: 474344468 時(shí)間: 2019-5-29 18:08
有上位機(jī)的啊
作者: hylomar 時(shí)間: 2019-7-1 16:07
謝謝分享
作者: matthewroy 時(shí)間: 2019-7-2 10:40
謝謝樓主的無(wú)私分享!
作者: matthewroy 時(shí)間: 2019-7-2 18:10
樓主你好 請(qǐng)問(wèn)用上位機(jī)點(diǎn)開(kāi)連接之后發(fā)現(xiàn)下位機(jī)卡死的情況
作者: byoo 時(shí)間: 2019-7-27 19:59
不錯(cuò),謝謝了!
作者: 鬼腳七 時(shí)間: 2019-8-20 15:38
謝謝 學(xué)習(xí)一下
作者: SHIROYAN 時(shí)間: 2019-9-12 10:20
感謝分享,研究一下分包粘包
作者: SHIROYAN 時(shí)間: 2019-9-12 17:38
測(cè)試時(shí)發(fā)現(xiàn),只要點(diǎn)擊連接,單片機(jī)就會(huì)卡死,斷開(kāi)連接后單片機(jī)又恢復(fù)正常
作者: zzjj44 時(shí)間: 2019-9-26 20:27
正好需要,謝謝大神!雪中送炭!
作者: tomgong 時(shí)間: 2019-10-4 14:21
如果需求是 這樣子如何實(shí)現(xiàn):
stm32f4單片機(jī)一檢測(cè)到某個(gè)觸發(fā)條件,即擦除相關(guān)程序區(qū)域,而不是升級(jí)它。
作者: 從前有只喵嗚 時(shí)間: 2019-10-8 22:39
學(xué)習(xí)下~
作者: han1993 時(shí)間: 2019-10-10 15:13
謝謝分享
作者: chdkf 時(shí)間: 2019-10-13 18:38
謝謝大佬分享
作者: chdkf 時(shí)間: 2019-10-13 18:39
謝謝 大佬分享
作者: 吉祥二月鳥(niǎo) 時(shí)間: 2019-10-14 13:31
沒(méi)有第三個(gè)文件夾
作者: jianfeii 時(shí)間: 2019-11-22 11:37
這個(gè)資料非常棒!
作者: sumissqin 時(shí)間: 2019-11-26 15:37
謝謝。下載學(xué)習(xí)下
作者: daichenghe 時(shí)間: 2019-12-16 20:56
看起來(lái)不錯(cuò),就是沒(méi)積分下載。
作者: SamCaffrey 時(shí)間: 2019-12-19 16:17
感謝分享 找了很久
作者: linda5150 時(shí)間: 2019-12-23 20:24
正需要,謝謝樓主
作者: D-偉 時(shí)間: 2019-12-30 09:48
大神,板子有鏈接沒(méi)?
作者: zhao293 時(shí)間: 2020-1-6 16:52
非常感謝分享,讓我在這個(gè)冬天非常溫暖
作者: dylan-ding 時(shí)間: 2020-1-31 11:22
請(qǐng)問(wèn)樓主你使用的通訊協(xié)議是什么?自定義的還是使用通用的協(xié)議?
作者: playeboy 時(shí)間: 2020-2-16 13:01

謝謝分享。
作者: srgbzf 時(shí)間: 2020-2-22 10:48
找了很久了,正找這個(gè)呢
作者: mebest74 時(shí)間: 2020-2-24 22:28
十分感謝!
作者: hsv23 時(shí)間: 2020-3-2 11:18
謝謝分享
作者: huangzongwu 時(shí)間: 2020-3-4 18:33
很實(shí)用的功能,我最近打算把這個(gè)模塊增加到我們儀器里面
作者: 玉簡(jiǎn)勵(lì) 時(shí)間: 2020-3-13 10:51
先收藏一下,有黑幣了再來(lái)下載
作者: jianfeii 時(shí)間: 2020-4-22 11:05
這個(gè)代碼不完整啊,只有IAP的,APP的沒(méi)有在壓縮包里面啊,應(yīng)該不能用才對(duì)
作者: nimisi 時(shí)間: 2020-4-26 10:36
收藏學(xué)習(xí)一下
作者: 一期一會(huì)619 時(shí)間: 2020-5-2 14:40
謝謝分享
作者: jach09 時(shí)間: 2020-6-16 14:17
缺少APP程序部分,范例不全。!
作者: 51lqlhei 時(shí)間: 2020-6-22 10:41
謝謝分享
作者: ccczx 時(shí)間: 2020-12-9 14:11
正需要這方面的資料,看介紹還是比較詳細(xì)的
作者: sunsaga1989 時(shí)間: 2020-12-20 00:24
壓縮包里面的東西不完整
作者: jach09 時(shí)間: 2021-1-27 12:14
東西不完整,缺少APP應(yīng)有程序部分的代碼。!
作者: Davidzz 時(shí)間: 2021-1-28 12:54
謝謝分享,剛好要用到IAP
作者: 454267390 時(shí)間: 2022-3-27 21:04
正需要這方面的資料,雪中送碳了
作者: 西點(diǎn)鐘靈毓秀 時(shí)間: 2022-7-14 17:51
已經(jīng)研究了一下,覺(jué)得可以移植到自己的開(kāi)發(fā)中。 最好有下載激活的,不是使用IO激活 IAP功能就好了。
作者: 543049411 時(shí)間: 2023-10-18 09:42
感謝分享,最近也是有產(chǎn)品要用到
作者: xzh5508 時(shí)間: 2023-12-19 10:50
已經(jīng)移植到自己的程序里,仔細(xì)看邏輯,方法就行。上位機(jī)用C#寫(xiě)的,是沒(méi)有問(wèn)題的。
app程序就是用自己的程序就可以了,在里面加一行跳轉(zhuǎn)代碼,并在工程里面設(shè)置以下地址就行,壓縮包里面的說(shuō)明寫(xiě)的很清楚。
作者: 靈沉 時(shí)間: 2024-3-6 10:18
移植到stm32f103上, 跳轉(zhuǎn)時(shí)卡死, 不知道什么原因
作者: mike7575 時(shí)間: 2024-6-3 13:35
這個(gè)非常實(shí)用,謝謝分享原理
作者: wyl 時(shí)間: 2025-7-2 08:44
蟹蟹,好東西,學(xué)習(xí)了!
歡迎光臨 (http://www.zg4o1577.cn/bbs/) |
Powered by Discuz! X3.1 |
主站蜘蛛池模板:
亚洲综合色丁香婷婷六月图片
|
人人爽人人爽
|
午夜精品一区二区三区在线观看
|
视频三区
|
欧美精品二区
|
欧美自拍另类
|
国产高清在线观看
|
97精品国产手机
|
欧美日韩专区
|
久久精品国产免费看久久精品
|
久久久成人一区二区免费影院
|
欧美中文字幕
|
欧美激情视频一区二区三区在线播放
|
成人综合久久
|
午夜影院污
|
日韩三级精品
|
www.99热这里只有精品
|
成人在线激情
|
草久久免费视频
|
国产精品一区二区三区久久久
|
国产二区三区
|
一区二区三区精品在线
|
国产精品69毛片高清亚洲
|
蜜桃视频一区二区三区
|
我爱操
|
久久久夜夜夜
|
天天操夜夜操
|
国产福利视频在线观看
|
天堂资源|
欧美bondage紧缚视频
|
7777久久|
国产精品三级久久久久久电影
|
免费成人在线网站
|
欧美一级久久
|
午夜影院操
|
三区四区在线观看
|
欧产日产国产精品v
|
欧美成人精品激情在线观看
|
我要看免费一级毛片
|
日韩在线视频精品
|
综合色婷婷|