文章目录
- 前言
- 一、背景知识
- 二、背景知识
- 二、开始你的表演
- 代码实现
- 总结
前言
前面介绍了开发板和环境搭建的基本情况,接下来我们开始学习使用C进行裸板开发,本节课先来学习下K210最基础的功能,引脚映射和点灯。
在开始具体学习之前,我介绍下通用的学习和使用方法:大致了解芯片->了解进行编程的类型(GPIO/I2C/UART/SPI)->查看硬件原理图->查看编程手册->进行编程。让我们以一个IO控制开始吧!
一、背景知识
对LED/RGB灯编程其实本质是一样的,RGB可以看作三个LED灯,都是对io的控制,LED发光二极管是一种能够将电能转化为可见光的固态的半导体器件,它可以直接把电转化为光。LED的内部是一个半导体晶片,晶片的一端附在一个支架上,一端是负极,另一端连接电源的正极,使整个晶片被环氧树脂封装起来。只需要给正极输入正极电压,负极接地,形成回路就可以点亮LED。
半导体晶片由两部分组成,一部分是P型半导体,在它里面空穴占主导地位,另一端是N型半导体,在这边主要是电子。但这两种半导体连接起来的时候,它们之间就形成一个P-N结。当电流通过导线作用于这个晶片的时候,电子就会被推向P区,在P区里电子跟空穴复合,然后就会以光子的形式发出能量,这就是LED灯发光的原理。而光的波长也就是光的颜色,是由形成P-N结的材料决定的。
在编程之前我们还需要进一步了解该款芯片,K210芯片使用BGA144封装,144个引脚,正方形,每一边有12个引脚。芯片宽度为8mm,长度为8mm,高度为0.953mm
引脚描述如下:
二、背景知识
可以看到,开发板板载了一颗可编程RGB灯,对其进行编程控制,需要了解其所连接的IO引脚;
接下来我们查看下原理图,可以看到他们分别连接到了IO12-IO14上,不同的IO控制不同颜色的灯,设置IO为输出模式,当IO设置为高电平时,对应的灯熄灭,当IO设置为低电平时,对应的灯点亮;
二、开始你的表演
这篇文章内容会涉及到FPIOA的使用,FPIOA的介绍可以参考我的 AI嵌入式K210项目(4)-FPIOA
新建一个gpio的文件夹,在里面新建main.c,以后也都是这样,我们每一个实验放一个文件夹
代码实现
为了方便大家看,我就不搞什么代码规范之类的了,直接放在一个文件里,方便大家查看
#include "sleep.h"
#include "gpio.h"
#include "fpioa.h"
/*****************************HARDWARE-PIN*********************************/
// 硬件IO口,与原理图对应
#define PIN_RGB_R (12)
#define PIN_RGB_G (13)
#define PIN_RGB_B (14)
/*****************************SOFTWARE-GPIO********************************/
// 软件GPIO口,与程序对应
#define RGB_R_GPIONUM (0)
#define RGB_G_GPIONUM (1)
#define RGB_B_GPIONUM (2)
/*****************************FUNC-GPIO************************************/
// GPIO口的功能,绑定到硬件IO口
#define FUNC_RGB_R (FUNC_GPIO0 + RGB_R_GPIONUM)
#define FUNC_RGB_G (FUNC_GPIO0 + RGB_G_GPIONUM)
#define FUNC_RGB_B (FUNC_GPIO0 + RGB_B_GPIONUM)
/**
* Function hardware_init
* @brief 硬件初始化,绑定GPIO口
* @param[in] void
* @param[out] void
* @retval void
* @par History 无
*/
void hardware_init(void)
{
// fpioa映射
fpioa_set_function(PIN_RGB_R, FUNC_RGB_R);
fpioa_set_function(PIN_RGB_G, FUNC_RGB_G);
fpioa_set_function(PIN_RGB_B, FUNC_RGB_B);
}
/**
* Function hardware_init
* @brief RGB灯灭
* @param[in] void
* @param[out] void
* @retval void
* @par History 无
*/
void rgb_all_off(void)
{
gpio_set_pin(RGB_R_GPIONUM, GPIO_PV_HIGH);
gpio_set_pin(RGB_G_GPIONUM, GPIO_PV_HIGH);
gpio_set_pin(RGB_B_GPIONUM, GPIO_PV_HIGH);
}
/**
* Function init_rgb
* @brief 初始化RGB灯
* @param[in] void
* @param[out] void
* @retval void
* @par History 无
*/
void init_rgb(void)
{
// 设置RGB灯的GPIO模式为输出
gpio_set_drive_mode(RGB_R_GPIONUM, GPIO_DM_OUTPUT);
gpio_set_drive_mode(RGB_G_GPIONUM, GPIO_DM_OUTPUT);
gpio_set_drive_mode(RGB_B_GPIONUM, GPIO_DM_OUTPUT);
// 关闭RGB灯
rgb_all_off();
}
/**
* Function main
* @brief 主函数,程序的入口
* @param[in] void
* @param[out] void
* @retval 0
* @par History 无
*/
int main(void)
{
// RGB灯状态,0=红灯亮,1=绿灯亮,2=蓝灯亮
int state = 0;
// 硬件引脚初始化
hardware_init();
// 初始化RGB灯
init_rgb();
while (1)
{
rgb_all_off(); // 先关闭RGB灯
// 根据state的值点亮不同颜色的灯
gpio_set_pin(state, GPIO_PV_LOW);
msleep(500);
state++;
state = state % 3;
}
return 0;
}
代码写好后,我们开始编译,注意:如果你编译过程中出现错误,可以先make clean掉之前生成的过程文件,重新生成
cd build
//注意这里的目标文件目录改成gpio,和刚才新建的文件夹名称一致
cmake .. -DPROJ=gpio -G "MinGW Makefiles"
make
烧录
然后来看看结果吧
总结
本节介绍了K210芯片使用FPIOA可编程阵列,所以每次使用硬件IO口前都需要对硬件IO口进行引脚映射。而且在软件中调用的也是软件映射后的软件GPIO。使用GPIO前需要设置GPIO的输入输出模式。LED灯是低电平点亮的,给LED引脚设置低电平时点亮,设置高电平时熄灭。