本例將實現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的電容,硬體的消抖功能便是通過電容的充放電實現...