K210应用2-使用GPIO控制LED状态

使用gpio控制led

  • 实验目的

        本次主要应用K210最基础的功能,了解FPIOA引脚映射,以及GPIO设置。该节验证方式为通过控制LED的亮灭来进行验证。

  • 实验准备

        1)、带发光二极管(LED)的K210开发板一块,开发板可自行上网选购,或者联系本人,获取实验配套开发板。这一项差异不大,如果有一定基础,可根据本节内容,在任意开发板上进行验证。下面,我将介绍本节实现原理以及实现过程。

        2)、官方裸机编程指导手册:kendryte_standalone_programming_guide,用于查阅SDK中接口说明。

  • 实验原理及名词解释

        FPIOA:全称现场可编程IO阵列,允许用户将 255 个内部功能映射到芯片外围的 48 个自由 IO 上。

        LED发光原理:LED也叫发光二极管,是一种能够直接将电能转换为可见光的固态半导体器件,使用方式为:在LED正极施以额定电压,负极接地,使其形成回路,即可点亮LED。LED内部是一个半导体晶片,这个半导体晶片主要有两部分组成,一部分是P型半导体,这里面空穴占主导地位。另一部分为N型半导体,这里面主要是电子。当这两种半导体连接起来的时候,他们之间就形成了一个P-N结。当电流通过时,N区里面的电子就会推向P区,在P区中,电子与空穴复合,然后就会以光子的形式发出能量,这就是LED的发光原理。而光的波长,就是光的颜色,这是由P-N结的材料所决定的。

  • 硬件设计

        硬件电路图如下:

  • 软件设计

        软件流程图如下:

  • 软件实现

        根据硬件设计和软件设计可知,本节应用实现步骤如下:

                1)、设置引脚复用功能:由硬件原理图可知:三个LED由分别由IO12、IO13、IO14三个管脚进行控制,参考官方SDK手册,我们使用 fpioa_set_function 函数对这三个引脚进行引脚功能配置,如下图:

                 2)、GPIO初始化:使能GPIO时钟,如下图:

                 3)、设置GPIO驱动模式:由于我们这里需要通过控制GPIO引脚输出的电平状态来控制LED灯的亮灭,所以,这里设置GPIO为输出模式,如下图:

                 4)、控制GPIO输出电平:根据硬件原理图知:当GPIO输出高电平时,LED熄灭,GPIO输出低电平时,LED亮起。故,我们设置GPIO初始输出电平为高,后面每隔1s,GPIO输出电平状态反转一次,如下图:

         根据上述实现步骤,最终代码如下:

#include <fpioa.h>
#include <gpio.h>
#include <sleep.h>

#define LED_R_PIN   (12)
#define LED_G_PIN   (13)
#define LED_B_PIN   (14)

#define LED_R_GPIONUM   (0)
#define LED_G_GPIONUM   (1)
#define LED_B_GPIONUM   (2)
#define LED_R_FUN   (FUNC_GPIO0+LED_R_GPIONUM)
#define LED_G_FUN   (FUNC_GPIO0+LED_G_GPIONUM)
#define LED_B_FUN   (FUNC_GPIO0+LED_B_GPIONUM)

int main()
{
    // 配置引脚功能
    fpioa_set_function (LED_R_PIN, LED_R_FUN);
    fpioa_set_function (LED_G_PIN, LED_G_FUN);
    fpioa_set_function (LED_B_PIN, LED_B_FUN);
    // gpio初始化
    gpio_init();
    // 设置gpio驱动模式
    gpio_set_drive_mode(LED_R_GPIONUM, GPIO_DM_OUTPUT);
    gpio_set_drive_mode(LED_G_GPIONUM, GPIO_DM_OUTPUT);
    gpio_set_drive_mode(LED_B_GPIONUM, GPIO_DM_OUTPUT);
    // 设置gpio输出电平
    gpio_pin_value_t gpio_value = GPIO_PV_HIGH;
    gpio_set_pin(LED_R_GPIONUM, gpio_value);
    gpio_set_pin(LED_G_GPIONUM, gpio_value);
    gpio_set_pin(LED_B_GPIONUM, gpio_value);
    // 控制三个LED以1s间隔亮灭
    while(1)
    {
        sleep(1);
        gpio_value = !gpio_value;
        gpio_set_pin(LED_R_GPIONUM, gpio_value);
        gpio_set_pin(LED_G_GPIONUM, gpio_value);
        gpio_set_pin(LED_B_GPIONUM, gpio_value);
    }

    return 0;
}
  • 编译

        1)、在上一节获取的SDK中创建gpio_led文件夹,在新建的文件夹中创建一个main.c文件,然后将本节代码输入到main.c文件中,如下图:

         2)、使用上一节的编译方式,打开vscode终端,在终端中进入上一节创建的build文件夹,然后输入:cmake ../ -DPROJ=gpio_led -G "MinGW Makefiles" ,生成makefile文件,如下图:

         3)、生成makefile文件后,输入:make ,开始编译,如下图:

         4)、编译完成后,会在build目录下生成烧录文件:gpio_led.bin,如下图:

  • 烧录

        使用上一节的烧录方式,注意:Firmware那一项选择我们刚编译出的gpio_led.bin文件。

  • 实验现象

        三个LED灯亮1s,灭1s,以此循环。

  • 实验总结

        1)、K210管脚使用的是FPIOA可编程阵列,故程序一起来,首先应当配置管脚功能。后面使用相应的功能的API时,调用的是配置后的管脚功能。例如:本节中,程序首先将IO12、IO13、IO14设置为FUNC_GPIO0、FUNC_GPIO1、FUNC_GPIO2,后面使用GPIO相关API时,传入的GPIO管脚就为设置后的0、1、2,代表GPIO0、GPIO1、GPIO2;

        2)、由于需要控制LED亮灭,所以,GPIO需设置为输出模式,这样才能通过设置GPIO输出电平来控制LED的亮灭;

        3)、注意,我这里根据我的硬件设计,GPIO管脚输出低电平时点亮LED,输出高电平时熄灭。如果使用其他板子,根据自己板子的原理图,进行LED控制。

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tigalight

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值