GD32F103学习笔记(4)

您所在的位置:网站首页 rt9259引脚 GD32F103学习笔记(4)

GD32F103学习笔记(4)

2023-12-17 02:20| 来源: 网络整理| 查看: 265

一、简介

最多可支持112个通用I/O引脚(GPIO),分别为PA0 ~ PA15,PB0 ~ PB15,PC0 ~ PC15,PD0 ~ PD15,PE0 ~ PE15,PF0 ~ PF15和PG0 ~ PG15,各片上设备用其来实现逻辑输入/输出功能。每个GPIO端口有相关的控制和配置寄存器以满足特定应用的需求。外设GPIO引脚上的外部中断在中断/事件控制器(EXTI)中有相关的控制和配置寄存器。GPIO端口和其他的备用功能(AFs)共用引脚,在特定的封装下获得最大的灵活性。GPIO引脚通过配置相关的寄存器可以用作备用功能引脚,备用功能输入/输出都可。每个GPIO引脚可以由软件配置为输出(推挽或开漏)、输入、外设的备用功能或者模拟模式。每个GPIO引脚都可以配置为上拉、下拉或无上拉/下拉。除模拟模式外,所有的GPIO引脚都具备大电流驱动能力。

二、API说明 2.1 外设寄存器说明

GPIO寄存器列表如下表所示:

寄存器名称 寄存器描述 GPIOx_CTL0 端口控制寄存器0 GPIOx_CTL1 端口控制寄存器1 GPIOx_ISTAT 端口输入状态寄存器 GPIOx_OCTL 端口输出状态寄存器 GPIOx_BOP 端口位操作寄存器 GPIOx_BC 位清除寄存器 GPIOx_LOCK 端口配置锁定寄存器 AFIO_EC 事件控制寄存器 AFIO_PCF0 AFIO端口配置寄存器0 AFIO_EXTISS0 EXTI源选择寄存器0 AFIO_EXTISS1 EXTI源选择寄存器1 AFIO_EXTISS2 EXTI源选择寄存器2 AFIO_EXTISS3 EXTI源选择寄存器3 AFIO_PCF1 AFIO端口配置寄存器1 2.2 外设库函数说明

以下 GPIO 接口位于 GD32F10x_Firmware_Library_V2.2.2\Firmware\GD32F10x_standard_peripheral\Include\gd32f10x_gpio.h。

2.2.1 gpio_init 功能 GPIO参数初始化。注意:首先要保证使用的GPIO的时钟开启 函数定义 void gpio_init(uint32_t gpio_periph,uint32_t mode,uint32_t speed,uint32_t pin) 参数 gpio_periph:GPIO端口x(x = A,B,C,D,E,F,G)mode:GPIO引脚模式speed:GPIO输出最大速度最大pin:GPIO引脚x(x=0..15) 返回 无

mode: IO模式,在GD32标准固件库中,共有四种输入模式,四种输出模式,详细列表如下:

值 含义 官方解释 GPIO_MODE_AIN 模拟输入 analog input mode GPIO_MODE_IN_FLOATING 浮空输入 floating input mode GPIO_MODE_IPD 下拉输入 pull-down input mode GPIO_MODE_IPU 上拉输入 pull-up input mode GPIO_MODE_OUT_OD 开漏输出 GPIO output with open-drain GPIO_MODE_OUT_PP 推挽输出 GPIO output with push-pull GPIO_MODE_OUT_OD 复用开漏输出 AFIO output with open-drain GPIO_MODE_OUT_PP 复用推挽输出 AFIO output with push-pull

speed: IO输出速度最大值,详细列表如下:

