單芯片解決方案,開啟全新體驗——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 提供了兩種選擇:QFN100和QFN68。
W55MH32L采用QFN100封裝版本,尺寸為12x12mm,其資源豐富,專為各種復雜工控場景設計。它擁有66個GPIO、3個ADC、12通道DMA、17個定時器、2個I2C、5個串口、2個SPI接口(其中1個帶I2S接口復用)、1個CAN、1個USB2.0以及1個SDIO接口。如此豐富的外設資源,能夠輕松應對工業控制中多樣化的連接需求,無論是與各類傳感器、執行器的通信,還是對復雜工業協議的支持,都能游刃有余,成為復雜工控領域的理想選擇。 同系列還有QFN68封裝的W55MH32Q版本,該版本體積更小,僅為8x8mm,成本低,適合集成度高的網關模組等場景,軟件使用方法一致。更多信息和資料請進入網站或者私信獲取。
此外,本W55MH32支持硬件加密算法單元,WIZnet還推出TOE+SSL應用,涵蓋TCP SSL、HTTP SSL以及 MQTT SSL等,為網絡通信安全再添保障。
為助力開發者快速上手與深入開發,基于W55MH32L這顆芯片,WIZnet精心打造了配套開發板。開發板集成WIZ-Link芯片,借助一根USB C口數據線,就能輕松實現調試、下載以及串口打印日志等功能。開發板將所有外設全部引出,拓展功能也大幅提升,便于開發者全面評估芯片性能。
若您想獲取芯片和開發板的更多詳細信息,包括產品特性、技術參數以及價格等,歡迎訪問官方網頁,我們期待與您共同探索W55MH32的無限可能。
第二十四章 WWDG——窗口看門狗
本章參考資料:《W55MH32參考手冊》WWDG章節。
學習本章時,配合《W55MH32參考手冊》WWDG章節一起閱讀,效果會更佳,特別是涉及到寄存器說明的部分。
1 WWDG簡介
W55MH32有兩個看門狗,一個是獨立看門狗,一個是窗口看門狗。我們知道獨立看門狗的工作原理就是一個遞減計數器不斷的往下遞減計數, 當減到0之前如果沒有喂狗的話,產生復位。窗口看門狗跟獨立看門狗一樣,也是一個遞減計數器不斷的往下遞減計數, 當減到一個固定值0X40時還不喂狗的話,產生復位,這個值叫窗口的下限,是固定的值,不能改變。這個是跟獨立看門狗類似的地方, 不同的地方是窗口看門狗的計數器的值在減到某一個數之前喂狗的話也會產生復位,這個值叫窗口的上限,上限值由用戶獨立設置。 窗口看門狗計數器的值必須在上窗口和下窗口之間才可以喂狗,這就是窗口看門狗中窗口兩個字的含義。
RLR是重裝載寄存器,用來設置獨立看門狗的計數器的值。TR是窗口看門狗的計數器的值,由用戶獨立設置,WR是窗口看門狗的上窗口值,由用戶獨立設置。
2 WWDG功能框圖剖析
WWDG功能框圖如下:
2.1 窗口看門狗時鐘
窗口看門狗時鐘來自PCLK1,PCLK1最大是108M,由RCC時鐘控制器開啟。
2.2 計數器時鐘
計數器時鐘由CK計時器時鐘經過預分頻器分頻得到,分頻系數由配置寄存器CFR的位8:7 WDGTB[1:0]配置,可以是[0,1,2,3], 其中CK計時器時鐘=PCLK1/4096,除以4096是手冊規定的,沒有為什么。所以計數器的時鐘CNT_CK=PCLK1/4096/(2^WDGTB), 這就可以算出計數器減一個數的時間T= 1/CNT_CK = Tpclk1 * 4096 * (2^WDGTB)。
2.3 計數器
窗口看門狗的計數器是一個遞減計數器,共有7位,其值存在控制寄存器CR的位6:0,即T[6:0],當7個位全部為1時是0X7F, 這個是最大值,當遞減到T6位變成0時,即從0X40變為0X3F時候,會產生看門狗復位。這個值0X40是看門狗能夠遞減到的最小值, 所以計數器的值只能是:0X40~0X7F之間,實際上真正用來計數的是T[5:0]。當遞減計數器遞減到0X40的時候,還不會馬上產生復位, 如果使能了提前喚醒中斷:CFR位9EWI置1,則產生提前喚醒中斷,如果真進入了這個中斷的話,就說明程序肯定是出問題了, 那么在中斷服務程序里面我們就需要做最重要的工作,比如保存重要數據,或者報警等,這個中斷我們也叫它死前中斷。
2.4 窗口值
我們知道窗口看門狗必須在計數器的值在一個范圍內才可以喂狗,其中下窗口的值是固定的0X40,上窗口的值可以改變, 具體的由配置寄存器CFR的位6:0 W[6:0]設置。其值必須大于0X40,如果小于或者等于0X40就是失去了窗口的價值,而且也不能大于計數器的值, 所以必須得小于0X7F。那窗口值具體要設置成多大?這個得根據我們需要監控的程序的運行時間來決定。如果我們要監控的程序段A運行的時間為Ta, 當執行完這段程序之后就要進行喂狗,如果在窗口時間內沒有喂狗的話,那程序就肯定是出問題了。一般計數器的值TR設置成最大0X7F,窗口值為WR, 計數器減一個數的時間為T,那么時間:(TR-WR)*T應該稍微小于Ta即可,這樣就能做到剛執行完程序段A之后喂狗,起到監控的作用,這樣也就可以算出WR的值是多少。
2.5 計算看門狗超時時間
這個圖來自數據手冊,從圖我們知道看門狗超時時間:Twwdg = Tpclk1 x 4096 x 2^wdgtb x (T[5:0] + 1) ms, 當PCLK1 = 36MHZ時,WDGTB取不同的值時有最小和最大的超時時間,那這個最小和最大的超時時間該怎么理解,又是怎么算出來的? 講起來有點繞,這里我稍微講解下WDGTB=0時是怎么算的。遞減計數器有7位T[6:0] ,當位6變為0的時候就會產生復位,實際上有效的計數位是T[5:0], 而且T6必須先設置為1。如果T[5:0]=0時,遞減計數器再減一次,就產生復位了, 那這減一的時間就等于計數器的周期=1/CNT_CK = Tpclk1 * 4096 * (2^WDGTB) = 1/36 * 4096 *2^0 =113.7us, 這個就是最短的超時時間。如果T[5:0]全部裝滿為1,即63,當他減到0X40變成0X3F時,所需的時間就是最大的超時時間=113.7*2^5=113.7*64=7.2768ms。 同理,當WDGTB等于1/2/3時,代入公式即可。
3 WWDG使用方法
WWDG一般被用來監測,由外部干擾或不可預見的邏輯條件造成的應用程序背離正常的運行序列而產生的軟件故障。比如一個程序段正常運行的時間是50ms, 在運行完這個段程序之后緊接著進行喂狗,如果在規定的時間窗口內還沒有喂狗,那就說明我們監控的程序出故障了,跑飛了,那么就會產生系統復位,讓程序重新運行。
4 WWDG的中斷測試
4.1 代碼解析
主要用于進行窗口看門狗(WWDG)的中斷測試。以下是對代碼各部分的詳細解釋:
1.頭文件包含
#include #include #include #include "delay.h" #include "w55mh32.h"
stdlib.h、string.h 和 stdio.h 是標準 C 庫頭文件,分別提供通用工具函數、字符串操作函數和標準輸入輸出功能。
delay.h 是自定義頭文件,可能用于實現延時功能。
w55mh32.h 是頭文件。
2. 全局變量定義
USART_TypeDef *USART_TEST = USART1;
定義了一個指向 USART_TypeDef 類型的指針 USART_TEST,并初始化為 USART1,后續串口操作將使用 USART1。
3. 函數聲明
void UART_Configuration(uint32_t bound); uint8_t GetCmd(void); void NVIC_Configuration(void);
UART_Configuration()函數用于配置串口通信,參數 bound 為波特率。
GetCmd()函數用于從串口接收數據。
NVIC_Configuration()函數用于配置嵌套向量中斷控制器(NVIC)。
4. main()函數
int main(void) { 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 Int Test.n"); printf("Interrupt Feed Dogn"); WWDG_SetPrescaler(WWDG_Prescaler_8); WWDG_SetWindowValue(0x5F); WWDG_Enable(0x7f); WWDG_ClearFlag(); NVIC_Configuration(); WWDG_EnableIT(); while (1); }
定義 RCC_ClocksTypeDef 類型的變量 clocks,用于存儲系統時鐘頻率信息。
使能窗口看門狗(WWDG)的時鐘。
調用 delay_init()函數初始化延時功能。
調用 UART_Configuration()函數配置串口通信,波特率為 115200。
調用 RCC_GetClocksFreq()函數獲取系統時鐘頻率信息,并通過串口輸出。
輸出提示信息,表明進行窗口看門狗中斷測試以及采用中斷方式喂狗。
配置窗口看門狗的預分頻器、窗口值,并使能窗口看門狗。
清除窗口看門狗的標志位。
調用 NVIC_Configuration()函數配置 NVIC。
使能窗口看門狗的中斷功能。
進入無限循環,程序在此處暫停。
5. WWDG_IRQHandler()函數
void WWDG_IRQHandler(void) { WWDG_SetCounter(0x7f); WWDG_ClearFlag(); }
這是窗口看門狗的中斷服務函數。當窗口看門狗產生中斷時,會執行該函數。函數中:
將窗口看門狗的計數器值設置為 0x7f,即喂狗操作,防止系統復位。
清除窗口看門狗的標志位,以便能處理下一次中斷。
6. NVIC_Configuration()函數
void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); }
7. UART_Configuration()函數
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); }
此函數用于配置 USART1 串口通信,具體步驟如下:
使能 USART1 和 GPIOA 的時鐘。
配置 GPIOA 的 Pin9 為復用推挽輸出模式,作為 USART1 的發送引腳。
配置 GPIOA 的 Pin10 為浮空輸入模式,作為 USART1 的接收引腳。
配置 USART1 的波特率、數據位、停止位、奇偶校驗位、硬件流控制和工作模式。
初始化 USART1 并使能。
8. GetCmd()函數
uint8_t GetCmd(void) { uint8_t tmp = 0; if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE)) { tmp = USART_ReceiveData(USART1); } return tmp; }
該函數用于從 USART1 接收數據。若接收緩沖區非空標志位 USART_FLAG_RXNE 被置位,則從接收緩沖區讀取數據并返回。
9. SER_PutChar()函數
int SER_PutChar(int ch) { while (!USART_GetFlagStatus(USART_TEST, USART_FLAG_TC)); USART_SendData(USART_TEST, (uint8_t)ch); return ch; }
此函數用于向 USART1 發送單個字符。等待發送完成標志位 USART_FLAG_TC 被置位后,將字符寫入發送緩沖區并返回該字符。
10. fputc()函數
int fputc(int c, FILE *f) { if (c == 'n') { SER_PutChar('r'); } return (SER_PutChar(c)); }
這是標準庫 fputc()函數的重定向實現,用于將字符輸出到串口。若要輸出的字符為換行符 n,先輸出回車符 r,再輸出換行符。
4.2 下載驗證
該程序的主要功能是配置串口通信,輸出系統時鐘頻率信息,同時使能窗口看門狗的中斷功能,并通過中斷服務函數進行喂狗操作,以防止系統復位。
如果想要了解確認這段代碼是否在正確執行“喂狗”(即重置WWDG計數器),在 WWDG_IRQHandler 中斷處理函數中添加串口打印語句,每次觸發中斷時輸出調試信息。
修改代碼:
void WWDG_IRQHandler(void) { WWDG_SetCounter(0x7f); // 喂狗 WWDG_ClearFlag(); // 清除中斷標志 printf("[WWDG] Feed dog! Counter reset to 0x7Fn"); // 添加調試輸出 }
然后查看串口打印數據,查看到正在執行“喂狗”:
5 WWDG_Reset
5.1 代碼解析
1. 頭文件和全局變量
#include #include #include #include "delay.h" #include "w55mh32.h" USART_TypeDef *USART_TEST = USART1;
包含了標準庫和自定義的頭文件。
USART_TEST 是一個指向 USART1 的指針,用于后續串口操作。
2. 函數聲明
void UART_Configuration(uint32_t bound); uint8_t GetCmd(void);
UART_Configuration()函數用于配置串口通信。
GetCmd()函數用于從串口接收數據。
3. main()函數
int main(void) { 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); while (1); }
時鐘和外設初始化:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE) 使能窗口看門狗(WWDG)的時鐘。
delay_init() 初始化延時函數。
UART_Configuration(115200) 配置串口通信,波特率為 115200。
RCC_GetClocksFreq(&clocks) 獲取系統時鐘頻率信息。
串口輸出信息:
通過 printf()函數輸出系統時鐘頻率信息和測試提示信息。
窗口看門狗配置:
WWDG_SetPrescaler(WWDG_Prescaler_8) 設置窗口看門狗的預分頻器為 8。
WWDG_SetWindowValue(0x5F) 設置窗口值為 0x5F。
WWDG_Enable(0x7f) 使能窗口看門狗,初始計數值為 0x7f。
主循環:
while (1); 程序進入無限循環,由于沒有對窗口看門狗進行喂狗操作,一段時間后窗口看門狗會觸發復位。
4. UART_Configuration()函數
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); }
使能 USART1 和 GPIOA 的時鐘。
配置 PA9 為復用推挽輸出,作為串口發送引腳;配置 PA10 為浮空輸入,作為串口接收引腳。
配置串口的波特率、數據位、停止位、奇偶校驗等參數。
初始化串口并使能。
5. GetCmd()函數
uint8_t GetCmd(void) { uint8_t tmp = 0; if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE)) { tmp = USART_ReceiveData(USART1); } return tmp; }
檢查串口接收緩沖區是否有數據(USART_FLAG_RXNE 標志位)。
如果有數據,從串口接收一個字節的數據并返回。
6. SER_PutChar()和fputc()函數
int SER_PutChar(int ch) { while (!USART_GetFlagStatus(USART_TEST, USART_FLAG_TC)); USART_SendData(USART_TEST, (uint8_t)ch); return ch; } int fputc(int c, FILE *f) { /* Place your implementation of fputc here */ /* e.g. write a character to the USART */ if (c == 'n') { SER_PutChar('r'); } return (SER_PutChar(c)); }
SER_PutChar()函數用于通過串口發送一個字符,等待發送完成標志位(USART_FLAG_TC)置位后再發送。
fputc()函數是 printf()函數的底層實現,當輸出換行符 n 時,會先發送回車符 r,然后再發送字符。
這段代碼的主要目的是測試窗口看門狗的復位功能。程序啟動后,會輸出系統時鐘信息和測試提示信息,然后配置并使能窗口看門狗。由于在主循環中沒有對窗口看門狗進行喂狗操作,窗口看門狗會在一段時間后觸發復位,重新啟動程序。同時,代碼還實現了串口通信功能,用于輸出信息和接收數據。
5.2 下載驗證
WIZnet 是一家無晶圓廠半導體公司,成立于 1998 年。產品包括互聯網處理器 iMCU?,它采用 TOE(TCP/IP 卸載引擎)技術,基于獨特的專利全硬連線 TCP/IP。iMCU? 面向各種應用中的嵌入式互聯網設備。
WIZnet 在全球擁有 70 多家分銷商,在香港、韓國、美國設有辦事處,提供技術支持和產品營銷。
香港辦事處管理的區域包括:澳大利亞、印度、土耳其、亞洲(韓國和日本除外)。
-
單片機
+關注
關注
6066文章
44946瀏覽量
648294 -
看門狗
+關注
關注
10文章
581瀏覽量
71639 -
開發板
+關注
關注
25文章
5589瀏覽量
103178 -
WWDG
+關注
關注
0文章
21瀏覽量
5740
發布評論請先 登錄
淺析窗口看門狗( WWDG)
介紹窗口看門狗(WWDG)
WWDG窗口看門狗的實驗步驟
STM32看門狗配置(獨立看門狗IWDG和窗口看門狗WWDG)

【MCU】基于STM32CubeMX 實現窗口看門狗 WWDG

【STM32】窗口看門狗

STM32L051使用HAL庫操作實例(7)-(WWDG)窗口看門狗實驗

評論