單芯片解決方案,開(kāi)啟全新體驗(yàn)——W55MH32 高性能以太網(wǎng)單片機(jī)
W55MH32是WIZnet重磅推出的高性能以太網(wǎng)單片機(jī),它為用戶(hù)帶來(lái)前所未有的集成化體驗(yàn)。這顆芯片將強(qiáng)大的組件集于一身,具體來(lái)說(shuō),一顆W55MH32內(nèi)置高性能Arm? Cortex-M3核心,其主頻最高可達(dá)216MHz;配備1024KB FLASH與96KB SRAM,滿足存儲(chǔ)與數(shù)據(jù)處理需求;集成TOE引擎,包含WIZnet全硬件TCP/IP協(xié)議棧、內(nèi)置MAC以及PHY,擁有獨(dú)立的32KB以太網(wǎng)收發(fā)緩存,可供8個(gè)獨(dú)立硬件socket使用。如此配置,真正實(shí)現(xiàn)了All-in-One解決方案,為開(kāi)發(fā)者提供極大便利。
在封裝規(guī)格上,W55MH32 提供了兩種選擇:QFN68和QFN100。
W55MH32Q采用QFN68封裝版本,尺寸為8x8mm,它擁有36個(gè)GPIO、3個(gè)ADC、12通道DMA、17個(gè)定時(shí)器、2個(gè)I2C、3個(gè)串口、2個(gè)SPI接口(其中1個(gè)帶I2S接口復(fù)用)、1個(gè)CAN以及1個(gè)USB2.0。在保持與同系列其他版本一致的核心性能基礎(chǔ)上,僅減少了部分GPIO以及SDIO接口,其他參數(shù)保持一致,性?xún)r(jià)比優(yōu)勢(shì)顯著,尤其適合網(wǎng)關(guān)模組等對(duì)空間布局要求較高的場(chǎng)景。緊湊的尺寸和精簡(jiǎn)化外設(shè)配置,使其能夠在有限空間內(nèi)實(shí)現(xiàn)高效的網(wǎng)絡(luò)連接與數(shù)據(jù)交互,成為物聯(lián)網(wǎng)網(wǎng)關(guān)、邊緣計(jì)算節(jié)點(diǎn)等緊湊型設(shè)備的理想選擇。 同系列還有QFN100封裝的W55MH32L版本,該版本擁有更豐富的外設(shè)資源,適用于需要多接口擴(kuò)展的復(fù)雜工控場(chǎng)景,軟件使用方法一致。更多信息和資料請(qǐng)進(jìn)入http://www.w5500.com/網(wǎng)站或者私信獲取。
此外,本W(wǎng)55MH32支持硬件加密算法單元,WIZnet還推出TOE+SSL應(yīng)用,涵蓋TCP SSL、HTTP SSL以及MQTT SSL等,為網(wǎng)絡(luò)通信安全再添保障。
為助力開(kāi)發(fā)者快速上手與深入開(kāi)發(fā),基于W55MH32Q這顆芯片,WIZnet精心打造了配套開(kāi)發(fā)板。開(kāi)發(fā)板集成WIZ-Link芯片,借助一根USB C口數(shù)據(jù)線,就能輕松實(shí)現(xiàn)調(diào)試、下載以及串口打印日志等功能。開(kāi)發(fā)板將所有外設(shè)全部引出,拓展功能也大幅提升,便于開(kāi)發(fā)者全面評(píng)估芯片性能。
若您想獲取芯片和開(kāi)發(fā)板的更多詳細(xì)信息,包括產(chǎn)品特性、技術(shù)參數(shù)以及價(jià)格等,歡迎訪問(wèn)官方網(wǎng)頁(yè):http://www.w5500.com/,我們期待與您共同探索W55MH32的無(wú)限可能。

