stm32的按鍵掃瞄 操作暫存器 庫函式

2021-07-22 06:25:18 字數 2442 閱讀 5459

本例將實現stm32的按鍵掃瞄功能。

操作暫存器

stm32的i/o口作為輸入使用時,是通過讀取gpiox -> idr 暫存器的內容來讀取i/o口狀態的。

idr暫存器各位描述如下:

由於systick不能像庫函式那樣方便的產生中斷,通過查詢systick狀態位後,再查詢各管腳狀態反而更為不方便,所以和庫函式方法不一樣,直接查詢了管腳狀態來檢測按鍵。

**中呼叫 paout(x) 、 pain(x)等函式 在sys.h檔案中,參見:(sys.h **參照 

stm32 直接操作暫存器開發環境配置)

直接操作暫存器**:

#include #include "system.h"

//key 按鍵埠定義

#define key0 pain(0)// pa0

#define key1 pain(1)// pa1

#define key2 pain(2)// pa2

#define key3 pain(3)// pa3

//led 按鍵埠定義

#define led0 paout(4)// pa4

#define led1 paout(5)// pa5

#define led2 paout(6)// pa6

#define led3 paout(7)// pa7

void gpio_init(void);//初始化函式

void key_scan(void);

int main(void)

}void key_scan(void)

if(key1 == 0)

if(key2 == 0)

if(key3 == 0)

}}void gpio_init(void)

庫函式操作學過eda都應該知道乙個概念叫狀態機,觸發某一條件後進入另一狀態,再觸發乙個條件就進入下一狀態,不滿足條件就進入初態,或者不改變狀態。實現按鍵掃瞄的思路,大致如此。

systick 產生乙個20ms的定時,在中斷中去查詢各個管腳的按鍵是否按下。 有按鍵按下,進入狀態1.

如果按下,判斷是否是抖動,是則返回狀態0,不是則判斷是哪個管腳按鍵按下,實現相應功能後進入狀態2.

在狀態2中,檢測按鍵是否鬆開,鬆開則返回狀態0,否則不改變狀態。

**如下: main.c

#include "stm32f10x.h"

#define keyport gpioa

#define key0 gpio_pin_3

#define key1 gpio_pin_1

#define key2 gpio_pin_2

#define key3 gpio_pin_0

typedef enum

keyscanstate_typedef;

keyscanstate_typedef keyscanstate;

void rcc_configuration(void);

void gpio_configuration(void);

void systick_set(vu32 x);

int main(void)

void systick_handler(void)

break;

} case keyscanstate_1:

else if(gpio_readinputdatabit(keyport,key1) == 0)

else if(gpio_readinputdatabit(keyport,key2) == 0)

else if(gpio_readinputdatabit(keyport,key3) == 0)

keyscanstate = keyscanstate_2;

}else

break;

} case keyscanstate_2:

break;

} }}

void systick_set(vu32 x)}

void gpio_configuration(void)

void rcc_configuration(void)

/* 開啟apb2匯流排上的gpioa時鐘*/

rcc_apb2periphclockcmd(rcc_apb2periph_gpioa, enable);

//rcc_apb1periphclockcmd(rcc_apb1periph_tim2 , enable);

}

本例中將systick 中斷處理函式從 stm32f10x_it.c中移至了main.c中 避免了需要在stm32f10x_it.c中宣告外部變數等操作。

STM32蜂鳴器 暫存器

這次實驗犯了個笑話,竟然在巨集定義後面加分號.就像這樣 define 大家千萬不要學我,結果報錯expected expression,還苦惱半天,想為啥操作不了暫存器了?我真愚蠢!剛開始我也不會寫這些東西,其實摸清套路就好,rcc時鐘使能 gpio初始化 相關暫存器初始化 延時函式 串列埠等初始化...

STM32暫存器對映

1.對映即將記憶體的某段位址與某一暫存器對應,微控制器對函式的操作底層是操作暫存器,而暫存器最終是操作記憶體上對應的單元,2.各個暫存器對應的位址都是在st定義的起始位址上層層偏移得到 3.想要實現某功能可直接對此段記憶體寫進相應的值,即可賦予某一功能 4.stm32底層實際是先定義出外設基位址,然...

STM32的按鍵的暫存器配置學習2

本篇文章主要是學習以m3核心的stm32的按鍵的 按鍵的機械觸點斷開 閉合時,由於觸點的彈性作用,按鍵開關不會馬上穩點接通或斷開,會在按下後產生帶波紋訊號分別為 前抖動和後抖動 需要使用軟體消抖處理濾波 當然硬體也可實現消抖功能,與按鍵併聯乙個0.1uf的電容,硬體的消抖功能便是通過電容的充放電實現...