W55MH32高性能以太网单片机教程 第九章 窗口看门狗(WWDG)

描述

单芯片解决方案,开启全新体验——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版本,该版本拥有更丰富的外设资源,适用于需要多接口扩展的复杂工控场景,软件使用方法一致。

此外,本W55MH32支持硬件加密算法单元,WIZnet还推出TOE+SSL应用,涵盖TCP SSL、HTTP SSL以及MQTT SSL等,为网络通信安全再添保障。 

为助力开发者快速上手与深入开发,基于W55MH32Q这颗芯片,WIZnet精心打造了配套开发板。开发板集成WIZ-Link芯片,借助一根USB C口数据线,就能轻松实现调试、下载以及串口打印日志等功能。开发板将所有外设全部引出,拓展功能也大幅提升,便于开发者全面评估芯片性能。 

以太网

第九章 窗口看门狗(WWDG)

本章分为如下几个小节:

1 IWDG 简介

2 IWDG 寄存器描述

3 程序设计

4 下载验证

1 WWDG简介

窗口看门狗通常被用来监测,由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。除非递减计数器的值在 T6 位变成 0 前被刷新,看门狗电路在达到预置的时间周期时,会产生一个 MCU 复位。在递减计数器达到窗口寄存器数值之前,如果 7 位的递减计数器数值(在控制寄存器中)被刷新,那么也将产生一个 MCU 复位。这表明递减计数器需要在一个有限的时间窗口中被刷新。 

1.1 WWDG主要特性

可编程的自由运行递减计数器

条件复位

······当递减计数器的值小于 0x40,(若看门狗被启动)则产生复位。

······当递减计数器在窗口外被重新装载,(若看门狗被启动)则产生复位。

如果启动了看门狗并且允许中断,当递减计数器等于 0x40 时产生早期唤醒中断(EWI),它可以被用于重装载计数器以避免 WWDG 复位。

1.2 WWDG功能描述

如果看门狗被启动(WWDG_CR 寄存器中的 WDGA 位被置'1'),并且当 7 位(T[6:0])递减计数器从0x40 翻转到 0x3F(T6 位清零)时,则产生一个复位。如果软件在计数器值大于窗口寄存器中的数值时重新装载计数器,将产生一个复位。

以太网

看门狗框图

应用程序在正常运行过程中必须定期地写入 WWDG_CR 寄存器以防止 MCU 发生复位。只有当计数器值小于窗口寄存器的值时,才能进行写操作。储存在 WWDG_CR 寄存器中的数值必须在 0xFF 和0xC0 之间:

  • 启动看门狗

在系统复位后,看门狗总是处于关闭状态,设置 WWDG_CR 寄存器的 WDGA 位能够开启看门狗,随后它不能再被关闭,除非发生复位。

  • 控制递减计数器

递减计数器处于自由运行状态,即使看门狗被禁止,递减计数器仍继续递减计数。当看门狗被启用时,T6 位必须被设置,以防止立即产生一个复位。T[5:0]位包含了看门狗产生复位之前的计时数目;复位前的延时时间在一个最小值和一个最大值之间变化,这是因为写入 WWDG_CR 寄存器时,预分频值是未知的。配置寄存器(WWDG_CFR)中包含窗口的上限值:要避免产生复位,递减计数器必须在其值小于窗口寄存器的数值并且大于 0x3F 时被重新装载,0 描述了窗口寄存器的工作过程。另一个重装载计数器的方法是利用早期唤醒中断(EWI)。设置 WWDG_CFR 寄存器中的 WEI 位开启该中断。当递减计数器到达 0x40 时,则产生此中断,相应的中断服务程序(ISR)可以用 来加载计数器以防止 WWDG 复位。在 WWDG_SR 寄存器中写'0'可以清除该中断。

注: 可以用 T6 位产生一个软件复位(设置 WDGA 位为'1',T6 位为'0')。

1.3 如何编写看门狗超时程序

可以使用 0 提供的公式计算窗口看门狗的超时时间。

警告:当写入 WWDG_CR 寄存器时,始终置 T6 位为'1'以避免立即产生一个复位。

以太网

窗口看门狗时序图

1.4 调试模式

当微控制器进入调试模式时(Cortex-M3 核心停止),根据调试模块中的 DBG_WWDG_STOP 配置位的状态,WWDG 的计数器能够继续工作或停止。

2 寄存器描述

可以用半字(16 位)或字(32 位)的方式操作这些外设寄存器。

2.1 控制寄存器(WWDG_CR)

地址偏移量:0x00

复位值:0x0000 007F

以太网

2.2 配置寄存器(WWDG_CFR)

地址偏移量:0x04

复位值:0x0000 007F

以太网

2.3 状态寄存器(WWDG_SR)

 地址偏移量:0x08

复位值:0x0000 0000

 

以太网

2.4 WWDG寄存器映像

WWDG 寄存器映像和复位值

以太网

3 程序设计

3.1 WWDG_Int例程

