点灯基本可以说是硬件版 Hello World,同样也是学习一个芯片通常意义上的第一步,那么今天就来学习一下K210的GPIO操作,顺便点一个灯。
K210 GPIO与FPIOA简述
K210芯片一共有8个GPIO(通用输入输出),GPIO是通过FPIOA(现场可编程IO阵列)来分配至任意IO上面,FPIOA可以将包括GPIO在内的255个功能自由分配到48个自由IO上。并且这些IO都在芯片引脚的外围,方便layout与信号完整性。
GPIO的功能描述
可配置管脚的上下拉与输入/输出模式
FPIOA的功能描述
- 支持 IO 的可编程功能选择
- 支持 IO 输出的 8 种驱动能力选择
- 支持 IO 的内部上拉电阻选择
- 支持 IO 的内部下拉电阻选择
- 支持 IO 输入的内部施密特触发器设置
- 支持 IO 输出的斜率控制
- 支持内部输入逻辑的电平设置
点灯
现在回到了问题的核心,我们想要点亮一个LED灯,那么通常应该怎么做呢?
为了确认LED可以被正确操作,通常情况下都采用blink的方式,也就是LED亮ns然后LED灭ns,这样循环往复,那么也就是说,我们应该在LED的控制IO上循环输出高和低电平。那么目标经过剖析,我们要做的就很简单了,也就是配置IO,然后控制IO输出
配置GPIO
因为上面提到了,48个IO都是自由的,功能都是通过FPIOA来分配的,那么我们第一步就是把GPIO分配某一个IO上面,通过查阅官方standalone开发手册(以下简称手册),可以得知,我们想配置GPIO,就需要先把GPIO功能通过FPIOA分配给某一个指定的引脚。如果配置FPIOA,我们应该先引用头文件如下:
#include "fpioa.h"
头文件引用结束之后,根据手册内的API示例的7.3.1可以知道,配置GPIO功能应该如下代码所示。下面一句代码的含义是,将IO24(任意选择一个已经连接LED的IO即可)配置为GPIO0功能。
fpioa_set_function (24, GPIO0);
现在我们已经得到了一个具有GPIO功能的IO(虽然有一点绕,但是这种方式感觉非常的自由),接下来就是配置GPIO功能了。代码如下,我一句一句介绍。
gpio_init ();
#手册5.3.1 初始化GPIO,这句应该不必多数,在使用之前是一定要初始化的
gpio_set_drive_mode (0, GPIO_DM_OUTPUT);
#手册5.3.2&5.4.1 这一句就是将GPIO0(IO24)配置输出驱动模式,函数的第二个输入项是一个gpio_drive_mode_t类型的参数,手册也有介绍,下面类似的参数,不多介绍
gpio_pin_value_t value = GPIO_PV_HIGH;
#手册5.4.2 定义一个gpio_pin_value_t类型的变量,并且初始值为高,这个变量是布尔型,高或者低两种,对应着1和0。
gpio_set_pin (0, value);
#手册5.3.3 这句就是指定GPIO0的输出高。
到这里呢,关于GPIO与IO的基本配置就完成了,此时IO24为输出模式,输出为高,如果有接LED(高位驱动),那么应该已经亮起来了。
配置Blink
上一步,我们已经把LED的IO配置完成,并且输出了一个值,接下来就是为LED配置Blink了,为了彻底证明LED已经给我控制了。
Blink的形式前面已经提到了,亮一段时间,灭一段时间,同时前面LED已经有一个初始值了,那么我们要做的其实已经非常简单了,代码如下:
sleep (1);
#延时1s,这个延时就是LED亮灭变化的间隔
gpio_set_pin (0, value = !value);
#这句其实也非常好理解,Blink就是LED状态切换,同时IO的输出值参数是一个布尔型参数,那么我们可以在经过一定的延时之后给它的值取非,这样循环往复就实现了高或者低的切换。
到这里,点亮一个blink LED的代码就写完了,我们接下来就是生成makefile,然后编译烧录就可以了。
cmake .. -DPROJ=gpio -G "MinGW Makefiles"
mingw32-make
kflash -p COMPORT $buildDir/gpio.bin