RA6M3 RT-Thread* LVGL HMI Board开发实践指南-GPIO实践

描述

RT-Thread即将发布一系列RA6M3外设驱动的实践指南,我们将使用瑞萨RA6M3 HMI-Board 开发板,带领大家上手RT-Thread设备驱动, 本篇文章将介绍GPIO外设。GPIO是最常见的外设,GPIO可以实现对IO的高低电平控制,读取IO的电平,以及配置为中断输入后,在中断函数中处理相关事件待。

 

 

 

 

开发板简介

HMI-Board 为 RT-Thread 联合瑞萨推出的高性价比图形评估套件,相比较于传统的 HMI + 主控板,一套硬件即可实现 HMI + IoT + 控制 的全套能力。依托于瑞萨高性能芯片 RA6M3 及 RT-Thread 软件生态,HMI Board 不仅硬件性能强劲,同时软件生态丰富,助力开发者快速开发出 GUI 智能硬件产品。

 

开发环境搭建指南

 

详见瑞萨 RA6M3 开发实践指南-UART实践 (qq.com)

 

 

 

 

 

RT-Thread

 

 

 

本章内容

 

我们将使用RT-Thread Studio来创建工程,配置IO,最终实现使用板载三个按键控制板载的两个LED的亮与灭。

 

 

 

 

模块介绍:

板载的两个LED灯接入了P209与P210,原理图如下:

RT-Thread

板载了三个按键,分别接入了P005、P006、P007。原理图如下:

 

 

RT-Thread

 

 

 

开发软件:

 

RT-Thread Studio

 

 

 

 

 

步骤说明

 

1、新建工程

● 安装开发板SDK:

打开RT-Thread Studio,点击SDK管理器,下载开发板SDK:

等待安装结束后退出SDK管理器

 

 

● 新建HMI_RA6M3_GPIO工程:

RT-Thread

 

 

● 选择基于开发板创建工程

RT-Thread

 

 

● 输入工程名称点完成生成工程:

 

 

RT-Thread

 

 

● 生成工程预览如下:

 

 

RT-Thread

 

 

2.配置RASC工程

● 选择RA Smart Configurator文件夹位置,只需要选到FSP文件夹就行了:

 

 

RT-Thread

 

 

● 在RASC工程配置LED为输出模式,按键为输入模式,并设置为默认的中断号。保存并生成工程:

 

 

RT-Thread

 

 

 

 

 

 

3.  编写代码

我们编写hal_entry.c代码如下:

/*

 

 * Copyright (c) 2006-2023, RT-Thread Development Team

 

 *

 

 * SPDX-License-Identifier: Apache-2.0

 

 *

 

 * Change Logs:

 

 * Date           Author        Notes

 

 * 2021-10-10     Sherman       first version

 

 */

 

 

#include 

 

#include "hal_data.h"

 

#include 

 

 

#define USER1_PIN    BSP_IO_PORT_02_PIN_09 /* Onboard LED pins */

 

#define USER2_PIN    BSP_IO_PORT_02_PIN_10 /* Onboard LED pins */

 

 

#define TN0_PIN      BSP_IO_PORT_00_PIN_05 /* Onboard TN0 pins */

 

#define TN1_PIN      BSP_IO_PORT_00_PIN_06 /* Onboard TN1 pins */

 

#define TN2_PIN      BSP_IO_PORT_00_PIN_07 /* Onboard TN2 pins */

 

 

staticuint8_t led_flash_state =0;

 

 

voidled_off(void*args)

 

{

 

rt_kprintf("bnt0 down! ");

 

    led_flash_state=0;

 

}

 

 

voidled_on(void*args)

 

{

 

rt_kprintf("bnt1 down! ");

 

    led_flash_state=1;

 

}

 

 

 

#define THREAD_PRIORITY         25

 

#define THREAD_STACK_SIZE       512

 

#define THREAD_TIMESLICE        5

 

 

static rt_thread_t tid1 = RT_NULL;

 

 

/* 线程 1 的入口函数 */

 

staticvoidthread_led_flash_entry(void*parameter)

 

