本文章基于兆易创新GD32 MCU所提供的2.2.4版本库函数开发
向上代码兼容GD32F450ZGT6中使用
后续项目主要在下面该专栏中发布:
https://blog.youkuaiyun.com/qq_62316532/category_12608431.html?spm=1001.2014.3001.5482
感兴趣的点个关注收藏一下吧!
电机驱动开发可以跳转:
GD32F103RCT6/GD32F303RCT6-实战项目-无刷电机驱动(1)_gd32f103rct6例程-优快云博客
BMS电源系统开发可以跳转:
暂未放链接
DCDC-双向BUCK-BOOST实战链接:
本教程使用开发板:
因为先前F4的开发板用于BMS储能开发,涉及隐私无法在此基础上继续公布,所以就手忙脚乱的自制了一块专门用于教程的开发板,部分还未焊接完毕,焊油也未洗掉,后续会慢慢美化的。
群号:621154399
有问题欢迎大家加入我们一起交流,这个群是开源性技术交流群。
介绍
GD32F407ZGT6作为我们本教材选用的芯片,本节我们将展开讲如何实现GPIO的输入输出的操作。
GPIO(General Purpose Input Output)是通用输入输出引脚,它是STM32芯片上的数字接口,可配置为8种输入输出模式,。可以使用寄存器级操作进行配置和控制,因此具有灵活性和可编程性。
引脚电平:0V~3.3V,部分引脚可容忍5V(在GD32F103RCT6引脚定义中,带FT的,可以容忍5V)
每个GPIO引脚可以由软件配置为输出(推挽或开漏)、输入、外设的备用功能或者模拟模式。每个GPIO引脚都可以配置为上拉、下拉或无上拉/下拉。
输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等。
输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等。
具体更加详细的关于GPIO的讲解,大家可以参考F1系列编写的教程:
手册说明:
对应的四种不同功能:
输出模式配置
输入配置
模拟输入配置
复用功能配置
库函数更新:
关于gpio的初始化,我们本次主要是列举在GD32F1系列与GD32F4系列之间的对比。
GD32F103/GD32F303
其中,在GD32F1/GD32F303系列中,将GPIO初始化为输出模式的代码如下:
// GPIO时钟使能 rcu_periph_clock_enable(LED_1_GPIO_CLK); rcu_periph_clock_enable(LED_2_GPIO_CLK); rcu_periph_clock_enable(LED_3_GPIO_CLK); rcu_periph_clock_enable(LED_4_GPIO_CLK); // 配置为推挽输出模式 gpio_init(LED_1_GPIO_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, LED_1_GPIO_PIN); gpio_init(LED_2_GPIO_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, LED_2_GPIO_PIN); gpio_init(LED_3_GPIO_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, LED_3_GPIO_PIN); gpio_init(LED_4_GPIO_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, LED_4_GPIO_PIN);
在初始化GPIO所使用的时钟后,涉及到的主要库函数为:
GD32F407/GD32F450
在GD32F407/GD32F450中,库函数对GPIO的初始化做更一步细分,具体的实现的代码如下:
//GPIOB时钟使能 rcu_periph_clock_enable(RCU_GPIOD); gpio_mode_set(GPIOD,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2); gpio_mode_set(GPIOD,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5); gpio_output_options_set(GPIOD,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2); gpio_output_options_set(GPIOD,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5);
在初始化GPIO所使用的时钟后,涉及到的主要库函数为:
对于GPIO的输出部分,改动主要是如上,其余关于GPIO的电平操作和读取等函数,均一样。
GPIO实验
GPIO流水灯实验
实验现象演示:
GD32F407ZGT6流水灯演示视频
通过延时顺序开启LED以完成实验效果。
LED对应引脚在原理图中为:PD0-PD5
编程要点:
1.初始化GPIO时钟
2.设置GPIO工作模式
3.编写GPIO用户函数
/**
@brief LED灯驱动初始化
@param 无
@return 无
*/
void LED_GPIO_Init(void)
{
//GPIOB时钟使能
rcu_periph_clock_enable(RCU_GPIOD);
gpio_mode_set(GPIOD,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2);
gpio_mode_set(GPIOD,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5);
gpio_output_options_set(GPIOD,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2);
gpio_output_options_set(GPIOD,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5);
//默认输出高电平
gpio_port_write(GPIOD, 0xFFFF);
}
主函数中调用:
for(int x = 0;x<6;x++)
{
gpio_bit_write(GPIOD,BIT(x),RESET);
delay_ms(150);
if(x==5)
{
for(int x = 5;x>0;x--)
{
gpio_bit_write(GPIOD,BIT(x),SET);
delay_ms(150);
}
}
}
这里的LED操作函数,和F1系列一样被封装成bsp_led.c以及bsp_led.h
原型可以参考F1系列教程中有详细讲解
GPIO按键输入实验
实验现象演示:
GD32F407ZGT6按键控制LED演示视频
通过按下按键达到翻转LED电平状态
按键在原理图中对应的引脚为:
PG2-PG6
编程要点
1.使能GPIO时钟
2.GPIO输入模式初始化
3.编写用户函数
详细模块化编程以及按键注意事项可以参考F1文章:
GD32F103RCT6/GD32F303RCT6(3.2)GPIO外设使用-实验编程
在按键函数中,我们也采样封装的形式,文件保存在:
分别对应LED以及KEY的初始化
主函数中调用: