單芯片解決方案,開啟全新體驗——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的無限可能。
第二十五章 FLASH
1 W55MH32 FLASH 簡介
WMH32的閃存模塊由主存儲器、信息塊和閃存存儲器接口寄存器等 3 部分組成。
主存儲器,該部分用來存放代碼和數據常數(如 const 類型的數據)。對于大容量產品,其被劃分為 256 頁,每一頁 2K 字節。注意,小容量和中容量產品則每頁只有 1K 字節。從上圖可以看出主存儲器的起始地址就是 0x08000000,B0、B1 都接 GND 的時候,就是從0x08000000 開始運行代碼的。
信息塊,該部分分為 2 個小部分,其中啟動程序代碼,用來存儲 ST 自帶的啟動程序,用來串口下載代碼,當 B0 接 3V3,B1 接 GND 的時候,運行的就是這部分代碼。用戶選中字節,則一般用于配置寫保護、讀保護等功能,本章不作介紹了。
閃存存儲器接口寄存器,該部分用于控制閃存讀寫等,是整個閃存模塊的控制結構。對主存儲器和信息塊的寫入由內嵌的閃存編程/擦除控制器(FPEC)管理;編程與擦除的高電壓由內部產生。在執行閃存寫操作時,任何對閃存的讀操作都會鎖住總線,在寫操作完成后讀操作才能正確地進行。既在進行寫或擦除操作時,不能進行代碼或數據的讀取操作。
型號 | W55MH32L | W55MH32Q |
Flash(KB) | 1024 | 1024 |
SRAM(KB) | 96 | 96 |
高級定時器 | 2 | 2 |
通用定時器 | 10 | 10 |
基本定時器 | 2 | 2 |
SPI | 2 | 2 |
I2C | 2 | 2 |
USART/UART | 5 | 3 |
USB | 1 | 1 |
CAN | 1 | 1 |
SDIO | 1 | - |
Ethernet | 1 | 1 |
GPIO 端口 | 66 | 36 |
12 位 ADC(通道數) | 3(12 個通道) | 3(12 個通道) |
12 位 DAC(通道數) | 2(2 個通道) | 2(2 個通道) |
隨機數模塊 | 支持 | 支持 |
硬件加密算法單元 | 支持 | 支持 |
頁大小(K 字節) | 4 | 4 |
CPU 頻率 | 216M | 216M |
工作電壓 | 2.0 - 3.6V | 2.0 - 3.6V |
工作溫度 | -40 - +85℃ | -40 - +85℃ |
2 閃存的讀取
內置閃存模塊可以在通用地址空間直接尋址,任何 32 位數據的讀操作都能訪問閃存模塊的內容并得到相應的數據。讀接口在閃存端包含一個讀控制器,還包含一個 AHB 接口與 CPU銜接。這個接口的主要工作是產生讀內存的控制信號并預取 CPU 要求的指令塊,預取指令塊僅用于在 I-Code 總線上的取指操作,數據常量是通過 D-Code 總線訪問的。這兩條總線的訪問目標是相同的閃存模塊,訪問 D-Code 將比預取指令優先級高。
這里要特別留意一個閃存等待時間,因為 CPU 運行速度比 FLASH 快得多,W55MH32的 FLASH 最快訪問速度≤24Mhz,如果 CPU 頻率超過這個速度,那么必須加入等待時間,比如我們一般使用 72Mhz 的主頻,那么 FLASH 等待周期就必須設置為 2,該設置通過FLASH_ACR 寄存器設置。
例如,我們要從地址 addr,讀取一個半字(半字為 16 位,字為 32 位),可以通過如下的
語句讀取:
data = *(vu16*)addr;
將 addr 強制轉換為 vu16 指針,然后取該指針所指向的地址的值,即得到了 addr 地址的值。類似的,將上面的 vu16 改為 vu8,即可讀取指定地址的一個字節。相對 FLASH 讀取來說,W55MH32 FLASH 的寫就復雜一點了。
3 閃存的編程和擦除
W55MH32 的閃存編程是由 FPEC(閃存編程和擦除控制器)模塊處理的,這個模塊包含 7 個 32位寄存器,它們分別是:
?FPEC 鍵寄存器(FLASH_KEYR)
?選擇字節鍵寄存器(FLASH_OPTKEYR)
?閃存控制寄存器(FLASH_CR)
?閃存狀態寄存器(FLASH_SR)
?閃存地址寄存器(FLASH_AR)
? 選擇字節寄存器(FLASH_WRPR)
其中 FPEC 鍵寄存器總共有 3 個鍵值:
?RDPRT 鍵 = 0X0000 00A5
?KEY1 = 0X4567 0123
?KEY2 = 0XCDEF 89AB
W55MH32 復位后,FPEC 模塊是被保護的,不能寫入 FLASH_CR 寄存器;通過寫入特定的序列到 FLASH_KEYR 寄存器可以打開 FPEC 模塊(即寫入 KEY1 和 KEY2),只有在寫保護被解除后,我們才能操作相關寄存器。
W55MH32 閃存的編程每次必須寫入 16 位(不能單純的寫入 8 位數據),當 FLASH_CR 寄存器的 PG 位為‘1’時,在一個閃存地址寫入一個半字將啟動一次編程;寫入任何非半字的數據,FPEC 都會產生總線錯誤。在編程過程中(BSY 位為’1’),任何讀寫內存的操作都會使CPU 暫停,直到此次閃存編程結束。同樣,W55MH32 的 FLASH 在編程的時候,也必須要求其寫入地址的 FLASH 是被擦除了的(其值必須是 0xFFFF),否則無法寫入,在 FLASH_SR 寄存器的 PGERR 位將得到一個警告。W55MH32 的 FLASH 編程過程如圖所示:
閃存編程過程
從上圖可以得到閃存的編程順序如下:
1)檢查 FLASH_CR 的 LOCK 是否解鎖,如果沒有則先解鎖
2)檢查 FLASH_SR 寄存器的 BSY 位,以確認沒有其他正在進行的編程操作
3)設置 FLASH_CR 寄存器的 PG 位為‘1’
4)在指定的地址寫入要編程的半字
5)等待 BSY 位變為‘0’
6)讀出寫入地址并驗證數據
前面提到,我們在 W55MH32 的 FLASH 編程的時候,要先判斷縮寫地址是否被擦出了,所以,我們有必要再介紹一下 W55MH32 的閃存擦除,W55MH32 的閃存擦除分為兩種:頁擦除和整片擦除。頁擦除過程如圖 所示:
閃存頁擦除過程
從上圖可以看出,W55MH32 的頁擦除順序為:
1)檢查 FLASH_CR 和 LOCK 是否解鎖,如果沒有則先解鎖
2)檢查 FLASH_SR 寄存器的 BSY 位,以確認沒有其他正在進行的閃存操作
3)設置 FLASH_CR 寄存器的 PER 位為‘1’
4)用 FLASH_AR 寄存器選擇要擦除的頁
5)設置 FLASH_CR 寄存器的 STRT 位為‘1’
6)等待 BSY 位變為‘0’
7)讀出被擦除的頁并做驗證
本章我們只用到了 W55MH32 頁擦除功能,整片擦除功能我們在這里就不介紹了。
4 FLASH 寄存器
通過上面的講解,我們基本對 W55MH32 閃存的讀寫執行步驟有所了解。接下來,我們介紹本實驗需要用到的一些 FLASH 寄存器。
4.1 FPEC 鍵寄存器(FLASH_KEYR)
FPEC 鍵寄存器描述如圖 所示:
FLASH_KEYR 寄存器
該寄存器主要用來解鎖 FPEC,必須在該寄存器寫入特定的序列(KEY1 和 KEY2)解鎖后,才能對 FLASH_CR 寄存器進行寫操作。
4.2 FLASH 控制寄存器(FLASH_CR)
FLASH 控制寄存器描述如圖所示:
圖 FLASH_CR 寄存器
該寄存器我們本章只用到了它的 LOCK、STRT、PER 和 PG 等 4 個位。LOCK 位,該位用于指示 FLASH_CR 寄存器是否被鎖住,該位在檢測到正確的解鎖序列后,硬件將其清零。在一次不成功的解鎖操作后,在下次系統復位之前,該位將不再改變。
STRT 位,該位用于開始一次擦除操作。在該位寫入 1,將執行一次擦除操作。
PER 位,該位用于選擇頁擦除操作,在頁擦除的時候,需要將該位置 1。
PG 位,該位用于選擇編程操作,在往 FLASH 寫數據的時候,該位需要置 1。
其他位,我們就不在這里介紹了,請大家參考《W55MH32xxx參考手冊》。
4.3 閃存狀態寄存器(FLASH_SR)
閃存狀態寄存器描述如圖所示:
圖 FLASH_SR 寄存器
該寄存器主要用來指示當前 FPEC 的操作編程狀態。由于寄存器中描述比較詳細,這里就不重復了。
4.4 閃存地址寄存器(FLASH_AR)
閃存地址寄存器描述如圖所示:
圖FLASH_AR 寄存器
該寄存器在本章,我們主要用來設置要擦除的頁。關 于 W55MH32 FLASH 的 介 紹 , 我 們 就 介 紹 到 這 里 。 更 詳 細 的 介 紹 , 可 以 參 考《W55MH32參考手冊》。
5 例程設計
5.1 FLASH_Eeprom
該通過例程串口輸出系統時鐘信息和測試提示,在無限循環里不斷對 WIZnet FLASH 進行讀寫操作,并且把讀取的數據通過串口輸出,以此實現對 FLASH 的讀寫測試。
5.1 函數聲明
聲明了UART_Configuration()函數,其功能是配置串口參數。
5.2 常量與數組定義
定義了一個常量字符串數組TEXT_Buffer,內容為"WIZnet FLASH TEST"。
借助SIZE宏定義獲取數組長度。
設定了FLASH_SAVE_ADDR常量,此為 FLASH 的保存地址。
5.3 主函數main()
int main(void) { uint8_t datatemp[SIZE], i; RCC_ClocksTypeDef clocks; delay_init(); UART_Configuration(115200); RCC_GetClocksFreq(&clocks); printf("n"); printf("SYSCLK: %3.1fMhz, HCLK: %3.1fMhz, PCLK1: %3.1fMhz, PCLK2: %3.1fMhz, ADCCLK: %3.1fMhzn", (float)clocks.SYSCLK_Frequency / 1000000, (float)clocks.HCLK_Frequency / 1000000, (float)clocks.PCLK1_Frequency / 1000000, (float)clocks.PCLK2_Frequency / 1000000, (float)clocks.ADCCLK_Frequency / 1000000); printf("FLASH EEPROM Tset.n"); while (1) { WIZFLASH_Write(FLASH_SAVE_ADDR, (u16 *)TEXT_Buffer, SIZE); WIZFLASH_Read(FLASH_SAVE_ADDR, (u16 *)datatemp, SIZE); for (i = 0; i < SIZE; i++) { printf("%sn", datatemp); } memset(datatemp, 0x00, sizeof(datatemp)); delay_ms(1000); } }
定義了一個用于存儲從 FLASH 讀取數據的數組datatemp,以及一個循環變量i。
初始化延遲函數、串口配置,并且獲取系統時鐘頻率。
通過printf()函數輸出系統時鐘頻率信息以及測試提示信息。
進入一個無限循環:調用WIZFLASH_Write()函數把TEXT_Buffer數組內容寫入到指定的 FLASH 地址。
?調用WIZFLASH_Read()函數從該地址讀取數據到datatemp數組。
?運用for循環遍歷datatemp數組,然后通過printf()函數輸出數組內容。
?調用memset()函數把datatemp數組清零。
?調用delay_ms()函數延遲 1 秒。
5.4 串口配置函數UART_Coniguration()
void UART_Configuration(uint32_t bound) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = bound; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART_TEST, &USART_InitStructure); USART_Cmd(USART_TEST, ENABLE); }
對 GPIO 和 USART 的初始化結構體進行定義。
使能 USART1 和 GPIOA 的時鐘。
配置 GPIOA 的引腳 9 為復用推挽輸出模式,引腳 10 為浮空輸入模式。
對 USART 的波特率、數據位、停止位、奇偶校驗等參數進行配置。
初始化 USART 并使能。
5.5 字符發送函數SER_PutChar()
int SER_PutChar(int ch) { while (!USART_GetFlagStatus(USART_TEST, USART_FLAG_TC)); USART_SendData(USART_TEST, (uint8_t)ch); return ch; }
等待串口發送完成標志位USART_FLAG_TC置位。
把字符發送到串口。
5.6 重定向函數fputc()
若要發送的字符是換行符n,則先發送回車符r。
調用SER_PutChar()函數發送字符。
6 下載驗證
6.1 FLASH_Eeprom
進入主循環后,程序會不斷執行以下操作:
把TEXT_Buffer數組中的字符串 "WIZnet FLASH TEST" 寫入到指定的 FLASH 地址。
從該 FLASH 地址讀取數據到datatemp數組。
借助printf()函數將datatemp數組的內容通過串口輸出。
由于for循環的存在,每次讀取到的數據會被重復輸出SIZE次。不過,原代碼里printf("%sn", datatemp);存在錯誤,它會把整個datatemp數組當作字符串輸出,而不是逐個字符輸出。正確的做法應該是printf("%c", datatemp[i]);。修正后,串口會每隔 1 秒輸出一次 "WIZnet FLASH TEST"。
WIZnet 是一家無晶圓廠半導體公司,成立于 1998 年。產品包括互聯網處理器 iMCU?,它采用 TOE(TCP/IP 卸載引擎)技術,基于獨特的專利全硬連線 TCP/IP。iMCU? 面向各種應用中的嵌入式互聯網設備。
WIZnet 在全球擁有 70 多家分銷商,在香港、韓國、美國設有辦事處,提供技術支持和產品營銷。
香港辦事處管理的區域包括:澳大利亞、印度、土耳其、亞洲(韓國和日本除外)。
審核編輯 黃宇
-
寄存器
+關注
關注
31文章
5433瀏覽量
124427 -
FlaSh
+關注
關注
10文章
1678瀏覽量
151766 -
閃存編程
+關注
關注
0文章
12瀏覽量
6781
發布評論請先 登錄
《DNK210使用指南 -CanMV版 V1.0》第二十五章 LCD圖片顯示實驗
【正點原子FPGA連載】第二十七章gpio子系統下的LED驅動實驗-領航者ZYNQ之linux開發指南
在顯示器上顯示出了靜態的彩條圖案
模擬電路網絡課件 第二十五節:集成運算放大器中的電流源

【正點原子FPGA連載】第二十五章HDMI方塊移動實驗 -摘自【正點原子】新起點之FPGA開發指南_V2.1

火熱預定中2023第二十五屆中國國際高新技術交易會11.15-11.19日
火熱招商--2023第二十五屆中國國際高新技術交易會11.15-11.19日
中軟國際與深開鴻邀您相約第二十五屆中國國際軟件博覽會
上海貝嶺榮獲“第二十五屆上市公司金信披獎”
鐳神智能榮獲第二十五屆高交會優秀產品獎

評論