值 含义 官方解释 GPIO_OSPEED_10MHZ 输出速度最大为10MHz output max speed 10MHz GPIO_OSPEED_2MHZ 输出速度最大为2MHz output max speed 2MHz GPIO_OSPEED_50MHZ 输出速度最大为50MHz output max speed 50MHz 2.2.2 gpio_bit_set 功能 将一个GPIO引脚拉高 函数定义 void gpio_bit_set(uint32_t gpio_periph, uint32_t pin) 参数 gpio_periph:GPIO端口x(x = A,B,C,D,E,F,G)pin:GPIO引脚x(x=0..15) 返回 无 2.2.3 gpio_bit_reset 功能 将一个GPIO引脚拉低 函数定义 void gpio_bit_reset(uint32_t gpio_periph, uint32_t pin) 参数 gpio_periph:GPIO端口x(x = A,B,C,D,E,F,G)pin:GPIO引脚x(x=0..15) 返回 无 2.2.4 gpio_bit_write 功能 将特定值写入引脚 函数定义 void gpio_bit_write(uint32_t gpio_periph, uint32_t pin, bit_status bit_value) 参数 gpio_periph:GPIO端口x(x = A,B,C,D,E,F,G)pin:GPIO引脚x(x=0..15)bit_value:SET设置或RESET清除 返回 无 2.2.5 gpio_input_bit_get 功能 获取引脚的输入值 函数定义 FlagStatus gpio_input_bit_get(uint32_t gpio_periph,uint32_t pin) 参数 gpio_periph:GPIO端口x(x = A,B,C,D,E,F,G)pin:GPIO引脚x(x=0..15) 返回 SET高电平或RESET低电平 2.2.6 gpio_pin_remap_config 功能 配置GPIO引脚重映射 函数定义 void gpio_pin_remap_config(uint32_t remap, ControlStatus newvalue) 参数 remap:选择重映射newvalue:是否使能,ENABLE使能或DISABLE除能 返回 无

remap: 重映射,详细列表如下:

值 含义 GPIO_SPI0_REMAP SPI0重映射 GPIO_I2C0_REMAP I2C0重映射 GPIO_USART0_REMAP USART0重映射 GPIO_USART1_REMAP USART1重映射 GPIO_USART2_PARTIAL_REMAP USART2部分重映射 GPIO_USART2_FULL_REMAP USART2全部重映射 GPIO_TIMER0_PARTIAL_REMAP TIMER0部分重映射 GPIO_TIMER0_FULL_REMAP TIMER0全部重映射 GPIO_TIMER1_PARTIAL_REMAP0 TIMER1部分重映射 GPIO_TIMER1_PARTIAL_REMAP1 TIMER1部分重映射 GPIO_TIMER1_FULL_REMAP TIMER1全部重映射 GPIO_TIMER2_PARTIAL_REMAP TIMER2部分重映射 GPIO_TIMER2_FULL_REMAP TIMER2全部重映射 GPIO_TIMER3_REMAP TIMER3重映射 GPIO_PD01_REMAP PD01重映射 GPIO_CAN_PARTIAL_REMAP CAN部分重映射(仅适用于GD32F10X_MD,GD32F10X_HD和GD32F10X_XD) GPIO_CAN_FULL_REMAP CAN全部重映射(仅适用于GD32F10X_MD,GD32F10X_HD和GD32F10X_XD) GPIO_SPI2_REMAP SPI2重映射(仅适用于GD32F10X_CL) GPIO_TIMER4CH3_IREMAP TIMER4 channel3内部重映射(仅适用于GD32F10X_CL和GD32F10X_HD) GPIO_ADC0_ETRGINS_REMAP ADC0外部触发注入转换重映射(仅适用于GD32F10X_MD,GD32F10X_HD和GD32F10X_XD) GPIO_ADC0_ETRGREG_REMAP ADC0外部触发规则转换重映射(仅适用于GD32F10X_MD,GD32F10X_HD和GD32F10X_XD) GPIO_ADC1_ETRGINS_REMAP ADC1外部触发注入转换重映射(仅适用于GD32F10X_MD,GD32F10X_HD和GD32F10X_XD) GPIO_ADC1_ETRGREG_REMAP ADC1外部触发规则转换重映射(仅适用于GD32F10X_MD,GD32F10X_HD和GD32F10X_XD) GPIO_SWJ_NONJTRST_REMAP 全部的SWJ(JTAG-DP + SW-DP),但是不包括NJTRST GPIO_SWJ_SWDPENABLE_REMAP JTAG-DP除能,SW-DP使能 GPIO_SWJ_DISABLE_REMAP JTAG-DP除能,SW-DP除能 GPIO_CAN0_PARTIAL_REMAP CAN0部分重映射(仅适用于GD32F10X_CL) GPIO_CAN0_FULL_REMAP CAN0全部重映射(仅适用于GD32F10X_CL) GPIO_ENET_REMAP ENET重映射(仅适用于GD32F10X_CL) GPIO_CAN1_REMAP CAN0重映射(仅适用于GD32F10X_CL) GPIO_TIMER1ITI1_REMAP TIMER1内部触发1重映射(仅适用于GD32F10X_CL) GPIO_PTP_PPS_REMAP 以太网PTP PPS重映射(仅适用于GD32F10X_CL) GPIO_TIMER8_REMAP TIMER8重映射 GPIO_TIMER9_REMAP TIMER9重映射 GPIO_TIMER10_REMAP TIMER10重映射 GPIO_TIMER12_REMAP TIMER12重映射 GPIO_TIMER13_REMAP TIMER13重映射 GPIO_EXMC_NADV_REMAP EXMC_NADV 连接/断开 三、GPIO输出 3.1 引脚确定

