单芯片解决方案,开启全新体验——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 多家分销商,在香港、韩国、美国设有办事处,提供技术支持和产品营销。
香港办事处管理的区域包括:澳大利亚、印度、土耳其、亚洲(韩国和日本除外)。
审核编辑 黄宇
-
单片机
+关注
关注
6068文章
45032浏览量
651953 -
定时器
+关注
关注
23文章
3302浏览量
119371 -
WIZnet
+关注
关注
3文章
20浏览量
42475 -
USART1
+关注
关注
0文章
10浏览量
3923 -
通用定时器
+关注
关注
1文章
19浏览量
3541
发布评论请先 登录
WIZnet发布最新单片式以太网控制芯片W7100
第一章 W55MH32 高性能以太网单片机的学习方法概述

第二章 开发板与芯片介绍 详解W55MH32芯片及开发板

WIZnet W55MH32以太网单片机开发教程 第十一章 通用定时器(上篇)

W55MH32高性能以太网单片机开发课件 第十四章 ADC(上篇)

第二章 W55MH32 DHCP示例

第十一章 W55MH32 SMTP示例

第十五章 W55MH32 SNMP示例

第二十六章 W55MH32?上位机搜索和配置示例

评论