STM32自學筆記(一)GPIO配置與使用

2021-09-10 12:55:31 字數 3190 閱讀 9116

由於是stm32學習的第乙個章節,會囉嗦一些,旨在幫助和我一樣剛接觸stm32時一頭霧水的朋友,更好地理解、學會它。

很多學過51,剛開始學stm32的朋友可能會和我一樣十分不適應,在我看來,stm32與51**最大的區別在於,stm32幾乎所有外設都要進行配置過後才能使用,比如說你想操作乙個io口,那麼首先要對這個io口所掛載的時鐘進行使能,再對此io口進行配置、使能。這也是為什麼51點亮乙個led只需要一行**,你找到的stm32的**卻看著都讓人頭大的原因。

為什麼要進行初始化(配置)?就gpio來說,51的io口很簡單,能且只能實現高低電平的輸入輸出;而stm32可以在此基礎上,指定gpio輸入輸出的型別,速率等一系列引數,正因為stm32可以實現更多的功能,因此要進行初始化,指定gpio的引數。實際上配置完成後,就使用上來說是不會比51複雜到哪去的。因此,先耐著性子學會gpio的配置吧。

首先要適應這種stm32的**風格:對每個模組都寫乙個***_init()函式進行初始化(配置)。至於這個函式裡要寫些什麼,視這個模組用到哪些功能而定。比如說我想寫乙個程式控制led的亮滅,需要用到gpio,所以要做以下的事情:對gpio的時鐘進行使能、對gpio進行初始化。把這兩個過程寫在乙個名為led_init()的函式中,這樣只需要在main()中呼叫一下led_init()就可以實現led模組的初始化了。

本章僅講解gpio的初始化,其他功能怎麼初始化在以後的章節中會進行講解。

首先,我們要認識下面這個結構體:gpio_inittypedef

typedef struct 

gpio_inittypedef;

它具有三個成員變數:gpio_pingpio_speedgpio_mode

對於gpio的配置其實就是指定這三個引數的值。接下來通過乙個例項講解這三個變數的含義。

gpio_inittypedef  gpio_initstructure; 

gpio_initstructure.gpio_pin = gpio_pin_5; //led0-->pb.5 埠配置

gpio_initstructure.gpio_mode = gpio_mode_out_pp; //推挽輸出

gpio_initstructure.gpio_speed = gpio_speed_50mhz;//速度 50mhz

gpio_init(gpiob, &gpio_initstructure);//根據設定引數配置 gpio

這便是gpio初始化的常用格式(事實上stm32任何外設的初始化都可以參照這種格式)

1.首先,要例項化乙個gpio_inittypedef物件,名為gpio_initstructure

2.接下來對它的三個成員變數進行配置。其中gpio_pin用來設定是要初始化哪個或者哪些io口(這裡要注意,決定的不是a、b、c...,而是gpiox後面的數字,也就是16個引腳中的哪乙個);gpio_mode是用來設定輸出輸入模式(gpio共有8種模式,這裡用到的是推挽輸出);gpio_speed是io口速度設定,有2m、10m、50m三個可選值。

3.最後,呼叫一下gpio_init()函式,gpio的初始化就完成了。gpio_init()第乙個引數填gpiox,也就是確定a、b、c...,結合前面設定的gpio_pin,就確定了具體是哪乙個io口;第二個引數填&gpio_initstructure,將我們之前設定好的引數通過gpio_initstructure這個物件輸入進去,實現gpio的初始化。

接下來給出乙個完整的gpio初始化例項,用了兩個io口(pb5、pe5)分別控制兩個led。

void led_init(void)

認真理解這段**。其中有兩句**是之前沒有提到過的,分別是時鐘的使能與gpio_setbits()這個函式。

gpio 是掛載在 apb2 匯流排上的外設,在韌體庫中對掛載在 apb2 匯流排上的外設時鐘使能是通過函式rcc_apb2periphclockcmd()來實現的,至於其他情況下時鐘使能是什麼函式,在以後的章節中會提到。

至於gpio_setbits()在下文進行講解。

gpio配置完成後,就可以對io口進行操作了。常用兩種方式進行操作,效果是一樣的。

在sys.h中有以下定義

#define pbout(n)   bit_addr(gpiob_odr_addr,n)  //輸出

#define pbin(n) bit_addr(gpiob_idr_addr,n) //輸入

......

//這裡由於篇幅關係僅給出gpiob的定義,其餘gpio埠都有類似定義

這使io口的操作變得和51一樣簡單

#define led pbout(5)		//define下提高程式可讀性

...led = 1; //輸出高電平

led = 0; //輸出低電平

led_in = pbin(5); //讀取pb.5電平

可以直接用pbout(5)=1進行gpiob.5的高電平輸出,也可以像51一樣先巨集定義改個名稱,增強可讀性。

//輸出

gpio_setbits(gpiob,gpio_pin_8); 輸出高電平

gpio_resetbits(gpiob,gpio_pin_8); 輸出低電平

//輸入

gpio_readinputdatabit(gpioe,gpio_pin_2) //讀取pe.2電平

tips:操作io口前,必須先進行對應的gpio初始化

stm32學習筆記 GPIO

2011 03 06 15 10 stm32基本上每個引腳都有8種配置模式 浮空輸入 帶弱上拉輸入 帶弱下拉輸入 模擬輸入 推挽輸出 開漏輸出 復用推挽輸出 復用開漏輸出 通常有5種方式使用某個引腳功能,它們的配置方式如下 1 作為普通gpio輸入 根據需要配置該引腳為浮空輸入 帶弱上拉輸入或帶弱下...

STM32學習筆記 GPIO

該微控制器在gpio功能方面有以下特點 1 4種輸入模式 gpio mode ain 模擬輸入 gpio mode in floating 浮空輸入 gpio mode ipd 下拉輸入 gpio mode ipu 上拉輸入 2 4種輸出模式 gpio mode out od 開漏輸出 gpio m...

STM32中的GPIO筆記

1.gpio是stm32可控制的引腳,stm32的gpio被分成很多組,每組有16個引腳。每個gpio埠包含 2個32位配置暫存器 crl crh 2個32位資料暫存器 idr odr 1個32位復位暫存器 bsrr 1個16位復位暫存器 brr 和1個32位鎖定暫存器。2.gpio埠的每個位可以配...