單芯片解決方案,開啟全新體驗——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 提供了兩種選擇:100QFN和68QFN。
W55MH32L 采用 100QFN 封裝,尺寸為 12x12mm,其資源豐富,擁有 66 個 GPIO、3 個 ADC、12 通道 DMA、17 個定時器、2 個 I2C、5 個串口、2 個 SPI 接口(其中 1 個帶 I2S 接口復用)、1 個 CAN、1 個 USB2.0 以及 1 個 SDIO 接口。
而對于那些對產品布局緊湊度有要求的用戶,W55MH32Q 是理想之選。它采用 68QFN 封裝,尺寸為 8x8mm,相較于 W55MH32L,僅減少了部分 GPIO 以及 SDIO 接口,其他參數保持一致,性價比優勢顯著。
此外,本W55MH32支持硬件加密算法單元,WIZnet 還推出 TOE+SSL 應用,涵蓋 TCP SSL、HTTP SSL 以及 MQTT SSL 等,為網絡通信安全再添保障。
為助力開發者快速上手與深入開發,基于 W55MH32L 和 W55MH32Q 這兩顆芯片,WIZnet 精心打造了配套開發板。開發板集成 WIZ-Link 芯片,借助一根 USB C 口數據線,就能輕松實現調試、下載以及串口打印日志等功能。開發板將所有外設全部引出,拓展功能也大幅提升,便于開發者全面評估芯片性能。

