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

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

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

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

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

設置生成編譯結果文件名

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

發送文件,按下KEY1后,程序檢查接收緩沖區數據:
若數據合法(復位向量地址為0x08XXXXXX),開始寫入Flash:

若數據非法(非Flash地址),打印錯誤信息:

若未接收到數據,提示:

按下KEY2后,程序檢查目標地址(FLASH_APP1_ADDR)
若地址合法(復位向量地址為0x08XXXXXX),跳轉執行用戶程序:

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

峰岹科技獲第二十三屆中國專利優秀獎

【每日一練】RT-Thread Nano-NTP-獲取網絡時間(第二十三節學習視頻)
火力發電廠水汽分析方法 第二十三部分:化學耗氧量的測定(重鉻
第二十三講 異步計數器

第二十三屆中國國際電子生產設備暨微電子工業展4月上海開幕
【正點原子FPGA連載】第二十三章RGB-LCD字符和圖片顯示實驗 -摘自【正點原子】新起點之FPGA開發指南_V2.1

圖撲受邀參加第二十三屆中國國際高新技術成果交易會
烽火通信光纖技術獲“第二十三屆中國專利獎”銀獎
第二十三屆中國國際工業博覽會宣布延期舉行
峰岹科技獲第二十三屆中國專利優秀獎

中國電子科技集團公司第二十三研究所選購我司炭黑含量測試儀

評論