第二十三章 IAP
IAP,即在應(yīng)用編程。通俗地說(shuō)法就是“程序升級(jí)”。產(chǎn)品階段設(shè)計(jì)完成后,在脫離實(shí)驗(yàn)室的調(diào)試環(huán)境下,如果想對(duì)產(chǎn)品做功能升級(jí)或 BUG 修復(fù)會(huì)十分麻煩,如果硬件支持,在出廠時(shí)預(yù)留一套升級(jí)固件的流程,就可以很好解決這個(gè)問(wèn)題,IAP 技術(shù)就是為此而生的。在之前的FLASH 模擬 EEPROM 實(shí)驗(yàn)里面,我們學(xué)習(xí)了 W55MH32的 FLASH 自編程,本章我們將結(jié)合 FLASH 自編程的知識(shí),通過(guò) W55MH32的串口實(shí)現(xiàn)一個(gè)簡(jiǎn)單的 IAP 功能。
本章分為如下幾個(gè)小節(jié):
1 IAP 簡(jiǎn)介
2 例程設(shè)計(jì)
3 下載驗(yàn)證
1 IAP 簡(jiǎn)介
IAP(In Application Programming)即在應(yīng)用編程。在講解 W55MH32 的啟動(dòng)模式時(shí)我們已經(jīng)知道 W55MH32 可以通過(guò)設(shè)置 MSP 的方式從不同的地址啟動(dòng):包括 Flash 地址、RAM 地址等,在默認(rèn)方式下,我們的嵌入式程序是以連續(xù)二進(jìn)制的方式燒錄到 W55MH32 的可尋址 Flash 區(qū)域上的。如果我們用的 Flash 容量大到可以存儲(chǔ)兩個(gè)或多個(gè)的完整程序,在保證每個(gè)程序完整的情況下,上電后的程序通過(guò)修改 MSP 的方式,就可以保證一個(gè)單片機(jī)上有多個(gè)有功能差異的嵌入式軟件,這就是我們要講解的 IAP 的設(shè)計(jì)思路。
IAP 是用戶(hù)自己的程序在運(yùn)行過(guò)程中對(duì) User Flash 的部分區(qū)域進(jìn)行燒寫(xiě),目的是為了在產(chǎn)品發(fā)布后可以方便地通過(guò)預(yù)留的通信口對(duì)產(chǎn)品中的固件程序進(jìn)行更新升級(jí),由于用戶(hù)可以自定義通訊方式和自定義加密,使得 IAP 在使用上非常靈活。通常實(shí)現(xiàn) IAP 功能時(shí),即用戶(hù)程序運(yùn)行中作自身的更新操作,需要在設(shè)計(jì)固件程序時(shí)編寫(xiě)兩個(gè)項(xiàng)目代碼,第一個(gè)程序檢查有無(wú)升級(jí)需求,并通過(guò)某種通信方式(如 USB、USART)接收程序或數(shù)據(jù),執(zhí)行對(duì)第二部分代碼的更新;第二個(gè)項(xiàng)目代碼才是真正的功能代碼。這兩部分項(xiàng)目代碼都同時(shí)燒錄在 User Flash 中,當(dāng)芯片上電后,首先是第一個(gè)項(xiàng)目代碼開(kāi)始運(yùn)行,它做如下操作:
1)檢查是否需要對(duì)第二部分代碼進(jìn)行更新
2)如果不需要更新則轉(zhuǎn)到 4)
3)執(zhí)行更新操作
4)跳轉(zhuǎn)到第二部分代碼執(zhí)行
一部分代碼必須通過(guò)其它手段,如 JTAG、ISP 等方式燒錄,常常是燒錄后就不再進(jìn)行更改;第二部分代碼可以使用第一部分代碼 IAP 功能燒入,也可以和第一部分代碼一起燒入,以后需要程序更新時(shí)再通過(guò)第一部分 IAP 代碼更新。
我們將第一個(gè)項(xiàng)目代碼稱(chēng)之為 Bootloader 程序,第二個(gè)項(xiàng)目代碼稱(chēng)之為 APP 程序,他們存放在 W55MH32FLASH 的不同地址范圍,一般從最低地址區(qū)開(kāi)始存放 Bootloader,緊跟其后的就是 APP 程序(注意,如果 FLASH 容量足夠,是可以設(shè)計(jì)很多 APP 程序的,本章我們只討論一個(gè) APP 程序的情況)。這樣我們就是要實(shí)現(xiàn) 2 個(gè)程序:Bootloader 和 APP。W55MH32的 APP 程序不僅可以放到 FLASH 里面運(yùn)行,也可以放到 SRAM 里面運(yùn)行,本章,我們將制作兩個(gè) APP,一個(gè)用于 FLASH 運(yùn)行,一個(gè)用于內(nèi)部 SRAM 運(yùn)行。我們先來(lái)看看 W55MH32正常的程序運(yùn)行流程(為了方便說(shuō)明 IAP 過(guò)程,我們先僅考慮代碼全部存放在內(nèi)部 FLASH 的情況),如圖所示:

W55MH3 正常運(yùn)行流程圖
W55MH32的內(nèi)部閃存(FLASH)地址起始于 0X0800 0000,一般情況下,程序文件就從此地址開(kāi)始寫(xiě)入。此外 W55MH32是基于 Cortex-M3 內(nèi)核的微控制器,其內(nèi)部通過(guò)一張“中斷向量表”來(lái)響應(yīng)中斷,程序啟動(dòng)后,將首先從“中斷向量表”取出復(fù)位中斷向量執(zhí)行復(fù)位中斷程序完成啟動(dòng),而這張“中斷向量表”的起始地址是 0x08000004,當(dāng)中斷來(lái)臨,W55MH32的內(nèi)部硬件機(jī)制亦會(huì)自動(dòng)將 PC 指針定位到“中斷向量表”處,并根據(jù)中斷源取出對(duì)應(yīng)的中斷向量執(zhí)行中斷服務(wù)程序。
W55MH32在復(fù)位后,先從 0X08000004 地址取出復(fù)位中斷向量的地址,并跳轉(zhuǎn)到復(fù)位中斷服務(wù)程序,如圖標(biāo)號(hào)①所示;在復(fù)位中斷服務(wù)程序執(zhí)行完之后,會(huì)跳轉(zhuǎn)到我們的 main 函數(shù),如圖標(biāo)號(hào)②所示;而我們的 main 函數(shù)一般都是一個(gè)死循環(huán),在 main 函數(shù)執(zhí)行過(guò)程中,如果收到中斷請(qǐng)求(發(fā)生了中斷),此時(shí) W55MH32強(qiáng)制將 PC 指針指回中斷向量表處,如圖標(biāo)號(hào)③所示;然后,根據(jù)中斷源進(jìn)入相應(yīng)的中斷服務(wù)程序,如圖標(biāo)號(hào)④所示;在執(zhí)行完中斷服務(wù)程序以后,程序再次返回 main 函數(shù)執(zhí)行,如圖標(biāo)號(hào)⑤所示。
當(dāng)加入 IAP 程序之后,程序運(yùn)行流程如圖所示:

