首先先了解一下輸出的模式
比較常用的是 推挽輸出
1)GPIO_Mode_AIN 模擬輸入
(2)GPIO_Mode_IN_FLOATING 浮空輸入
(3)GPIO_Mode_IPD 下拉輸入
(4)GPIO_Mode_IPU 上拉輸入
(5)GPIO_Mode_Out_OD 開漏輸出
(6)GPIO_Mode_Out_PP 推挽輸出
(7)GPIO_Mode_AF_OD 復(fù)用開漏輸出
(8)GPIO_Mode_AF_PP 復(fù)用推挽輸出
首先簡述一下stm3的gpio
接口(interface):主機(jī)(CPU)與外部設(shè)備(指MCU片上外設(shè))之間緩沖電路。它用于完成主機(jī)與外部設(shè)備設(shè)間速度匹配、信號轉(zhuǎn)換,并完成某些控制功能。按數(shù)據(jù)的傳輸方式可分為并行接口和串行接口,并行接口指一般I/O接口或通用I/O接口,而串行接口有I2C/SPI/UART等等。
端口(port):I/O接口電路中已經(jīng)編址并能進(jìn)行讀寫操作的寄存器。端口分為數(shù)據(jù)端口、狀態(tài)端口及控制端口,普遍存在于各個(gè)接口電路中。每個(gè)接口電路中都包含一組寄存器,CPU與外部設(shè)備進(jìn)行信息交換時(shí),各類信息在接口中存入不同的寄存器,這些寄存器就是I/O端口,簡稱I/O口,也稱為I/O端口寄存器。
引腳(pin):集成電路與外圍電路連接的管腳。
接口(端口)概念是對并行接口和串行接口(I2C/SPI/UART等片上外設(shè))而言的,MCU中大多數(shù)的功能模塊都有接口電路。狹義上,端口概念往往特指I/O并行接口電路中的寄存器。此外,通常我們所說的“I/O口”指的就是“I/O端口”。
一、GPIO的模式選擇
通過GPIO模式寄存器GPIOx_MODER(x是端口名稱,x=A…I/J/K)來設(shè)置GPIO端口位的方向:
1、輸入模式(復(fù)位狀態(tài))
2、GPIO輸出模式
3、復(fù)用功能模式
4、模擬功能模式
GPIOx_MODER的設(shè)置方法,詳見技術(shù)參考手冊TRM。
二、GPIO端口寄存器
每個(gè)I/O端口均有下列寄存器,每個(gè)端口位均可自由編程,但I(xiàn)/O端口寄存器必須按32位字、半字或字節(jié)被訪問。其中,GPIOx_BSRR寄存器旨在實(shí)現(xiàn)對GPIOx_ODR寄存器進(jìn)行原子讀取/修改訪問,具有對GPIOx_ODR按位寫權(quán)限。
1、4個(gè)32位配置寄存器:GPIOx_MODER、GPIOx_OTYPER、GPIOx_OSPEEDR、GPIOx_PUPDR,這些寄存器位可通過軟件寫入。其中,輸出類型寄存器GPIOx_OTYPER是用1個(gè)寄存器位設(shè)置1個(gè)I/O位,其他配置寄存器均是用2個(gè)寄存器位設(shè)置1個(gè)I/O位。
GPIOx_MODER:選擇I/O端口方向?yàn)?輸入/通用輸出/AF/模擬,復(fù)位狀態(tài)為輸入。
GPIOx_OTYPER:選擇輸出類型為 推挽/開漏,復(fù)位狀態(tài)為推挽輸出。
GPIOx_OSPEEDR:選擇I/O輸出驅(qū)動(dòng)電路的響應(yīng)速度為 低速/中速/快速/高速,用于噪聲控制。(由下面Table 22. Port bit configuration table 可知,這個(gè)速度寄存器只對輸出模式和AF起作用)。
注意:GPIO的引腳速度是指I/O口驅(qū)動(dòng)電路的響應(yīng)速度而不是輸出信號的速度,輸出信號的速度與程序有關(guān)。此外,如果較高頻率的信號經(jīng)過較低頻率的驅(qū)動(dòng)電路輸出,那么輸出的信號就會(huì)產(chǎn)生失真,所以驅(qū)動(dòng)電路的頻率和信號的頻率之間滿足采樣定理的要求。驅(qū)動(dòng)電路的頻率應(yīng)該適當(dāng)不能過大(建議10~20倍于信號的頻率),以便降低噪聲、功耗和電磁輻射。
GPIOx_PUPDR:選擇I/O端口為 無上拉或下拉/上拉/下拉/保留(與IO端口方向無關(guān))。
2、2個(gè)32位數(shù)據(jù)寄存器:GPIOx_IDR、GPIOx_ODR
GPIOx_IDR:這些寄存器位為只讀 形式,并且只能在字模式下訪問。
GPIOx_ODR:這些寄存器位可通過軟件讀取和寫入。
3、1個(gè)32位置位復(fù)位寄存器:GPIOx_BSRR
GPIOx_BSRR低半字用來置位GPIOx_ODR,即寫入“1”,而高半字用來復(fù)位GPIOx_ODR,即寫入“0”。GPIOx_BSRR旨在對GPIOx_ODR寄存器進(jìn)行原子讀寫操作,它只能在字、半字、字節(jié)模式下被訪問對GPIOx_ODR進(jìn)行原子操作。
4、1個(gè)32位鎖定寄存器:GPIOx_LCKR
鎖定寄存器GPIOx_LCKR的每個(gè)鎖定位用于鎖定端口位的配置。凍結(jié)的寄存器包括:GPIOx_MODER、GPIOx_OTYPER、GPIOx_OSPEEDR、GPIOx_PUPDR、GPIOx_AFRH、GPIOx_AFRL,它只能以字的方式被訪問。鎖定寄存器鎖定配置后,就會(huì)避免因意外改寫端口寄存器配置造成大電流損壞芯片的故障或其他故障。
5、2個(gè)32位復(fù)用功能選擇寄存器:GPIOx_AFRH、GPIOx_AFRL
GPIOx_AFRL:用四位寄存器位選擇一個(gè)對應(yīng)的復(fù)用功能。該寄存器用于選擇AF0~AF7。
GPIOx_AFRH:用四位寄存器位選擇一個(gè)對應(yīng)的復(fù)用功能。該寄存器用于選擇AF8~AF15。
復(fù)用功能選擇寄存器只能通過字被訪問。
三、GPIO的工作模式
通過對4種端口配置寄存器進(jìn)行編程,可將GPIO口的各個(gè)端口位配置成以下8種工作模式:
輸入+懸空
輸入+上拉
輸入+下拉
模擬(用作ADC輸入、DAC輸出或者捕獲輸入情況下)
輸出+開漏+上拉/下拉(輸出模式時(shí)GPIO的輸出速度是可配置的)
輸出+推挽+上拉/下拉(輸出模式時(shí)GPIO的輸出速度是可配置的)
復(fù)用功能+推挽+上拉/下拉(復(fù)用功能時(shí)速度是可配置的)
復(fù)用功能+開漏+上拉/下拉(復(fù)用功能時(shí)速度是可配置的)
● I/O輸入通道有個(gè)TTL施密特觸發(fā)器,它用于將變化緩慢的輸入信號整形成邊沿陡峭的矩形脈沖。同時(shí),施密特觸發(fā)器利用其回差電壓提高了電路的抗干擾能力;
● 所有的I/O口均兼容TTL電平和CMOS電平;
● 大多數(shù)I/O是5V電壓容限(FT 結(jié)構(gòu)的I/O是5V容限,其他結(jié)構(gòu)的I/O不是。詳細(xì)情況請參見相應(yīng)的STM32F4數(shù)據(jù)手冊);
● 當(dāng)GPIO被配置為模擬功能時(shí),I/O不再是5V電壓容限,這時(shí)以VDDA為電壓容限;
● 除了端口A和B(主要是PA13/PA14/PA15/PB3/PB4這5個(gè)端口位復(fù)位后專門用于片上調(diào)試模塊,不受4個(gè)GPIO控制寄存器控制),其他端口的所有端口位復(fù)位期間或者復(fù)位后都是懸空輸入狀態(tài);
● 輸出通道中,輸出數(shù)據(jù)寄存器和復(fù)用功能輸出接到多路復(fù)用器,再經(jīng)過輸出控制連接到推挽電路的門極。值得注意的是輸出控制會(huì)將輸出數(shù)據(jù)寄存器和復(fù)用功能輸出的電平進(jìn)行反轉(zhuǎn)(即’1’變’0’,’0’變’1’)。仔細(xì)觀察會(huì)發(fā)現(xiàn)P-MOS管的門極有個(gè)小圈“。”,它表示P-MOS的門極為低電平’0’時(shí),P-MOS導(dǎo)通。反之,N-MOS是門極為高電平’1’時(shí)導(dǎo)通;
● 推挽輸出的驅(qū)動(dòng)能力強(qiáng),并且推挽輸出時(shí),若P-MOS導(dǎo)通,引腳上的電壓不會(huì)因?yàn)橥獠科骷蛟O(shè)備(即引腳帶負(fù)載)而有所降低;
● I/O端口位的最大狀態(tài)切換頻率為90MHZ。
● 輸出緩沖器被禁止;
● 施密特觸發(fā)輸入被激活;
● 根據(jù)寄存器GPIOx_PUPDR中的值選擇引腳為弱上拉或弱下拉或懸空輸入;
● I/O引腳上的數(shù)據(jù)在每個(gè)AHB1時(shí)鐘周期被采樣到輸入數(shù)據(jù)寄存器;
● 對輸入數(shù)據(jù)寄存器的讀訪問可獲得I/O狀態(tài)。
● 輸出緩沖器被激活
─ 開漏模式:輸出寄存器上的 ‘0’ 激活N-MOS,而輸出寄存器上的 ‘1’ 將端口置于高阻狀態(tài)(PMOS從不被激活);
─ 推挽模式:輸出寄存器上的 ‘0’ 激活N-MOS,而輸出寄存器上的 ‘1’ 將激活P-MOS;
● 施密特觸發(fā)器輸入被激活;
● 選擇引腳為弱上拉或弱下拉輸出或懸空;
● I/O腳上的數(shù)據(jù)在每個(gè)AHB1時(shí)鐘周期被采樣到輸入數(shù)據(jù)寄存器;
● 對輸入數(shù)據(jù)寄存器的讀訪問可得到I/O狀態(tài);
● 對輸出數(shù)據(jù)寄存器的讀訪問得到最后一次寫的值。
由圖4可以看出,當(dāng)I/O端口被配置為復(fù)用功能AF(Alternate Function)時(shí):
● 輸出緩沖器可以被配置成開漏或推挽;
● 輸出緩沖器被片上外設(shè)信號驅(qū)動(dòng);
● 施密特觸發(fā)器輸入被激活;
● 根據(jù)寄存器GPIOx_PUPDR中的值選擇引腳為弱上拉或弱下拉或懸空輸出;
● I/O腳上的數(shù)據(jù)在每個(gè)AHB1時(shí)鐘周期被采樣到輸入數(shù)據(jù)寄存器;
● 對輸出數(shù)據(jù)寄存器的讀訪問得到最后一次寫的值。
● 輸出緩沖器被禁止;
● 施密特觸發(fā)器輸入被暫停,0功耗,并且輸出一直維持在0值狀態(tài);
● 管腳的弱上拉和下拉被禁止;
● 訪問輸入數(shù)據(jù)寄存器得到的數(shù)值為0;
五、GPIO引腳作為一般IO輸入時(shí),引腳的狀態(tài)和端口輸入寄存器GPIOx_IDR的狀態(tài)是否一致?
在學(xué)習(xí)51核單片機(jī)時(shí),由于51單片機(jī)I/O接口電路結(jié)構(gòu)的原因,I/O輸入時(shí),I/O的引腳狀態(tài)會(huì)出現(xiàn)與鎖存器不一樣的情況。所以,往往在I/O上拉輸入前,提前向鎖存器寫入“1”,指令上也分為讀引腳和讀鎖存器指令。
那么,基于Cortex-M內(nèi)核的MCU的I/O引腳輸入時(shí)是否也有與51單片機(jī)同樣的問題呢??
答案是否定的!因?yàn)镃ortex-M內(nèi)核的MCU的GPIO引腳在被配置為I/O輸入時(shí),其輸出電路是斷開的。這樣,輸出電路就不會(huì)影響到引腳的狀態(tài)。所以,引腳上的狀態(tài)和輸入寄存器GPIOx_IDR中的數(shù)據(jù)始終一致。
為什么要配置端口?
因?yàn)镚PIO中端口的作用很多,沒有固定的一種模式,因此需要配置.
每個(gè)GPI/O端口有兩個(gè)32位配置寄存器(GPIOx_CRL,GPIOx_CRH),兩個(gè)32位數(shù)據(jù)寄存器(GPIOx_IDR,GPIOx_ODR),一個(gè)32位置位/復(fù)位寄存器(GPIOx_BSRR),一個(gè)16位復(fù)位寄存器(GPIOx_BRR)和一個(gè)32位鎖定寄存器(GPIOx_LCKR)。
本文引用地址:http://www.eepw.com.cn/article/201611/318989.htm
GPIO端口的每個(gè)位可以由軟件分別配置成多種模式。每個(gè)I/O端口位可以自由編程,然而I/0端口寄存器必須按32位字被訪問(不允許半字或字節(jié)訪問)。GPIOx_BSRR和GPIOx_BRR寄存器允許對任何GPIO寄存器的讀/更改的獨(dú)立訪問;這樣,在讀和更改訪問之間產(chǎn)生IRQ時(shí)不會(huì)發(fā)生危險(xiǎn)。
配置為輸出模式 , 驅(qū)動(dòng)led , 配置思路是什么樣的?
使能端口時(shí)鐘;
選定需要配置的管腳;
配置端口的模式;
初始化端口;
代碼如下:
#include "led.h"
#include "sys.h"
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;//結(jié)構(gòu)體變量定義
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能GPIOF時(shí)鐘
GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_9|GPIO_Pin_10); //LED0=PF9,LED1=PF10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//輸出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//50M
GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化GPIOF
}
以下是配置按鍵的接口
程序如下:
/按鍵初始化函數(shù)
void KEY_Init(void) //IO初始化
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);//使能PORTA,PORTE時(shí)鐘
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;//KEY0-KEY2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //設(shè)置成上拉輸入
GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE2,3,4
//初始化 WK_UP-->GPIOA.0 下拉輸入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0設(shè)置成輸入,默認(rèn)下拉
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.0
}
以下是配置ds18b20的接口
//IO方向設(shè)置
#define DS18B20_IO_IN() {GPIOG->CRH&=0XFFFF0FFF;GPIOG->CRH|=8<<12;}
#define DS18B20_IO_OUT() {GPIOG->CRH&=0XFFFF0FFF;GPIOG->CRH|=3<<12;}
////IO操作函數(shù)
#define DS18B20_DQ_OUT PGout(11) //數(shù)據(jù)端口 PA0
#define DS18B20_DQ_IN PGin(11) //數(shù)據(jù)端口 PA0
//////IO方向設(shè)置 gpio13 每4個(gè)位控制1個(gè)IO。
//#define DS18B20_IO_IN() {GPIOG->CRH&=0XFFF0FFFFF;GPIOG->CRH|=8<<20;}
//#define DS18B20_IO_OUT() {GPIOG->CRH&=0XFFF0FFFFF;GPIOG->CRH|=3<<20;}
//////IO操作函數(shù)
//#define DS18B20_DQ_OUT PGout(13) //數(shù)據(jù)端口 PA0
//#define DS18B20_DQ_IN PGin(13) //數(shù)據(jù)端口 PA0
再看GPIO功能很強(qiáng)大:
1.通用I/O(GPIO):最最基本的功能,可以驅(qū)動(dòng)LED、可以產(chǎn)生PWM、可以驅(qū)動(dòng)蜂鳴器等等;
2.單獨(dú)的位設(shè)置或位清除:方便軟體作業(yè),程序簡單。端口配置好以后只需GPIO_SetBits(GPIOx, GPIO_Pin_x)就可以實(shí)現(xiàn)對GPIOx的pinx位為高電平;
3.外部中斷/喚醒線:端口必須配置成輸入模式時(shí),所有端口都有外部中斷能力;
4.復(fù)用功能(AF):復(fù)用功能的端口兼有IO功能等。復(fù)位期間和剛復(fù)位后,復(fù)用功能未開啟,I/O端口被配置成浮空輸入模式:(CNFx[1:0]=01b,MODEx[1:0]=00b)。
5.軟件重新映射I/O復(fù)用功能:為了使不同器件封裝的外設(shè)I/O功能的數(shù)量達(dá)到最優(yōu),可以把一些復(fù)用功能重新映射到其他一些腳上。這可以通過軟件配置相應(yīng)的寄存器來完成。這時(shí),復(fù)用功能就不再映射到它們的原始引腳上了;
6.GPIO鎖定機(jī)制:主要針對復(fù)位設(shè)定的,當(dāng)某端口位lock后,復(fù)位后將不改變的此端口的位配置。
GPIO基本設(shè)置
GPIOMode_TypeDef GPIO mode定義及偏移地址
GPIO_Mode_AIN = 0x0,//模擬輸入
GPIO_Mode_IN_FLOATING = 0x04, //懸空輸入
GPIO_Mode_IPD = 0x28,//下拉輸入
GPIO_Mode_IPU = 0x48,//上拉輸入
GPIO_Mode_Out_OD = 0x14, //開漏輸出
GPIO_Mode_Out_PP = 0x10,//推挽輸出
GPIO_Mode_AF_OD = 0x1C,//開漏復(fù)用
GPIO_Mode_AF_PP = 0x18//推挽復(fù)用
GPIO輸入輸出速度選擇:
typedef enum
{
GPIO_Speed_10MHz = 1,
GPIO_Speed_2MHz,
GPIO_Speed_50MHz
}
GPIOSpeed_TypeDef;
#define IS_GPIO_SPEED(SPEED) ((SPEED == GPIO_Speed_10MHz) || (SPEED == GPIO_Speed_2MHz) ||(SPEED == GPIO_Speed_50MHz))
做一個(gè)GPIO輸出的試驗(yàn)
當(dāng)I/O端口被配置為推挽模式輸出時(shí):輸出寄存器上的0激活N-MOS,而輸出寄存器上的1將激活P-MOS。
用這段程序?qū)崿F(xiàn):GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
int main(void)
{
#ifdef DEBUG
debug();
#endif
RCC_Configuration();
NVIC_Configuration();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
while (1)
{
GPIO_SetBits(GPIOC, GPIO_Pin_4); //設(shè)置PC.04 pin為高電平,點(diǎn)亮LED1
Delay();
GPIO_ResetBits(GPIOC, GPIO_Pin_4); //設(shè)置PC.04 pin為低電平,熄滅LED1
Delay();
}
}
上一篇:STM32時(shí)鐘基礎(chǔ)知識(shí)
下一篇:基于STM32系列的模擬串口(非阻塞式)
推薦閱讀
史海拾趣
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 電動(dòng)車電池成本降一半,續(xù)航卻減一半?寧德時(shí)代新電池能突圍嗎?
- 從“不可修”到可拆可換:CTP電池的售后怎么辦?
- 區(qū)域控制器ZCU國產(chǎn)化:從物料齊全到系統(tǒng)話語權(quán)
- 總額超260億-盤點(diǎn)全球移動(dòng)機(jī)器人領(lǐng)域融資TOP10企業(yè)
- 安森美CEO談?wù)撾妱?dòng)汽車與AI服務(wù)器前景
- LILYGO T-LoRa Pager:復(fù)古造型與前沿技術(shù)結(jié)合的物聯(lián)網(wǎng)手持設(shè)備
- VS Code+PlatformIO搭建ESP32 Arduino開發(fā)環(huán)境
- Esp32環(huán)境離線搭建參考
- ESP32使用舵機(jī)庫時(shí)的錯(cuò)誤
- ESP32 S3接ST7789屏幕線序
- 尋人:熟悉“儀器儀表校準(zhǔn)流程”的工程師來報(bào)到啦!
- 慶元旦發(fā)熱貼,EEWORLD好禮相送!
- 有獎(jiǎng)直播:助力AI算力,下一代GPU服務(wù)器中卡緣高速互連解決方案哪里找?
- 6月6日 Microchip 直播|利用單片機(jī)設(shè)計(jì)安全關(guān)鍵型應(yīng)用時(shí)應(yīng)采取的最佳實(shí)踐方法
- 學(xué)最新DLP課程,跟帖搶樓贏好禮!
- 有獎(jiǎng)評測:平頭哥RISC-V低功耗板——RVB2601
- 下資料 看視頻 抽大獎(jiǎng)!泰克汽車電子測試解決方案
- 有獎(jiǎng)?wù){(diào)查:ST MEMS 傳感器論壇用戶問卷調(diào)查,參與有驚喜
- 別顧著打網(wǎng)游了,AI都能策劃游戲了
- 國產(chǎn)工業(yè)機(jī)器人核心零部件技術(shù)發(fā)展到了什么階段?
- AI什么都懂,但它懂幽默嗎?
- 金磚五國峰會(huì)釋放新信號,人工智能將迎來大爆發(fā)
- 人工智能能夠理解語言的細(xì)微差別嗎?
- 在智能家居領(lǐng)域中應(yīng)用的三類傳感器
- 昆士蘭大學(xué)研制出超靈敏超聲波傳感器 可用于生物醫(yī)學(xué)領(lǐng)域
- 壓力傳感器在無創(chuàng)血壓測量中的技術(shù)應(yīng)用
- 基于AT89S51和MF RC500的RFID閱讀器系統(tǒng)設(shè)計(jì)
- 五大智能家居巨頭誰將成贏家?
- Designing a short-range RF link into a consumer-electronics product
- 光伏應(yīng)用研究之二
- 【曬心得】Chronos運(yùn)動(dòng)手表初體驗(yàn)
- 00-05年職業(yè)資格有關(guān)法規(guī)大全
- 求RFID的調(diào)制解調(diào)原理和數(shù)據(jù)加解密資料
- 很好的賽前練手題目
- LED顯示屏控制卡常見問題
- 如何知道RS485差分信號(A B之間的) 是什么數(shù)據(jù) ?
- 用micropython玩newbit(二)
- 【設(shè)計(jì)工具】Xilinx ISE software teaching aid for Diploma's students