GPIO的全稱為通用輸入輸出口,是很多外設能夠正常工作的必要條件。除了一些特定功能的引腳(如電源腳)外,MCU上其他的引腳都可以當做GPIO來使用。本章,我們將對GPIO進行簡單介紹,并通過一個“流水燈”的實驗來熟悉GPIO的工作模式。
2.1.GPIO 基礎知識
GD32系列MCU的GPIO口是以“組”的形式工作,命名方式為PX(X=A,B,C,D,E···),每組配置有16個pin腳。每個pin腳都可由軟件配置為輸出(推挽或開漏)、輸入、外設備用功能或者模擬模式。每個 GPIO 引腳都可以配置為上拉、下拉或浮空。除模擬模式外,所有的 GPIO 引腳都具備大電流驅動能力。
GPIO的主要特性
? 輸入/輸出方向控制;
? 施密特觸發器輸入功能使能控制;
? 每個引腳都具有弱上拉/下拉功能;
? 推挽/開漏輸出使能控制;
? 置位/復位輸出使能;
? 模擬輸入/輸出配置;
? 備用功能輸入/輸出配置;
? 端口鎖定配置;
? 單周期輸出翻轉功能;
GPIO結構框圖
如圖所示為標準I/O端口位的基本結構圖。

GPIO引腳配置
在復位期間或復位之后,備用功能并未激活,所有GPIO端口都被配置成輸入浮空模式,這種輸入模式禁用上拉(PU)/下拉(PD)電阻。用戶可通過軟件配置GPIO為輸入或輸出模式。當 GPIO引腳配置為輸入引腳時,所有的GPIO引腳內部都有一個可選擇的弱上拉和弱下拉電阻。當GPIO引腳配置為輸出引腳,用戶可以配置端口的輸出速度和選擇輸出驅動模式:推挽或開漏模式。
輸入配置
當GPIO引腳配置為輸入時:
? 施密特觸發輸入使能;
? 可選擇的弱上拉和下拉電阻;
? 當前I/O引腳上的數據在每個APB2時鐘周期都會被采樣并存入端口輸入狀態寄存器;
? 輸出緩沖器禁用。 如圖為輸入配置是I/O引腳的輸入配置。

輸出配置
當GPIO引腳配置為輸出時:
? 施密特觸發輸入使能;
? 弱上拉和下拉電阻禁用;
? 輸出緩沖器使能;
? 開漏模式:輸出控制寄存器設置為“0”時,相應引腳輸出低電平;輸出控制寄存器設置為“1”,相應管腳處于高阻狀態;
? 推挽模式:輸出控制寄存器設置為“0”時,相應引腳輸出低電平;輸出控制寄存器設置為“1”,相應引腳輸出高電平;
? 對端口輸出控制寄存器進行讀操作,將返回上次寫入的值;
? 對端口輸入狀態寄存器進行讀操作,將獲得當前I/O口的狀態。
如圖為I/O端口的輸出配置

模擬配置
當GPIO引腳配置為模擬模式時:
? 弱上拉和下拉電阻禁用;
? 輸出緩沖器禁用;
? 施密特觸發輸入禁用;
? 端口輸入狀態寄存器相應位為“0”。
如圖為I/O端口的輸出配置

