注:本文基于BW20-12F-Kit开发板,若非该开发板请自行更换引脚
1、驱动函数熟悉
驱动函数位置
ameba-rtos-1.0.1\component\soc\amebadplus\hal\src\gpio_api.c
具体内容可以自行下载SDK查看
本文需要使用的函数如下
1.1、IO口初始化
文件中第51行起
void gpio_init(gpio_t *obj, PinName pin)
1.2、IO输入输出模式配置
文件中第111行起
void gpio_dir(gpio_t *obj, PinDirection direction)
1.3、IO高低电平设置
文件中第144行或160行起
void gpio_write(gpio_t *obj, int value)
void gpio_direct_write(gpio_t *obj, bool value)
这两个任选一个均可
1.4、IO状态读取
int gpio_read(gpio_t *obj)
剩下如上下拉与GPIO中断,我做的项目用不到,便不使用
2、创建.c文件(可直接在main.c中创建函数)
因为我这边看创建的文件不会自动导入路径,我这边也不太懂怎么自动导入只会手动添加,我后面简单描述一下方法
.c文件代码如下

#include "gpio_api.h"
gpio_t LED1;
void userGpioInit(void)
{
gpio_init(&LED1,PB_17);
gpio_dir(&LED1,PIN_OUTPUT);
gpio_direct_write(&LED1,1);
}
3、导入至主函数


因为是简单做测试,所以我就不搞.h文件了
4、添加.c文件至构建系统
ameba-rtos/amebadplus_gcc_project/project_km4/src/CMakeLists.txt
修改该文件

添加新创建的.c文件后编译,
5、下载固件
下载方式和效果展示如下(只能上传5M视频,所以我从130M压缩了,会很糊.)
很好,上传失败了(

下载前优先按住1,然后按下2,再松开2,此时串口会一直发数据,间隔约50毫秒,此时可以下载

代码效果
6、输入判断
.c文件代码如下
#include "userGPIO.h"
gpio_t LED1;
gpio_t LED2;
gpio_t LED3;
gpio_t KEY1;
gpio_t KEY2;
gpio_t KEY3;
void userGpioInit(void)
{
gpio_init(&LED1,PB_17);
gpio_init(&LED2,PB_18);
gpio_init(&LED3,PB_19);
gpio_init(&KEY1,PA_31);
gpio_init(&KEY2,PA_30);
gpio_init(&KEY3,PA_27);
gpio_dir(&LED1,PIN_OUTPUT);
gpio_dir(&LED2,PIN_OUTPUT);
gpio_dir(&LED3,PIN_OUTPUT);
gpio_dir(&KEY1,PIN_INPUT);
gpio_dir(&KEY2,PIN_INPUT);
gpio_dir(&KEY3,PIN_INPUT);
gpio_mode(&KEY1,1); //配置为上拉,也就是默认高电平
}
void LED1Test(int mode)
{
if(1 < mode)
{
mode = 1;
}
gpio_direct_write(&LED1,mode);
}
void LED2Test(int mode)
{
if(1 < mode)
{
mode = 1;
}
gpio_direct_write(&LED2,mode);
}
void LED3Test(int mode)
{
if(1 < mode)
{
mode = 1;
}
gpio_direct_write(&LED3,mode);
}
int KEY1Test(void)
{
return gpio_read(&KEY1);
}
int KEY2Test(void)
{
return gpio_read(&KEY2);
}
int KEY3Test(void)
{
return gpio_read(&KEY3);
}
这些是为了方便理解所以才分开函数的,实际自己写的时候请不要分开成这样哦
.h代码如下
#ifndef _USERGPIO_H_
#define _USERGPIO_H_
#include "gpio_api.h"
void userGpioInit(void);
void LED1Test(int mode);
void LED2Test(int mode);
void LED3Test(int mode);
int KEY1Test(void);
int KEY2Test(void);
int KEY3Test(void);
#endif
在main.c中创建任务(懒得在GPIO中引用rtos库)
void gpioTestTask(void * pvParameters)
{
(void)pvParameters;
while(1)
{
if(1 == KEY1Test())
{
LED1Test(1);
}
else
{
LED1Test(0);
}
if(1 == KEY2Test())
{
LED2Test(1);
}
else
{
LED2Test(0);
}
if(0 == KEY3Test())
{
LED3Test(1);
}
else
{
LED3Test(0);
}
rtos_time_delay_ms(1000);
}
//记得杀死自己,库被封装了我没怎么看
}


引用GPIO,并且创建任务
实际现象就是,上电后蓝色灯与绿色灯亮起,将KEY接低电平,蓝色灯熄灭,将KEY2接高电平,红色灯亮起,将KEY3接高电平,绿色灯熄灭,自此,GPIO的简单应用完成