0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

GD32开发实战指南(基础篇) 第2章 初始GPIO流水灯

嵌入式大杂烩 来源:嵌入式大杂烩 作者:嵌入式大杂烩 2023-05-08 09:03 次阅读

开发环境:

MDK:Keil 5.30

开发板:GD32F207I-EVAL

MCU:GD32F207IK

1 GPIO工作原理

熟悉单片机的朋友都知道,学习的第一个例程就是流水灯,要想实现流水灯,首先必须了解GPIO的工作原理。GPIO的基本结构如下图所示。

16833874879227adue8q65x

GD32 的 IO 口可以由软件配置成如下 8 种模式:

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

1683387488659ugrr20se8m

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

1683387489233zsfshfg16f

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

1683387489618qp33hnttxx

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

1683387490063gm0ayutl6v

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

1683387490432310yvu5zbg

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

1683387490869aja54889fv

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

1683387491229e5si3nc845

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

1683387491717umhg0t0gly

2 I/O复用和重映射

2.1 I/O复用

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

● 在开漏或推挽式配置中,输出缓冲器被打开

● 内置外设的信号驱动输出缓冲器(复用功能输出)

● 施密特触发输入被激活

● 弱上拉和下拉电阻被禁止

● 在每个APB2时钟周期,出现在I/O脚上的数据被采样到输入数据寄存器

● 开漏模式时,读输入数据寄存器时可得到I/O口状态

● 在推挽模式时,读输出数据寄存器时可得到最后一次写的值

1683387492086akrxgvayye

大家都知道,MCU 都有串口,GD32 有好几个串口。比如说 GD32F207IK有 8个串口,我们可以查手册知道,串口 0 的引脚对应的 IO 为 PA9,PA10.PA9, PA10 默认功能是 GPIO, 所以当PA9,PA10 引脚作为串口0的 TX,RX 引脚使用的时候,那就是端口复用。

USART0_TX PA9
USART0_RX PA10

关于串口的内容后面的章节会详细讲解。

2.2 I/O重映射

为了使不同器件封装的外设 IO 功能数量达到最优,可以把一些复用功能重新映射到其他一些引脚上。 GD32 中有很多内置外设的输入输出引脚都具有重映射(remap)的功能。 我们知道每个内置外设都有若干个输入输出引脚,一般这些引脚的输出端口都是固定不变的,为了让设计工程师可以更好地安排引脚的走向和功能,在 GD32中引入了外设引脚重映射的概念,即一个外设的引脚除了具有默认的端口外,还可以通过设置重映射寄存器的方式,把这个外设的引脚映射到其它的端口。

复用功能 USART1_REMAP = 0 USART1_REMAP = 1
USART0_TX PA9 PB6
USART0_RX PA10 PB7

从表中可以看出,默认情况下,串口 0复用的时候的引脚位 PA9、PA10,同时我们可以将 TX 和 RX 重新映射到管脚 PB6 和 PB7 上面去。所以重映射我们同样要使能复用功能的时候讲解的 2 个时钟外,还要使能 AFIO 功能时钟,然后要调用重映射函数。

3 GPIO流水灯硬件电路分析

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

1683387492404gy69yo3ul2

值得注意的,不同的开发板,LED连接的GPIO一般是不同的,请注意修改。

4 GPIO流水灯寄存器分析

要想真正掌握一款单片机,分析寄存器是必不可少,但是对于GD32来再说,GD已经将寄存器操作封装成库函数,开发者只需要调用库函数即可,对于初学者来说,只需学会使用使用函数即可,对于没有基础的读者朋友就不必细究每个寄存器,当学到一定程度,再来一探究竟吧,笔者再这里只是给出GPIO的寄存配置相关配置表,在后面的章节也是如此。好了,继续进入正题吧。

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

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

我们常用的 IO 端口寄存器只有 4 个: GPIO_CTL0、GPIO_CTL1、 GPIO_OCTL、 GPIO_BOP。其中GPIO_CTL0、GPIO_CTL1 控制着每个 IO 口的模式及输出速率。

1683387492758gcrsz47q1u