加入 IAP 之后程序運(yùn)行流程圖
W55MH32復(fù)位后,還是從 0X08000004 地址取出復(fù)位中斷向量的地址,并跳轉(zhuǎn)到復(fù)位中斷服務(wù)程序,在運(yùn)行完復(fù)位中斷服務(wù)程序之后跳轉(zhuǎn)到 IAP 的 main 函數(shù),如圖標(biāo)號(hào)①所示,此部分同圖 22.1.1 一樣;在執(zhí)行完 IAP 以后(即將新的 APP 代碼寫(xiě)入W55MH32的 FLASH,灰底部分。新程序的復(fù)位中斷向量起始地址為 0X08000004+N+M),跳轉(zhuǎn)至新寫(xiě)入程序的復(fù)位向量表,取出新程序的復(fù)位中斷向量的地址,并跳轉(zhuǎn)執(zhí)行新程序的復(fù)位中斷服務(wù)程序,隨后跳轉(zhuǎn)至新程序的 main 函數(shù),如圖標(biāo)號(hào)②和③所示,同樣 main 函數(shù)為一個(gè)死循環(huán),并且注意到此時(shí) W55MH32的 FLASH,在不同位置上,共有兩個(gè)中斷向量表。
在 main 函數(shù)執(zhí)行過(guò)程中,如果 CPU 得到一個(gè)中斷請(qǐng)求,PC 指針仍然會(huì)強(qiáng)制跳轉(zhuǎn)到地址0X08000004 中斷向量表處,而不是新程序的中斷向量表,如圖標(biāo)號(hào)④所示;程序再根據(jù)我們?cè)O(shè)置的中斷向量表偏移量,跳轉(zhuǎn)到對(duì)應(yīng)中斷源新的中斷服務(wù)程序中,如圖標(biāo)號(hào)⑤所示;在執(zhí)行完中斷服務(wù)程序后,程序返回 main 函數(shù)繼續(xù)運(yùn)行,如圖標(biāo)號(hào)⑥所示。
通過(guò)以上兩個(gè)過(guò)程的分析,我們知道 IAP 程序必須滿足兩個(gè)要求:
1) 新程序必須在 IAP 程序之后的某個(gè)偏移量為 x 的地址開(kāi)始;
2) 必須將新程序的中斷向量表相應(yīng)的移動(dòng),移動(dòng)的偏移量為 x;
對(duì) W55MH32系列來(lái)說(shuō),閃存編程一次可以寫(xiě)入 16 位(半字)。閃存擦除操作可以按頁(yè)面擦除或完全擦除(全擦除)。全擦除不影響信息塊。根據(jù)類(lèi)別的不同,F(xiàn)lash 有如下區(qū)別:
?小容量產(chǎn)品主存儲(chǔ)塊最大為 4K×64 位,每個(gè)存儲(chǔ)塊劃分為 32 個(gè) 1K 字節(jié)的頁(yè)。
? 中容量產(chǎn)品主存儲(chǔ)塊最大為 16K×64 位,每個(gè)存儲(chǔ)塊劃分為 128 個(gè) 1K 字節(jié)的頁(yè)。
?大容量產(chǎn)品主存儲(chǔ)塊最大為 64K×64 位,每個(gè)存儲(chǔ)塊劃分為 256 個(gè) 2K 字節(jié)的頁(yè)。
?互聯(lián)型產(chǎn)品主存儲(chǔ)塊最大為 32K×64 位,每個(gè)存儲(chǔ)塊劃分為 128 個(gè) 2K 字節(jié)的頁(yè)
使用時(shí)我們需要根據(jù)自己的芯片型號(hào)來(lái)選擇,設(shè)計(jì) IAP 程序時(shí)需要嚴(yán)格避免不同的程序占用相同 Flash 扇區(qū)的情形。本章,我們有 2 個(gè) APP 程序:
1,F(xiàn)LASH APP 程序,即只運(yùn)行在內(nèi)部 FLASH 的 APP 程序。
2,SRAM APP 程序,即只運(yùn)行在內(nèi)部 SRAM 的 APP 程序。
1.APP 程序起始地址設(shè)置方法
APP 我們使用以前的例程即可,不過(guò)需要對(duì)程序進(jìn)行修改,默認(rèn)的條件下,圖中 IROM1 的起始地址(Start)一般為 0X08000000,大小(Size)為0x40000,即從 0X08000000 開(kāi)始的 256K 空間為我們的程序存儲(chǔ)區(qū)。
FLASH APP Target 選項(xiàng)卡設(shè)置
我們?cè)O(shè)置起始地址(Start)為 0X08010000,即偏移量為 0x10000(64K 字節(jié),即留給 BootLoader 的空間),因而,留給 APP 用的 FLASH 空間(Size)為 0x40000-0x10000=0x30000(192K 字節(jié))大小了。設(shè)置好 Start 和 Size,就完成 APP 程序的起始地址設(shè)置。IRAM 是內(nèi)存的地址,APP 可以獨(dú)占這些內(nèi)存,我們不需要修改。
注意:需要確保 APP 起始地址在 Bootloader 程序結(jié)束位置之后,并且偏移量為 0X200 的倍數(shù)即可這是針對(duì) FLASH APP 的起始地址設(shè)置,如果是 SRAM APP,那么起始地址設(shè)置如圖所示:

