【GD32】01-GPIO通用输入输出

GD32

闲话说在前头

这里又开一个系列啦。

原因就是之前买了立创开发板的9.9的GD32E230C8T6的板子,买都买了就跟着立创开发板学习一下(属于是一次性支持了两个国产品牌了,立创和兆易创新)。并且我还买了GD32F407VET6的板子,后续也会使用GD32F407VET6这块板子来做一些别的。

GD32可以说是STM32的国产平替版,听说部分型号可以直接替换掉STM32(我没试过)。

反正以后有啥项目我的首选MCU肯定不会是STM32了(虽然我是用的STM32入门的32位单片机),因为上有更好用ESP32,下有供货稳定(21年的时候STM32断货,STM32F103C8T6的价格曾被炒到六十多一片)的GD32。

刚刚去某宝逛了逛,目前为止(2024.4.23),我在同一家店铺里发现GD32F103C8T6的芯片会比STM32F103C8T6的芯片稍贵三毛钱(不过GD32的主频更高,其他外设和性能什么的没去翻手册对比不太清楚)。并且在某宝上卖STM32开发板的商家明显比GD32开发板的多。现在一个STM32F103C8T6的最小系统板我找到的便宜的可能也就十块钱出头,但是GD32F103C8T6的核心板要二十多块,而且选择还很少。我想这大概是市场上的差异,因为有了需求才会有供给,大家都去买STM32那么STM32自然就能投入更多到研发和生产上,导致了强者愈强的局面。随着国内技术的不断发展和市场的逐步成熟,GD32等国产MCU正在逐渐缩小与国际品牌的差距。

本人怀着强烈的爱国之心,呼吁各位小伙伴支持国产。你不支持,我不支持,那国产品牌哪来的研发资金给咱整什么国货崛起。

总之一句话,支持国产就完事了。

命名规则

GD32和STM32可以说是非常相似的,连命名规则都差不多。

外设资源

上面红框框出来的是GD32E230的外设资源。相比较STM32F103C8T6来说,相对少一些。不过E230在GD32系列芯片里属于入门级,拿来学习是绰绰有余的。

GPIO

接下来我们直接看如何驱动GPIO,点个灯先。

国产的还有一个好处就是手册对中文的支持比较好,省的跑去找翻译了。

可以看得出GD32的固件库功能还是挺多的,比如最后一个翻转GPIO的引脚状态,这个在STM32的固件库里是没有的(HAL库有)。虽然不用人家提供,我们另外也有办法可以实现翻转的操作,但是直接就有的话还是很舒服的。

在STM32中,我们配置GPIO口是需要一个结构体变量的,通过给这个结构体的成员赋值来配置GPIO口。

在GD32中,我们可以看到配置GPIO口是通过两个函数来配置的,分别是设置GPIO模式和GPIO输出模式和速度。

gpio_mode_set

可以选什么参数,在上面的表格写的非常清楚。

这边就简单说一下一些参数的具体含义。

首先是mode,输入输出这个没什么好说的,模拟模式就是我们使用ADC的时候用的。备用功能模式也就是复用引脚,比如我现在要用串口,那么就需要给串口的TX和RX这俩引脚配上这个备用功能模式。

pull_up_down是配置电阻的,和STM32不同的是GD32把这个配置拆开了,STM32中是直接配置为上拉输入,下拉输入等,而在GD32中是配置输入模式,再加上上拉电阻或者是下拉电阻。

gpio_mode_set(GPIOA,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,GPIO_PIN_0);

上面示例代码的意思就是我们配置GPIOA的0号引脚为输出模式,没有加电阻。

gpio_output_options_set

配置输出的模式和速率。

一般来说咱就陪推挽输出是够用的,不过具体还得看咱要驱动的模块的手册来判断。

输出速度,如果是通过高低电平来传输数据,那么速度是建议在通信速率的5~10倍的。

gpio_output_options_set(GPIOA,GPIO_OTYPE_PP,GPIO_OSPEED_2MHZ,GPIO_PIN_0);

