GPIO的全稱為通用輸入輸出口,是很多外設(shè)能夠正常工作的必要條件。除了一些特定功能的引腳(如電源腳)外,MCU上其他的引腳都可以當(dāng)做GPIO來使用。本章,我們將對GPIO進(jìn)行簡單介紹,并通過一個“流水燈”的實(shí)驗(yàn)來熟悉GPIO的工作模式。
2.1.GPIO 基礎(chǔ)知識
GD32系列MCU的GPIO口是以“組”的形式工作,命名方式為PX(X=A,B,C,D,E···),每組配置有16個pin腳。每個pin腳都可由軟件配置為輸出(推挽或開漏)、輸入、外設(shè)備用功能或者模擬模式。每個 GPIO 引腳都可以配置為上拉、下拉或浮空。除模擬模式外,所有的 GPIO 引腳都具備大電流驅(qū)動能力。
GPIO的主要特性
? 輸入/輸出方向控制;
? 施密特觸發(fā)器輸入功能使能控制;
? 每個引腳都具有弱上拉/下拉功能;
? 推挽/開漏輸出使能控制;
? 置位/復(fù)位輸出使能;
? 可編程觸發(fā)沿的外部中斷—使用EXTI配置寄存器;
? 模擬輸入/輸出配置;
? 備用功能輸入/輸出配置;
? 端口鎖定配置;
? 單周期輸出翻轉(zhuǎn)功能;
GPIO結(jié)構(gòu)框圖
如圖所示為標(biāo)準(zhǔn)I/O端口位的基本結(jié)構(gòu)圖。
GPIO引腳配置
在復(fù)位期間或復(fù)位之后,備用功能并未激活,所有GPIO端口都被配置成輸入浮空模式,這種輸入模式禁用上拉(PU)/下拉(PD)電阻。用戶可通過軟件配置GPIO為輸入或輸出模式。當(dāng) GPIO引腳配置為輸入引腳時,所有的GPIO引腳內(nèi)部都有一個可選擇的弱上拉和弱下拉電阻。當(dāng)GPIO引腳配置為輸出引腳,用戶可以配置端口的輸出速度和選擇輸出驅(qū)動模式:推挽或開漏模式。
輸入配置
當(dāng)GPIO引腳配置為輸入時:
? 施密特觸發(fā)輸入使能;
? 可選擇的弱上拉和下拉電阻;
? 當(dāng)前I/O引腳上的數(shù)據(jù)在每個APB2時鐘周期都會被采樣并存入端口輸入狀態(tài)寄存器;
? 輸出緩沖器禁用。 如圖為輸入配置是I/O引腳的輸入配置。
輸出配置
當(dāng)GPIO引腳配置為輸出時:
? 施密特觸發(fā)輸入使能;
? 弱上拉和下拉電阻禁用;
? 輸出緩沖器使能;
? 開漏模式:輸出控制寄存器設(shè)置為“0”時,相應(yīng)引腳輸出低電平;輸出控制寄存器設(shè)置為“1”,相應(yīng)管腳處于高阻狀態(tài);
? 推挽模式:輸出控制寄存器設(shè)置為“0”時,相應(yīng)引腳輸出低電平;輸出控制寄存器設(shè)置為“1”,相應(yīng)引腳輸出高電平;
? 對端口輸出控制寄存器進(jìn)行讀操作,將返回上次寫入的值;
? 對端口輸入狀態(tài)寄存器進(jìn)行讀操作,將獲得當(dāng)前I/O口的狀態(tài)。
如圖為I/O端口的輸出配置
模擬配置
當(dāng)GPIO引腳配置為模擬模式時:
? 弱上拉和下拉電阻禁用;
? 輸出緩沖器禁用;
? 施密特觸發(fā)輸入禁用;
? 端口輸入狀態(tài)寄存器相應(yīng)位為“0”。
如圖為I/O端口的輸出配置
2.2.備用功能(AF)
除了用作通用 IO 口以外,所有的 GPIO 都有備用功能。
對于 GD32F10x/20x/30x/403/E10x/E50x/A501/VF103 系列 MCU,用戶可通過軟件將某一個 GPIO配置為復(fù)用模式,然后再使能相應(yīng)外設(shè)即可使用 IO 對應(yīng)的復(fù)用功能。
對于 GD32F1x0/3x0/4xx/E23x/A501 系列 MCU,用戶可通過軟件將某一個 GPIO 配置為復(fù)用模式,同時還需要設(shè)置 GPIO 備用功能選擇寄存器選擇 16 個備用功能中的一個。以 GD32F130 為例,說下具體的配置流程。
(1) 設(shè)置 GPIO 模式 gpio_mode_setgpio_mode_set函數(shù)原型為:
void gpio_mode_set(uint32_t gpio_periph, uint32_t mode, uint32_t pull_up_down, uint32_t pin) { xxx xxx }
其中形參gpio_periph為需要設(shè)置的GPIO口組,其對應(yīng)的實(shí)參為GPIOx(x = A,B,C,D,E,F,G),形參mode為需要設(shè)置的GPIO模式,對應(yīng)的實(shí)參為:
GPIO_MODE_INPUT(輸入模式) GPIO_MODE_OUTPUT(輸出模式) GPIO_MODE_AF(復(fù)用模式) GPIO_MODE_ANALOG(模擬模式)
形參pull_up_down為GPIO的上下拉設(shè)置,對應(yīng)的實(shí)參為:
GPIO_PUPD_NONE(無上下拉) GPIO_PUPD_PULLUP(上拉) GPIO_PUPD_PULLDOWN(下拉)
形參pin為pin腳號,實(shí)參為GPIO_PIN_x(x=0..15)。
(2) 設(shè)置 AF 類型 gpio_af_set
當(dāng)需要將GPIO設(shè)置為復(fù)用模式時,除了調(diào)用gpio_mode_se設(shè)置GPIO模式外,還需要調(diào)用函數(shù)gpio_af_set進(jìn)行復(fù)用類型的設(shè)置。gpio_af_set函數(shù)原型為:
void gpio_mode_set(uint32_t gpio_periph, uint32_t alt_func_num, uint32_t pin) { xxx xxx }
其中形參gpio_periph為需要設(shè)置的GPIO口組,其對應(yīng)的實(shí)參為GPIOx(x = A,B,C,D,E,F,G),形參alt_func_num為需要設(shè)置復(fù)用類型,對應(yīng)的實(shí)參為:
GPIO_AF_0(復(fù)用類型0) GPIO_AF_1(復(fù)用類型1) GPIO_AF_2(復(fù)用類型2) GPIO_AF_3(復(fù)用類型3) GPIO_AF_4(復(fù)用類型4) GPIO_AF_5(復(fù)用類型5) GPIO_AF_6(復(fù)用類型6) GPIO_AF_7(復(fù)用類型7)
F1x0、F3x0、F4xx(F405\F407\F450)、E23x系列MCU的GPIO的復(fù)用類型可以從對應(yīng)MCU的 Datasheet中查得,如GD32F130系列的復(fù)用類型表如下圖(部分截圖):
形參pin為pin腳號,實(shí)參為GPIO_PIN_x(x=0..15)。
根據(jù)以上介紹,如設(shè)置PA0為復(fù)用模式,且設(shè)置功能為USART0_CTS功能,函數(shù)調(diào)用如下:
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 重映射功能
本節(jié)內(nèi)容只適用于GD32F10x/30x/403/E103/E50x/A501/VF103系列MCU。
介紹
為了擴(kuò)展 GPIO 的 靈 活 性 或 外 設(shè) 功 能 使 用 , 通 過 配 置 AFIO 端 口 配 置 寄 存 器(AFIO_PCF0/AFIO_PCF1),每個I/O引腳都可以配置多達(dá)4種不同的功能。通過使用外設(shè) IO 的重映射功能可以選擇合適的引腳另外,通過配置相應(yīng)的EXTI源選擇寄存器(AFIO_EXTISSx)選擇觸發(fā)中斷或事件,GPIO引腳可以用作EXTI中斷線。
主要特性
? EXTI 源選擇
? 每個引腳具有多達(dá)4種備用功能的配置外設(shè)重映射配置以GD32F30x的USART0 AF重映射來說明重映射配置。
由上表可看出,當(dāng) USART0_REMAP = 0 時 ,USART0_TX 和USART0_RX 功 能 映 射 在 PA9 、 PA10 上 ,而當(dāng) USART0_REMAP = 1 時 ,USART0_TX和USART0_RX功能映射在PB6、PB7上。
其他外設(shè)端口重映射或其他系列MCU重映射表,請參考各系列MCU的User Manual。
JTAG/SWD 備用功能重映射
調(diào)試接口信號映射在 GPIO 端口的情況下表所示。
為了減少用于調(diào)試的 GPIO 端口,用戶可以配置 AFIO_PCF0 寄存器中的 SWJ_CFG [2:0]位為不同的值。具體情況參照下表調(diào)試端口映射。
注意:當(dāng)JTAG或SWD定義的IO口被用戶設(shè)置為其他功能時,需要根據(jù)此表將JTAG或SWD功能關(guān)閉,否則可能會出現(xiàn)MCU無法運(yùn)行的情況。
2.4.硬件連接說明
本章以一個“流水燈”的實(shí)驗(yàn)來熟悉GPIO的工作模式。
“流水燈”實(shí)驗(yàn)硬件連接圖
如實(shí)驗(yàn)硬件連接圖所示,LED2、LED3通過470Ω電阻和MCU的PF0、PF1連接,另一端接GND,可通過配置PF0、PF1的輸出電平,來達(dá)到控制LED2、LED3亮滅的目的。
讀者可以根據(jù)典型硬件連接圖和相應(yīng)系列的Datasheet設(shè)計(jì)出自己的硬件連接方式。
2.5.軟件配置說明
本小節(jié)講解GPIO_Example例程中GPIO的配置說明,主要包括外設(shè)時鐘配置、GPIO引腳配置、主函數(shù)介紹以及運(yùn)行結(jié)果。
軟件設(shè)計(jì)的流程如下:
(1) 使能GPIOF時鐘
(2) 初始化PF0和PF1,將這兩個引腳配置為推挽輸出
(3) 通過調(diào)用庫函數(shù)配置PF0和PF1的電平,再通過一些延時處理,使LED2和LED3交替點(diǎn)亮,以實(shí)現(xiàn)流水燈
外設(shè)時鐘配置
外設(shè)時鐘配置如代碼清單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配置為推挽輸出相同,調(diào)用gpio_init函數(shù)(由標(biāo)準(zhǔn)庫提供)即可,此函數(shù)原型為:
void gpio_init(uint32_t gpio_periph, uint32_t mode, uint32_t speed, uint32_t pin) { xxx xxx }
其中形參gpio_periph為需要設(shè)置的GPIO口組,其對應(yīng)的實(shí)參為GPIOx(x = A,B,C,D,E,F,G),形參mode為需要設(shè)置的GPIO模式,對應(yīng)的實(shí)參為:
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(復(fù)用開漏輸出) GPIO_MODE_AF_PP(復(fù)用推挽輸出)
形參speed為GPIO的速度設(shè)置,對應(yīng)的實(shí)參為:
GPIO_OSPEED_2MHZ GPIO_OSPEED_10MHZ GPIO_OSPEED_50MHZ GPIO_OSPEED_MAX(只有部分系列 MCU 的 GPIO 支持大于 50MHz)
形參pin為pin腳號,實(shí)參為GPIO_PIN_x(x=0..15)。
實(shí)際上GPIO的速度設(shè)置只在設(shè)置為輸出模式下才有效,輸入模式下是無效的。
如代碼清單GPIO例程引腳配置 ,F(xiàn)1x0、F4xx、F3x0、E23x系列GPIO配置為推挽輸出相同,需調(diào)用gpio_mode_set和gpio_output_options_set函數(shù)。
(1) gpio_mode_set函數(shù)
gpio_mode_set函數(shù)原型為:
void gpio_mode_set(uint32_t gpio_periph, uint32_t mode, uint32_t pull_up_down, uint32_t pin) { xxx xxx }
其中形參gpio_periph為需要設(shè)置的GPIO口組,其對應(yīng)的實(shí)參為GPIOx(x = A,B,C,D,E,F,G),形參mode為需要設(shè)置的GPIO模式,對應(yīng)的實(shí)參為:
GPIO_MODE_INPUT(輸入模式) GPIO_MODE_OUTPUT(輸出模式) GPIO_MODE_AF(復(fù)用模式) GPIO_MODE_ANALOG(模擬模式)
形參pull_up_down為GPIO的上下拉設(shè)置,對應(yīng)的實(shí)參為:
GPIO_PUPD_NONE(無上下拉) GPIO_PUPD_PULLUP(上拉) GPIO_PUPD_PULLDOWN(下拉)
形參pin為pin腳號,實(shí)參為GPIO_PIN_x(x=0..15)。
(2) gpio_output_options_set函數(shù)
當(dāng)需要將GPIO設(shè)置為輸出模式時,除了調(diào)用gpio_mode_set設(shè)置GPIO模式外,還需要調(diào)用函數(shù)gpio_output_options_set進(jìn)行GPIO的速度及輸出類型的設(shè)置。gpio_output_options_set函數(shù)原型為:
void gpio_output_options_set(uint32_t gpio_periph, uint8_t otype, uint32_t speed, uint32_t pin) { xxx xxx }
其中形參gpio_periph為需要設(shè)置的GPIO口組,其對應(yīng)的實(shí)參為GPIOx(x = A,B,C,D,E,F,G),形參otype為需要設(shè)置的GPIO輸出類型,對應(yīng)的實(shí)參為:
GPIO_OTYPE_PP(推挽模式) GPIO_OTYPE_OD(開漏模式)
形參speed為引腳速度,實(shí)參為:
GPIO_OSPEED_2MHZ GPIO_OSPEED_10MHZ GPIO_OSPEED_50MHZ GPIO_OSPEED_MAX(只有部分系列 MCU 的 GPIO 支持大于 50MHz)
形參pin為pin腳號,實(shí)參為GPIO_PIN_x(x=0..15)。
主函數(shù)說明
代碼清單 GPIO 例程主函數(shù)
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 例程主函數(shù),該主函數(shù)主要分成四部分,systick 配置、RCU 時鐘配置、GPIO 配置和 while(1)主循環(huán),其中 systick 配置用于產(chǎn)生延時,while(1)主循環(huán)通過控制相應(yīng) GPIO 的 BC 和 BOP 寄存器來控制 GPIO 的輸出電平。
運(yùn)行結(jié)果
2.6.GPIO 使用注意事項(xiàng)
1、當(dāng)出現(xiàn)在調(diào)試狀態(tài)下程序可運(yùn)行,但run模式下MCU無法啟動,需要查看是否使用了JTAG口定義的IO,用戶需要在程序中將JTAG口功能屏蔽,具體請參考2.3節(jié)。
2、當(dāng)JTAG和SWD功能都被禁用后,MCU將無法通過仿真器連接。
本教程由GD32 MCU方案商聚沃科技原創(chuàng)發(fā)布,了解更多GD32 MCU教程,關(guān)注聚沃科技官網(wǎng)
-
單片機(jī)
+關(guān)注
關(guān)注
6040文章
44592瀏覽量
636867 -
mcu
+關(guān)注
關(guān)注
146文章
17199瀏覽量
351918 -
嵌入式
+關(guān)注
關(guān)注
5087文章
19153瀏覽量
306419 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
5093瀏覽量
97802 -
GD32
+關(guān)注
關(guān)注
7文章
404瀏覽量
24404
發(fā)布評論請先 登錄
相關(guān)推薦
評論