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將無法通過仿真器連接。
-
單片機
+關注
關注
6042文章
44617瀏覽量
637617 -
mcu
+關注
關注
146文章
17316瀏覽量
352255 -
嵌入式
+關注
關注
5090文章
19176瀏覽量
306925 -
開發板
+關注
關注
25文章
5121瀏覽量
97988 -
GD32
+關注
關注
7文章
413瀏覽量
24429
發布評論請先 登錄
相關推薦
評論