发帖
0 0 0

[BW20]二次开发学习1 简单点亮第一个LED灯

夜雨喧嚣
中级会员

7

主题

4

回帖

386

积分

中级会员

积分
386
BW系列 26 0 昨天 17:55

注:本文基于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文件代码如下

image.png

#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、导入至主函数

image.png

image.png

因为是简单做测试,所以我就不搞.h文件了

4、添加.c文件至构建系统

ameba-rtos/amebadplus_gcc_project/project_km4/src/CMakeLists.txt

修改该文件

image.png

添加新创建的.c文件后编译,

5、下载固件

下载方式和效果展示如下(只能上传5M视频,所以我从130M压缩了,会很糊.)

很好,上传失败了(

b36fa19068c36a53a6fc23dbc7f78f75.jpg

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

da08c622f743b42d22dc470bc69012a0.jpg

代码效果

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);
	}
	//记得杀死自己,库被封装了我没怎么看
}

image.png

image.png

引用GPIO,并且创建任务

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

──── 0人觉得很赞 ────

使用道具 举报

您需要登录后才可以回帖 立即登录
高级模式
返回
统计信息
  • 会员数: 28748 个
  • 话题数: 41021 篇