上面配置了GPIOA的0号引脚为2MHz的推挽输出模式。 

如果是输入模式则不需要使用这个函数。

gpio_bit_write

设置输出电平的函数有很多个,除了这个还有gpio_bit_set gpio_bit_resetgpio_port_write不过我这边就讲gpio_bit_write,因为这个是最常用的,并且剩下三个能实现的功能,用这个函数都可以实现。

参数就是指定端口和引脚,以及高电平(SET)或是低电平(RESET)。

gpio_input_bit_get

gpio_output_bit_get

上面的两个函数都可以读取指定端口和引脚的电平。

跟STM32不一样的是GD32细分了读取电平,分为了读取输出模式下的引脚和读取输入模式下的引脚。

gpio_af_set

设置复用哪一个外设。

这个具体看我们要使用哪一个外设,对照着表格去配置就好了。后续我们会用到。

点亮LED

剩下还有一点就是GD32和STM32一样,默认都是关闭外设时钟的,因此我们还需要打开外设时钟。

rcu_periph_clock_enable  

参照着表格填写我们需要打开的外设时钟即可。 

#include "gd32e23x.h"void Z_Init_GPIO(void){rcu_periph_clock_enable(RCU_GPIOA);gpio_mode_set(GPIOA,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,GPIO_PIN_0);gpio_output_options_set(GPIOA,GPIO_OTYPE_PP,GPIO_OSPEED_2MHZ,GPIO_PIN_0);
}int main(void){Z_Init_GPIO();gpio_bit_write(GPIOA,GPIO_PIN_0,0);while(1){}
}

闪烁LED

点亮LED之后我们再让LED闪烁。

我们需要延时函数,这个时候就直接把立创开发板写的拿过来用就好了。

systick.c

 /******************************************************************************* 测试硬件:立创开发板·GD32E230C8T6    使用主频72Mhz    晶振8Mhz* 版 本 号: V1.0* 修改作者: www.lckfb.com* 修改日期: 2023年11月02日* 功能介绍:      ****************************************************************************** 梁山派软硬件资料与相关扩展板软硬件资料官网全部开源  * 开发板官网:www.lckfb.com   * 技术支持常驻论坛,任何技术问题欢迎随时交流学习  * 立创论坛:club.szlcsc.com   * 其余模块移植手册:【立创·GD32E230C8T6开发板】模块移植手册* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!* 不靠卖板赚钱,以培养中国工程师为己任******************************************************************************/