这段代码是基于 W55MH32 微控制器编写的,主要用于演示窗口看门狗(WWDG)的中断喂狗功能。窗口看门狗是一种特殊的看门狗,它有一个上窗口值和下窗口值,只有在计数器的值处于这两个窗口值之间时喂狗才有效。该程序通过配置窗口看门狗和中断,在窗口看门狗产生中断时进行喂狗操作,以防止系统复位。

1. 系统启动阶段

系统上电或复位后,程序开始执行。首先会初始化各种外设和窗口看门狗,然后通过串口输出系统时钟频率信息和提示信息。

2.正常运行阶段

// 窗口看门狗配置(在main函数中)
WWDG_SetPrescaler(WWDG_Prescaler_8);      // 设置预分频值
WWDG_SetWindowValue(0x5F);                // 设置窗口上限值
WWDG_Enable(0x7f);                        // 使能看门狗并设置初始值

// 中断配置
WWDG_ClearFlag();                         // 清除早期唤醒中断标志
NVIC_Configuration();                     // 配置NVIC中断优先级
WWDG_EnableIT();                          // 使能窗口看门狗中断

// 窗口看门狗中断处理函数
void WWDG_IRQHandler(void)
{
    WWDG_SetCounter(0x7f);                // 重置计数器值为0x7F(喂狗操作)
    WWDG_ClearFlag();                     // 清除中断标志
    printf("[WWDG] Feed dog! Counter reset to 0x7Fn"); 
}

窗口看门狗开始工作,计数器从初始值 0x7F 开始递减。

当计数器的值递减到窗口值 0x5F 时,会触发窗口看门狗中断,进入中断处理函数WWDG_IRQHandler()。

在中断处理函数中,计数器被重置为 0x7F,中断标志位被清除,然后继续正常运行。

只要中断处理函数能够及时响应并进行喂狗操作,系统将不会因为窗口看门狗超时而复位,会一直保持正常运行状态。

3. 异常情况

如果由于某种原因(如中断处理函数被阻塞、系统死机等)导致中断处理函数不能及时响应,计数器会继续递减到 0,此时窗口看门狗会产生复位信号,使系统重新启动,再次输出系统时钟频率信息和提示信息。

 

3.1.1 下载验证

在烧录完成后,串口会输出系统时钟频率信息及“WWDG Int Test.”和“Interrupt Feed Dog”提示,窗口看门狗会周期性触发中断,在中断处理函数中重新设置计数器和清除标志以防止系统复位,而主函数进入无限循环,无其他明显现象。 

以太网

 

3.2 WWDG_Reset例程

此程序是基于 W55MH32 单片机开发的,其主要目的是开展窗口看门狗(WWDG)的复位测试,同时配置了串口通信用于输出系统信息。

1.主函数main()

RCC_ClocksTypeDef clocks;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);
    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("WWDG Reset Test.n");

    WWDG_SetPrescaler(WWDG_Prescaler_8);
    WWDG_SetWindowValue(0x5F);
    WWDG_Enable(0x7f);

定义了RCC_ClocksTypeDef类型的变量clocks,用于存储系统时钟频率信息。

使能窗口看门狗(WWDG)的时钟。

调用delay_init函数进行延时初始化。

调用UART_Configuration()函数,以 115200 的波特率配置串口。

获取系统时钟频率,并通过printf函数将系统时钟频率信息打印输出。

打印 “WWDG Reset Test.” 信息。

对窗口看门狗进行配置,设置预分频器和窗口值,然后使能窗口看门狗。

进入无限循环。

2. 串口配置函数UART_Configuration()

定义了GPIO_InitTypeDef和USART_InitTypeDef类型的结构体变量。

使能USART1和GPIOA的时钟。

对GPIOA的引脚 9 进行配置,使其作为USART1的发送引脚(复用推挽输出)。

对GPIOA的引脚 10 进行配置,使其作为USART1的接收引脚(浮空输入)。

对USART1进行配置,设置波特率、数据位、停止位、校验位、硬件流控制和工作模式。

使能USART1。

3. 获取串口数据函数GetCmd()

定义了一个无符号 8 位整型变量tmp。

检查USART1的接收缓冲区是否非空,如果非空则读取接收到的数据并赋值给tmp。

返回接收到的数据。

uint8_t GetCmd(void)
{
    uint8_t tmp = 0;

    if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE))
    {
        tmp = USART_ReceiveData(USART1);
    }
    return tmp;
}

4. 串口发送字符函数SER_PutChar()

等待USART_TEST的发送完成标志位被置位。

发送一个字符到USART_TEST。

返回发送的字符。

5. 标准输出重定向函数fputc()

若要输出的字符是换行符n,则先发送回车符r。

调用SER_PutChar函数发送字符。

返回发送的字符。

3.2.1 下载验证

1. 正常下载情况

串口输出信息:程序下载到单片机后,若一切正常,通过串口调试助手可以看到系统时钟信息以及 WWDG Reset Test. 提示信息。

窗口看门狗复位:由于程序中没有对窗口看门狗进行喂狗操作,窗口看门狗计数器会不断递减。当计数器值减到 0x3F 以下时,单片机就会复位,然后重新开始执行程序,串口会再次输出系统时钟信息和提示信息。

以太网


审核编辑 黄宇

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分