我使用的是 光子MINI-GD32F103RCT6 开发板

有个 IO 口为 PB4 的 LED 灯

在复位期间或复位之后,备用功能并未激活,所有GPIO端口都被配置成输入浮空模式,这种输入模式禁用上拉(PU)/下拉(PD)电阻。但是复位后,串行线调试端口(JTAG/Serial-Wired Debug pins)为输入PU/PD模式: PA15:JTDI为上拉模式; PA14:JTCK / SWCLK为下拉模式; PA13:JTMS / SWDIO为上拉模式; PB4:NJTRST为上拉模式; PB3:JTDO为浮空模式。

所以PB4要当GPIO需要重映射

//管脚复用时钟使能 rcu_periph_clock_enable(RCU_AF); //PB4管脚默认是NJTRST,要当GPIO,需要重映射 gpio_pin_remap_config(GPIO_SWJ_NONJTRST_REMAP, ENABLE) 3.2 编程要点 使能 GPIO 端口时钟 初始化 GPIO 目标引脚为推挽输出 控制 GPIO 引脚输出高、低电平 3.3 外设寄存器方法 //GPIOB时钟使能 rcu_periph_clock_enable(RCU_GPIOB); //配置GPIO端口 gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_4); //引脚输出低电平 GPIO_BC(GPIOB) = GPIO_PIN_4; //引脚输出高电平 GPIO_BOP(GPIOB) = GPIO_PIN_4; 3.4 外设库函数方法 //GPIOB时钟使能 rcu_periph_clock_enable(RCU_GPIOB); //PB4配置成输出 gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_4); //引脚输出低电平 gpio_bit_reset(GPIOB, GPIO_PIN_4); //引脚输出高电平 gpio_bit_set(GPIOB, GPIO_PIN_4); //引脚输出低电平 gpio_bit_write(GPIOB, GPIO_PIN_4, RESET); //引脚输出高电平 gpio_bit_write(GPIOB, GPIO_PIN_4, SET); 四、GPIO输入 4.1 引脚确定

我使用的是 光子MINI-GD32F103RCT6 开发板

有个 IO 口为 PA1 的按键

