本文中主要介紹STM32中的GPIO,在最後簡單介紹下PIC的IO設置。
基本功能需求
我們在使用STM32的管腳時,主要使用串口,I2C,SPI,或者直接作爲輸入輸出管腳。而這些管腳的實現都是通過GPIO完成的。
下面簡單介紹下GPIO的四種輸入模式和四種輸出模式。
四種輸出模式
首先我們回顧一下我們常用的輸出形式,I2C,SPI,輸出高低電平,通過外部上拉輸出高電平。
推輓輸出:該模式下引腳可以輸出高低電平,可連接驅動數字器件。
開漏輸出:該模式下只能輸出低電平,不能輸出高電平,需要引腳加上拉電阻才能得到高電平。
推輓模式和開漏模式對比:
1 推輓模式延時小,開漏模式上拉延時大。
2 開漏模式可以連接與主控電平不匹配的器件,只需要將上拉電阻的上拉端連接到對方電平即可。
3 開漏模式可以以小博大,利用外部電路的驅動能力,減小內部電流,內部只需要很小的柵極驅動電流。
複用推輓輸出:UART、SPI等輸出引腳就是複用的推輓輸出。
複用開漏輸出:I2C就是這種模式,所以用I2C的時候外部需要上拉電阻。
四種輸入模式
浮空輸入:這種模式一般多用於檢測外部高低電平狀態,比如按鍵。浮空輸入時上下拉電阻都沒有連接,引腳電平狀態不確定。那這時候讀取的電平是否是合理的按鍵值呢???
上拉、下拉輸入:很明顯,這種模式下必定是連接了上拉或者下拉電阻。
模擬輸入:我們通常使用的ADC採樣正是採集的模擬信號。
另外需要特別強調:在使用GPIO時,需要注意alternate function的使用,有兩個方法可以驗證是否可用,一個是使用cubeMX進行選擇,如果能正確的選擇我們需要的功能,則說明這個跨越或者不跨越AF的功能可用。或者查閱下面的表,來驗證我們選擇的功能是否能夠正常工作。
我們在使用GPIO的過程中,有時候可能需要進行輸出輸出等GPIO功能的切換,下面提供一段參考代碼
void Convert_sysrst_gpio(int io)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if (io == 1) {//input
/*Configure GPIO pin : PtPin */
GPIO_InitStruct.Pin = SYS_RST_X_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(SYS_RST_X_GPIO_Port, &GPIO_InitStruct);
} else if (io == 0) {
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOC, SYS_RST_X_Pin, GPIO_PIN_RESET);
/*Configure GPIO pins : PCPin PCPin PCPin */
GPIO_InitStruct.Pin = SYS_RST_X_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
}
}
當我們傳入參數1時,爲input模式,傳入參數爲0時,爲output模式。
PIC單片機
每個端口都有三個工作寄存器,這些寄存器是:
- TRIS 寄存器(數據方向寄存器)
- PORT寄存器(讀取的引腳的電平設備)
- LAT寄存器(輸出鎖存器)
在文檔中對PORT寄存器和LAT寄存器的描述應該是一樣的。上述相當於做出了區分和解釋。
Writes to PORTA are actually written to corresponding LATA register. Reads from PORTA register is return of actual I/O pin values.