當(dāng)前位置:首頁 > 單片機 > 單片機
[導(dǎo)讀]本例將實現(xiàn)stm32的按鍵掃描功能。操作寄存器stm32的I/O口作為輸入使用時,是通過讀取GPIOx -> IDR 寄存器的內(nèi)容來讀取I/O口狀態(tài)的。IDR寄存器各位描述如下:由于systick不能像庫函數(shù)那樣方便的產(chǎn)生中斷,通過查詢sys

本例將實現(xiàn)stm32的按鍵掃描功能。

操作寄存器

stm32的I/O口作為輸入使用時,是通過讀取GPIOx -> IDR 寄存器的內(nèi)容來讀取I/O口狀態(tài)的。

IDR寄存器各位描述如下:

由于systick不能像庫函數(shù)那樣方便的產(chǎn)生中斷,通過查詢systick狀態(tài)位后,再查詢各管腳狀態(tài)反而更為不方便,所以和庫函數(shù)方法不一樣,直接查詢了管腳狀態(tài)來檢測按鍵。

代碼中調(diào)用 PAout(x) 、 PAin(x)等函數(shù) 在sys.h文件中,參見:(sys.h 代碼參照stm32 直接操作寄存器開發(fā)環(huán)境配置)

直接操作寄存器代碼:

#include#include"system.h"http://Key按鍵端口定義#definekey0PAin(0)//PA0#definekey1PAin(1)//PA1#definekey2PAin(2)//PA2#definekey3PAin(3)//PA3//LED按鍵端口定義#defineLED0PAout(4)//PA4#defineLED1PAout(5)//PA5#defineLED2PAout(6)//PA6#defineLED3PAout(7)//PA7voidGpio_Init(void);//初始化函數(shù)voidKey_Scan(void);intmain(void){Rcc_Init(9);//系統(tǒng)時鐘設(shè)置Gpio_Init();//初始化與LED連接的硬件接口while(1){Key_Scan();}}voidKey_Scan(void){if(key0==0||key1==0||key2==0||key3==0)//if(GPIOA->IDR!=0x000F){delay(10000);//去抖動if(key0==0){while(key0==0);//檢測按鍵松開LED0=!LED0;}if(key1==0){while(key1==0);LED1=!LED1;}if(key2==0){while(key2==0);LED2=!LED2;}if(key3==0){while(key3==0);LED3=!LED3;}}}voidGpio_Init(void){RCC->APB2ENR|=1<<2;//使能PORTA時鐘GPIOA->CRL&=0X0000FFFF;//PA0~3設(shè)置為浮空輸入,PA4~7設(shè)置為推挽輸出GPIOA->CRL|=0X33334444;}


庫函數(shù)操作

學(xué)過EDA都應(yīng)該知道一個概念叫狀態(tài)機,觸發(fā)某一條件后進入另一狀態(tài),再觸發(fā)一個條件就進入下一狀態(tài),不滿足條件就進入初態(tài),或者不改變狀態(tài)。實現(xiàn)按鍵掃描的思路,大致如此。

Systick 產(chǎn)生一個20ms的定時,在中斷中去查詢各個管腳的按鍵是否按下。有按鍵按下,進入狀態(tài)1.

如果按下,判斷是否是抖動,是則返回狀態(tài)0,不是則判斷是哪個管腳按鍵按下,實現(xiàn)相應(yīng)功能后進入狀態(tài)2.

在狀態(tài)2中,檢測按鍵是否松開,松開則返回狀態(tài)0,否則不改變狀態(tài)。

代碼如下: main.c


#include"stm32f10x.h"#defineKEYPORTGPIOA#defineKEY0GPIO_Pin_3#defineKEY1GPIO_Pin_1#defineKEY2GPIO_Pin_2#defineKEY3GPIO_Pin_0typedefenum{KeyScanState_0=0x00,KeyScanState_1=0x01,KeyScanState_2=0x02,}KeyScanState_Typedef;KeyScanState_TypedefKeyScanState;voidRCC_Configuration(void);voidGPIO_Configuration(void);voidSysTick_Set(vu32x);intmain(void){RCC_Configuration();GPIO_Configuration();SysTick_Set(20000);while(1);}voidSysTick_Handler(void){vu16keyState;keyState=GPIO_ReadInputData(KEYPORT)&0x000f;switch(KeyScanState){caseKeyScanState_0:{if(keyState!=0x000f){KeyScanState=KeyScanState_1;}break;}caseKeyScanState_1:{if(keyState!=0x000f){if(GPIO_ReadInputDataBit(KEYPORT,KEY0)==0){GPIO_WriteBit(GPIOA,GPIO_Pin_4,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_4)));}elseif(GPIO_ReadInputDataBit(KEYPORT,KEY1)==0){GPIO_WriteBit(GPIOA,GPIO_Pin_5,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_5)));}elseif(GPIO_ReadInputDataBit(KEYPORT,KEY2)==0){GPIO_WriteBit(GPIOA,GPIO_Pin_6,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_6)));}elseif(GPIO_ReadInputDataBit(KEYPORT,KEY3)==0){GPIO_WriteBit(GPIOA,GPIO_Pin_7,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_7)));}KeyScanState=KeyScanState_2;}else{KeyScanState=KeyScanState_0;}break;}caseKeyScanState_2:{if(keyState==0x000f){KeyScanState=KeyScanState_0;}break;}}}voidSysTick_Set(vu32x){if(SysTick_Config(x*72))//配置錯誤返回1,max16777216{GPIO_SetBits(GPIOA,GPIO_Pin_7);//錯誤處理}}voidGPIO_Configuration(void){GPIO_InitTypeDefGPIO_InitStructure;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA,&GPIO_InitStructure);}voidRCC_Configuration(void){/*定義枚舉類型變量HSEStartUpStatus*/ErrorStatusHSEStartUpStatus;/*復(fù)位系統(tǒng)時鐘設(shè)置*/RCC_DeInit();/*開啟HSE*/RCC_HSEConfig(RCC_HSE_ON);/*等待HSE起振并穩(wěn)定*/HSEStartUpStatus=RCC_WaitForHSEStartUp();/*判斷HSE起是否振成功,是則進入if()內(nèi)部*/if(HSEStartUpStatus==SUCCESS){/*選擇HCLK(AHB)時鐘源為SYSCLK1分頻*/RCC_HCLKConfig(RCC_SYSCLK_Div1);/*選擇PCLK2時鐘源為HCLK(AHB)1分頻*/RCC_PCLK2Config(RCC_HCLK_Div1);/*選擇PCLK1時鐘源為HCLK(AHB)2分頻*/RCC_PCLK1Config(RCC_HCLK_Div2);/*設(shè)置FLASH延時周期數(shù)為2*/FLASH_SetLatency(FLASH_Latency_2);/*使能FLASH預(yù)取緩存*/FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);/*選擇鎖相環(huán)(PLL)時鐘源為HSE1分頻,倍頻數(shù)為9,則PLL輸出頻率為8MHz*9=72MHz*/RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);/*使能PLL*/RCC_PLLCmd(ENABLE);/*等待PLL輸出穩(wěn)定*/while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);/*選擇SYSCLK時鐘源為PLL*/RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);/*等待PLL成為SYSCLK時鐘源*/while(RCC_GetSYSCLKSource()!=0x08);}/*打開APB2總線上的GPIOA時鐘*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);}

本例中將Systick 中斷處理函數(shù)從 stm32f10x_it.c中移至了main.c中 避免了需要在stm32f10x_it.c中聲明外部變量等操作。


本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