4.2 编程要点 使能 GPIO 端口时钟 初始化 GPIO 目标引脚为输入模式(由于硬件电路没有外部上拉电阻,这里使用内部上拉输入) 检测按键的状态 4.3 外设库函数方法 //GPIOA时钟使能 rcu_periph_clock_enable(RCU_GPIOA); //PA1配置成上拉输入 gpio_init(GPIOA, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, GPIO_PIN_1); //读取引脚电平 gpio_input_bit_get(GPIOA, GPIO_PIN_1); 五、轮询读取按下按键,LED灯闪烁 5.1 board_gpio.c /********************************************************************* * INCLUDES */ #include "gd32f10x.h" #include "board_gpio.h" /********************************************************************* * PUBLIC FUNCTIONS */ /*=========================================================================*/ /* 输入 */ /*=========================================================================*/ /** @brief 按键驱动初始化 @param 无 @return 无 */ void Key_GPIO_Init(void) { // GPIO时钟使能 rcu_periph_clock_enable(RCU_GPIOA); // 配置为内部上拉输入模式 gpio_init(KEY1_GPIO_PORT, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, KEY1_GPIO_PIN); } /** @brief 获取按键状态 @param keyNum -[in] 按键编号 @return 1 - 按下;0 - 松开 */ uint8_t Key_GPIO_Read(uint8_t keyNum) { uint8_t value = 0; if(KEY1 == keyNum) { value = gpio_input_bit_get(KEY1_GPIO_PORT, KEY1_GPIO_PIN); } // else if(KEY2 == keyNum) // { // value = gpio_input_bit_get(KEY2_GPIO_PORT, KEY2_GPIO_PIN); // } return value; } /*=========================================================================*/ /* 输出 */ /*=========================================================================*/ /** @brief LED灯驱动初始化 @param 无 @return 无 */ void LED_GPIO_Init(void) { // PB4管脚默认是NJTRST,要当GPIO,需要重映射 rcu_periph_clock_enable(RCU_AF); // 管脚复用时钟使能 gpio_pin_remap_config(GPIO_SWJ_NONJTRST_REMAP, ENABLE); // GPIO时钟使能 rcu_periph_clock_enable(RCU_GPIOB); // 配置为推挽输出模式 gpio_init(LED1_GPIO_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, LED1_GPIO_PIN); LED_GPIO_Write(LED1, LED_OFF); } /** @brief 配置LED灯工作模式 @param ledNum -[in] LED灯编号 @param ledMode -[in] 工作模式 @return 无 */ void LED_GPIO_Write(uint8_t ledNum, uint8_t ledMode) { if(LED1 == ledNum) { gpio_bit_write(LED1_GPIO_PORT, LED1_GPIO_PIN, ledMode); } // else if(LED2 == ledNum) // { // gpio_bit_write(LED2_GPIO_PORT, LED2_GPIO_PIN, ledMode); // } } /** @brief 获取LED灯工作模式 @param ledNum -[in] LED灯编号 @return 工作模式 */ uint8_t LED_GPIO_Read(uint8_t ledNum) { uint8_t ledMode = 0; if(LED1 == ledNum) { ledMode = gpio_output_bit_get(LED1_GPIO_PORT, LED1_GPIO_PIN); } // else if(LED2 == ledNum) // { // ledMode = gpio_output_bit_get(LED2_GPIO_PORT, LED2_GPIO_PIN, &ledMode); // } return ledMode; } 5.2 board_gpio.h #ifndef _BOARD_GPIO_H_ #define _BOARD_GPIO_H_ /********************************************************************* * INCLUDES */ #include "gd32f10x_gpio.h" /********************************************************************* * DEFINITIONS */ /*=========================================================================*/ /* 输入 */ /*=========================================================================*/ #define KEY1_GPIO_PORT GPIOA #define KEY1_GPIO_PIN GPIO_PIN_1 #define KEY_OFF 0x01 #define KEY_ON 0x00 #define KEY1 1 #define KEY2 2 /*=========================================================================*/ /* 输出 */ /*=========================================================================*/ #define LED1_GPIO_PORT GPIOB #define LED1_GPIO_PIN GPIO_PIN_4 #define LED_OFF 0x01 #define LED_ON 0x00 #define LED1 1 #define LED2 2 /********************************************************************* * API FUNCTIONS */ void Key_GPIO_Init(void); uint8_t Key_GPIO_Read(uint8_t keyNum); void LED_GPIO_Init(void); void LED_GPIO_Write(uint8_t ledNum, uint8_t ledMode); uint8_t LED_GPIO_Read(uint8_t ledNum); #endif /* _BOARD_GPIO_H_ */ 5.3 main.c #include "gd32f10x.h" #include "systick.h" #include "board_gpio.h" int main(void) { systick_config();//系统主频108MHZ,采用外部晶振,由两个宏决定(__SYSTEM_CLOCK_108M_PLL_HXTAL与HXTAL_VALUE) Key_GPIO_Init();// 按键模块初始化 LED_GPIO_Init();// LED灯模块初始化 while(1) { if(KEY_ON == Key_GPIO_Read(KEY1)) { delay_1ms(100);//等待100ms LED_GPIO_Write(LED1, LED_ON); delay_1ms(100);//等待100ms LED_GPIO_Write(LED1, LED_OFF); } } } 5.4 工程代码

百度网盘:https://pan.baidu.com/s/1_tjTeP_xVNC-KdVDLbN-Ww?pwd=0h8m 提取码:0h8m

• 由 Leung 写于 2022 年 4 月 12 日

• 参考:GD32F103基础教程—GPIO输出实验(五)     GD32实战3__点亮LED灯



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3