开发环境

MDK:keil 5.37

MCU: GD32F450IK

2.1GPIO工作原理

要想实现流水灯,首先必须了解GPIO的工作原理。

2.1.1 GPIO的基本结构如下图所示。

2.1.2 GD32 的 I/O 口可以由32位控制寄存器(GPIOx_CTL)配置为GPIO输入,GPIO输出,AF功能,模拟模式

当端口配置为输出 时,可以通过 GPIO 输出模式寄存器 (GPIOx_OMODE)配置为推挽或开漏模式。
输出端口的最大速度可以通过 GPIO 输出速度寄存 器 (GPIOx_OSPD) 配置。
每个端口可以通过 GPIO 上 / 下拉寄存器 (GPIOx_PUD) 配置为浮空 (无上拉或下拉 ) ,上拉或下拉功能。
分类 CTLy OMy PUDy
GPIO输入 X 浮空 00 X 00
上拉 01
下拉 10
GPIO输出 推挽 浮空 01 0 00
上拉 01
下拉 10
开漏 浮空 1 00
上拉 01
下拉 10
AFIO输入 X 浮空 10 X 00
上拉 01
下拉 10
AFIO输出 推挽 浮空 0 00
上拉 01
下拉 10
开漏 浮空 1 00
上拉 01
下拉 10
模拟 X X 11 X XX

 输入模式

 浮空输入:浮空(floating)就是逻辑器件的输入引脚即不接高电平,也不接低电平。由于逻辑器件的内部结构,当它输入引脚悬空时,相当于该引脚接了高电平。一般实际运用时,引脚不建议悬空,易受干扰。 通俗讲就是让管脚什么都不接,浮空着。信号进入芯片内部后,既没有接上拉电阻也没有接下拉电阻,经由触发器输入。配置成这个模式后,用电压变量引脚电压为1点几伏,这是个不确定值。由于其输入阻抗比较大,一般把这种模式用于标准的通讯协议,比如IIC、USART的等。该模式是GD32复位之后的默认模式。

 上拉输入:上拉就是把电位拉高,比如拉到Vcc。上拉就是将不确定的信号通过一个电阻嵌位在高电平,电阻同时起限流作用,弱强只是上拉电阻的阻值不同,没有什么严格区分。上拉输入就是信号进入芯片后加了一个上拉电阻,再经过施密特触发器转换成0、1信号,读取此时的引脚电平为高电平;

 下拉输入:就是把电压拉低,拉到GND。与上拉原理相似。下拉输入就是信号进入芯片后加了一个下拉电阻,再经过施密特触发器转换成0、1信号,读取此时的引脚电平为低电平;

 模拟输入:信号进入后不经过上拉电阻或者下拉电阻,关闭施密特触发器,经由另一线路把电压信号传送到片上外设模块。模拟输入是指传统方式的输入,数字输入是输入PCM数字信号,即0、1的二进制数字信号,通过数模转换,转换成模拟信号,经前级放大进入功率放大器,功率放大器还是模拟的。比如传送给ADC模块,由ADC采集电压信号。所以可以理解为模拟输入的信号是未经处理的信号,是原汁原味的信号。

 输出模式

 开漏输出:一般用在电平不匹配的场合,如需要输出5V的高电平。输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行。适合于做电流型的驱动,其吸收电流的能力相对强(一般20mA以内)。

 复用开漏输出:可以理解为GPIO口被用作第二功能时的配置情况(即并非作为通用IO口使用)。端口必须配置成复用开漏功能输出模式。

 推挽式输出:可以输出高、低电平,连接数字器件;推挽结构一般是指两个三极管分别受两个互补信号的控制,总是在一个三极管导通的时候另一个截止。高低电平由IC的电源决定。推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高。输出既可以向负载灌电流,也可以从负载抽取电流。推拉式输出级既提高电路的负载能力,又提高开关速度。

 推挽式复用输出

 备用功能(AF)——为了适应不同的器件封装,GPIO 端口支持软件配置将一些备用功能应用到其他引脚上。

2.2 I/O复用和重映射

2.2.1 I/O复用

GD32 有很多的内置外设,这些外设的外部引脚都是与 GPIO 复用的。也就是说,一个 GPIO如果可以复用为内置外设的功能引脚,那么当这个 GPIO 作为内置外设使用的时候,就叫做复用。当I/O端口被配置为复用功能时:

2.3 GPIO流水灯硬件电路分析

发光二极管是属于二极管的一种,具有二级管单向导电特性,即只有在正向电压(二极管的正极接正,负极接负)下才能导通发光。PF6引脚接发光二极管(LED1)的正极,所以PF6引脚输出高电平LED1亮,PF6引脚输出低电平LED1熄灭,其他LED同理。

2.4 GPIO流水灯寄存器分析

要想真正掌握一款单片机,分析寄存器是必不可少,但是对于GD32来再说,GD已经将寄存器操作封装成库函数,开发者只需要调用库函数即可.