第十一章 通用定時器(下篇)
1 程序設計
1.1 TIM_InputCapture例程
此例程聚焦于 W55MH32 的定時器輸入捕獲功能,借助 TIM3 對外部信號的高電平持續時間展開測量,同時運用串口輸出相關信息。下面是詳細的程序分析:
1.初始化
?配置系統時鐘:RCC_ClkConfiguration()。
?初始化延時函數:delay_init()。
?配置串口:UART_Configuration(),波特率設為 115200。
?獲取系統時鐘頻率并輸出。
配置定時器 3:TIM_Configuration(),用于輸入捕獲。
2.主循環
while (1)
{
if (TIM3_CAPTURE_STA & 0X80) //Successfully captured a rising edge
{
temp = TIM3_CAPTURE_STA & 0X3F;
temp *= 65536; //sum of overflow times
temp += TIM3_CAPTURE_VAL; //Get the total high time
printf("HIGH:%d usrn", temp); //Print total peak time
TIM3_CAPTURE_STA = 0; //Initiate the next capture
}
}
?持續檢查TIM3_CAPTURE_STA 標志,若成功捕獲到一個完整的高電平脈沖(TIM3_CAPTURE_STA & 0X80 為真),則計算高電平持續時間,輸出該時間,接著重新初始化捕獲狀態,準備下一次捕獲。
3.定時器中斷服務程序
void TIM_Configuration(void)
{
// ...(GPIO和時基配置略)...
NVIC_InitTypeDef NVIC_InitStructure;
// 1. 配置NVIC中斷優先級
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; // 選擇TIM3中斷通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; // 搶占優先級(數值越小優先級越高)
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 子優先級
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 使能中斷
NVIC_Init(&NVIC_InitStructure); // 應用配置
// 2. 使能TIM3中斷類型
TIM_ITConfig(TIM3, TIM_IT_Update | TIM_IT_CC2, ENABLE); // 使能更新中斷(計數器溢出)和通道2捕獲中斷
TIM_Cmd(TIM3, ENABLE); // 啟動定時器
}
?若尚未成功捕獲((TIM3_CAPTURE_STA & 0X80) == 0),則處理定時器更新中斷與捕獲中斷。
?捕獲到上升沿時,標記已捕獲上升沿,把計數器清零,同時將捕獲極性設為下降沿捕獲。
?捕獲到下降沿時,標記已成功捕獲高電平脈沖寬度,記錄捕獲值,再把捕獲極性設為上升沿捕獲。
?處理定時器溢出情況。
?清除中斷標志。
4.串口輸出函數
?SER_PutChar()函數用于向串口發送單個字符。
?fputc()函數重定向標準輸出,使printf 能通過串口輸出。
3.4 TIM_OutPwm例程
該例程借助對系統時鐘、UART 和定時器的配置,實現了系統時鐘的初始化、UART 通信以及定時器 PWM 輸出的功能。通過printf()函數能夠輸出系統時鐘頻率信息,方便調試和監控。下面是詳細的程序分析:
1.系統時鐘配置
?使用 8MHz 外部晶振(HSE)經 PLL9 倍頻生成 72MHz 系統時鐘
?配置總線頻率:HCLK=72MHz, PCLK1=36MHz, PCLK2=72MHz
?使能內部低速(LSI)和高速(HSI)時鐘
2.串口通信
?USART1 配置為 115200 波特率,8 位數據位,1 位停止位
?PA9(TX)設為復用推挽輸出,PA10(RX)浮空輸入
?重定向printf到串口,自動添加rn轉換
3.定時器 PWM 輸出
void TIM_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
// 使能時鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
// ================== GPIO配置:PA7為TIM3_CH2復用輸出 ==================
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; // PA7對應TIM3_CH2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 復用推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// ================== 時基配置:1MHz計數時鐘,100μs周期 ==================
TIM_TimeBaseStructure.TIM_Period = 99; // 周期值(0-99,共100個計數周期)
TIM_TimeBaseStructure.TIM_Prescaler = 35; // PCLK1=36MHz預分頻36倍(35+1)
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
// ================== PWM配置:50%占空比,PWM模式2 ==================
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; // PWM模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // 使能輸出
TIM_OCInitStructure.TIM_Pulse = 49; // 脈沖值(決定占空比)
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; // 低電平有效
TIM_OC2Init(TIM3, &TIM_OCInitStructure); // 初始化通道2
// 使能預裝載和自動重裝載
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM3, ENABLE);
// 啟動定時器
TIM_Cmd(TIM3, ENABLE);
TIM_CtrlPWMOutputs(TIM3, ENABLE); // 適用于高級定時器的輸出控制
}
?TIM3 通道 2 在 PA7 輸出 50% 占空比 PWM
?周期 100μs(計數周期 99),頻率 10kHz
?時基配置:PCLK1 (36MHz) 預分頻 36 得到 1MHz 計數時鐘
3.5 TIM_Tim9例程
此例程主要實現了 W55MH32 的定時器(TIM9)中斷測試以及 UART 串口通信功能,以下為其工作流程總結:
1. 初始化階段
延時函數初始化:調用delay_init()函數,對延時功能進行初始化。
UART 串口配置:借助UART_Configuration(115200)函數,把 USART1 的波特率設定為 115200,并完成 GPIO 引腳和 USART 的初始化工作。
獲取時鐘頻率:運用RCC_GetClocksFreq(&clocks)函數獲取系統時鐘頻率,然后通過printf()函數將系統時鐘、HCLK、PCLK1、PCLK2 以及 ADCCLK 的頻率信息打印出來。
2. 定時器配置階段
使能時鐘:開啟 TIM9 的時鐘。
定時器初始化:對定時器 TIM9 的周期、預分頻器、時鐘分割和計數模式等參數進行配置。
使能中斷:使能 TIM9 的更新中斷,并對 NVIC 中斷優先級進行設置。
啟動定時器:啟動 TIM9 定時器。
3. 主循環階段
主函數中的while (1)是一個無限循環,程序在此處持續等待定時器中斷的發生。
4.中斷處理階段
void TIM1_BRK_TIM9_IRQHandler(void)
{
// 4.1 檢查更新中斷標志
if (TIM_GetITStatus(TIM9, TIM_IT_Update) != RESET)
{
// 4.2 清除中斷標志
TIM_ClearITPendingBit(TIM9, TIM_IT_Update);
// 4.3 串口輸出中斷信息(打印函數名)
printf("%sn", __FUNCTION__);
}
}
當定時器 TIM9 產生更新中斷時,TIM1_BRK_TIM9_IRQHandler()函數會被調用。在該函數里,會先檢查中斷標志位,若標志位被置位,則清除該標志位,并通過printf()函數打印出當前函數名。
5.串口輸出階段
// 5.1 單字符發送函數(阻塞式發送)
int SER_PutChar(int ch)
{
while (!USART_GetFlagStatus(USART_TEST, USART_FLAG_TC)); // 等待發送完成
USART_SendData(USART_TEST, (uint8_t)ch);
return ch;
}
// 5.2 重定向fputc函數(支持printf)
int fputc(int c, FILE *f)
{
if (c == 'n') // 自動添加回車符(適配串口終端)
{
SER_PutChar('r');
}
return SER_PutChar(c);
}
?SER_PutChar()函數:用于向 USART1 發送單個字符,會等待發送完成標志位被置位后再發送字符。
?fputc()函數:對標準庫的fputc()函數進行重定向,實現將字符輸出到 USART1。若遇到換行符n,會先發送回車符r,再發送換行符n。
該例程的核心功能是配置定時器 TIM9 使其按設定參數產生中斷,在中斷發生時通過串口輸出信息,同時利用串口輸出系統時鐘頻率等信息。
3.6 TIM_Touch例程
此例程的主要作用是實現觸摸檢測功能,并通過 LED 燈狀態的改變直觀地反饋觸摸事件,同時借助串口輸出相關調試信息,方便開發人員進行調試與監測。下面是具體功能的詳細介紹:
1.初始化階段
?系統初始化:調用delay_init()進行延時初始化
?串口配置:通過UART_Configuration(115200)配置 USART1 為 115200 波特率
?時鐘信息輸出:獲取并打印系統時鐘各頻率參數
?硬件初始化:調用LED_Init()初始化 LED 控制引腳,調用TPAD_Init(6)初始化觸摸檢測模塊
2.主循環階段
?觸摸檢測:通過TPAD_Scan(0)實時檢測觸摸事件檢測到觸摸時:打印 "Touch" 并翻轉 LED1 狀態
?LED0 周期性閃爍:通過計數器實現 150ms 周期(15×10ms)翻轉 LED0
?循環延時:每次循環執行 10ms 延時
3.硬件控制
// LED初始化函數(根據開發板類型選擇不同引腳)
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
#ifdef PIN48_BOARD
// 48腳開發板: LED0->PA7, LED1->PB0
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA, GPIO_Pin_7); // 初始狀態熄滅LED
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB, GPIO_Pin_0);
#else
// 64腳開發板: LED0->PC2, LED1->PC3
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_SetBits(GPIOC, GPIO_Pin_3 | GPIO_Pin_2); // 初始狀態熄滅LED
#endif
}
// 觸摸檢測初始化(依賴tpad.h庫實現)
void TPAD_Init(u8 sysclk)
{
// 實際代碼在tpad.c中實現,此處為函數聲明
// 配置觸摸檢測相關GPIO和定時器
}
// 觸摸掃描函數(返回1表示檢測到觸摸)
u8 TPAD_Scan(u8 mode)
{
// 實際代碼在tpad.c中實現,此處為函數聲明
// mode=0: 單次觸發模式
// mode=1: 連續觸發模式
}
?LED 控制:根據開發板類型(PIN48/PIN64)控制對應 GPIO 引腳
?觸摸檢測:通過 TPAD 模塊實現觸摸信號采集與處理(具體實現由 tpad 庫提供)
4.功能特點
?雙 LED 狀態控制:LED0 周期性閃爍,LED1 觸摸觸發翻轉
?串口調試支持:通過 printf 輸出系統信息和觸摸事件
?硬件無關性:通過條件編譯適應不同開發板(PIN48/PIN64)
2 下載驗證
2.1 TIM_InputCapture例程
程序下載到開發板運行后,串口會先輸出系統時鐘頻率信息與“TIM Input CaptureTest.”提示信息。之后,若PA7引腳有信號輸入,每當成功捕獲到一個完整高電平脈沖,串口就會輸出該高電平的持續時間(單位為微秒),并自動準備下一次捕獲。若信號頻率過高致計數器溢出,或信號電平異常,捕獲可能出現異常,需重新上電復位;若沒有信號輸入則無捕獲結果輸出。

