單芯片解決方案,開啟全新體驗——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,成本低,適合集成度高的網關模組等場景,軟件使用方法一致。更多信息和資料請進入http://www.w5500.com/網站或者私信獲取。
此外,本W55MH32支持硬件加密算法單元,WIZnet還推出TOE+SSL應用,涵蓋TCP SSL、HTTP SSL以及 MQTT SSL等,為網絡通信安全再添保障。
為助力開發者快速上手與深入開發,基于W55MH32L這顆芯片,WIZnet精心打造了配套開發板。開發板集成WIZ-Link芯片,借助一根USB C口數據線,就能輕松實現調試、下載以及串口打印日志等功能。開發板將所有外設全部引出,拓展功能也大幅提升,便于開發者全面評估芯片性能。
若您想獲取芯片和開發板的更多詳細信息,包括產品特性、技術參數以及價格等,歡迎訪問官方網頁:http://www.w5500.com/,我們期待與您共同探索W55MH32的無限可能。
第六章 GPIO輸入——按鍵檢測
本章參考資料:《W55MH32中文參考手冊》按鍵檢測使用到GPIO外設的基本輸入功能。
1 硬件設計
按鍵機械觸點斷開、閉合時,由于觸點的彈性作用,按鍵開關不會馬上穩定接通或一下子斷開, 使用按鍵時會產生圖 按鍵抖動說明圖 中的帶波紋信號,需要用軟件消抖處理濾波,不方便輸入檢測。本實驗板連接的按鍵帶硬件消抖功能, 見下圖:
它利用電容充放電的延時,消除了波紋,從而簡化軟件的處理,軟件只需要直接檢測引腳的電平即可。
從按鍵的原理圖可知,這些按鍵在沒有被按下的時候,GPIO引腳的輸入狀態為低電平(按鍵所在的電路不通,引腳接地),當按鍵按下時, GPIO引腳的輸入狀態為高電平(按鍵所在的電路導通,引腳接到電源)。只要我們檢測引腳的輸入電平,即可判斷按鍵是否被按下。
若您使用的實驗板按鍵的連接方式或引腳不一樣,只需根據我們的工程修改引腳即可,程序的控制原理相同。
2 軟件設計
2.1 按鍵輸入檢測方式
按鍵輸入檢測方式分為定時掃描和外部中斷兩種,工作原理和優缺點如下文所示。本篇我們主要講解用外部中斷的方式進行按鍵輸入檢測。
2.1.1 按鍵掃描
工作原理:通過 CPU 定時或不斷地讀取按鍵所連接的 GPIO 引腳電平狀態,來判斷按鍵是否被按下。比如在一個循環中,反復檢測按鍵對應的引腳是高電平還是低電平 ,若原本是高電平,檢測到變為低電平,且經過消抖處理(一般通過延時,比如 5~10ms 再次檢測確認)后還是低電平,就認為按鍵被按下;松開時則相反。像獨立按鍵掃描,就是單獨檢測每個按鍵引腳;矩陣按鍵掃描則是按行或列掃描,通過行列交叉點判斷哪個按鍵動作 。
優點:
原理簡單易懂,實現起來相對容易,對于初學者友好。
可靈活控制掃描頻率和時機,在一些對按鍵檢測實時性要求不高,且系統資源較為充裕的場景下,能很好地工作。
缺點:
占用 CPU 資源,CPU 需要不斷執行掃描程序來檢測按鍵狀態,若系統中還有其他任務,會影響整體運行效率。
實時性較差,因為是定時或不斷掃描,不能及時響應按鍵動作,存在檢測延遲。
2.1.2 外部中斷
工作原理:當外部事件發生,比如按鍵按下使連接到單片機的外部中斷引腳上電平發生變化(可配置為上升沿觸發、下降沿觸發或雙邊沿觸發 ),單片機的中斷系統會迫使 CPU 暫停正在執行的程序,轉而去執行預先編寫好的中斷服務程序來處理該事件,處理完后再返回原來中斷的地方繼續執行原程序 。以按鍵為例,按鍵連接到外部中斷引腳,按下按鍵產生電平變化,觸發中斷請求,CPU 響應后進入中斷服務函數處理按鍵事件。
優點:
實時性強,能在外部事件發生的瞬間及時響應,快速處理事件,適用于對實時性要求高的場景,如工業控制中對突發信號的快速響應。
節省 CPU 資源,CPU 不需要一直輪詢檢測按鍵狀態,只有在外部事件觸發中斷時才會處理相關事務,提高了 CPU 使用效率。
缺點:
配置相對復雜,需要對中斷相關寄存器(如中斷使能寄存器、中斷優先級寄存器、中斷觸發方式寄存器等 )進行正確配置,對開發者要求較高。
多個中斷源同時請求時,需要合理處理中斷優先級和中斷嵌套等問題,否則可能導致系統運行異常。
2.2 編程要點
2.初始化GPIO目標引腳為輸入模式(浮空輸入);
3.編寫簡單測試程序,檢測按鍵的狀態。
2.3 代碼分析
1. 頭文件包含和宏定義
#include #include #include #include "delay.h" #include "w55mh32.h" #define GPIO_GROUP_TEST GPIOG #define GPIO_MODE_TEST GPIO_Mode_IPU #define GPIO_SPEED_TEST GPIO_Speed_50MHz #define GPIO_PIN_TEST GPIO_Pin_5 USART_TypeDef *USART_TEST = USART1;
頭文件包含:包含標準庫頭文件 stdlib.h、string.h、stdio.h,以及自定義的 delay.h 和 w55mh32.h 頭文件。
宏定義:
GPIO_GROUP_TEST:定義使用的 GPIO 組為 GPIOG。
GPIO_MODE_TEST:定義 GPIO 模式為上拉輸入模式 GPIO_Mode_IPU。
GPIO_SPEED_TEST:定義 GPIO 速度為 50MHz。
GPIO_PIN_TEST:定義使用的 GPIO 引腳為 GPIO_Pin_5。
USART_TEST:定義使用的 USART 外設為 USART1。
2. 函數聲明
void UART_Configuration(uint32_t bound); void GPIO_Configuration(void);
聲明了兩個函數:UART_Configuration 用于配置串口通信,GPIO_Configuration 用于配置 GPIO 引腳和外部中斷。
3. main 函數
int main(void) { RCC_ClocksTypeDef clocks; 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("GPIO IO Input Test.n"); GPIO_Configuration(); while (1) { } }
初始化操作:
delay_init():初始化延時函數。
UART_Configuration(115200):配置串口通信,波特率為 115200。
RCC_GetClocksFreq(&clocks):獲取系統時鐘頻率信息。
打印信息:打印系統時鐘頻率信息和測試提示信息。
GPIO 配置:調用 GPIO_Configuration() 函數配置 GPIO 引腳和外部中斷。
主循環:進入一個無限循環,等待外部中斷觸發。
4. GPIO_Configuration 函數
void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG | RCC_APB2Periph_AFIO, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_PIN_TEST; GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_TEST; GPIO_InitStructure.GPIO_Mode = GPIO_MODE_TEST; GPIO_Init(GPIO_GROUP_TEST, &GPIO_InitStructure); GPIO_EXTILineConfig(GPIO_PortSourceGPIOG, GPIO_PinSource5); NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); EXTI_InitStructure.EXTI_Line = EXTI_Line5; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); }
時鐘使能:使能 GPIOG 和復用功能 I/O(AFIO)的時鐘。
GPIO 初始化:配置 GPIOG 的 GPIO_Pin_5 為上拉輸入模式,速度為 50MHz。
外部中斷線配置:將 GPIOG 的 GPIO_Pin_5 映射到外部中斷線 EXTI_Line5。
NVIC 配置:
配置外部中斷線 5~9 的中斷通道 EXTI9_5_IRQn。
設置搶占優先級為 2,子優先級為 3,并使能該中斷通道。
EXTI 配置:配置外部中斷線 EXTI_Line5 為中斷模式,下降沿觸發,并使能該中斷線。
5. EXTI9_5_IRQHandler 函數
void EXTI9_5_IRQHandler(void) { if (EXTI_GetITStatus(EXTI_Line5) == SET) { delay_ms(10); if (GPIO_ReadInputDataBit(GPIOG, GPIO_Pin_5) == Bit_RESET) { printf("The key is pressedn"); } } EXTI_ClearITPendingBit(EXTI_Line5); }
中斷處理:
檢查外部中斷線 EXTI_Line5 的中斷標志位是否被置位。
進行 10ms 的消抖處理。
讀取 GPIOG 的 GPIO_Pin_5 的輸入電平,如果為低電平,則打印 "The key is pressed"。
清除外部中斷線 EXTI_Line5 的中斷標志位。
6. 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 的時鐘。
GPIO 初始化:
配置 GPIOA 的 GPIO_Pin_9 為復用推挽輸出模式,用于 USART1 的發送引腳。
配置 GPIOA 的 GPIO_Pin_10 為浮空輸入模式,用于 USART1 的接收引腳。
USART 初始化:
配置 USART1 的波特率、數據位、停止位、校驗位、硬件流控制和工作模式。
使能 USART1。
7. EXTI1_IRQHandler 函數
void EXTI1_IRQHandler(void) { if (EXTI_GetITStatus(EXTI_Line1) == SET) { delay_ms(10); if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1) == Bit_SET) { printf("The key is pressedn"); } } EXTI_ClearITPendingBit(EXTI_Line1); }
中斷處理:處理外部中斷線 EXTI_Line1 的中斷事件,與 EXTI9_5_IRQHandler 類似,但該中斷在本代碼中未被使用。
8. 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) { if (c == 'n') { SER_PutChar('r'); } return (SER_PutChar(c)); }
SER_PutChar 函數:將一個字符通過 USART 發送出去,等待發送完成標志位被置位。
fputc 函數:重定向標準輸出函數,將換行符 n 替換為回車符 r 后再發送。
2.4 下載驗證
把編譯好的程序下載到開發板并復位,按下按鍵可以在串口查看按鈕是否按下:
WIZnet 是一家無晶圓廠半導體公司,成立于 1998 年。產品包括互聯網處理器 iMCU?,它采用 TOE(TCP/IP 卸載引擎)技術,基于獨特的專利全硬連線 TCP/IP。iMCU? 面向各種應用中的嵌入式互聯網設備。
WIZnet 在全球擁有 70 多家分銷商,在香港、韓國、美國設有辦事處,提供技術支持和產品營銷。
香港辦事處管理的區域包括:澳大利亞、印度、土耳其、亞洲(韓國和日本除外)。
審核編輯 黃宇
-
WIZnet
+關注
關注
3文章
22瀏覽量
42362 -
GPIO
+關注
關注
16文章
1261瀏覽量
53470
發布評論請先 登錄
AS32X601驅動系列教程 GPIO_按鍵檢測詳解

RK3568驅動指南|第十二篇 GPIO子系統-第135章 GPIO子系統與pinctrl子系統相結合實驗

【紫光同創盤古PGX-Lite 7K教程】——(盤古PGX-Lite 7K開發板/PGC7KD-6IMBG256第六章)密碼鎖實驗例程
廣電計量入選工信部第六批產業技術基礎公共服務平臺
《DNESP32S3使用指南-IDF版_V1.6》第六章 新建基礎工程
gpio接口是干什么的 gpio四種輸入輸出模式怎么選擇
《DNK210使用指南 -CanMV版 V1.0》第六章 Kendryte K210固件燒錄
【「ARM MCU嵌入式開發 | 基于國產GD32F10x芯片」閱讀體驗】+書籍整體概況
第六章-電機驅動和PWM STM32項目

評論