SRAM APP Target 選項(xiàng)卡設(shè)置
這里我們將 IROM1 的起始地址(Start)定義為:0X20001000,大小為 0XB000(44K 字節(jié)),即從地址 0X20000000 偏移 0X1000 開(kāi)始,存放 SRAM APP 代碼。這個(gè)分配關(guān)系大家可以根據(jù)自己的實(shí)際情況修改,由于 W55MH32只有一個(gè) 48K 的片內(nèi) SRAM,存放程序的位置與變量的加載位置不能重復(fù),所以我們需要設(shè)置 IRAM1 中的地址到 SRAM 程序空間之外。
關(guān)于 APP 起始地址的設(shè)置方法,我們就介紹到這里,大家可以根據(jù)自己項(xiàng)目的實(shí)際需求進(jìn)行修改。
2.中斷向量表的偏移量設(shè)置方法
VTOR 寄存器存放的是中斷向量表的起始地址。默認(rèn)的情況它由 BOOT 的啟動(dòng)模式?jīng)Q定,對(duì)于來(lái)說(shuō)就是指向 0x0800 0000 這個(gè)位置,也就是從默認(rèn)的啟動(dòng)位置加載中斷向量等信息,不過(guò) ST 允許重定向這個(gè)位置,這樣就可以從 Flash 區(qū)域的任意位置啟動(dòng)我們的代碼了。
我們可以通過(guò)調(diào)用 sys.c 里面的 sys_nvic_set_vector_table 函數(shù)實(shí)現(xiàn),通過(guò)以上兩個(gè)步驟的設(shè)置,我們就可以生成 APP 程序了,只要 APP 程序的 FLASH 和SRAM 大小不超過(guò)我們的設(shè)置即可。不過(guò) MDK 默認(rèn)生成的文件是.hex 文件,并不方便我們用作 IAP 更新,我們希望生成的文件是.bin 文件,這樣可以方便進(jìn)行 IAP 升級(jí)(至于為什么,請(qǐng)大家自行百度 HEX 和 BIN 文件的區(qū)別!)。這里我們通過(guò) MDK 自帶的格式轉(zhuǎn)換工具fromelf.exe ,如果 安 裝 在 C 盤(pán)的默認(rèn)路徑,它的位置是C:Keil_v5ARMARMCCbinfromelf.exe,來(lái)實(shí)現(xiàn).axf 文件到.bin 文件的轉(zhuǎn)換。該工具在 MDK的安裝目錄ARMARMCCbin 文件夾里面。
fromelf.exe 轉(zhuǎn)換工具的語(yǔ)法格式為:fromelf [options] input_file。其中 options 有很多選項(xiàng)可以設(shè)置,詳細(xì)使用請(qǐng)參考光盤(pán)《mdk 如何生成 bin 文件.doc》。
我 們可 以通過(guò) 在 MDK 點(diǎn) 擊 Options for Target→User 選 項(xiàng)卡 ,在 After Build/Rebuild 一欄中,勾選 Run #1,我們推薦使用相對(duì)地址,在勾選的同一行后的輸入框并寫(xiě)入命令行:fromelf --bin -o ....Output@L.bin ....Output%L,如圖 所示:

設(shè)置生成編譯結(jié)果文件名

MDK 生成.bin 文件設(shè)置方法
通過(guò)這一步設(shè)置,我們就可以在 MDK 編譯成功之后,調(diào)用 fromelf.exe,....Output%L 表示當(dāng)前編譯的鏈接文件(..是相對(duì)路徑,表示上級(jí)目錄,編譯器默認(rèn)從工程文件*.uvprojx 開(kāi)始查找,根據(jù)我的工程文件 Output 的位置就能明白路徑的含義),指令--bin –o ....Output@L.bin表示在 Output 目錄下生成一個(gè).bin 文件,@L 在 Keil 的下表示 Output 選項(xiàng)卡下的 Name of Executable 后面的字符串,即在 Output 文件夾下生成一個(gè) atk_APP.bin 文件。在得到.bin 文件之后,我們只需要將這個(gè) bin 文件傳送給單片機(jī),即可執(zhí)行 IAP 升級(jí)。
最后來(lái)看看 APP 程序的生成步驟:
1) 設(shè)置 APP 程序的起始地址和存儲(chǔ)空間大小
對(duì)于在 FLASH 里面運(yùn)行的 APP 程序,我們只需要設(shè)置 APP 程序的起始地址,和存儲(chǔ)空間大小即可。而對(duì)于在 SRAM 里面運(yùn)行的 APP 程序,我們還需要設(shè)置 SRAM 的起始地址和大小。無(wú)論哪種 APP 程序,都需要確保 APP 程序的大小和所占 SRAM 大小不超過(guò)我們的設(shè)置范圍。
2) 設(shè)置中斷向量表偏移量
此步,通過(guò)調(diào)用 sys_nvic_set_vector_table 函數(shù),實(shí)現(xiàn)對(duì)中斷向量表偏移量的設(shè)置。這個(gè)偏移量的大小,其實(shí)就等于程序起始地址相對(duì)于 0X08000000 或者 0X20000000 的偏移。
3) 設(shè)置編譯后運(yùn)行 fromelf.exe,生成.bin 文件
通過(guò)在 User 選項(xiàng)卡,設(shè)置編譯后調(diào)用 fromelf.exe,根據(jù).axf 文件生成.bin 文件,用于 IAP更新。 以上 3 個(gè)步驟,就可以得到一個(gè).bin 的 APP 程序,通過(guò) Bootlader 程序即可實(shí)現(xiàn)更新。
2 例程設(shè)計(jì)
2.1 IAP_Bootloader
該例程實(shí)現(xiàn)了一個(gè)基礎(chǔ)的W55MH32AP引導(dǎo)加載程序,核心亮點(diǎn)包括中斷驅(qū)動(dòng)數(shù)據(jù)接收、Flash操作安全性校驗(yàn)及靈活的調(diào)試輸出。適用于需遠(yuǎn)程固件更新(FOTA)或工廠批量燒錄的場(chǎng)景。后續(xù)可通過(guò)協(xié)議增強(qiáng)、安全加固和錯(cuò)誤恢復(fù)進(jìn)一步提升可靠性,同時(shí)需注意中斷向量表重映射與內(nèi)存管理等關(guān)鍵細(xì)節(jié)。
1. 系統(tǒng)功能概述
該程序是一個(gè)基于W55MH32的IAP引導(dǎo)加載程序(Bootloader),支持通過(guò)串口接收用戶(hù)應(yīng)用程序(APP)的二進(jìn)制文件,并寫(xiě)入Flash存儲(chǔ)。主要功能包括:
串口通信:接收用戶(hù)程序數(shù)據(jù)(最大32KB)。
固件更新:通過(guò)按鍵觸發(fā)將接收到的數(shù)據(jù)寫(xiě)入Flash指定地址。
應(yīng)用跳轉(zhuǎn):執(zhí)行已燒錄的Flash用戶(hù)程序。
調(diào)試輸出:通過(guò)USART1打印系統(tǒng)信息及操作日志。
2. 核心模塊設(shè)計(jì)
(1)系統(tǒng)初始化:
時(shí)鐘配置:通過(guò)RCC_GetClocksFreq獲取系統(tǒng)時(shí)鐘頻率,并通過(guò)串口輸出SYSCLK、HCLK等參數(shù),驗(yàn)證時(shí)鐘配置正確性。
外設(shè)初始化:延時(shí)模塊:delay_init()初始化系統(tǒng)時(shí)鐘,用于后續(xù)延時(shí)操作。
按鍵模塊:KEY_Init()初始化按鍵輸入,檢測(cè)用戶(hù)操作(KEY1:固件更新,KEY2:跳轉(zhuǎn)APP)。
中斷配置:NVIC_Configuration()使能USART1接收中斷,實(shí)現(xiàn)非阻塞數(shù)據(jù)接收。
(2)串口通信硬件配置:USART1使用PA9(TX)和PA10(RX),波特率115200,8N1格式。接收緩沖區(qū)USART_RX_BUF通過(guò)__attribute__((at(0X20001000)))指定到SRAM地0x20001000,容32KB。
(3)中斷驅(qū)動(dòng)接收:在USART1_IRQHandler中,通過(guò)USART_IT_RXNE中斷接收數(shù)據(jù),逐字節(jié)存入緩沖區(qū),并更新接收計(jì)數(shù)器USART_RX_CNT。主循環(huán)通過(guò)檢測(cè)USART_RX_CNT是否穩(wěn)定(oldcount對(duì)比)判斷數(shù)據(jù)接收完成。
(4)IAP邏輯:
固件更新:按鍵觸發(fā):按下KEY1后,檢查接收緩沖區(qū)長(zhǎng)度applenth。
合法性校驗(yàn):驗(yàn)證應(yīng)用程序起始地址是否為Flash區(qū)域(0x08XXXXXX),防止寫(xiě)入非法地址。
Flash操作:調(diào)用IAP_Write_Appbin將緩沖區(qū)數(shù)據(jù)寫(xiě)入Flash目標(biāo)地址(FLASH_APP1_ADDR)。
應(yīng)用跳轉(zhuǎn):按下KEY2后,檢查目標(biāo)地址合法性,調(diào)用IAP_Load_App跳轉(zhuǎn)執(zhí)行用戶(hù)程序。
關(guān)鍵實(shí)現(xiàn):IAP_Load_App需重置堆棧指針并跳轉(zhuǎn)到用戶(hù)程序復(fù)位中斷向量,通常包含以下操作:
typedef void (*pFunction)(void);
pFunction Jump_To_App;
uint32_t JumpAddress = *(__IO uint32_t*)(FLASH_APP1_ADDR + 4); // 用戶(hù)程序復(fù)位向量
Jump_To_App = (pFunction)JumpAddress;
__set_MSP(*(__IO uint32_t*)FLASH_APP1_ADDR); // 重置主堆棧指針
Jump_To_App(); // 跳轉(zhuǎn)執(zhí)行
(5)調(diào)試輸出:
?重定向機(jī)制:通過(guò)fputc將printf輸出重定向至USART1,支持格式化日志打印。
?關(guān)鍵信息:
······系統(tǒng)啟動(dòng)時(shí)輸出時(shí)鐘配置信息。
······操作提示(如“KEY1:Copy To FLASH”)。
······固件更新進(jìn)度(如“Copy APP Successed!!”)。
3. 關(guān)鍵代碼分析
(1)數(shù)據(jù)接收管理
接收狀態(tài)檢測(cè):
if (USART_RX_CNT) {
if (oldcount == USART_RX_CNT) { // 數(shù)據(jù)接收完成
applenth = USART_RX_CNT;
USART_RX_CNT = 0; // 清空計(jì)數(shù)器
printf("User program reception complete!rn");
} else {
oldcount = USART_RX_CNT; // 更新舊值,繼續(xù)等待
}
}
通過(guò)對(duì)比oldcount與USART_RX_CNT判斷數(shù)據(jù)是否接收完畢,避免固定超時(shí)等待。
(2)Flash操作校驗(yàn)
地址合法性檢查:
if (((*(vu32 *)(0X20001000 + 4)) & 0xFF000000) == 0x08000000) {
// 合法Flash地址,執(zhí)行寫(xiě)入
} else {
printf("Illegal FLASH APP!n");
}
檢查用戶(hù)程序復(fù)位向量的高8位是否為0x08,確保目標(biāo)地址在Flash范圍內(nèi)(W55MH32 Flash起始地址為)。
3 下載驗(yàn)證
3.1 IAP_Bootloader

