STM32 GPIO之二 按鍵例程 學習總結

2021-08-04 23:57:57 字數 4402 閱讀 2867

一. gpio的8種工作模式

1.4種輸入模式:

(1)上拉輸入模式(gpio_mode_ipu):在預設狀態下(gpio引腳無輸入),讀取得的gpio引腳資料為1,高電平。

(2)下拉輸入模式(gpio_mode_ipd):在預設狀態下(gpio引腳無輸入),讀取得的gpio引腳資料為0,低電平。

(3)浮空輸入模式(gpio_mode_in_floating):一般把這種模式用於標準的通訊協議如i²c、usart的接收端。

(4)模擬輸入模式(gpio_mode_ain):使用adc外設時,必須設定為模擬輸入模式。

2.4種輸出模式:

(1)推挽輸出模式(gpio_mode_out_pp):一般應用在輸出電平為0到3.3伏的場合。

(2)開漏輸出模式(gpio_mode_out_od):一般應用在電平不匹配的場合。

(3)復用推挽輸出模式:如gpio的引腳用作串列埠的輸出。

(4)復用開漏輸出模式:如在ic、smbus這些需要線與功能的復用場合。

二、開發板原理圖如下:

三、測試**:

實現功能:led1亮,按下按鍵時led1滅,再按下按鍵時led1亮,如此迴圈。

/*配置led用到的i/o口*/

void led_gpio_config(void)

/*led.h*/

#ifndef __led_h

#define __led_h

#include "stm32f10x.h"

#define on 0

#define off 1

#define led1(a) if(a) \

gpio_setbits(gpiod,gpio_pin_3);\

else \

gpio_resetbits(gpiod,gpio_pin_3)

#define led2(a) if(a) \

gpio_setbits(gpiod,gpio_pin_6);\

else \

gpio_resetbits(gpiod,gpio_pin_6)

#define led3(a) if(a) \

gpio_setbits(gpiob,gpio_pin_5);\

else \

gpio_resetbits(gpiob,gpio_pin_5)

void led_gpio_config(void);

#endif /*__led_h*/

/*key.c*/

#include "key.h"

void delay(u16 time)}/*

*函式名:key_gpio_config

*描述 :配置按鍵用到的i/o口

*輸入 :無

*輸出 :無

*/void key_gpio_config(void)

/**函式名:key_scan(gpio_typedef* gpiox,u16 gpio_pin)

*描述 :檢測是否有按鍵按下

*輸入 :gpiox:x 可以是a,b,c,d或者e

* gpio_pin:待讀取的埠位

*輸出 :key_off(沒按下按鍵)、key_on(按下按鍵)

*/u8 key_scan(gpio_typedef* gpiox,u16 gpio_pin)

else

return key_off;

} else

return key_off;

}

/*key.h*/

#ifndef __key_h

#define __key_h

#include "stm32f10x.h"

#define key_on 0

#define key_off 1

void key_gpio_config(void);

u8 key_scan(gpio_typedef* gpiox,u16 gpio_pin);

void delay(u16 time);

#endif /*__led_h*/

/*main.c*/

#include "stm32f10x.h"

#include "led.h"

#include "key.h"

int main (void)

}}

四、範例

/*stm32v5_led.c*/

#include "stm32v5_led.h"

static led_gpio_t leds_gpio[max_led] =

, /* led1 用的gpb5 */

, /* led2 用的gpd6 */

, /* led3 用的gpd3 */

};void init_led_gpio(void)

/*stm32v5_led.h*/

#ifndef __stm32v5_led_h

#define __stm32v5_led_h

#include"stm32f10x.h"

#define on 1

#define off 0

enum

;typedef struct led_gpio_s

led_gpio_t;

extern void init_led_gpio(void);

extern void turn_led(int which, int cmd);

#endif

/*stm32v5_key.c*/

#include "stm32f10x.h"

#include "stm32f10x_exti.h"

#include "stm32f10x_rcc.h"

#include "misc.h"

#include "stm32v5_led.h"

#include "stm32v5_key.h"

#define define_pin_exti(group, pin, irqn, subpriority) \

void init_p##group##pin##_as_exti(void) \

/* key1(pc5) configured as exti5, subpriority as 1 */

define_pin_exti(c, 5, exti9_5_irqn, 1)

/* key2(pc2) configured as exti2, subpriority as 2 */

define_pin_exti(c, 2, exti2_irqn, 2)

/* key3(pc3) configured as exti3, subpriority as 3 */

define_pin_exti(c, 3, exti3_irqn, 3)

/* pc5 key1 interrupt handler */

void exti9_5_irqhandler(void)

}/* pc2 key2 interrupt handler */

void exti2_irqhandler(void)

}/* pc3 key3 interrupt handler */

void exti3_irqhandler(void)

}void init_keys_interrupt(void)

/*stm32v5_key.h*/

#ifndef __stm32v5_key_h

#define __stm32v5_key_h

extern void init_keys_interrupt(void);

#endif

/*main.c*/

#include "stm32f10x.h"

#include "stm32v5_led.h"

#include "stm32v5_key.h"

int main(void)

}

stm32 GPIO 輸入 按鍵檢測

使能 gpio 埠時鐘 初始化 gpio 目標引腳為輸入模式 浮空輸入 編寫簡單測試程式,檢測按鍵的狀態,實現按鍵控制 led 燈。1.按鍵引腳巨集定義 1 引腳定義 2 define key1 gpio clk rcc apb2periph gpioa 3 define key1 gpio por...

STM32 GPIO 流水燈例程 學習總結

通過控制led燈,熟悉stm32的儲存器結構 位址對映 時鐘樹 庫檔案 利用庫的方法及開發工程的步驟,建立stm32的開發思想。這是我建立的第乙個工程,由於涉及面較廣,知識點分散,在此做乙個總結。1 為控制led燈,知道要使用gpio外設。gpio general purpose i o i o引腳...

STM32GPIO部分介紹

最近在老師交給了乙個專案,需要用到stm32微控制器,這裡就在學習的過程中所注意到的一些地方或細節部分記錄了下來,筆者所使用的是stm32f407zgt6晶元 探索者 檢視晶元的資料手冊 這個 對每個i o口的功能進行了很詳細的介紹。每個i o除了作為i o使用外,還可以作為其他的復用。已以pe2口...