GPIO_CTL0、GPIO_CTL1类似,读者朋友可以参看《GD32F10x_User_Manual_EN_Rev2.4》数据输入输出寄存器是将对应的IO口置位,从而进行数据的输入与输出。

1683387493037oitmwhsdmo

5 GPIO 流水灯实现流程

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

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

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

6 GPIO 流水灯实现

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 相应的引脚配置被锁定

6.2 流水灯代码实现

主函数代码如下:

/*
    brief      main function
    param[in]  none
    param[out] none
    retval     none
*/
int main(void)
{
    /* configure LED1 GPIO port */
    led_init(LED1);

    /* configure LED2 GPIO port */
    led_init(LED2);

    /* configure LED3 GPIO port */
    led_init(LED3);

    /* configure LED4 GPIO port */
    led_init(LED4);

    while(1) 
    {
        /* turn on LED1, turn off LED4 */
        led_on(LED1);
        led_off(LED4);
        /*delay about 500ms*/
        delay(0xffffff);

        /* turn on LED2, turn off LED1 */
        led_on(LED2);
        led_off(LED1);
        /*delay about 500ms*/
        delay(0xffffff);

        /* turn on LED3, turn off LED2 */
        led_on(LED3);
        led_off(LED2);
        /*delay about 500ms*/
        delay(0xffffff);

        /* turn on LED4, turn off LED3 */
        led_on(LED4);
        led_off(LED3);
        /*delay about 500ms*/
        delay(0xffffff);
    }
}

代码还是比较简单的,首先开启GPIO的时钟,然后对GPIO初始化,主要是设置模式和速率,GPIO的初始化代码如下:

/*
    brief      configure led GPIO
    param[in]  lednum: specify the led to be configured
      arg        LED1
      arg        LED2
      arg        LED3
      arg        LED4
    param[out] none
    retval     none
*/
void led_init(led_typedef_enum lednum)
{
    /* enable the led clock */
    rcu_periph_clock_enable(GPIO_CLK[lednum]);

    /* configure led GPIO port */
    gpio_init(GPIO_PORT[lednum], GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN[lednum]);

    GPIO_BC(GPIO_PORT[lednum]) = GPIO_PIN[lednum];
}

然后就可以控制GPIO高低电平了。

7 实验现象

将编译好的程序下载到板子中,可以看到四个LED灯依次闪烁。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    146

    文章

    16016

    浏览量

    343624
  • led灯
    +关注

    关注

    22

    文章

    1554

    浏览量

    107030
  • 流水灯
    +关注

    关注

    21

    文章

    432

    浏览量

    59104
  • GPIO
    +关注

    关注

    16

    文章

    1133

    浏览量

    50570
  • GD32
    +关注

    关注

    7

    文章

    333

    浏览量

    23740
