前言
最近在学习K210,点灯操作也是入门学习一款芯片的第一步。当掌握了该芯片的基本GPIO操作,在之后操作该芯片的其他外设也将变得更加简单。此文介绍一下K210如何操作一个IO口使其复用成GPIO,输出指定电平来控制LED的暗灭。
FPIOA(现场可编程 IO 阵列)
有过STM32开发经验的都了解,32的IO初始化之后默认功能就是基本的GPIO,如果想要让IO当做其他功能引脚,就要使用AFIO将IO口复用成其他功能。

首先先介绍K210的FPIOA,也就是IOMUX,FPIOA 允许用户将 255 个内部功能映射到芯片外围的 48 个自由 IO 上。
支持 IO 的可编程功能选择
支持 IO 输出的 8 种驱动能力选择
支持 IO 的内部上拉电阻选择
支持 IO 的内部下拉电阻选择
支持 IO 输入的内部施密特触发器设置
支持 IO 输出的斜率控制
支持内部输入逻辑的电平设置
即K210向外引出了48个引脚,我们可以进行IO复用,让一个IO具体复用成某一个特殊的功能。通过原理图可以确定LED0和LED1分别连接到了K210的IO0和IO17,且低电平的时候灯亮。
通用 GPIO
通用 GPIO 共 8 个,具有如下特点 :
8 个 IO 使用一个中断源
可配置输入输出信号
可配置触发 IO 总中断,边沿触发和电平触发
每个 IO 可以分配到 FPIOA 上 48 个管脚之一
可配置上下拉,或者高阻
上文提到K210芯片内部有255个功能,具体的可以在fpioa.h中进行查看
可以在fpioa.h文件中查看到K210IO复用功能的枚举,GPIO0和GPIO1的枚举编号分别为56、57。所以在IO的的配置文件pin_config.h中的代码如下。
#ifndef _PIN_CONFIG_H_
#define _PIN_CONFIG_H_
/*****************************HEAR-FILE************************************/
#include "fpioa.h"
/*****************************HARDWARE-PIN*********************************/
// 硬件IO口,与原理图对应
#define PIN_LED_0 (0)
#define PIN_LED_1 (17)
/*****************************SOFTWARE-GPIO********************************/
// 软件GPIO口,使用到了GPIO0和GPIO1
#define LED0_GPIONUM (0)
#define LED1_GPIONUM (1)
/*****************************FUNC-GPIO************************************/
// GPIO口的功能,绑定到硬件IO口,FUNC_GPIO0 = 56,也就是使用了GPIO0
#define FUNC_LED0 (FUNC_GPIO0 + LED0_GPIONUM)
#define FUNC_LED1 (FUNC_GPIO0 + LED1_GPIONUM)
#endif /* _PIN_CONFIG_H_ */
Main.c文件中首先将LED0和LED1使用到的K210引脚(IO0和IO17)跟GPIO0和GPIO1进行绑定,然后就是初始化GPIO时钟,设置输入输出模式、设置输出的值,这些和32的配置步骤就是相似的了。
#include <stdio.h>
#include <unistd.h>
#include "gpio.h"
#include "pin_config.h"
void hardware_init(void)
{
fpioa_set_function(PIN_LED_0, FUNC_LED0); //IO0复用成GPIO0
fpioa_set_function(PIN_LED_1, FUNC_LED1); //IO17复用成GPIO1
}
int main(void)
{
hardware_init();// 硬件引脚初始化
gpio_init(); // 使能GPIO的时钟
// 设置LED0和LED1的GPIO模式为输出
gpio_set_drive_mode(LED0_GPIONUM, GPIO_DM_OUTPUT);
gpio_set_drive_mode(LED1_GPIONUM, GPIO_DM_OUTPUT);
// 先关闭LED0和LED1
gpio_pin_value_t value = GPIO_PV_HIGH;
gpio_set_pin(LED0_GPIONUM, value);
gpio_set_pin(LED1_GPIONUM, value);
while (1)
{
sleep(1);
gpio_set_pin(LED0_GPIONUM, value);
gpio_set_pin(LED1_GPIONUM, value = !value);
}
return 0;
}