2.2 TIM_OutPwm例程
該程序下載運行后,通過USART1(PA9/PA10)以115200波特率輸出系統時鐘信息:"SYSCLK: 72.0Mhz, HCLK: 72.0Mhz, PCLK1: 36.0Mhz, PCLK2: 72.0Mhz, ADCCLK: 72.0Mhz"和"TIM Out Test."。PA7引腳持續輸出10kHz頻率、50%占空比的PWM信號(低電平有效),周期100μs。程序執行完畢后進入無限循環保持運行狀態,CPU空閑但PWM輸出持續。驗證時需用示波器觀察PA7波形,通過串口工具配置相同波特率查看打印信息,同時確保硬件連接正確(PA7接示波器、PA9接串口轉USB模塊)。

如果想查看PWM輸出的占空比,可以在循環里加這段代碼:
uint16_t pwm_value = TIM_GetCapture2(TIM3);
float duty_cycle = (float)pwm_value / 99 * 100;
printf("PWM Duty Cycle: %.2f%%n", duty_cycle);
delay_ms(1000);
這樣可以打印出PWM的占空比:

2.3 TIM_Tim9例程
程序啟動后,先進行延時和串口初始化,輸出系統時鐘頻率信息與 “TIM Tim9 Base Test.” 提示,接著配置并啟動定時器 TIM9,隨后進入無限循環;當 TIM9 產生更新事件觸發中斷時,中斷服務函數會清除中斷標志并通過串口輸出自身函數名,之后繼續等待下一次中斷。

