Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
2024-RSOC
新手学习
星火1号_spark_星火一号_开发板
【2024-RSOC】Day4 : RT-Thread设备驱动(上)
发布于 2024-07-26 00:15:29 浏览:520
订阅该版
[tocm] # **【2024-RSOC】Day4 : RT-Thread设备驱动(上)** **【2024-RSOC】** 基于RT-Thread官方开发板星火一号,本篇参考RT-Thread入门pdf资料《RT-Thread 内核-线程间同步》,和夏令营老师讲解,编写而成。本内容面向小白,因为写这个的作者也是小白,跟着夏令营刚开始学,欸嘿(笑)。 ![0.png](https://oss-club.rt-thread.org/uploads/20240726/f54250dee4f4760af66a43dbc51e0813.png.webp) ![1.png](https://oss-club.rt-thread.org/uploads/20240726/92a06a6b42ebe42c36b759d7a08b1017.png.webp) [在线文档♥点♥我♥看♥](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/device) 如果初次使用spark的bsp软件包,未构建vscode文件,则参考我前日发布[【2024-RSOC】夏令营Day2:初识rt-thread及多线程简单试用](https://club.rt-thread.org/ask/article/9da7f2983ce3264f.html)中的`初次搞机(干通官方bsp源码)`小节,确保工程文件能正常打开烧录例程,再往下进行。 ## 实验1 注册字符设备 >[小节相关在线文档♥点♥我♥看♥](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/device?id=%e5%88%9b%e5%bb%ba%e5%92%8c%e6%b3%a8%e5%86%8c-io-%e8%ae%be%e5%a4%87) 代码如下: ``` #include
#include
static int rt_device_test_init(void) { //动态创建设备实例 rt_device_t test_dev = rt_device_create(RT_Device_Class_Char,0); if(!test_dev) { rt_kprintf("test_dev create failed!\n"); return -RT_ERROR; } if(rt_device_register(test_dev,"test_dev",RT_DEVICE_FLAG_RDWR)!= RT_EOK) { rt_kprintf("test_dev register failed\n"); return -RT_ERROR; } return RT_EOK; } MSH_CMD_EXPORT(rt_device_test_init, rt_device_test_init); ``` ![2.png](https://oss-club.rt-thread.org/uploads/20240726/e15e561d3a3d6486c44dd0b0089bf20e.png) ## 实验2 按键ulog显示 >ulog 是一个非常简洁、易用的 C/C++ 日志组件,第一个字母 u 代表 μ,即微型的意思。它能做到最低ROM<1K, RAM<0.2K的资源占用。ulog 不仅有小巧体积,同样也有非常全面的功能,其设计理念参考的是另外一款 C/C++ 开源日志库:EasyLogger(简称 elog),并在功能和性能等方面做了非常多的改进。 >[ulog小节相关在线文档♥点♥我♥看♥](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/ulog/ulog) 首先在env中,我们打开`menuconfig.exe`,按照下图设置打开ulog。 首先找到ulog。 ![3.png](https://oss-club.rt-thread.org/uploads/20240726/74e0ef429eba7a73a7478aa7729e4255.png) 选中,再按回车进入内部,勾选`Enable ISR log`,保存退出,然后`scons -j32`编译。 ![4.png](https://oss-club.rt-thread.org/uploads/20240726/12597c8630ed4e9982d7b26487a823de.png) 新建.c文件,将以下代码添加进去。按f5运行。 代码如下: ``` #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); ``` 运行结果如图:按压案件,会打印输出日志。 ![5.png](https://oss-club.rt-thread.org/uploads/20240726/997996cd2c0951054539b4469b05aa87.png) --- ##实验3 IIC读写。 首先在env中,我们打开`menuconfig.exe`,按照下图设置打开IIC。 ![6.png](https://oss-club.rt-thread.org/uploads/20240726/7c634d421c342a1a1d7ac939b6034f1d.png) 然后`scons -j32`编译。 已经能看到iic1已经注册。 ![7.png](https://oss-club.rt-thread.org/uploads/20240726/ede37b62f0ec36f7a3c2880acb0c1461.png) ## 实验4 修改Kconfig文件以添加自己设备 刚才我们选取IIC1已经看到了有5个IIC。如果我们要添加IIC6,那该如何讷? 在board目录下找到Kconfig文件打开,找到IIC的配置行。 ![8.png](https://oss-club.rt-thread.org/uploads/20240726/e6bd14857ea3e1d337232c939fd2079d.png.webp) 将IIC5整段复制,粘贴,修改为IIC6,再打开drv_soft_i2c.c,同样添加一段IIC6的代码如图。 ![9.png](https://oss-club.rt-thread.org/uploads/20240726/02e2885161e190cf2d35cafe3924c61f.png.webp) 以及修改上方`#if defined(BSP_USING_I2C1) || defined(BSP_USING_I2C2) || defined(BSP_USING_I2C3) || defined(BSP_USING_I2C4) || defined(BSP_USING_I2C5) || defined(BSP_USING_I2C6)`(在末尾添加IIC6的判断) 在头文件里也要加上IIC6信息,复制粘贴再修改即可 ![10.png](https://oss-club.rt-thread.org/uploads/20240726/32b46957933145bdf463a1711a3259b3.png.webp) 保存所有修改好的文件,再次打开menuconfig.exe,发现IIC选项内已有IIC6。如图示。 ![11.png](https://oss-club.rt-thread.org/uploads/20240726/1cd22d78024ec62e3be0e71c5bff9722.png) 按住shift+?,查看依赖信息,显示的信息对接的即Kconfig的内容。 --- ## 小插曲ಠ_ಠ ### 消失的libraries库 刚刚在修改HAL驱动包时发现,我的bsp包内不存在libraries文件夹,导致我无法修改HAL库来添加IIC6的配置信息。那么如何将libraries目录改至工程目录呢? 我们进入.vscode目录查看`c_cpp_properties.json`文件,如图: ![12.png](https://oss-club.rt-thread.org/uploads/20240726/43675c51df98496e9f9304a24dc90d97.png) libraries相关的目录全改为工程目录下,改为如下图示,即删去..\之类的东西。记得保存更改。 ![13.png](https://oss-club.rt-thread.org/uploads/20240726/864df216c7bb5922fba729ee5a21c69b.png) 此时去stm32目录下,找到libraries文件夹,进入找到星火一号的F407VGT6的HAL库,和HAL_Drivers单独拷贝到工程目录下的libraries文件夹内。`scons -j32`编译即可。 ### i2c-tools探测设备地址。 在menuconfig.exe中启用,如图。可以很便捷的查找设备地址。 ![14.png](https://oss-club.rt-thread.org/uploads/20240726/c4fe8f33467190288d48fd09bf0b214a.png) --- ## 实验5 IIC读与写操作 代码如下 ``` #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
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
河南理工大学恁带劲儿
俺是计算机协会硬件部嘞
文章
5
回答
0
被采纳
0
关注TA
发私信
相关文章
1
大神们,rt-thread启用WDT了,但是还是没启动,怎么办?
2
求一个师傅带带队,有偿交学费 肯吃苦
3
自己按照官方手册 在drv_gpio.c里面找不到PIN脚信息
4
rtt studio f4默认生成的代码无法使用
5
官方例程中的 USB设置配置不成功
6
STM32F4的虚拟串口 的USB时钟如何配置
7
AT24CXX 软件包函数 at24cxx的问题
8
rtthread studio和bsp文件之间生成的区别和联系?
9
pwm根据手册修改为对应的引脚后无效
10
文件系统挂实验 ls命令异常
推荐文章
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
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部