{

 

staticuint32_t flash_cnt;

 

while(1)

 

{

 

if(led_flash_state ==0){

 

rt_pin_write(USER1_PIN, PIN_LOW);

 

rt_pin_write(USER2_PIN, PIN_LOW);

 

}

 

elseif(led_flash_state ==1){

 

rt_pin_write(USER1_PIN, PIN_HIGH);

 

rt_pin_write(USER2_PIN, PIN_HIGH);

 

}

 

elseif(led_flash_state ==2){

 

if(flash_cnt<50)

 

{

 

rt_pin_write(USER1_PIN, PIN_HIGH);

 

rt_pin_write(USER2_PIN, PIN_LOW);

 

}

 

elseif(flash_cnt<100)

 

{

 

rt_pin_write(USER1_PIN, PIN_LOW);

 

rt_pin_write(USER2_PIN, PIN_HIGH);

 

}

 

else{

 

                 flash_cnt =0;

 

}

 

             flash_cnt ++;

 

}

 

rt_thread_mdelay(10);

 

}

 

}

 

 

voidkey_init(void)

 

{

 

 

/* 按键0引脚为输入模式 */

 

rt_pin_mode(TN0_PIN, PIN_MODE_INPUT_PULLUP);

 

/* 绑定中断,下降沿模式,回调函数名为beep_on */

 

rt_pin_attach_irq(TN0_PIN, PIN_IRQ_MODE_FALLING, led_off, RT_NULL);

 

/* 使能中断 */

 

rt_pin_irq_enable(TN0_PIN, PIN_IRQ_ENABLE);

 

 

/* 按键1引脚为输入模式 */

 

rt_pin_mode(TN1_PIN, PIN_MODE_INPUT_PULLUP);

 

/* 绑定中断,下降沿模式,回调函数名为beep_on */

 

rt_pin_attach_irq(TN1_PIN, PIN_IRQ_MODE_FALLING, led_on, RT_NULL);

 

/* 使能中断 */

 

rt_pin_irq_enable(TN1_PIN, PIN_IRQ_ENABLE);

 

/* 按键2引脚为输入模式 */

 

rt_pin_mode(TN2_PIN, PIN_MODE_INPUT_PULLUP);

 

}

 

 

 

voidhal_entry(void)

 

{

 

rt_kprintf(" Hello RT-Thread! ");

 

 

key_init();

 

/* 创建线程 1,名称是 thread1,入口是 thread1_entry*/

 

    tid1 =rt_thread_create("thread_led",

 

                            thread_led_flash_entry, RT_NULL,

 

                            THREAD_STACK_SIZE,

 

                            THREAD_PRIORITY, THREAD_TIMESLICE);

 

 

/* 如果获得线程控制块,启动这个线程 */

 

if(tid1 != RT_NULL)

 

rt_thread_startup(tid1);

 

while(1)

 

{

 

if(rt_pin_read(TN2_PIN)==0)

 

{

 

rt_thread_delay(10);

 

if(rt_pin_read(TN2_PIN)==0)

 

                led_flash_state =2;

 

rt_kprintf(" TN2 push down! ");

 

}

 

rt_thread_delay(10);

 

 

}

 

}

 

 

 

 

4.代码验证

 

我们编译下载后,我们按TN0,两个LED亮,按下TN1,两个LED灯灭,按下TN2,两个LED灯交替闪烁。

 

 

章节总结

 

本章主要介绍了如果新建GPIO工程,RASC工程配置,驱动三个按键与三个LED灯的GPIO,涉及到了GPIO的输出、输入的配置,中断输入的配置与以及中断回调函数的编写。本文函盖了GPIO的所有操作。

 

 

也可以阅读帖子:

https://club.rt-thread.org/ask/article/ddc499ea99f1ea23.html

 

 

 

 

 

 

【购买HMI Board】

 

RT-Thread

 

———————End——————

新生态,创未来 | 2023RT-Thread 开发者大会开启报名

 

邀请你参加 2023 RT-Thread 开发者大会的大理由

1、刷新RT-Thread最新技术动态和产业服务能力

2、聆听行业大咖分享,洞察产业趋势

3、丰富的技术和产品展示,前沿技术发展和应用

4、绝佳的实践机会:AIOT、MPU、RISC-V...

5、精美伴手礼人手一份开发板盲盒和免费午餐

6、黑科技满点~滴水湖地铁口安排无人车接送至会场

 

立刻扫码报名吧

RT-Thread

 


打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分