一、STM32中GPIO模式的選擇方法:
(1)浮空輸入_IN_FLOATING ——浮空輸入,可以做KEY識別,RX1
(2)帶上拉輸入_IPU——IO內部上拉電阻輸入
(3)帶下拉輸入_IPD—— IO內部下拉電阻輸入
(4)模擬輸入_AIN ——應用ADC模擬輸入,或者低功耗下省電
(5)開漏輸出_OUT_OD ——IO輸出0接GND,IO輸出1,懸空,需要外接上拉電阻,才能實現(xiàn)輸出高電平。當輸出為1時,IO口的狀態(tài)由上拉電阻拉高電平,但由于是開漏輸出模式,這樣IO口也就可以由外部電路改變?yōu)榈碗娖交虿蛔???梢宰xIO輸入電平變化,實現(xiàn)C51的IO雙向功能
(6)推挽輸出_OUT_PP ——IO輸出0-接GND, IO輸出1 -接VCC,讀輸入值是未知的
(7)復用功能的推挽輸出_AF_PP ——片內外設功能(I2C的SCL,SDA)
(8)復用功能的開漏輸出_AF_OD——片內外設功能(TX1,MOSI,MISO.SCK.SS)
STM32設置實例:
(1)模擬I2C使用開漏輸出_OUT_OD,接上拉電阻,能夠正確輸出0和1;讀值時先GPIO_SetBits(GPIOB, GPIO_Pin_0);拉高,然后可以讀IO的值;使用GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0);
(2)如果是無上拉電阻,IO默認是高電平;需要讀取IO的值,可以使用帶上拉輸入_IPU和浮空輸入_IN_FLOATING和開漏輸出_OUT_OD;
二、在STM32中如何配置片內外設使用的IO端口
首先
①配置輸入的時鐘和初始化后即被激活(開啟);
②如果使用該外設的輸入輸出管腳,則需要配置相應的GPIO端口(否則該外設對應的輸入輸出管腳可以做普通GPIO管腳使用);
③再對外設進行詳細配置。
對應到外設的輸入輸出功能有下述三種情況:
①外設對應的管腳為輸出:需要根據(jù)外圍電路的配置選擇對應的管腳為復用功能的推挽輸出或復用功能的開漏輸出。
②外設對應的管腳為輸入:則根據(jù)外圍電路的配置可以選擇浮空輸入、帶上拉輸入或帶下拉輸入。
③ADC對應的管腳:配置管腳為模擬輸入。
如果把端口配置成復用輸出功能,則引腳和輸出寄存器斷開,并和片上外設的輸出信號連接。將管腳配置成復用輸出功能后,如果外設沒有被激活,那么它的輸出將不確定。
三、GPIO庫函數(shù)
首先,先介紹一下STM32固件庫函數(shù)的命名規(guī)則:
在函數(shù)名中,只允許存在一個下劃線,用以分隔外設縮寫和函數(shù)名的其它部分。
名為xx_Init的函數(shù),其功能是根據(jù)xx_InitTypeDef中指定的參數(shù),初始化外設xx。
名為xx_DeInit的函數(shù),其功能為復位外設xx的所有寄存器至缺省值。
名為xx_StructInit的函數(shù),其功能為通過設置xx_InitTypeDef 結構中的各種參數(shù)來定義外設的功能。
名為xx_Cmd的函數(shù),其功能為使能或者失能外設xx。
名為xx_ITConfig的函數(shù),其功能為使能或者失能來自外設xx某中斷源。
名為xx_DMAConfig的函數(shù),其功能為使能或者失能外設xx的DMA接口。
名為xx_GetFlagStatus的函數(shù),其功能為檢查外設xx某標志位被設置與否。
名為xx_ClearFlag的函數(shù),其功能為清除外設xx標志位。
名為xx_GetITStatus的函數(shù),其功能為判斷來自外設xx的中斷發(fā)生與否。
名為xx_ClearITPendingBit的函數(shù),其功能為清除外設xx中斷待處理標志位。
typedef signed long s32;
Type0def signed short s16;
typedef signed char s8;
typedef signed long const sc32;
typedef signed short const sc16;
typedef signed char const sc8;
typedef volatile signed long vs32;
typedef volatile signed short vs16;
typedef volatile signed char vs8;
typedef volatile signed long const vsc32;
typedef volatile signed short const vsc16;
typedef volatile signed char const vsc8;
typedef unsigned long u32;
typedef unsigned short u16;
typedef unsigned char u8;
typedef unsigned long const uc32;
typedef unsigned short const uc16;
typedef unsigned char const uc8;
typedef volatile unsigned long vu32;
typedef volatile unsigned short vu16;
typedef volatile unsigned char vu8;
typedef volatile unsigned long const vuc32;
typedef volatile unsigned short const vuc16;
typedef volatile unsigned char const vuc8;
GPIO寄存器結構
GPIO_TypeDef和AFIO_TypeDef,在文件“stm32f10x_map.h”中定義:
typedef struct
{
vu32 CRL;
vu32 CRH;
vu32 IDR;
vu32 ODR;
vu32 BSRR;
vu32 BRR;
vu32 LCKR;
}
GPIO_TypeDef;
typedef struct
{
vu32 EVCR;
vu32 MAPR;
vu32 EXTICR[4];
}
AFIO_TypeDef;
四、庫函數(shù)
函數(shù)GPIO_DeInit
功能描述:將外設GPIOx寄存器重設為缺省值
例:
GPIO_DeInit(GPIOA);
函數(shù)GPIO_AFIODeInit
功能描述:將復用功能(重映射事件控制和EXTI設置)重設為缺省值
例:
GPIO_AFIODeInit();
函數(shù)GPIO_Init
功能描述:根據(jù)GPIO_InitStruct中指定的參數(shù)初始化外設GPIOx寄存器
例:
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitTypeDef structure
GPIO_InitTypeDef定義于文件“stm32f10x_gpio.h”:
typedef struct
{
u16 GPIO_Pin;
GPIOSpeed_TypeDef GPIO_Speed;
GPIOMode_TypeDef GPIO_Mode;
}
GPIO_InitTypeDef;
GPIO_Pin
該參數(shù)選擇待設置的GPIO管腳,使用操作符“|”可以一次選中多個管腳??梢允褂孟卤碇械娜我饨M合。
GPIO_Pin_None:無管腳被選中
GPIO_Pin_x:選中管腳x(0--15)
GPIO_Pin_All:選中全部管腳
GPIO_Speed
GPIO_Speed:用以設置選中管腳的速率。
GPIO_Speed_10MHz:最高輸出速率10MHz
GPIO_Speed_2MHz:最高輸出速率2MHz
GPIO_Speed_50MHz:最高輸出速率50MHz
GPIO_Mode
GPIO_Mode:用以設置選中管腳的工作狀態(tài)。
GPIO_Mode_AIN:模擬輸入
GPIO_Mode_IN_FLOATING:浮空輸入
GPIO_Mode_IPD:下拉輸入
GPIO_Mode_IPU:上拉輸入
GPIO_Mode_Out_OD:開漏輸出
GPIO_Mode_Out_PP:推挽輸出
GPIO_Mode_AF_OD:復用開漏輸出
GPIO_Mode_AF_PP:復用推挽輸出
函數(shù)GPIO_StructInit
功能描述:把GPIO_InitStruct中的每一個參數(shù)按缺省值填入
例:
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStruct:
GPIO_Pin:GPIO_Pin_All
GPIO_Speed:GPIO_Speed_2MHz
GPIO_Mode:GPIO_Mode_IN_FLOATING
函數(shù)GPIO_ReadInputDataBit
功能描述:讀取指定端口管腳的輸入
例:
u8 ReadValue;
ReadValue = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7);
函數(shù)GPIO_ReadInputData
功能描述:讀取指定的GPIO端口輸入
例:
u16 ReadValue;
ReadValue = GPIO_ReadInputData(GPIOC);
函數(shù)GPIO_ReadOutputDataBit
功能描述:讀取指定端口管腳的輸出
例:
u8 ReadValue;
ReadValue = GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_7);
函數(shù)GPIO_ReadOutputData
功能描述:讀取指定的GPIO端口輸出
例:
u16 ReadValue;
ReadValue = GPIO_ReadOutputData(GPIOC);
函數(shù)GPIO_SetBits
功能描述:置位指定的數(shù)據(jù)端口位
例:
GPIO_SetBits(GPIOA, GPIO_Pin_10 | GPIO_Pin_15);
函數(shù)GPIO_ResetBits
功能描述:清除指定的數(shù)據(jù)端口位
例:
GPIO_ResetBits(GPIOA, GPIO_Pin_10 | GPIO_Pin_15);
函數(shù)GPIO_WriteBit
功能描述:設置或者清除指定的數(shù)據(jù)端口位
例:
GPIO_WriteBit(GPIOA, GPIO_Pin_15, Bit_SET);
函數(shù)GPIO_Write
功能描述:向指定GPIO數(shù)據(jù)端口寫入數(shù)據(jù)
例:
GPIO_Write(GPIOA, 0x1101);
函數(shù)GPIO_PinLockConfig
功能描述:鎖定GPIO管腳設置寄存器
例:
GPIO_PinLockConfig(GPIOA, GPIO_Pin_0 | GPIO_Pin_1);
函數(shù)GPIO_EventOutputConfig
功能描述:選擇GPIO管腳用作事件輸出
例:
GPIO_EventOutputConfig(GPIO_PortSourceGPIOE, GPIO_PinSource5);
GPIO_PortSource
GPIO_PortSource用以選擇用作事件輸出的GPIO端口。
GPIO_PinSource
GPIO_PinSource用以選擇用作事件輸出的GPIO管腳。
函數(shù)GPIO_EventOutputCmd
功能描述:使能或者失能事件輸出
例:
GPIO_EventOutputConfig(GPIO_PortSourceGPIOC, GPIO_PinSource6);
GPIO_EventOutputCmd(ENABLE);
函數(shù)GPIO_PinRemapConfig
功能描述:改變指定管腳的映射
例:
GPIO_PinRemapConfig(GPIO_Remap_I2C1, ENABLE);
GPIO_Remap
GPIO_Remap用以選擇用作事件輸出的GPIO端口。
GPIO_Remap_SPI1:SPI1復用功能映射
GPIO_Remap_I2C1:I2C1復用功能映射
GPIO_Remap_USART1:USART1復用功能映射
GPIO_PartialRemap_USART3:USART2復用功能映射
GPIO_FullRemap_USART3:USART3復用功能完全映射
GPIO_PartialRemap_TIM1:USART3復用功能部分映射
GPIO_FullRemap_TIM1:TIM1復用功能完全映射
GPIO_PartialRemap1_TIM2:TIM2復用功能部分映射1
GPIO_PartialRemap2_TIM2:TIM2復用功能部分映射2
GPIO_FullRemap_TIM2:TIM2復用功能完全映射
GPIO_PartialRemap_TIM3:TIM3復用功能部分映射
GPIO_FullRemap_TIM3:TIM3復用功能完全映射
GPIO_Remap_TIM4:TIM4復用功能映射
GPIO_Remap1_CAN:CAN復用功能映射1
GPIO_Remap2_CAN:CAN復用功能映射2
GPIO_Remap_PD01:PD01復用功能映射
GPIO_Remap_SWJ_NoJTRST:除JTRST外SWJ完全使能(JTAG SW-DP)
GPIO_Remap_SWJ_JTAGDisable:JTAG-DP失能 SW-DP使能
GPIO_Remap_SWJ_Disable:SWJ完全失能(JTAG SW-DP)
函數(shù)GPIO_EXTILineConfig
功能描述:選擇GPIO管腳用作外部中斷線路
例:
GPIO_EXTILineConfig(GPIO_PortSource_GPIOB, GPIO_PinSource8);