單片機入門---最重要的外設控制(GPIO)

本文中主要介紹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.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章