使用gpiohs控制led
- 实验目的
本次主要应用K210的基础的功能--GPIOHS。该节验证方式同上一节一致,也是通过控制LED的亮灭来进行验证。
- 实验准备
1)、带发光二极管(LED)的K210开发板一块,用于实践并查看实验现象;
2)、官方裸机编程指导手册:kendryte_standalone_programming_guide,用于查阅SDK中接口说明。
- 实验原理及名词解释
GPIOHS:全称高速GPIO,功能与普通GPIO相似,但GPIOHS的管脚反转能力更强,并且每个GPIOHS的IO都具有独立中断源,支持边沿触发和电平触发。
- 硬件设计
硬件电路图如下:
- 软件设计
软件流程图如下:
- 软件实现
根据硬件设计和软件设计可知,本节应用实现步骤如下:
1)、设置引脚复用功能:由硬件原理图可知:三个LED由分别由IO12、IO13、IO14三个管脚进行控制,参考官方SDK手册,我们使用 fpioa_set_function 函数对这三个引脚进行引脚功能配置,如下图:
2)、设置GPIOHS驱动模式,如下图:
3)、控制GPIOHS输出电平:根据硬件原理图知:当GPIOHS输出高电平时,LED熄灭,GPIOHS输出低电平时,LED亮起。故,我们设置GPIOHS初始输出电平为高,后面每隔500ms,GPIOHS输出电平状态反转一次,如下图:
根据上述实现步骤,最终代码如下:
#include "fpioa.h"
#include "gpiohs.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_GPIOHS0+LED_R_GPIONUM)
#define LED_G_FUN (FUNC_GPIOHS0+LED_G_GPIONUM)
#define LED_B_FUN (FUNC_GPIOHS0+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);
// 设置GPIOHS驱动模式
gpiohs_set_drive_mode(LED_R_GPIONUM, GPIO_DM_OUTPUT);
gpiohs_set_drive_mode(LED_B_GPIONUM, GPIO_DM_OUTPUT);
gpiohs_set_drive_mode(LED_B_GPIONUM, GPIO_DM_OUTPUT);
// 初始化GPIOHS输出电平
gpio_pin_value_t gpiohs_value = GPIO_PV_HIGH;
gpiohs_set_pin(LED_R_GPIONUM, gpiohs_value);
gpiohs_set_pin(LED_G_GPIONUM, gpiohs_value);
gpiohs_set_pin(LED_B_GPIONUM, gpiohs_value);
// 控制三个LED以500ms间隔亮灭
while(1)
{
msleep(500);
gpiohs_value = !gpiohs_value;
gpiohs_set_pin(LED_R_GPIONUM, gpiohs_value);
gpiohs_set_pin(LED_G_GPIONUM, gpiohs_value);
gpiohs_set_pin(LED_B_GPIONUM, gpiohs_value);
}
return 0;
}
- 编译
1)、同上一节类似,在SDK中创建gpiohs_led文件夹,在新建的文件夹中创建一个main.c文件,然后将本节代码输入到main.c文件中,如下图:
2)、同上一节的编译方式类似,打开vscode终端,在终端中进入上一节创建的build文件夹,然后输入:cmake ../ -DPROJ=gpiohs_led -G "MinGW Makefiles" ,生成makefile文件,如下图:
3)、生成makefile文件后,输入:make ,开始编译,如下图:
4)、编译完成后,会在build目录下生成烧录文件:gpiohs_led.bin,如下图:
- 烧录
同上一节的烧录方式类似,注意:Firmware那一项选择我们刚编译出的gpiohs_led.bin文件。
- 实验现象
三个LED灯亮500ms,灭500ms,以此循环。
- 实验总结
1)、根据手册,GPIOHS相比于GPIO,GPIOHS的管脚反转能力更强,并且GPIOHS每个IO具有独立的中断源,而GPIO所有IO共用一个中断源。后面用户可根据自身需求,选择使用GPIO或者GPIOHS。