2.4 TIM_Touch例程
程序運行后,LED0以150ms周期閃爍,檢測到觸摸時LED1狀態翻轉并通過串口打印"Touch",同時啟動時輸出系統時鐘頻率信息。
WIZnet 是一家無晶圓廠半導體公司,成立于 1998 年。產品包括互聯網處理器 iMCU?,它采用 TOE(TCP/IP 卸載引擎)技術,基于獨特的專利全硬連線 TCP/IP。iMCU? 面向各種應用中的嵌入式互聯網設備。
WIZnet 在全球擁有 70 多家分銷商,在香港、韓國、美國設有辦事處,提供技術支持和產品營銷。
香港辦事處管理的區域包括:澳大利亞、印度、土耳其、亞洲(韓國和日本除外)。
審核編輯 黃宇
-
單片機
+關注
關注
6067文章
45003瀏覽量
650999 -
定時器
+關注
關注
23文章
3300瀏覽量
119097 -
WIZnet
+關注
關注
3文章
20瀏覽量
42464 -
USART1
+關注
關注
0文章
10瀏覽量
3914 -
通用定時器
+關注
關注
1文章
19瀏覽量
3533
發布評論請先 登錄
WIZnet發布最新單片式以太網控制芯片W7100
第一章 W55MH32 高性能以太網單片機的學習方法概述

第二章 開發板與芯片介紹 詳解W55MH32芯片及開發板

WIZnet W55MH32以太網單片機開發教程 第十一章 通用定時器(上篇)

W55MH32高性能以太網單片機開發課件 第十四章 ADC(上篇)

第二章 W55MH32 DHCP示例

第九章 W55MH32 HTTP Server示例

第十一章 W55MH32 SMTP示例

第十五章 W55MH32 SNMP示例

評論