Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
GPIO
HMI-Board
HMI-Board GPIO驱动
发布于 2023-06-12 14:09:52 浏览:553
订阅该版
[tocm] # 开发板原理图 [hmi-board-v3.1原理图.pdf](https://club.rt-thread.org/file_download/894841cbe63b6f3f) 从原理图与开发板实物图,我们可以看到给用户使用的LED有两个,分别为LED_USER1与LED_USER2两个,对开发板的LED0与LED1,原理图如下: ![LED原理图.png](https://oss-club.rt-thread.org/uploads/20230612/12024abd6e9b2ac16816b456fbe65d2e.png) 开发板上还有三个用户按键,原理图如下: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230612/106c54a595b24e251e4697d2147b7229.png) # 安装开发板SDK 1. 打开RT-Thread Studio,点击SDK管理器,下载开发板SDK: ![安装SDK.png](https://oss-club.rt-thread.org/uploads/20230612/3b58c07a1bd1e554a8fa808e6f7033bb.png.webp) 等待安装结束后退出SDK管理器 # 新建工程 1. 打开RT-Thread Studio点击菜单 ![新建工程1.png](https://oss-club.rt-thread.org/uploads/20230612/ffe4a8e883e8daeeb44b641fe36ac184.png) 2. 选择基于开发板创建工程: ![选择开发板创建工程.png](https://oss-club.rt-thread.org/uploads/20230612/061c3afe70137fcd6e77ba5581c7331c.png.webp) 3. 输入工程名称后生成工程: ![输入工程名称.png](https://oss-club.rt-thread.org/uploads/20230612/40e42db90b88d7d38f196d82f84f50c6.png.webp) 4. 生成工程预览如下: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230612/106c54a595b24e251e4697d2147b7229.png) # 配置GPIO 1. 选择RA Smart Configurator文件夹位置,只需要选到FSP文件夹就行了: ![选择RASC文件平.png](https://oss-club.rt-thread.org/uploads/20230612/a5cb756e8e6b64ffd846e569a22134c6.png.webp) 2. 在RASC工程配置LED为输出模式,按键为输入模式,并设置为默认的中断号。保存并生成工程: ![按键输入为中断.png](https://oss-club.rt-thread.org/uploads/20230612/5a799a1854442b782da57547b87cd782.png.webp) ![配置GPIO为out.png](https://oss-club.rt-thread.org/uploads/20230612/8b2943a9fba9a4eb9efa3a51f9fe64af.png.webp) # 编写流水灯程序 hal_entry.c 文件内容如下: ```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的方法来实现。具体代码如下: ```c 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的中断函如下: ```c 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的数据读取如下: ```c 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按下,两个灯熄灭。 ```c 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如下: ```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灯交替闪烁。
1
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
Lu_盼盼
这家伙很懒,什么也没写!
文章
35
回答
20
被采纳
0
关注TA
发私信
相关文章
1
drivers- pin
2
bsp 里面的drivers/gpio.c 少了一个功能
3
stm32f407移植RTT中gpio设备驱动问题
4
config PB4(NJTRST) to GPIO
5
RT-Thread的GPIO设备驱动问题
6
关于pin.c文件中语句可能出现的bug
7
RT-Thread学习笔记--线程创建与官方Pin设备驱动调用
8
【应用笔记】小白也能玩转RT-Thread之通用GPIO设备【官方出品
9
串口引脚定义中的GPIO_Pin_sources是社么意思?
10
RTT -GPIO 使用例程
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
cubemx
PWM
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
出出啊
1518
个答案
343
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
813
个答案
177
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
出出啊
1
篇文章
5
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
3
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部