STM32F103學習筆記-GPIO相關

一、GPIO是什麼?能做什麼?

  GPIO是通用輸入、輸出端口的簡稱,簡單地說就是STM32可控制的引腳(但需要注意的是一個GPIO可能包含多個引腳,如STM32芯片中每組GPIO就有16個引腳)。

  每個GPIO都有基本的輸入和輸出功能。 其中,輸出功能是指可以通過引腳控制高、低電平(對應數電中的0和1);輸入功能指的是檢測外部輸入電平。GPIO的結構框圖示意如下:
Alt
  一般來說,GPIO的高低電平的轉化都會產生一些控制信息,例如共陽極LED在對應GPIO爲高電平時爲暗,在對應GPIO低電平時爲亮。另外,GPIO是所有通信協議依託的物理串口,也即無論是使用I2C通信協議通信還是SW進行通信,實質上都是依靠GPIO發送或接受信息流。

二、GPIO的工作模式

  GPIO的工作模式,從大體上可分爲輸出模式和輸入模式,以及一個特殊的複用功能模式。顧名思義,輸入模式主要管GPIO的輸入功能,其包括模擬輸入浮空輸入上拉輸入下拉輸入四種;輸出模式主要包括推輓輸出開漏輸出兩種;複用功能既可以輸入也可以輸出。

  接下來將詳細說明每種輸入、輸出模式的作用(背後寄存器的底層機理忽略)。

  1. 模擬輸入: 將模擬信號輸入到單片機中,而不經過肖特基觸發器(將信號轉化爲0和1);
  2. 浮空輸入: 輸出的高低電平不確定,由外設確定(如按鍵的信號輸入就用浮空輸入);
  3. 上、下拉輸入: 上拉輸入指的是默認電平由上拉決定(默認高電平),下拉輸入指的是默認電平由下拉決定(默認低電平)。關於上下拉的具體內涵,可參見:如何將單片機的引腳配置爲上拉輸入
  4. 推輓輸出: 雙MOS管輪流工作,使I/O口輸出的只可能是高電平或低電平(具體是高電平還是低電平由CPU控制,由代碼實現);

  5. 開漏輸出: 只有N-MOS管工作,I/O口的輸出有兩種情況:低電平或者由外部電路控制的電平。它具有 “線與”特性 ,也就是說,若有很多個開漏模式引腳連接到一起時,只有當所有引腳都輸出高阻態,才由上拉電阻提供高電平,此高電平的電壓爲外部上拉電阻所接的電源的電壓。若其中一個引腳爲低電平,那線路就相當於短路接地,使得整條線路都爲低電平。

三、GPIO輸出的代碼實現(庫函數版)

/* 此例程是初始化GPIOA的PIN_1引腳,並將GPIOA設置爲推輓輸出,50MHz */
//*my_gpio.c*
void GPIO_Config(void)
{
	/* 定義一個GPIO_InitTypeDef的結構體,GPIO_InitTypeDef是STM32官方的結構體類型,內含GPIO_Pin,GPIO_Mode,GPIO_Speed三個數據 */
	GPIO_InitTypeDef GPIO_InitStructure;
		
	/* 開啓GPIO外設時鐘 */
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE)

	/* 選擇要控制的GPIO引腳 */
	GPIO_InitStructure.GPIO_Pin = GPIO_PIN_1;	

	/* 設置引腳模式爲通用推輓輸出 */
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   

	/* 設置引腳速率爲50MHz */
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 

	/* 調用庫函數,初始化GPIO */
	GPIO_Init(GPIOA, &GPIO_InitStructure);	
}

	/* 接下來的例程將展示如何調節GPIO的高低電平 */
	*main.c*
int main()
{	
	GPIO_SetBits(GPIOA, GPIO_Pin1);  /* 調至低電平 */
	
	GPIO_ResetBits(GPIOA, GPIO_Pin1);  /* 調至高電平 */
}

四、GPIO輸入初始化的代碼實現(庫函數版)

/* 此例程是初始化GPIOA的PIN_1引腳,並將GPIOA設置爲上拉輸入,50MHz */
*my_gpio.c*
void KEY_Init(void)
{
	/* 定義一個GPIO_InitTypeDef的結構體,GPIO_InitTypeDef是STM32官方的結構體類型,內含GPIO_Pin,GPIO_Mode,GPIO_Speed三個數據 */
	GPIO_InitTypeDef GPIO_InitStructure;
		
	/* 開啓GPIO外設時鐘 */
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE)
		
	/* 選擇要控制的GPIO引腳 */
	GPIO_InitStructure.GPIO_Pin=GPIO_PIN_1; 
		
	/* 設置引腳模式爲下拉輸入 */
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;
		
	/* 設置引腳速率爲50MHz */ 
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; 
		
	/* 調用庫函數,初始化GPIO */
	GPIO_Init(GPIOA, &GPIO_InitStructure); 
}
發佈了12 篇原創文章 · 獲贊 22 · 訪問量 3450
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章