?一、GPIO的八種模式
GPIO支持4種輸入模式(浮空輸入、上拉輸入、下拉輸入、模擬輸入)和4種輸出模式(開漏輸出、開漏復用輸出、推挽輸出、推挽復用輸出)。
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 | 復用推挽輸出 |
開漏輸出:mos管導通,輸出強低電平;mos管截止,此時mos管電阻無窮大,如果無外部上拉電路,輸出為高阻態,如果有外部上拉電路,輸出為弱高電平(驅動能力較弱)
推挽輸出:NMOS管導通,PMOS管截止,輸出強低電平;NMOS管截止,PMOS管導通,輸出強高電平
二、端口復用功能
????????由數據手冊可以得知,每一個IO口都有很多功能,比如PA4可以做SPI1的片選,也可以做SPI3的片選,這些都是IO端口的復用功能
使用硬件SPI時,此時的引腳需要使用復用功能,即配置為復用推挽輸出
void SPI1_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};__HAL_RCC_SPI1_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();GPIO_InitStruct.Pin = GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
使用硬件iic時,引腳配置為復用開漏輸出
void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle)
{GPIO_InitTypeDef GPIO_InitStruct = {0};if(i2cHandle->Instance==I2C2){__HAL_RCC_GPIOB_CLK_ENABLE();GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11;GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;GPIO_InitStruct.Alternate = GPIO_AF4_I2C2;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);__HAL_RCC_I2C2_CLK_ENABLE();}
}
?使用軟件iic時,此時的SCL和SDA引腳完全由我們控制,所以不使能復用功能,直接配置為開漏輸出,然后SDA引腳讀數據時配置為上拉輸入模式,寫數據時配置為開漏輸出即可
void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle)
{GPIO_InitTypeDef GPIO_InitStruct = {0};if(i2cHandle->Instance==I2C2){__HAL_RCC_GPIOB_CLK_ENABLE();GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;GPIO_InitStruct.Alternate = GPIO_AF4_I2C2;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);__HAL_RCC_I2C2_CLK_ENABLE();}
}
注意:SPI作為主機,MISO配置為浮空輸入或者復用推挽輸出都可以,原因在于,MISO引腳的功能就是讀取電平信號,所以配置為輸入模式沒有問題,當配置為復用推挽輸出時,我們會把MISO端口的使用權交給SPI,他會自己控制MISO的端口模式為輸入模式
三、GPIO速度
#define ?GPIO_SPEED_FREQ_LOW ? ? ? ? 0x00000000U ?/*!< IO works at 2 MHz, please refer to the product datasheet */
#define ?GPIO_SPEED_FREQ_MEDIUM ? ? ?0x00000001U ?/*!< range 12,5 MHz to 50 MHz, please refer to the product datasheet */
#define ?GPIO_SPEED_FREQ_HIGH ? ? ? ?0x00000002U ?/*!< range 25 MHz to 100 MHz, please refer to the product datasheet ?*/
#define ?GPIO_SPEED_FREQ_VERY_HIGH ? 0x00000003U ?/*!< range 50 MHz to 200 MHz, please refer to the product datasheet ?*/配置高速:輸出頻率高,噪音大,功耗高,電磁干擾強;?
配置低速:輸出頻率低,噪音小,功耗低,電磁干擾弱;提高系統EMI(電磁干擾)性能;
我們知道GPIO速度有四種模式,低速,中速,高速和超高速,其中不同的速度對應不同的時鐘頻率。
- 低速:USART(115.2kbps)、按鍵掃描。
- 中速:I2C(400kbps)。
- 高速:SPI(18Mbps)、PWM高頻信號。
- 超高速:QSPI FLASH,FMC,以太網等高速。
注意事項:
1、如果你使用9600波特率UART通信,建議速度配置為低。所以,如果你想使產品更加完美,速度配置也是關鍵的一項。
2、比如SPI時鐘配置時,如果配置為30Mhz,那么GPIO引腳的速度最起碼配置為高速模式,不然信號可能會失真。
3、GPIO設為輸入模式時,輸出驅動電路斷開,速度配置無意義。此時應關注上拉/下拉電阻配置。
4、使用Cubemx生成代碼時,SPI選用軟件片選信號,此時注意GPIO口速度默認為低速模式,但是SPI一般配置高速模式,此時防止數據亂碼需要修改GPIO口速度
四、如何選擇I/O模式
- 浮空輸入_IN_FLOATING ——浮空輸入,可以做KEY識別,RX1
- 帶上拉輸入_IPU——IO內部上拉電阻輸入
- 帶下拉輸入_IPD—— IO內部下拉電阻輸入
- 模擬輸入_AIN ——應用ADC模擬輸入,或者低功耗下省電
- 開漏輸出_OUT_OD ——IO輸出0接GND,IO輸出1,懸空,需要外接上拉電阻,才能實現輸出高電平。當輸出為1時,IO口的狀態由上拉電阻拉高電平,但由于是開漏輸出模式,這樣IO口也就可以由外部電路改變為低電平或不變。可以讀IO輸入電平變化,實現C51的IO雙向功能
- 推挽輸出_OUT_PP ——IO輸出0-接GND, IO輸出1 -接VCC,讀輸入值是未知的
- 復用功能的開漏輸出_AF_OD ——片內外設功能(I2C的SCL、SDA)
- 復用功能的推挽輸出_AF_PP——片內外設功能(USART的TX和RX、SPI的MOSI、MISO.SCK)
五、JTAG引腳作為GPIO使用要注意
例如PA15引腳,它默認時JTDI引腳,但是可以復用為SPI的NSS片選信號。在初始化時,需要先開啟AFIO時鐘,再關閉JTAG功能,否則GPIO功能仍然不起作用。初始化代碼如下:
stm32f103
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); /*使能SWD 禁用JTAG*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);/* CS: PA15 */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);
兆易創新gd32F103?
void micromotor_alarm_gpio_config(void)
{//1.GPIO引腳時鐘使能rcu_periph_clock_enable(RCU_GPIOA); //2.復用功能時鐘使能 rcu_periph_clock_enable(RCU_AF); //3.GPIO配置為推完輸出模式gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_15); //4.重映射配置:JTAG-DP禁用和SW-DP使能 gpio_pin_remap_config(GPIO_SWJ_SWDPENABLE_REMAP,ENABLE); //5.引腳配置為低電平gpio_bit_reset(GPIOA,GPIO_PIN_15);
}
常見的調試接口:
SW調試接口: PA13、PA14共兩個引腳。
JTAG調試接口: PA13、PA14、PA15、PB3、PB4共五個引腳。