STM32學(xué)習(xí)筆記之GPIO口的使用
一、GPIO口簡介
本文引用地址:http://m.butianyuan.cn/article/201611/319282.htm1、
1.1 一般來說STM32的輸入輸出管腳有以下8種配置方式:
輸入
① 浮空輸入_IN_FLOATING
② 帶上拉輸入_IPU
③ 帶下拉輸入_IPD
④ 模擬輸入_AIN
輸出
⑤ 開漏輸出_OUT_OD
⑥ 推挽輸出_OUT_PP
⑦ 復(fù)用功能的推挽輸出_AF_PP
⑧ 復(fù)用功能的開漏輸出_AF_OD
2、輸入輸出模式詳解
一般我們平時用的最多的也就是推挽輸出、開漏輸出、上拉輸入,介紹如下:
2.1推挽輸出:
2.2開漏輸出:
開漏形式的電路有以下幾個特點:
1、利用外部電路的驅(qū)動能力,減少IC內(nèi)部的驅(qū)動。當(dāng)IC內(nèi)部MOSFET導(dǎo)通時,驅(qū)動電流是從外部的VCC流經(jīng)R pull-up ,MOSFET到GND。IC內(nèi)部僅需很小的柵極驅(qū)動電流。
2、一般來說,開漏是用來連接不同電平的器件,匹配電平用的,因為開漏引腳不連接外部的上拉電阻時,只能輸出低電平,如果需要同時具備輸出高電平的功能,則需要接上拉電阻,很好的一個優(yōu)點是通過改變上拉電源的電壓,便可以改變傳輸電平。比如加上上拉電阻就可以提供TTL/CMOS電平輸出等。(上拉電阻的阻值決定了邏輯電平轉(zhuǎn)換的沿的速度。阻值越大,速度越低功耗越小,所以負(fù)載電阻的選擇要兼顧功耗和速度。)
3、 OPEN-DRAIN提供了靈活的輸出方式,但是也有其弱點,就是帶來上升沿的延時。因為上升沿是通過外接上拉無源電阻對負(fù)載充電,所以當(dāng)電阻選擇小時延時就小,但功耗大;反之延時大功耗小。所以如果對延時有要求,則建議用下降沿輸出。
4、可以將多個開漏輸出的Pin,連接到一條線上。通過一只上拉電阻,在不增加任何器件的情況下,形成“與邏輯”關(guān)系。這也是I2C,SMBus等總線判斷總線占用狀態(tài)的原理。
補(bǔ)充:什么是“線與”?:
在一個結(jié)點(線)上, 連接一個上拉電阻到電源 VCC 或 VDD 和 n 個 NPN 或 NMOS 晶體管的集電極 C 或漏極 D, 這些晶體管的發(fā)射極 E 或源極 S 都接到地線上, 只要有一個晶體管飽和,這個結(jié)點(線)就被拉到地線電平上。 因為這些晶體管的基極注入電流(NPN)或柵極加上高電平(NMOS), 晶體管就會飽和,所以這些基極或柵極對這個結(jié)點(線)的關(guān)系是或非 NOR 邏輯。 如果這個結(jié)點后面加一個反相器, 就是或 OR 邏輯。
其實可以簡單的理解為:在所有引腳連在一起時,外接一上拉電阻,如果有一個引腳輸出為邏輯0,相當(dāng)于接地,與之并聯(lián)的回路“相當(dāng)于被一根導(dǎo)線短路”,所以外電路邏輯電平便為0,只有都為高電平時,與的結(jié)果才為邏輯1。
2.3浮空輸入 :對于浮空輸入,一直沒找到很權(quán)威的解釋,只好從以下圖中去理解了。
2.4
2.5
二、GPIO口配置
1、根據(jù)具體應(yīng)用配置為輸入或輸出
① 作為普通GPIO輸入:
根據(jù)需要配置該引腳為浮空輸入、帶弱上拉輸入或帶弱下拉輸入,同時不要使能該引腳對應(yīng)的所有復(fù)用功能模塊。
② 作為普通GPIO輸出:
根據(jù)需要配置該引腳為推挽輸出或開漏輸出,同時不要使能該引腳對應(yīng)的所有復(fù)用功能模塊。
③ 作為普通模擬輸入:
配置該引腳為模擬輸入模式,同時不要使能該引腳對應(yīng)的所有復(fù)用功能模塊。
④ 作為內(nèi)置外設(shè)的輸入:
根據(jù)需要配置該引腳為浮空輸入、帶弱上拉輸入或帶弱下拉輸入,同時使能該引腳對應(yīng)的某個復(fù)用功能模塊。
⑤ 作為內(nèi)置外設(shè)的輸出:
根據(jù)需要配置該引腳為復(fù)用推挽輸出或復(fù)用開漏輸出,同時使能該引腳對應(yīng)的所有復(fù)用功能模塊。
2、輸出模式下,配置速度
I/O口輸出模式下,有3種輸出速度可選(2MHz、10MHz和50MHz),這個速度是指I/O口驅(qū)動電路的響應(yīng)速度而不是輸出信號的速度,輸出信號的速度與程序有關(guān)(芯片內(nèi)部在I/O口的輸出部分安排了多個響應(yīng)速度不同的輸出驅(qū)動電路,用戶可以根據(jù)自己的需要選擇合適的驅(qū)動電路)。通過選擇速度來選擇不同的輸出驅(qū)動模塊,達(dá)到最佳的噪聲控制和降低功耗的目的。高頻的驅(qū)動電路,噪聲也高,當(dāng)不需要高的輸出頻率時,請選用低頻驅(qū)動電路,這樣非常有利于提高系統(tǒng)的EMI性能。當(dāng)然如果要輸出較高頻率的信號,但卻選用了較低頻率的驅(qū)動模塊,很可能會得到失真的輸出信號。關(guān)鍵是GPIO的引腳速度跟應(yīng)用匹配。
2.1
了,既省電也噪聲小。
2.2
GPIO的引腳速度或許不夠,這時可以選用10M的GPIO引腳速度。
2.3
3、GPIO口初始化
①使能GPIO口的時鐘 ②配置模式設(shè)置(8種模式)
如打開PORTA時鐘
如果把端口配置成復(fù)用輸出功能,則還需開始復(fù)用端口時鐘,并進(jìn)行相應(yīng)配置。
4、GPIO配置寄存器
GPIO口配置是通過配置寄存器來進(jìn)行的,每個GPIO 端口有:
兩個32位配置寄存器(GPIOx_CRL,GPIOx_CRH)分別控制每個端口的高八位和低八位。如果IO口是0-7號的話,則寫CRL寄存器;如果IO口是8-15號的話,則寫CRH寄存器。
兩個32位數(shù)據(jù)寄存器(GPIOx_IDR,GPIOx_ODR)一個是只讀作輸入數(shù)據(jù)寄存器,一個是只寫作輸出寄存器。
一個32位置位/復(fù)位寄存器(GPIOx_BSRR)。
一個16位復(fù)位寄存器(GPIOx_BRR)。
一個32位鎖定寄存器(GPIOx_LCKR)。
常用的IO端口寄存器只有四個:CRH,CRL,IDR,ODR。
總結(jié)一下GPIO功能:
1、通用I/O(GPIO):最基本的功能,可以驅(qū)動LED、可以產(chǎn)生PWM、可以驅(qū)動蜂鳴器等等;
2、單獨(dú)的位設(shè)置或位清除:方便軟體作業(yè),程序簡單。端口配置好以后只需GPIO_SetBits(GPIOx, GPIO_Pin_x)就可以實現(xiàn)對GPIOx的pinx位為高電平;
3、所有端口都有外部中斷能力:端口必須配置成輸入模式,所有端口都有外部中斷能力;
4、復(fù)用功能(AF):復(fù)用功能的端口兼有IO功能等。復(fù)位期間和剛復(fù)位后,復(fù)用功能未開啟,I/O 端口被配置成浮空輸入模式。
5、 軟件重新映射I/O復(fù)用功能:為了使不同器件封裝的外設(shè)I/O 功能的數(shù)量達(dá)到最優(yōu),可以把一些復(fù)用功能重新映射到其他一些腳上。這可以通過軟件配置相應(yīng)的寄存器來完成。這時,復(fù)用功能就不再映射到它們的原始引腳上了。
6、 GPIO鎖定機(jī)制:當(dāng)在一個端口位上執(zhí)行了所定(LOCK)程序,在下一次復(fù)位之前,將不能再更改端口位的配置。
5、GPIO寄存器詳解
參見《STM32F10X中文手冊》
三、GPIO輸出實驗
這里利用ST固件庫,就不需要自己對照配置寄存器寫代碼,直接利用庫函數(shù),非常方便。
Main.c
#include "stm32f10x.h"
#include "led.h"
void Delay(u32 d_time);
int main(void)
{
}
void Delay(u32 d_time)
{
}
#ifndef __LED_H
#define __LED_H
void LED_Init(void);
#endif
Led.c
#include "led.h"
//LED IO初始化
void LED_Init(void)
{
}
評論