2.2.備用功能(AF)
除了用作通用 IO 口以外,所有的 GPIO 都有備用功能。
對于 GD32F10x/20x/30x/403/E10x/E50x/A501/VF103 系列 MCU,用戶可通過軟件將某一個 GPIO配置為復用模式,然后再使能相應外設即可使用 IO 對應的復用功能。
對于 GD32F1x0/3x0/4xx/E23x/A501 系列 MCU,用戶可通過軟件將某一個 GPIO 配置為復用模式,同時還需要設置 GPIO 備用功能選擇寄存器選擇 16 個備用功能中的一個。以 GD32F130 為例,說下具體的配置流程。
(1) 設置 GPIO 模式 gpio_mode_setgpio_mode_set函數原型為:
void gpio_mode_set(uint32_t gpio_periph, uint32_t mode, uint32_t pull_up_down, uint32_t pin) { xxx xxx }
其中形參gpio_periph為需要設置的GPIO口組,其對應的實參為GPIOx(x = A,B,C,D,E,F,G),形參mode為需要設置的GPIO模式,對應的實參為:
GPIO_MODE_INPUT(輸入模式) GPIO_MODE_OUTPUT(輸出模式) GPIO_MODE_AF(復用模式) GPIO_MODE_ANALOG(模擬模式)
形參pull_up_down為GPIO的上下拉設置,對應的實參為:
GPIO_PUPD_NONE(無上下拉) GPIO_PUPD_PULLUP(上拉) GPIO_PUPD_PULLDOWN(下拉)
形參pin為pin腳號,實參為GPIO_PIN_x(x=0..15)。
(2) 設置 AF 類型 gpio_af_set
當需要將GPIO設置為復用模式時,除了調用gpio_mode_se設置GPIO模式外,還需要調用函數gpio_af_set進行復用類型的設置。gpio_af_set函數原型為:
void gpio_mode_set(uint32_t gpio_periph, uint32_t alt_func_num, uint32_t pin) { xxx xxx }
其中形參gpio_periph為需要設置的GPIO口組,其對應的實參為GPIOx(x = A,B,C,D,E,F,G),形參alt_func_num為需要設置復用類型,對應的實參為:
GPIO_AF_0(復用類型0) GPIO_AF_1(復用類型1) GPIO_AF_2(復用類型2) GPIO_AF_3(復用類型3) GPIO_AF_4(復用類型4) GPIO_AF_5(復用類型5) GPIO_AF_6(復用類型6) GPIO_AF_7(復用類型7)
F1x0、F3x0、F4xx(F405\F407\F450)、E23x系列MCU的GPIO的復用類型可以從對應MCU的 Datasheet中查得,如GD32F130系列的復用類型表如下圖(部分截圖):

形參pin為pin腳號,實參為GPIO_PIN_x(x=0..15)。
根據以上介紹,如設置PA0為復用模式,且設置功能為USART0_CTS功能,函數調用如下:
gpio_mode_set(GPIOA,GPIO_MODE_AF,GPIO_PUPD_NONE,GPIO_PIN_0); gpio_af_set (GPIOA,GPIO_AF_1,GPIO_PIN_0);
2.3.I/O 重映射功能
本節內容只適用于GD32F10x/30x/403/E103/E50x/A501/VF103系列MCU。
介紹
為了擴展 GPIO 的 靈 活 性 或 外 設 功 能 使 用 , 通 過 配 置 AFIO 端 口 配 置 寄 存 器(AFIO_PCF0/AFIO_PCF1),每個I/O引腳都可以配置多達4種不同的功能。通過使用外設 IO 的重映射功能可以選擇合適的引腳另外,通過配置相應的EXTI源選擇寄存器(AFIO_EXTISSx)選擇觸發中斷或事件,GPIO引腳可以用作EXTI中斷線。
主要特性
? EXTI 源選擇
? 每個引腳具有多達4種備用功能的配置外設重映射配置以GD32F30x的USART0 AF重映射來說明重映射配置。

由上表可看出,當 USART0_REMAP = 0 時 ,USART0_TX 和USART0_RX 功 能 映 射 在 PA9 、 PA10 上 ,而當 USART0_REMAP = 1 時 ,USART0_TX和USART0_RX功能映射在PB6、PB7上。
其他外設端口重映射或其他系列MCU重映射表,請參考各系列MCU的User Manual。
JTAG/SWD 備用功能重映射

為了減少用于調試的 GPIO 端口,用戶可以配置 AFIO_PCF0 寄存器中的 SWJ_CFG [2:0]位為不同的值。具體情況參照下表調試端口映射。