/*!\file  systick.c\brief the systick configuration file\version 2019-02-19, V1.0.0, firmware for GD32E23x
*//*Copyright (c) 2019, GigaDevice Semiconductor Inc.All rights reserved.Redistribution and use in source and binary forms, with or without modification, 
are permitted provided that the following conditions are met:1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 
OF SUCH DAMAGE.
*/#include "gd32e23x.h"
#include "systick.h"volatile static float count_1us = 0;
volatile static float count_1ms = 0;/*!\brief      configure systick\param[in]  none\param[out] none\retval     none
*/
void systick_config(void)
{/* systick clock source is from HCLK/8 */systick_clksource_set(SYSTICK_CLKSOURCE_HCLK_DIV8);count_1us = (float)SystemCoreClock/8000000;count_1ms = (float)count_1us * 1000;
}/*!\brief      delay a time in microseconds in polling mode\param[in]  count: count in microseconds\param[out] none\retval     none
*/
void delay_1us(uint32_t count)
{uint32_t ctl;/* reload the count value */SysTick->LOAD = (uint32_t)(count * count_1us);/* clear the current count value */SysTick->VAL = 0x0000U;/* enable the systick timer */SysTick->CTRL = SysTick_CTRL_ENABLE_Msk;/* wait for the COUNTFLAG flag set */do{ctl = SysTick->CTRL;}while((ctl&SysTick_CTRL_ENABLE_Msk)&&!(ctl & SysTick_CTRL_COUNTFLAG_Msk));/* disable the systick timer */SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;/* clear the current count value */SysTick->VAL = 0x0000U;
}void delay_us(uint32_t count)
{uint32_t ctl;/* reload the count value */SysTick->LOAD = (uint32_t)(count * count_1us);/* clear the current count value */SysTick->VAL = 0x0000U;/* enable the systick timer */SysTick->CTRL = SysTick_CTRL_ENABLE_Msk;/* wait for the COUNTFLAG flag set */do{ctl = SysTick->CTRL;}while((ctl&SysTick_CTRL_ENABLE_Msk)&&!(ctl & SysTick_CTRL_COUNTFLAG_Msk));/* disable the systick timer */SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;/* clear the current count value */SysTick->VAL = 0x0000U;
}/*!\brief      delay a time in milliseconds in polling mode\param[in]  count: count in milliseconds\param[out] none\retval     none
*/
void delay_1ms(uint32_t count)
{uint32_t ctl;/* reload the count value */SysTick->LOAD = (uint32_t)(count * count_1ms);/* clear the current count value */SysTick->VAL = 0x0000U;/* enable the systick timer */SysTick->CTRL = SysTick_CTRL_ENABLE_Msk;/* wait for the COUNTFLAG flag set */do{ctl = SysTick->CTRL;}while((ctl&SysTick_CTRL_ENABLE_Msk)&&!(ctl & SysTick_CTRL_COUNTFLAG_Msk));/* disable the systick timer */SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;/* clear the current count value */SysTick->VAL = 0x0000U;
}void delay_ms(uint32_t count)
{uint32_t ctl;/* reload the count value */SysTick->LOAD = (uint32_t)(count * count_1ms);/* clear the current count value */SysTick->VAL = 0x0000U;/* enable the systick timer */SysTick->CTRL = SysTick_CTRL_ENABLE_Msk;/* wait for the COUNTFLAG flag set */do{ctl = SysTick->CTRL;}while((ctl&SysTick_CTRL_ENABLE_Msk)&&!(ctl & SysTick_CTRL_COUNTFLAG_Msk));/* disable the systick timer */SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;/* clear the current count value */SysTick->VAL = 0x0000U;
}

systick.h

/*!\file  systick.h\brief the header file of systick\version 2019-02-19, V1.0.0, firmware for GD32E23x
*//*Copyright (c) 2019, GigaDevice Semiconductor Inc.All rights reserved.Redistribution and use in source and binary forms, with or without modification, 
are permitted provided that the following conditions are met:1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 
OF SUCH DAMAGE.
*/#ifndef SYS_TICK_H
#define SYS_TICK_H#include <stdint.h>/* function declarations */
/* configure systick */
void systick_config(void);
/* delay a time in milliseconds */
void delay_1ms(uint32_t count);/* delay a time in milliseconds */
void delay_ms(uint32_t count);/* delay a time in microseconds */
void delay_1us(uint32_t count);/* delay a time in microseconds */
void delay_us(uint32_t count);#endif /* SYS_TICK_H */

闪烁LED代码 