發(fā)送文件,按下KEY1后,程序檢查接收緩沖區(qū)數(shù)據(jù):
若數(shù)據(jù)合法(復(fù)位向量地址為0x08XXXXXX),開(kāi)始寫(xiě)入Flash:

若數(shù)據(jù)非法(非Flash地址),打印錯(cuò)誤信息:

若未接收到數(shù)據(jù),提示:

按下KEY2后,程序檢查目標(biāo)地址(FLASH_APP1_ADDR)
若地址合法(復(fù)位向量地址為0x08XXXXXX),跳轉(zhuǎn)執(zhí)行用戶(hù)程序:

WIZnet 是一家無(wú)晶圓廠半導(dǎo)體公司,成立于 1998 年。產(chǎn)品包括互聯(lián)網(wǎng)處理器 iMCU?,它采用 TOE(TCP/IP 卸載引擎)技術(shù),基于獨(dú)特的專(zhuān)利全硬連線 TCP/IP。iMCU? 面向各種應(yīng)用中的嵌入式互聯(lián)網(wǎng)設(shè)備。
WIZnet 在全球擁有 70 多家分銷(xiāo)商,在香港、韓國(guó)、美國(guó)設(shè)有辦事處,提供技術(shù)支持和產(chǎn)品營(yíng)銷(xiāo)。
香港辦事處管理的區(qū)域包括:澳大利亞、印度、土耳其、亞洲(韓國(guó)和日本除外)。
-
單片機(jī)
+關(guān)注
關(guān)注
6067文章
44969瀏覽量
649389 -
IAP
+關(guān)注
關(guān)注
2文章
165瀏覽量
24979
發(fā)布評(píng)論請(qǐng)先 登錄
科技賦能推動(dòng)綠色低碳發(fā)展 第二十三屆高交會(huì)“環(huán)保”亮點(diǎn)看這里!

