自學STM32 - 不同GPIO模式的片內配置

2024年2月6日 24点热度 0人点赞

作者:junziyang


GPIO的不同輸入模式是在程序中通過GPIOx_CRL和GPIOx_CRH兩個寄存器進行配置的。配置寄存器的值影響的是片內電路的通斷(可以理解為每個位控制1個開關),不同GPIO模式對應的是不同的片內連通狀態。根據GPIO的模式,片內配置可分為四類:

1. 輸入配置(Input Configuration)

輸入配置包括輸入浮空、輸入上拉和輸入下拉3種寄存器配置。片內配置原理示意圖如圖1所示。右側的輸入I/O引腳上、下各有一個保護二極管,其作用是防止外部過高的電壓輸入對內部電路造成損壞。如果輸入正電壓顯著高於VDD,則上方二極管導通;如果輸入負電壓顯著低於VSS,則下方二極管導通。這樣可以將輸入芯片內部的電壓鉗制在VDD和VSS附近(約±0.7V)。

圖1. 輸入浮空/上拉/下拉模式芯片內部配置

說明:

  • ODR與引腳間斷開。此時ODR可被CPU讀寫,可輔助配置寄存器,實現輸入上/下拉模式配置。
  • 片內弱上/下拉功能開啟。上拉時上方的開關閉合,下拉時下方的開關閉合,浮空輸入時兩個開關均開啟。
  • Schimtt Trigger開啟,在每個APB2時鐘周期,信號經此TTL觸發器取樣,輸入IDR。
  • 讀取IDR可得到I/O電平狀態。
  • 對於可接受5V輸入的I/O引腳,可用VDD_FT替代VDD。

2. 輸出配置(Output Configuration)

通用輸出推挽和開漏兩種輸出模式片內配置原理示意圖如圖2所示。

圖2. 通用輸出推挽/開漏模式片內配置

說明:

  • ODR與引腳連通。
  • 片內弱上/下拉功能關閉。
  • 開漏模式:輸出控制器將P-MOS柵極置1,P-MOS始終不工作。ODR為1時,N-MOS導通,輸出低電平;ODR為0時,N-MOS也截止,引腳處於既不是高電平也不是低電平的高阻態。可見,開漏模式隻能輸出低電平
  • 推挽模式:ODR為0時P-MOS導通、N-MOS截止,輸出高電平;ODR為1時,N-MOSE導通,P-MOS截止,輸出低電平。推挽模式可以輸出高/低電平
  • Schmitt觸發器開啟,在每個APB2時鐘周期,引腳電平都被取樣存入IDR。
  • 讀取IDR寄存器可以獲得引腳當前電平狀態。

3. 復用功能配置(AFIO Configuration)

STM32內部集成了眾多的外設控制器,如USART、ADC等,如果原來的GPIO引腳(通過對ODR或IDR的操作輸出或輸入電平信號)要充當外設控制器的引腳,此時需要將引腳配置為AFIO(Alternate Function Input/Output)模式,即通過配置相關寄存器,將引腳與外設控制器連通。具體到某個GPIO引腳可以復用哪些功能(可接哪些外設),需要查閱芯片的《Data Sheet》中對引腳的定義,一般在數據手冊的Pinouts and pin descriptions章節有關於引腳定義的表格。AFIO復用功能輸入輸出模式片內配置原理示意圖如圖3所示。

圖3. AFIO復用功能輸入輸出模式片內配置

說明:

  • ODR開啟,但不是直接與引腳相連,隻能被芯片內部的外設控制器訪問。
  • 片內弱上/下拉功能關閉。
  • Schmitt觸發器開啟,在每個APB2時鐘周期,引腳電平都被取樣存入IDR。
  • 讀取IDR寄存器可以獲得引腳當前電平狀態。
  • 復用輸出支持推挽/開漏。
  • 主要特征:輸入/輸出均匯於片內外設。對大多數外設,I/O須配置為復用模式。

4. 模擬配置(Analog Configuration)

模擬配置用於ADC的輸入和DAC的輸出。

圖4. 模擬模式片內配置

說明

  • ODR與引腳斷開。
  • 片內弱上/下拉關閉。
  • Schmitt觸發器關閉。省電!
  • 這種模式下讀取IDR始終返回0。

Analog模式是最省電的模式。特別是對電池供電的應用場合,建議將所有GPIO引腳初始化為Analog,然後再按需設置用到的I/O引腳的工作模式。可以在程序調用GPIO_Init()之類的函數初始化I/O之前,調用如下函數:

void GPIO_SetAllIO2Analog(void){
  RCC->APB2ENR |= 0x000041FC; //Enalbe GPIOA-G
	GPIOA->CRL = 0x00; // Set all GPIO to Analog,
	GPIOA->CRH = 0x00; // in order to save energy.
	GPIOB->CRL = 0x00;
	GPIOB->CRH = 0x00;
	GPIOC->CRL = 0x00;
	GPIOC->CRH = 0x00;
	GPIOD->CRL = 0x00;
	GPIOD->CRH = 0x00;
	GPIOE->CRL = 0x00;
	GPIOE->CRH = 0x00;
	GPIOF->CRL = 0x00;
	GPIOF->CRH = 0x00;
	GPIOG->CRL = 0x00;
	GPIOG->CRH = 0x00;
 RCC->APB2ENR &= ~0x000041FC;//DisEnalbe GPIOA-G                         
} 

註意:一定要在調用GPIO_SetAllIO2Analog()之後,再調用GPIO_Init(),執行使能時鐘、初始化所需I/O端口等操作。


總結:

  • I/O端口對外雖然隻是一個引腳,但每個引腳在芯片內部可能有多種連通路徑。
  • 具體連通哪條路徑,是通過配置相關的寄存器(開關)來實現的。
  • I/O端口的復用和重映射都是基於這一原理。可以根據需求,通過配置寄存器,將內部外設切換到某個可選的引腳。
  • 具體到某個外設,需要設置為哪種GPIO模式,可查閱芯片的《Reference Manual》中關於GPIO和AFIO的章節。
  • 具體的某個引腳,可能的復用和重映射選項,可查閱芯片的《Data Sheet》中關於Pin definitions相關的表格。

#文章首發挑戰賽#