#include "gd32e23x.h"
#include "systick.h"void Z_Init_GPIO(void){rcu_periph_clock_enable(RCU_GPIOA);gpio_mode_set(GPIOA,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,GPIO_PIN_0);gpio_output_options_set(GPIOA,GPIO_OTYPE_PP,GPIO_OSPEED_2MHZ,GPIO_PIN_0);
}int main(void){systick_config();Z_Init_GPIO();gpio_bit_write(GPIOA,GPIO_PIN_0,0);while(1){//gpio_bit_write(GPIOA,GPIO_PIN_0,!gpio_output_bit_get(GPIOA,GPIO_PIN_0));gpio_bit_toggle(GPIOA,GPIO_PIN_0);delay_ms(500);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/10275.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++:关于圆形鱼眼半全景图转为等距圆柱投影图

C&#xff1a;空间坐标映射到球面坐标/全景图_如何将球体坐标映射到球面uv-CSDN博客 C&#xff1a;关于360全景图像和立方体6面全景图像的相互转换_彩色全景拆解正方体6个面-CSDN博客 之前记录了立方体和360全景之间的转换&#xff0c;这次记录下鱼眼图与360全景图之间的转换…

信创应用软件之办公流版签

信创应用软件之办公流版签 文章目录 信创应用软件之办公流版签概述流式文件版式文件电子签章厂商金山办公永中-永中Office中标-中标普华Office福昕科技e签宝法大大 概述 办公流版签软件主要包括办公中常用到的流式软件、版式软件以及电子签章。 版式文件和流式文件都是文书类…

软件体系结构总结

文章目录 一、软件体系结构概述1.1 基本概念1.1.1 背景1.1.2 定义1.1.3 系统1.1.3.1 定义1.1.3.2 特性1.1.3.3 系统的体系结构 1.1.4 软件设计的层次性1.1.5 体系结构的类别&#xff08;类型&#xff09;1.1.6 重要性&#xff08;意义&#xff09; 1.2 模块及其设计1.2.1 定义1…

HTTP超时时间设置

在进行超时时间设置之前我们需要了解一次http请求经历的过程 浏览器进行DNS域名解析&#xff0c;得到对应的IP地址根据这个IP&#xff0c;找到对应的服务器建立连接&#xff08;三次握手&#xff09;建立TCP连接后发起HTTP请求&#xff08;一个完整的http请求报文&#xff09;服…

[单机]完美国际_V155_GM工具_VM虚拟机

[端游] 完美国际单机版V155一键端PC电脑网络游戏完美世界幻海凌云家园 本教程仅限学习使用&#xff0c;禁止商用&#xff0c;一切后果与本人无关&#xff0c;此声明具有法律效应&#xff01;&#xff01;&#xff01;&#xff01; 教程是本人亲自搭建成功的&#xff0c;绝对是…

出海企业哪种组网方案更省事?

对于出海企业而言&#xff0c;建立跨地区的数据传输和协同工作至关重要&#xff0c;以提升运营效率。因此&#xff0c;网络构建变得迫在眉睫。通过构建企业组网&#xff0c;企业能够加强与海外分支、客户和合作伙伴之间的联系&#xff0c;加速海外业务的发展。 然而&#xff0c…

Stable Diffusion教程|图生图原理和实战

Stable Diffusion凭借其卓越的图生图功能&#xff0c;极大地提升了图像生成的可控性与输出品质&#xff0c;赋予用户前所未有的个性化创作风格表达能力。这一革新特性使得Stable Diffusion不仅能精准地捕捉用户的艺术愿景&#xff0c;更能以数字化手段孕育出新颖且极具创意的画…

【Java 8】Lambda: mAA::get 返回函数式接口实例

正文 代码介绍&#xff1a;分别有两个函数式接口Lazy跟LazyDependencyCreator&#xff0c;一个HashMap存储<Object, LazyDependencyCreator>键值对。重点在于mProviders.put(AA.class,mAA::get)&#xff0c;看了很久都没看懂&#xff0c;mAA::get返回的不是mAA本身吗&am…

零基础HTML教程(32)--HTML5语义化标签

文章目录 1. div时代2. div的缺点3. 语义化标签4. 语义化标签有哪些5. 实战演练6. 小结 1. div时代 我是2009年开始学习网页开发的&#xff0c;那时候HTML里面到处是div。 这么说吧&#xff0c;那时候div就是网页的骨架&#xff0c;支撑着网页的主结构。 2. div的缺点 div作…

使用J-Link Commander / JFlash 烧写固件程序(以STM32F103C8T6为例)

使用JFlash 烧写流程 运行JFlash, 点击Project Settings 配置Jlink为SWD方式,选择连接设备为STM32F103C8T6, 点击确定. 选择要烧录的Bin文件 设置bin文件烧录地址, 点击OK(地址要在0x08000000-0x0800FFFF范围内) Note : STM32F103C8T6 Flash大小为 64KB&#xff0c; 地址范围…

重生奇迹mu再生宝石怎么用有什么用

重生奇迹mu再生宝石有2个用处&#xff1a; 1、在玛雅哥布林处给380装备加PVP属性4追4以上的380级装备,守护宝石一颗,再生宝石一颗,成功得到PVP装备,失败宝石消失,装备无变化&#xff1b; 2、给非套装点强化属性用法跟祝福,灵魂,生命一样直接往装备上敲,成功得到随机强化属性一…

八. Django项目之电商购物商城 -- 添加邮箱

Django项目之电商购物商城 – 添加邮箱 一. 用户中心 添加邮箱功能在用户中心中 , 先完善用户中心功能 1. 视图 # 用户中心 class UserInfoCenterView(LoginRequiredMixin,View):def get(self , request):context {username : request.user.username,mobile : request.use…

队列的实现以及队列如何实现栈

一、队列的定义 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出 FIFO(First In First Out) 入队列&#xff1a;进行插入操作的一端称为 队尾 出队列&#xff1a;进行删除操作的一端称为 队头 …

20240507 ubuntu20.04+ros noetic 跑通lioslam

任务&#xff1a;跑通lioslam 主要参考博客 IMU激光雷达融合使用LIO-SAM建图学习笔记——详细、长文、多图、全流程_ubuntu_AIDE回归线-GitCode 开源社区 (csdn.net) 1.不要用这一句 wget -O ~/Downloads/gtsam.zip https://github.com/borglab/gtsam/archive/4.0.0-alpha2…

【Spring】初识 Spring AOP(面向切面编程)

目录 1、介绍AOP 1.1、AOP的定义 1.2、AOP的作用 1.3、AOP的核心概念及术语 2、AOP实现示例 3、EnableAspectJAutoProxy注解 1、介绍AOP 1.1、AOP的定义 AOP&#xff08;Aspect Orient Programming&#xff09;&#xff0c;直译过来就是面向切面编程&#xff0c;AOP 是一…

Windows Python 安装准备

首先安装配置 1. 环境的安装和配置: 运行环境: 官方提供了cpython解释器 编辑环境: 课程初级阶段:推荐大家使用: 记事本工具(UE、notepad++、editplus、sublime、vscode) 中期阶段IDE的使用,pycharm 2. 安装python环境: 在官方下载python解释器 www.python.org …

Ubuntu18.04--虚拟机配置Samba并从Windows登录

前言&#xff1a; 本文记录我自己在Windows上安装 Virtualbox &#xff0c;并在Virtualbox中安装 Ubuntu-18.04 虚拟机&#xff0c;在Ubuntu-18.04虚拟机里安装配置Smaba服务器&#xff0c;从 Windows 宿主系统上访问虚拟机共享samba目录的配置命令。 引用: N/A 正文 虚拟…

揭秘LLMOps,高效开发大型语言模型

大家好&#xff0c;随着人工智能&#xff08;AI&#xff09;的蓬勃发展&#xff0c;一个新兴领域语言模型运维&#xff08;LLMOps&#xff09;正逐渐成为关注的焦点。LLMOps专注于对大型语言模型&#xff08;LLMs&#xff09;&#xff0c;例如OpenAI的GPT系列&#xff0c;进行全…

SpringBoot Actuator未授权访问漏洞的解决方法

1. 介绍 Spring Boot Actuator 是一个用于监控和管理 Spring Boot 应用程序的功能模块。它提供了一系列生产就绪的功能&#xff0c;帮助你了解应用程序的运行状况&#xff0c;以及在运行时对应用程序进行调整。Actuator 使用了 Spring MVC 来暴露各种 HTTP 或 JMX 端点&#x…

【机器学习】卷积神经(CNN)在图像识别中的革命性应用:自动驾驶的崛起

卷积神经网络&#xff08;CNN&#xff09;在图像识别中的革命性应用&#xff1a;自动驾驶的崛起 一、卷积神经网络&#xff08;CNN&#xff09;的基本原理二、CNN在图像识别中的显著成果三、CNN在自动驾驶汽车中的物体检测和识别四、CNN在图像识别中的代码实例 随着人工智能和深…