注意:當JTAG或SWD定義的IO口被用戶設置為其他功能時,需要根據此表將JTAG或SWD功能關閉,否則可能會出現MCU無法運行的情況。
2.4.硬件連接說明
本章以一個“流水燈”的實驗來熟悉GPIO的工作模式。
“流水燈”實驗硬件連接圖

如實驗硬件連接圖所示,LED2、LED3通過470Ω電阻和MCU的PF0、PF1連接,另一端接GND,可通過配置PF0、PF1的輸出電平,來達到控制LED2、LED3亮滅的目的。
讀者可以根據典型硬件連接圖和相應系列的Datasheet設計出自己的硬件連接方式。
2.5.軟件配置說明
本小節講解GPIO_Example例程中GPIO的配置說明,主要包括外設時鐘配置、GPIO引腳配置、主函數介紹以及運行結果。
軟件設計的流程如下:
(1) 使能GPIOF時鐘
(2) 初始化PF0和PF1,將這兩個引腳配置為推挽輸出
(3) 通過調用庫函數配置PF0和PF1的電平,再通過一些延時處理,使LED2和LED3交替點亮,以實現流水燈
外設時鐘配置
外設時鐘配置如代碼清單GPIO例程時鐘配置所示,在GD32全系列MCU中需打開GPIOF時鐘。
void rcu_config(void) { /* enable the led clock */ rcu_periph_clock_enable(RCU_GPIOF); }
GPIO 引腳配置
代碼清單 0-9.GPIO 例程引腳配置
void gpio_config(void) { /* configure led GPIO port */ #if defined GD32F10X_HD || GD32F30X_HD || GD32F20X_CL || GD32E10X gpio_init(GPIOF, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0); gpio_init(GPIOF, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_1); #elif GD32F1X0 || GD32F4XX || GD32F3X0 || GD32E23X gpio_mode_set(GPIOF,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,GPIO_PIN_0); gpio_mode_set(GPIOF,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,GPIO_PIN_1); gpio_output_options_set(GPIOF,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_0); gpio_output_options_set(GPIOF,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_1); #endif }
如代碼清單GPIO例程引腳配置 ,GD32F10X、GD32F30X、GD32F20X、GD32E10X系列GPIO配置為推挽輸出相同,調用gpio_init函數(由標準庫提供)即可,此函數原型為:
void gpio_init(uint32_t gpio_periph, uint32_t mode, uint32_t speed, uint32_t pin) { xxx xxx }
其中形參gpio_periph為需要設置的GPIO口組,其對應的實參為GPIOx(x = A,B,C,D,E,F,G),形參mode為需要設置的GPIO模式,對應的實參為:
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(復用推挽輸出)
形參speed為GPIO的速度設置,對應的實參為:
GPIO_OSPEED_2MHZ GPIO_OSPEED_10MHZ GPIO_OSPEED_50MHZ GPIO_OSPEED_MAX(只有部分系列 MCU 的 GPIO 支持大于 50MHz)
形參pin為pin腳號,實參為GPIO_PIN_x(x=0..15)。
實際上GPIO的速度設置只在設置為輸出模式下才有效,輸入模式下是無效的。
如代碼清單GPIO例程引腳配置 ,F1x0、F4xx、F3x0、E23x系列GPIO配置為推挽輸出相同,需調用gpio_mode_set和gpio_output_options_set函數。
(1) gpio_mode_set函數
gpio_mode_set函數原型為:
void gpio_mode_set(uint32_t gpio_periph, uint32_t mode, uint32_t pull_up_down, uint32_t pin) { xxx xxx }
其中形參gpio_periph為需要設置的GPIO口組,其對應的實參為GPIOx(x = A,B,C,D,E,F,G),形參mode為需要設置的GPIO模式,對應的實參為:
GPIO_MODE_INPUT(輸入模式) GPIO_MODE_OUTPUT(輸出模式) GPIO_MODE_AF(復用模式) GPIO_MODE_ANALOG(模擬模式)
形參pull_up_down為GPIO的上下拉設置,對應的實參為:
GPIO_PUPD_NONE(無上下拉) GPIO_PUPD_PULLUP(上拉) GPIO_PUPD_PULLDOWN(下拉)
形參pin為pin腳號,實參為GPIO_PIN_x(x=0..15)。
(2) gpio_output_options_set函數
當需要將GPIO設置為輸出模式時,除了調用gpio_mode_set設置GPIO模式外,還需要調用函數gpio_output_options_set進行GPIO的速度及輸出類型的設置。gpio_output_options_set函數原型為:
void gpio_output_options_set(uint32_t gpio_periph, uint8_t otype, uint32_t speed, uint32_t pin) { xxx xxx }
其中形參gpio_periph為需要設置的GPIO口組,其對應的實參為GPIOx(x = A,B,C,D,E,F,G),形參otype為需要設置的GPIO輸出類型,對應的實參為:
GPIO_OTYPE_PP(推挽模式) GPIO_OTYPE_OD(開漏模式)
形參speed為引腳速度,實參為:
GPIO_OSPEED_2MHZ GPIO_OSPEED_10MHZ GPIO_OSPEED_50MHZ GPIO_OSPEED_MAX(只有部分系列 MCU 的 GPIO 支持大于 50MHz)
形參pin為pin腳號,實參為GPIO_PIN_x(x=0..15)。
主函數說明
代碼清單 GPIO 例程主函數
int main(void) { systick_config(); rcu_config(); gpio_config(); GPIO_BC(GPIOF) = GPIO_PIN_0; GPIO_BC(GPIOF) = GPIO_PIN_1; while(1){ /* turn on led2, turn off led3 */ GPIO_BC(GPIOF) = GPIO_PIN_0; GPIO_BOP(GPIOF) = GPIO_PIN_1; delay_1ms(1000); /* turn on led3, turn off led2 */ GPIO_BC(GPIOF) = GPIO_PIN_1; GPIO_BOP(GPIOF) = GPIO_PIN_0; delay_1ms(1000); } }
如代碼清單 GPIO 例程主函數,該主函數主要分成四部分,systick 配置、RCU 時鐘配置、GPIO 配置和 while(1)主循環,其中 systick 配置用于產生延時,while(1)主循環通過控制相應 GPIO 的 BC 和 BOP 寄存器來控制 GPIO 的輸出電平。
運行結果


2.6.GPIO 使用注意事項
1、當出現在調試狀態下程序可運行,但run模式下MCU無法啟動,需要查看是否使用了JTAG口定義的IO,用戶需要在程序中將JTAG口功能屏蔽,具體請參考2.3節。
2、當JTAG和SWD功能都被禁用后,MCU將無法通過仿真器連接。
-
單片機
+關注
關注
6065文章
44940瀏覽量
647957 -
mcu
+關注
關注
146文章
17886瀏覽量
361598 -
嵌入式
+關注
關注
5143文章
19569瀏覽量
315652 -
開發板
+關注
關注
25文章
5576瀏覽量
102996 -
GD32
+關注
關注
7文章
419瀏覽量
25229
發布評論請先 登錄
GD32 MCU 入門教程】GD32 MCU 常見外設介紹(12)FMC 模塊介紹

《GD32 MCU原理及固件庫開發指南》 + 初讀感悟
兆易創新GD32 MCU選型手冊,適用于GD32全系列MCU
【GD32 MCU 入門教程】一、GD32 MCU 開發環境搭建(1)使用Keil開發GD32

【GD32 MCU 入門教程】一、GD32 MCU 開發環境搭建(2)使用 IAR 開發 GD32

【GD32 MCU 入門教程】一、GD32 MCU 開發環境搭建(3)使用 Embedded Builder 開發 GD32

【GD32 MCU 入門教程】二、GD32 MCU 燒錄說明(1)ISP 燒錄

【GD32 MCU 入門教程】GD32 MCU 常見外設介紹(14)RTC 模塊介紹

【GD32 MCU入門教程】GD32 MCU GPIO 結構與使用注意事項

評論