峰岹科技獲第二十三屆中國(guó)專(zhuān)利優(yōu)秀獎(jiǎng)

【每日一練】RT-Thread Nano-NTP-獲取網(wǎng)絡(luò)時(shí)間(第二十三節(jié)學(xué)習(xí)視頻)
RGB-LCD字符和圖片顯示實(shí)驗(yàn)
火力發(fā)電廠水汽分析方法 第二十三部分:化學(xué)耗氧量的測(cè)定(重鉻
第二十三講 異步計(jì)數(shù)器

模擬電路網(wǎng)絡(luò)課件 第二十三節(jié):乙類(lèi)雙電源互補(bǔ)對(duì)稱(chēng)功率放大電路
第二十三屆中國(guó)國(guó)際電子生產(chǎn)設(shè)備暨微電子工業(yè)展4月上海開(kāi)幕
2017中國(guó)西部微波射頻技術(shù)研討會(huì)暨第二十三屆國(guó)際電子測(cè)試測(cè)量研討會(huì)
【正點(diǎn)原子FPGA連載】第二十三章RGB-LCD字符和圖片顯示實(shí)驗(yàn) -摘自【正點(diǎn)原子】新起點(diǎn)之FPGA開(kāi)發(fā)指南_V2.1

圖撲受邀參加第二十三屆中國(guó)國(guó)際高新技術(shù)成果交易會(huì)
烽火通信光纖技術(shù)獲“第二十三屆中國(guó)專(zhuān)利獎(jiǎng)”銀獎(jiǎng)
第二十三屆中國(guó)國(guó)際工業(yè)博覽會(huì)宣布延期舉行
峰岹科技獲第二十三屆中國(guó)專(zhuān)利優(yōu)秀獎(jiǎng)

中國(guó)電子科技集團(tuán)公司第二十三研究所選購(gòu)我司炭黑含量測(cè)試儀

評(píng)論