收藏 人收藏

    评论

    相关推荐

    GD32开发实战指南(基础篇) 第3章 GPIO流水灯的前世今生

    上一章通过控制GPIO的高低电平实现了流水灯,但只是告诉了大家怎么做,如何实现流水灯,本文将深入剖析的GPIO流水灯的前生今世,深入研究
    的头像 发表于 05-10 08:58 4520次阅读
    <b class='flag-5'>GD32</b><b class='flag-5'>开发</b><b class='flag-5'>实战</b><b class='flag-5'>指南</b>(基础篇) 第3章 <b class='flag-5'>GPIO</b><b class='flag-5'>流水灯</b>的前世今生

    ARM Cortex-M学习笔记:初识GPIO流水灯

    熟悉单片机的朋友都知道,学习的第一个例程就是流水灯,要想实现流水灯,首先必须了解GPIO的工作原理。GPIO的基本结构如图1所示。
    的头像 发表于 05-15 11:31 2224次阅读
    ARM Cortex-M学习笔记:初识<b class='flag-5'>GPIO</b><b class='flag-5'>流水灯</b>

    ARM Cortex-M学习笔记:GPIO流水灯的前世今生

    上一章通过控制GPIO的高低电平实现了流水灯,但只是告诉了大家怎么做,如何实现流水灯,本文将深入剖析的GPIO流水灯的前生今世,深入研究
    的头像 发表于 05-15 14:44 1928次阅读
    ARM Cortex-M学习笔记:<b class='flag-5'>GPIO</b><b class='flag-5'>流水灯</b>的前世今生

    GD32开发实战指南(基础篇) 第16章 RTC

    开发环境: MDK:Keil 5.30 开发板:GD32F207I-EVAL MCU:GD32F207IK 1 RTC工作原理 1.1 RTC简介
    的头像 发表于 05-18 22:14 5739次阅读
    <b class='flag-5'>GD32</b><b class='flag-5'>开发</b><b class='flag-5'>实战</b><b class='flag-5'>指南</b>(基础篇) 第16章 RTC

    【图书分享】《STM32库开发实战指南

    GPIO入门之流水灯 4 深入分析流水灯例程 5
    发表于 03-13 17:01

    好书分享】入门经典:STM32库开发实战指南

    相关专业的教材,也适合作为从事嵌入式领域科技工作者的参考书。前言 第一部分 库开发初级 1 为什么学习STM32
    发表于 06-24 20:53

    Arduino开发实战指南 AVR

    第一基础1初识Arduino2编写Ard
    发表于 08-03 16:14

    什么是GD32

    一、前言什么GD32GD32是国内开发的一款单片机,据说开发的人员是来自ST公司的,GD32也是以STM32作为模板做出来的。所以
    发表于 08-12 07:46

    每日推荐 | STM32Cube高效开发教程,电源系统管理设计系列知识

    指南(基于RT-Thread系统)》3 GPIO使用和《嵌入式系统 – GD32应用开发
    发表于 05-09 10:38

    GD32 MCU原理及固件库开发指南》 + 初读感悟

    GD32 MCU原理固件库开发指南这本书内容丰富,囊括了GD32中的所有外设,书中首先介绍了如何使用MDK或IAR软件搭建GD32工程环境,让初学者能快速基于工程上手编程。书中主要对
    发表于 03-31 22:11

    GD32 MCU原理及固件库开发指南》+读后感

    2介绍GD32 MCU快速入门与开发平台搭建的方法,包括对软硬件开发平台、调试工具、
    发表于 06-06 21:52

    GD32GD32读取ADC数据

    GD32的ADC有很多模式,这里教大家使用最简单的软件触发读取ADC,我使用的芯片是 GD32F350K8U6使用步骤1.初始化IO引脚设置为模拟输入模式2.初始ADC时钟和配置ADC
    发表于 12-02 15:06 26次下载
    【<b class='flag-5'>GD32</b>】<b class='flag-5'>GD32</b>读取ADC数据

    GD32GD32设置TIMER0输出PWM

    GD32的ADC有很多模式,这里教大家使用最简单的软件触发读取ADC,我使用的芯片是 GD32F350K8U6使用步骤1.初始化IO引脚设置为模拟输入模式2.初始ADC时钟和配置ADC
    发表于 12-02 15:06 21次下载
    【<b class='flag-5'>GD32</b>】<b class='flag-5'>GD32</b>设置TIMER0输出PWM

    GD32开发实战指南(基础篇) 第19章 程序加密

    GD32通过读取芯片唯一ID号来实现程序的保护,防止被抄袭。96位的产品唯一身份标识所提供的参考号码对任意一个GD32微控制器
    的头像 发表于 05-20 09:10 3385次阅读
    <b class='flag-5'>GD32</b><b class='flag-5'>开发</b><b class='flag-5'>实战</b><b class='flag-5'>指南</b>(基础篇) 第19章 程序加密

    GD32 MCU如何将烧录口配置为GPIO使用?

    如果大家在进行GD32 MCU开发时发现GPIO引脚使用不足,可以尝试将烧录口配置为GPIO使用,这样就可以多出几个引脚使用,但使用的时候如何配置以及有哪些注意事项,本视频将会为大家进
    的头像 发表于 02-20 10:18 478次阅读
    <b class='flag-5'>GD32</b> MCU如何将烧录口配置为<b class='flag-5'>GPIO</b>使用?