每个GPIO端口都有两个32位配置寄存器(GPIO_CTL0 ,GPIO_CTL1) ,两个16位数据寄存器 (GPIO_ISTAT和GPIO_OCTL),一个32位置位寄存器(GPIO_BOP),一个16位复位寄存器(GPIO_BC),一个16位锁定寄存器(GPIO_LOCK)。每个I/O端口位可以自由编程。

点亮LED,基本步骤是:配置寄存器;控制寄存器。库开发只是将传统的配置方式编程函数,使单片机开发变得简单方便快捷。

2.5 GPIO 流水灯实现流程

在上文已经分析了GPIO的原理及操作步骤,现在我们就来写代码吧。

GPIO是开发GD32最基本的配置,所以掌握GPIO的配置显得尤为重要。要实现流水灯,一般步骤可以总结为如下:

1)GPIO 时钟使能;
2)GPIO 端口模式设置;
3)初始化IO口;
4)编写处理函数;

2.6 GPIO 流水灯实现

2.6.1 GPIO库函数

GPIO库函数相关的库函数如下:
 gpio_deinit 复位外设GPIO
 gpio_afio_deinit 复位AFIO
 gpio_init GPIO参数初始化
 gpio_bit_set 置位引脚值
 gpio_bit_reset 复位引脚值
 gpio_bit_write 将特定的值写入引脚
 gpio_port_write 将特定的值写入一组端口
 gpio_input_bit_get 获取引脚的输入值
 gpio_input_port_get 获取一组端口的输入值
 gpio_output_bit_get 获取引脚的输出值
 gpio_output_port_get 获取一组端口的输出值
 gpio_pin_remap_config 配置GPIO引脚重映射
 gpio_pin_remap1_config 配置GPIO引脚重映射1
 gpio_exti_source_select 选择哪个引脚作为EXTI源
 gpio_ethernet_phy_select 以太网MII或RMII PHY选择
 gpio_event_output_config 配置事件输出
 gpio_event_output_enable 事件输出使能
 gpio_event_output_disable 事件输出禁能
 gpio_pin_lock 相应的引脚配置被锁定

2.6.2流水灯代码实现
核心代码如下:

#include "gd32f4xx.h"/*!\brief      configure led GPIO\param[in]  lednum: specify the Led to be configured\arg        LED1\arg        LED2\arg        LED3\param[out] none\retval     none
*/
void  gd_eval_led_init (led_typedef_enum lednum)
{/* enable the led clock */rcu_periph_clock_enable(GPIO_CLK[lednum]);/* configure led GPIO port */ gpio_mode_set(GPIO_PORT[lednum], GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,GPIO_PIN[lednum]);gpio_output_options_set(GPIO_PORT[lednum], GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN[lednum]);GPIO_BC(GPIO_PORT[lednum]) = GPIO_PIN[lednum];
}/*!\brief      configure systick\param[in]  none\param[out] none\retval     none
*/
void systick_config(void)
{/* setup systick timer for 1000Hz interrupts */if (SysTick_Config(SystemCoreClock / 1000U)){/* capture error */while (1){}}/* configure the systick handler priority */NVIC_SetPriority(SysTick_IRQn, 0x00U);
}/*!\brief      turn on selected led\param[in]  lednum: specify the Led to be turned on\arg        LED1\arg        LED2\arg        LED3\param[out] none\retval     none
*/
void gd_eval_led_on(led_typedef_enum lednum)
{GPIO_BOP(GPIO_PORT[lednum]) = GPIO_PIN[lednum];
}/*!\brief      turn off selected led\param[in]  lednum: specify the Led to be turned off\arg        LED1\arg        LED2\arg        LED3\param[out] none\retval     none
*/
void gd_eval_led_off(led_typedef_enum lednum)
{GPIO_BC(GPIO_PORT[lednum]) = GPIO_PIN[lednum];
}/*!\brief      delay a time in milliseconds\param[in]  count: count in milliseconds\param[out] none\retval     none
*/
void delay_1ms(uint32_t count)
{delay = count;while(0U != delay){}
}int main(void)
{  gd_eval_led_init(LED1);gd_eval_led_init(LED2);gd_eval_led_init(LED3);systick_config();while(1){/* turn on LED1 */gd_eval_led_on(LED1);/* insert 200 ms delay */delay_1ms(200);/* turn on LED2 */gd_eval_led_on(LED2);/* insert 200 ms delay */delay_1ms(200);/* turn on LED3 */gd_eval_led_on(LED3);/* insert 200 ms delay */delay_1ms(200);        /* turn off LEDs */gd_eval_led_off(LED1);gd_eval_led_off(LED2);gd_eval_led_off(LED3);/* insert 200 ms delay */delay_1ms(200);}
}

