全球最实用的IT互联网信息网站!

AI人工智能P2P分享&下载搜索网页发布信息网站地图

当前位置:诺佳网 > 电子/半导体 > 接口/总线/驱动 >

HMI-Board GPIO驱动设计实现

时间:2023-08-07 15:26

人气:

作者:admin

标签: GPIO  实现  HMI-Board  驱动  设计 

导读:HMI-Board GPIO驱动设计实现-从原理图与开发板实物图,我们可以看到给用户使用的LED有两个,分别为LED_USER1与LED_USER2两个,对开发板的LED0与LED1,...

开发板原理图

从原理图与开发板实物图,我们可以看到给用户使用的LED有两个,分别为LED_USER1与LED_USER2两个,对开发板的LED0与LED1,原理图如下:

1.jpg

开发板上还有三个用户按键,原理图如下:

1.jpg

安装开发板SDK

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

1.jpg

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

新建工程

打开RT-Thread Studio点击菜单

1.jpg

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

1.jpg

输入工程名称后生成工程:

1.jpg

生成工程预览如下:

1.jpg

配置GPIO

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

1.jpg

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

1.jpg

1.jpg

编写流水灯程序
hal_entry.c 文件内容如下:

#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 */
void hal_entry(void)
{
rt_kprintf("nHello RT-Thread!n");
while (1)
{
rt_pin_write(USER1_PIN, PIN_HIGH);
rt_pin_write(USER2_PIN, PIN_LOW);
rt_thread_mdelay(500);
rt_pin_write(USER1_PIN, PIN_LOW);
rt_pin_write(USER2_PIN, PIN_HIGH);
rt_thread_mdelay(500);
}
}
运行效果,两个LED交替闪烁。

GPIO 输入模式
我们配置TN0-1为中断输入模式,由于TN2没有中断输入模式,所以用读取IO的方法来实现。具体代码如下:

void key_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);
}
TN0、TN1的中断函如下:

void led_off(void *args)
{
rt_kprintf("bnt0 down!n");
led_flash_state= 0;
}
void led_on(void *args)
{
rt_kprintf("bnt1 down!n");
led_flash_state= 1;
}
TN2的数据读取如下:

if(rt_pin_read(TN2_PIN) == 0)
{
rt_thread_delay(10);//消抖
if(rt_pin_read(TN2_PIN) == 0)
led_flash_state = 2;
rt_kprintf("nTN2 push down!n");
}
创建闪灯任务如下,主要实现的是如果TN0按下,两个LED灯常亮,TN2按下,两个灯交替闪烁,TN1按下,两个灯熄灭。

static rt_thread_t tid1 = RT_NULL;
/* 线程 1 的入口函数 */
static void thread_led_flash_entry(void *parameter)
{
static uint32_t flash_cnt;
while (1)
{
if (led_flash_state == 0) {
rt_pin_write(USER1_PIN, PIN_LOW);
rt_pin_write(USER2_PIN, PIN_LOW);
}
else if (led_flash_state == 1) {
rt_pin_write(USER1_PIN, PIN_HIGH);
rt_pin_write(USER2_PIN, PIN_HIGH);
}
else if (led_flash_state == 2) {
if(flash_cnt<50)
{
rt_pin_write(USER1_PIN, PIN_HIGH);
rt_pin_write(USER2_PIN, PIN_LOW);
}
else if(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);
}
}
整个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 */
static uint8_t led_flash_state =0;
void led_off(void *args)
{
rt_kprintf("bnt0 down!n");
led_flash_state= 0;
}
void led_on(void *args)
{
rt_kprintf("bnt1 down!n");
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 的入口函数 */
static void thread_led_flash_entry(void *parameter)
{
static uint32_t flash_cnt;
while (1)
{
if (led_flash_state == 0) {
rt_pin_write(USER1_PIN, PIN_LOW);
rt_pin_write(USER2_PIN, PIN_LOW);
}
else if (led_flash_state == 1) {
rt_pin_write(USER1_PIN, PIN_HIGH);
rt_pin_write(USER2_PIN, PIN_HIGH);
}
else if (led_flash_state == 2) {
if(flash_cnt<50)
{
rt_pin_write(USER1_PIN, PIN_HIGH);
rt_pin_write(USER2_PIN, PIN_LOW);
}
else if(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);
}
}
void key_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);
}
void hal_entry(void)
{
rt_kprintf("nHello RT-Thread!n");
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("nTN2 push down!n");
}
rt_thread_delay(10);
}
}

实现的效果就是,我们按TN0,两个LED亮,按下TN1,两个LED灯灭,按下TN2,两个LED灯交替闪烁。

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信