單芯片解決方案,開啟全新體驗——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 提供了兩種選擇:QFN100和QFN68。
W55MH32L采用QFN100封裝版本,尺寸為12x12mm,其資源豐富,專為各種復雜工控場景設計。它擁有66個GPIO、3個ADC、12通道DMA、17個定時器、2個I2C、5個串口、2個SPI接口(其中1個帶I2S接口復用)、1個CAN、1個USB2.0以及1個SDIO接口。如此豐富的外設資源,能夠輕松應對工業控制中多樣化的連接需求,無論是與各類傳感器、執行器的通信,還是對復雜工業協議的支持,都能游刃有余,成為復雜工控領域的理想選擇。 同系列還有QFN68封裝的W55MH32Q版本,該版本體積更小,僅為8x8mm,成本低,適合集成度高的網關模組等場景,軟件使用方法一致。更多信息和資料請進入http://www.w5500.com/網站或者私信獲取。
此外,本W55MH32支持硬件加密算法單元,WIZnet還推出TOE+SSL應用,涵蓋TCP SSL、HTTP SSL以及 MQTT SSL等,為網絡通信安全再添保障。
為助力開發者快速上手與深入開發,基于W55MH32L這顆芯片,WIZnet精心打造了配套開發板。開發板集成WIZ-Link芯片,借助一根USB C口數據線,就能輕松實現調試、下載以及串口打印日志等功能。開發板將所有外設全部引出,拓展功能也大幅提升,便于開發者全面評估芯片性能。
若您想獲取芯片和開發板的更多詳細信息,包括產品特性、技術參數以及價格等,歡迎訪問官方網頁:http://www.w5500.com/,我們期待與您共同探索W55MH32的無限可能。
第七章 GPIO——位帶操作
本章參考資料:《W55MH32-中文參考手冊》存儲器和總線構架章節、GPIO章節。
1 位帶操作基礎
1.1 位帶技術概述
位操作是指針對單個二進制比特位的獨立讀寫操作,這一特性在 51 單片機開發中極為常見(51 單片機通過sbit關鍵字實現位定義)。不同于 51 單片機,W55MH32 采用位帶別名區訪問機制實現位操作功能。
在 W55MH32 中,位帶技術主要應用于兩大區域:
SRAM 位帶區:SRAM 空間的最低 1MB 區域(地址范圍:0X20000000~0X200FFFFF)
外設位帶區:片上外設空間的最低 1MB 區域(地址范圍:0X40000000~0X40100000)
這兩個 1MB 的基礎位帶區除具備常規存儲操作功能外,還映射了專屬的位帶別名區。位帶別名區通過特殊機制將基礎位帶區的每個比特位擴展為 32 位字(4 字節),通過訪問這些擴展后的 32 位字,即可實現對原基礎位帶區中指定比特位的精準操作。W55MH32 的內存映射與位帶區關系可參考下圖:
1.2 位帶區細分解析
1.2.1 外設位帶區
外設位帶區地址范圍為 0X40000000~0X40100000(1MB),覆蓋了 W55MH32 片上外設的全部寄存器(寄存器地址范圍:0X40000000~0X40029FFF)。其對應的位帶別名區地址范圍為 0X42000000~0X43FFFFFF(32MB),該區間恰好落在 W55MH32 保留地址空間(0X40030000~0X4FFFFFFF)內,避免了與其他外設寄存器地址的沖突。
與 51 單片機僅部分寄存器支持位操作(如 SBUF 需字節操作)不同,W55MH32 的所有片上外設寄存器均支持位帶操作,這一特性顯著提升了底層控制的靈活性。不過需注意:實際項目中通常不會對所有寄存器進行位操作,僅在需要高頻操作 IO 口等特定場景下,才會針對性地對 IO 相關寄存器啟用位操作。
1.2.2 SRAM位帶區
SRAM 位帶區地址范圍為 0X20000000~0X200FFFFF(1MB),對應的位帶別名區地址范圍為 0X22000000~0X23FFFFFF(32MB)。由于 SRAM 的位操作需求較少,該區域的實際應用場景相對有限。
1.3 位帶地址轉換機制
位帶區的每個比特位擴展為 32 位字后,僅最低有效位(LSB)有效。盡管看似空間利用率不高,但這種設計與 W55MH32 的 32 位系統總線架構匹配,能確保以 4 字節為單位的訪問效率最大化。
1.3.1 地址轉換公式
通過指針訪問位帶別名區地址,即可實現對基礎位帶區比特位的操作。具體轉換公式如下:
外設位帶別名區地址:設基礎位帶區中某比特所在字節地址為A,位序號為n(0≤n≤31,實際范圍由寄存器位寬決定),則其在別名區的地址為:
AliasAddr= =0x42000000+ (A-0x40000000)*8*4 +n*4
公式解析:
0x42000000:外設位帶別名區起始地址
(A - 0x40000000):目標比特前的字節數
×8×4:單字節 8 位,每位擴展為 4 字節
n×4:目標比特在字節內的偏移(每位占 4 字節)
SRAM 位帶別名區地址:設基礎位帶區中某比特所在字節地址為A,位序號為n,則其在別名區的地址為:
AliasAddr= =0x22000000+ (A-0x20000000)*8*4 +n*4
公式解析:公式邏輯與外設位帶區一致,僅起始地址(0x22000000)和基礎位帶區起始地址(0x20000000)不同。
1.3.2 統一宏定義
為簡化操作,可將兩類地址轉換合并為統一宏定義:
// 把“位帶地址+位序號”轉換成別名地址的宏 #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x02000000+((addr & 0x00FFFFFF)<5)+(bitnum<2))
addr & 0xF0000000:提取地址高位(0x40000000 或 0x20000000),用于區分外設 / SRAM 區域
+0x02000000:將高位轉換為別名區起始地址(0x42000000 或 0x22000000)
(addr & 0x00FFFFFF) << 5:等效于(A - 基礎區起始地址)×8×4(屏蔽高位后左移 5 位 =×32=×8×4)
bitnum << 2:等效于n×4(左移 2 位 =×4)
配合以下宏可實現位帶操作:
// 把一個地址轉換成一個指針 #define MEM_ADDR(addr) *((volatile unsigned long *)(addr)) // 把位帶別名區地址轉換成指針 #define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
2 GPIO位帶操作實踐
2.1 GPIO 寄存器映射
外設位帶區覆蓋了所有片上外設寄存器,理論上可通過宏為每個寄存器位定義別名地址。但實際開發中,通常僅針對高頻操作的 GPIO 寄存器(如輸出數據寄存器 ODR、輸入數據寄存器 IDR)啟用位操作。
根據手冊,GPIO 的 ODR 和 IDR 寄存器相對于 GPIO 基址的偏移分別為 12 和 8(GPIOx_BASE由庫函數定義)。具體寄存器地址映射如下:
代碼清單:位帶操作-1 GPIO ODR 和 IDR 寄存器映射
// GPIO ODR 和 IDR 寄存器地址映射 #define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C #define GPIOB_ODR_Addr (GPIOB_BASE+12) //0x40010C0C #define GPIOC_ODR_Addr (GPIOC_BASE+12) //0x4001100C #define GPIOD_ODR_Addr (GPIOD_BASE+12) //0x4001140C #define GPIOE_ODR_Addr (GPIOE_BASE+12) //0x4001180C #define GPIOF_ODR_Addr (GPIOF_BASE+12) //0x40011A0C #define GPIOG_ODR_Addr (GPIOG_BASE+12) //0x40011E0C #define GPIOA_IDR_Addr (GPIOA_BASE+8) //0x40010808 #define GPIOB_IDR_Addr (GPIOB_BASE+8) //0x40010C08 #define GPIOC_IDR_Addr (GPIOC_BASE+8) //0x40011008 #define GPIOD_IDR_Addr (GPIOD_BASE+8) //0x40011408 #define GPIOE_IDR_Addr (GPIOE_BASE+8) //0x40011808 #define GPIOF_IDR_Addr (GPIOF_BASE+8) //0x40011A08 #define GPIOG_IDR_Addr (GPIOG_BASE+8) //0x40011E08
注:不同單片機型號的 GPIO 端口數量可能不同(如 64pin 型號最多僅支持到 C 端口),實際使用時需根據具體型號調整。
2.2 GPIO位操作宏定義
通過位帶別名區地址,可直接操作指定 GPIO 端口的單個 IO 口。以下為 GPIO 輸入 / 輸出位操作的宏定義:
代碼清單:位帶操作-2 GPIO 輸入輸出位操作
// 單獨操作 GPIO的某一個IO口,n(0,1,2...15),n表示具體是哪一個IO口 #define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //輸出 #define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //輸入 #define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //輸出 #define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //輸入 #define PCout(n) BIT_ADDR(GPIOC_ODR_Addr,n) //輸出 #define PCin(n) BIT_ADDR(GPIOC_IDR_Addr,n) //輸入 #define PDout(n) BIT_ADDR(GPIOD_ODR_Addr,n) //輸出 #define PDin(n) BIT_ADDR(GPIOD_IDR_Addr,n) //輸入 #define PEout(n) BIT_ADDR(GPIOE_ODR_Addr,n) //輸出 #define PEin(n) BIT_ADDR(GPIOE_IDR_Addr,n) //輸入 #define PFout(n) BIT_ADDR(GPIOF_ODR_Addr,n) //輸出 #define PFin(n) BIT_ADDR(GPIOF_IDR_Addr,n) //輸入 #define PGout(n) BIT_ADDR(GPIOG_ODR_Addr,n) //輸出 #define PGin(n) BIT_ADDR(GPIOG_IDR_Addr,n) //輸入
2.3 主函數示例
以下為通過位操作控制 GPIO 的主函數示例:
代碼清單:位帶操作-3 main 函數
int main(void) { // 程序來到main函數之前,啟動文件:statup_w55mh32_hd.s已經調用 // SystemInit()函數把系統時鐘初始化成72MHZ // SystemInit()在system_w55mh32.c中定義 // 如果用戶想修改系統時鐘,可自行編寫程序修改 LED_GPIO_Config(); while ( 1 ) { PDout(14)= 0; SOFT_Delay(0x0FFFFF); } }
WIZnet 是一家無晶圓廠半導體公司,成立于 1998 年。產品包括互聯網處理器 iMCU?,它采用 TOE(TCP/IP 卸載引擎)技術,基于獨特的專利全硬連線 TCP/IP。iMCU? 面向各種應用中的嵌入式互聯網設備。
WIZnet 在全球擁有 70 多家分銷商,在香港、韓國、美國設有辦事處,提供技術支持和產品營銷。
香港辦事處管理的區域包括:澳大利亞、印度、土耳其、亞洲(韓國和日本除外)。
審核編輯 黃宇
-
單片機
+關注
關注
6067文章
44969瀏覽量
649728 -
WIZnet
+關注
關注
3文章
20瀏覽量
42438 -
GPIO
+關注
關注
16文章
1280瀏覽量
53954
發布評論請先 登錄
第七章MMU例子代碼交叉編譯后下載到mini2440后,LED燈一直亮著并沒有閃
GPIO按鍵實驗與位帶操作
快速理解STM32位帶操作原理

第七章 開關電源PCB排版解析

STM32位帶操作-詳解-計算過程

評論