GD32学习2——流水灯相关推荐

  1. FPGA第一天的学习-LED流水灯

    FPGA第一天的学习-LED流水灯 每一次玩一块新的开发板我们都会首先做出一个流水灯,所以我也做出一个流水灯并且结合网上教程和自己的理解来试着将代码理解得更透彻. 1.硬件部分 由原理图我们可以知道时 ...

  2. 51单片机入门学习--LED流水灯呼吸灯

    LED led:发光二极管,Light Emitting Diode,可用万用表测量正负极 二极管电路图 直插式led,长的一端是正极,短的一端是负极 贴片式led,三角形的尖指向的是负极,有颜色的是 ...

  3. 八位流水灯的verilog代码_Arduino入门 第七节-彗星灯 呼吸流水灯

    在前面的课程中,我们学习了流水灯.呼吸灯的实现方法,本期课程我们将把呼吸灯和流水灯"组合"到一起,做一个"呼吸流水灯"的效果.呼吸流水灯,实际上就是" ...

  4. 《嵌入式 – GD32开发实战指南》第3章 GPIO流水灯的前世今生

    开发环境: MDK:Keil 5.30 MCU:GD32F207IK 上一章通过控制GPIO的高低电平实现了流水灯,但只是告诉了大家怎么做,如何实现流水灯,本文将深入剖析的GPIO流水灯的前生今世,深 ...

  5. 《嵌入式 – GD32开发实战指南》第2章 初识GPIO流水灯

    开发环境: MDK:Keil 5.30 MCU:GD32F207IK 2.1 GPIO工作原理 熟悉单片机的朋友都知道,学习的第一个例程就是流水灯,要想实现流水灯,首先必须了解GPIO的工作原理.GP ...

  6. FPGA学习笔记(1)简单的时序逻辑电路——流水灯

    FPGA学习笔记(1)简单的时序逻辑电路--流水灯 编程语言为Verilog HDL 原理 (1)设计一个计数器,使开发板上的4个LED状态每500ms翻转一次.开发板上的晶振输出时钟频率为50MHz ...

  7. 51单片机入门学习小结(流水灯与数码管)

    51单片机入门学习小结(流水灯与数码管) 对原理图的分析 以下是我所用单片机的原理图 这块51单片机一共有4个I/O口(意思为input/output),也代表着如果我们后续都要用到这四个的话那么功能 ...

  8. c语言intrins头文件,结合单片机学习板学习c语言之流水灯制作 intrins.h头文件

    原标题:结合单片机学习板学习c语言之流水灯制作 intrins.h头文件 目的:实现流水灯. 本文引用地址:http://www.eepw.com.cn/article/201608/294948.h ...

  9. 4.6Proteus流水灯学习

    目录 学习总结: 流水灯代码: 学习总结: 选AT89C52,然后选别的灯啊,电阻啊,再连线,蓝色的那个是自己画的主线,注意连在主线上的线要用LBL标号才能用,然后怎么把代码烧进去呢,双击芯片,把路径 ...

最新文章

  1. Struts2 2.5版本新配置filter-class
  2. mybatis学习笔记(3)-入门程序一
  3. 《码出高效:Java开发手册》背后的故事
  4. 文献记录(part6)--Dynamic Tree Cut in-depth description, tests and applications
  5. 前端笔记-thymeleaf获取及回显select数据(combox)
  6. 从小小后视镜看物联网的生态(下)
  7. AI研发新药真有那么神?可能哈佛、斯坦福和阿斯利康实验室都在吹牛
  8. qt 在qtextedit显示数组_QtWidget: 设置QTextEdit的各种颜色
  9. php mixed约束,Mixed Content: 混合被动/显示内容和混合活动内容
  10. Visio绘图怎么对齐连接点
  11. tp5验证码详细代码
  12. (vivo)安卓神器xposed框架Root安装指南
  13. 微信小程序之点点考勤经验总结
  14. 上海安陆FPGA程序下载
  15. 产品经理如何设计网页导航菜单
  16. 关于大数据技术原理与应用的学习(6)
  17. android 7.1 白屏,苹果iphone7手机白屏怎么回事 iphone7白屏不能关不了机的快速解决办法...
  18. 如何将白鹭引擎开发的游戏通过Egret Native发布到 GooglePlay平台
  19. java盘古分词_.NET使用Lucene.Net和盘古分词类库实现中文分词
  20. 艺赛旗(RPA)RPA8.0 解决滑动验证码完整流程

热门文章

  1. c语言printf输出字母,C语言printf()格式化输出控制
  2. shell脚本--重启服务
  3. linux css压缩工具下载,JS和CSS的压缩混淆工具(JsCompressor)下载 v3.0
  4. 报错解决:Can‘t connect to X11 window server using……
  5. Win7中解决无法卸载/升级 VS2008、无法输入序列号的问题
  6. 个位数统计(C语言)
  7. eyoucms自媒体新闻资讯类网站模板
  8. 小驼峰命名法与大驼峰命名法
  9. flash 与CODE memory ,ROM与Xdata
  10. unity敌人跟随(导航)