Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
【2024-RSOC】day 4RT-Thread 设备驱动
发布于 2024-07-29 20:50:28 浏览:106
订阅该版
[tocm] # Day 4 RT-Thread 设备驱动 ![image-20240729200313077.png](https://oss-club.rt-thread.org/uploads/20240729/6a4c0329a6732b73fbe1b7d8c3972a91.png.webp) ## I/O设备管理层 RT-Thread 提供了一套简单的 I/O 设备模型框架,如下图所示,它位于硬件和应用程序之间,共分成三层,从上到下分别是 I/O 设备管理层、设备驱动框架层、设备驱动层。 [I/O设备模型 (rt-thread.org)](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/device?id=io-设备模型-1) ## 实验一:注册字符设备 实验代码如下: ```c #include
#include
static int rt_device_test_init(void) { rt_device_t test_dev = rt_device_create(RT_Device_Class_Char,0);//字符设备是I/O设备的一种类型 if(!test_dev) { rt_kprintf("rt_dev creat failed!\n"); return -RT_ERROR; } if(et_device_register(rt_dev "rt_dev",RT_DEVICE_FLAG_RDWR)! = RT_EOK)// /**< read and write */ { rt_kprintf("test_dev register failed!\n"); return -RT_ERROR; } return RT_EOK; } MSH_CMD_EXPORT(rt_device_test_init,rt_device_test_init); ``` 实验结果如下: ![image-20240729201403926.png](https://oss-club.rt-thread.org/uploads/20240729/0e1cbd902ef8c63c6ad491c1aef6bd66.png) 注: 1.设备驱动根据设备模型定义,创建出具备硬件访问能力的设备实例,将该设备通过 `rt_device_register()` 接口注册到 I/O 设备管理器中。 2.应用程序通过 `rt_device_find()` 接口查找到设备,然后使用 I/O 设备管理接口来访问硬件。 ## 实验二:案件显示 menuconfig.exe配置如下: ![image-20240729202057004.png](https://oss-club.rt-thread.org/uploads/20240729/835d890f053e9af77b8e0956db90fb6c.png.webp) 代码如下: ```c #include
#include
#include
#include
#ifndef RT_USING_NANO #include
#endif /* RT_USING_NANO */ #define GPIO_LED_B GET_PIN(F, 11) #define GPIO_LED_R GET_PIN(F, 12) #define KET_UP GET_PIN(C, 5) #define KET_DOWN GET_PIN(C, 1) #define KET_LIFT GET_PIN(C, 0) #define KET_RIGHT GET_PIN(C, 4) #define LOG_TAG "pin.irq" #define LOG_LVL LOG_LVL_DBG void key_up_callback(void *args) { int value = rt_pin_read(KET_UP); LOG_I("key up! %d",value); } void key_down_callback(void *args) { int value = rt_pin_read(KET_DOWN); LOG_I("key down! %d",value); } void key_lift_callback(void *args) { int value = rt_pin_read(KET_LIFT); LOG_I("key lift! %d",value); } void key_right_callback(void *args) { int value = rt_pin_read(KET_RIGHT); LOG_I("key right! %d",value); } static int rt_pin_irq_example(void) { rt_pin_mode(KET_UP, PIN_MODE_INPUT_PULLUP); rt_pin_mode(KET_DOWN, PIN_MODE_INPUT_PULLUP); rt_pin_mode(KET_LIFT, PIN_MODE_INPUT_PULLUP); rt_pin_mode(KET_RIGHT, PIN_MODE_INPUT_PULLUP); rt_pin_attach_irq(KET_UP,PIN_IRQ_MODE_FALLING,key_up_callback,RT_NULL); rt_pin_attach_irq(KET_DOWN,PIN_IRQ_MODE_FALLING,key_down_callback,RT_NULL); rt_pin_attach_irq(KET_LIFT,PIN_IRQ_MODE_FALLING,key_lift_callback,RT_NULL); rt_pin_attach_irq(KET_RIGHT,PIN_IRQ_MODE_FALLING,key_right_callback,RT_NULL); rt_pin_irq_enable(KET_UP,PIN_IRQ_ENABLE); rt_pin_irq_enable(KET_DOWN,PIN_IRQ_ENABLE); rt_pin_irq_enable(KET_LIFT,PIN_IRQ_ENABLE); rt_pin_irq_enable(KET_RIGHT,PIN_IRQ_ENABLE); return RT_EOK; } MSH_CMD_EXPORT(rt_pin_irq_example, rt pin irq examlpe); ``` 运行结果如下: ![image-20240729202826409.png](https://oss-club.rt-thread.org/uploads/20240729/2d84e1d2794c163c1a7bb6c1613b2948.png.webp) ## 实验三: I2C读与写操作 ```c #include
#include
#include
#define LOG_TAG "i2c.app" #define LOG_LVL LOG_LVL_DOG void i2c_sample_single_byte_write(void) { struct rt_i2c_bus_device *i2c_bus; struct rt_i2c_msg msgs; rt_uint8_t buf[2]; i2c_bus = (struct rt_i2c_bus_device *)rt_device_find("i2c2"); if (i2c_bus == RT_NULL) { LOG_E("can't find %s device!\n","i2c2"); } buf[0] = 0x6B; msgs.addr = 0x68; msgs.flags = RT_I2C_WR; msgs.buf = buf; msgs.len = 1; if (rt_i2c_transfer(i2c_bus,&msgs,1) == 1) LOG_I("single byte write success!"); else LOG_E("single byte write failed!"); } MSH_CMD_EXPORT(i2c_sample_single_byte_write, i2c_sample_single_byte_write); void i2c_sample_multi_byte_write(void) { struct rt_i2c_bus_device *i2c_bus; struct rt_i2c_msg msgs; rt_uint8_t buf[3]; i2c_bus = (struct rt_i2c_bus_device *)rt_device_find("i2c2"); if (i2c_bus == RT_NULL) { LOG_E("can't find %s device!\n","i2c2"); } buf[0] = 0x01; buf[1] = 0x02; buf[2] = 0x03; msgs.addr = 0x68; msgs.flags = RT_I2C_WR; msgs.buf = buf; msgs.len = 3; if (rt_i2c_transfer(i2c_bus,&msgs,1) == 1) LOG_I("multi byte write success!"); else LOG_E("multi byte write failed!"); } MSH_CMD_EXPORT(i2c_sample_multi_byte_write, i2c_sample_multi_byte_write); void i2c_sample_single_byte_read(void) { struct rt_i2c_bus_device *i2c_bus; struct rt_i2c_msg msgs[2]; rt_uint8_t send_buf[1],recv_buf[1]; rt_err_t ret = RT_EOK; i2c_bus = (struct rt_i2c_bus_device *)rt_device_find("i2c2"); if (i2c_bus == RT_NULL) { LOG_E("can't find %s device!\n","i2c2"); } send_buf[0] = 0x6B; recv_buf[1] = 0x6A; msgs[0].addr = 0x68; msgs[0].flags = RT_I2C_WR; msgs[0].buf = send_buf; msgs[0].len = 1; msgs[1].addr = 0x68; msgs[1].flags = RT_I2C_RD; msgs[1].buf = recv_buf; msgs[1].len = 1; ret = rt_i2c_transfer(i2c_bus,&msgs,2); if (ret == 2) LOG_I("single byte read success!"); else LOG_E("single byte read failed! %d", ret); } MSH_CMD_EXPORT(i2c_sample_single_byte_read, i2c_sample_single_byte_read); ```
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
POJT_4529
这家伙很懒,什么也没写!
文章
4
回答
0
被采纳
0
关注TA
发私信
相关文章
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
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
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
张世争
8
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
KunYi
6
个答案
1
次被采纳
本月文章贡献
程序员阿伟
6
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部