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

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

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

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

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

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

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

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

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

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

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

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

峰岹科技獲第二十三屆中國專利優(yōu)秀獎

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

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

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

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

評論