單芯片解決方案,開啟全新體驗——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 多家分銷商,在香港、韓國、美國設有辦事處,提供技術支持和產品營銷。
香港辦事處管理的區域包括:澳大利亞、印度、土耳其、亞洲(韓國和日本除外)。
審核編輯 黃宇
-
單片機
+關注
關注
6074文章
45368瀏覽量
664649 -
定時器
+關注
關注
23文章
3362瀏覽量
121935 -
WIZnet
+關注
關注
3文章
20瀏覽量
42760 -
USART1
+關注
關注
0文章
10瀏覽量
4028 -
通用定時器
+關注
關注
1文章
19瀏覽量
3616
發布評論請先 登錄
WIZnet發布最新單片式以太網控制芯片W7100
第一章 W55MH32 高性能以太網單片機的學習方法概述
第二章 開發板與芯片介紹 詳解W55MH32芯片及開發板
WIZnet W55MH32以太網單片機開發教程 第十一章 通用定時器(上篇)
W55MH32高性能以太網單片機開發課件 第十四章 ADC(上篇)
第十一章 W55MH32 SMTP示例
第十五章 W55MH32 SNMP示例
第二十六章 W55MH32?上位機搜索和配置示例
一文讀懂:W55MH32 如何攜手微信小程序與 OneNET,實現以太網燈條調色自由(軟硬件開源)

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