既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新
需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)
+ - [1.2.1 手动添加路径](#121__71)
- [1.2.1 使用`SConscript`脚本添加](#121_SConscript_78)
前言
经过前面两篇文章的准备,我们终于可以开始写应用代码了,在添加我们自己的驱动文件之前,本文会说明一下 RT-Thread Studio 如何添加自己的.c 和 .h文件。
然后在此基础上,完成 SHT21 温湿度传感器的 I2C 驱动移植。
❤️
本 RT-Thread 专栏记录的开发环境:
RT-Thread记录(一、RT-Thread 版本、RT-Thread Studio开发环境 及 配合CubeMX开发快速上手)
RT-Thread记录(二、RT-Thread内核启动流程 — 启动文件和源码分析)
❤️
RT-Thread 内核篇系列博文链接:
RT-Thread记录(三、RT-Thread 线程操作函数及线程管理与FreeRTOS的比较)
RT-Thread记录(四、RT-Thread 时钟节拍和软件定时器)
RT-Thread记录(五、RT-Thread 临界区保护)
RT-Thread记录(六、IPC机制之信号量、互斥量和事件集)
RT-Thread记录(七、IPC机制之邮箱、消息队列)
RT-Thread记录(八、理解 RT-Thread 内存管理)
RT-Thread记录(九、RT-Thread 中断处理与阶段小结)
❤️
在STM32L051C8 上使用 RT-Thread 应用篇系列博文连接:
RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (一、无线温湿度传感器 之 新建项目)
RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (二、无线温湿度传感器 之 CubeMX配置)
一、RT-Thread Studio添加自定义的.c .h文件
使用RT-Thread Studio添加自定义的.c .h文件有多种方式,本文根据博主的实际测试,分别说明一下。
1.1 在现有文件夹下添加
直接在工程现有的文件夹下面右击,选择新建头文件或者源文件,如下图:
添加完成以后就可以直接编译了,上面我在 cubemx 文件夹下的Src 和 Inc 下分别添加了i2c.c
和两个头文件,直接编译会关联进去的:
但是这里得说明下,cubemx 是通过SConscript
受SCons 构建工具管理的,所以直接这样添加的话,每次我们自己增加一个.c文件,需要在 SConscript
文件中增加对应部分,要不然同步一下scons,不相关的.c文件就会被排除构建:
当然我们也可以在其他文件夹下添加,比如 drivers 文件夹,里面.c.h文件是混在一起,我们也可以直接在这里面新建,如下图:
总结一下,在现有文件夹下面添加是比较方便的一种方式,因为项目整体的构建系统已经处理好了这些文件下的.c.h文件的包含关系,我们不用再进行添加头文件路径这种操作。
但是这种方式会影响项目原始框架,小项目的文件少倒是无所谓,文件多了的话就很乱了。
1.2 新建文件夹添加
所以我们要讲一下如果新建文件夹放置我们自己的驱动程序应该怎么做。
首先,还是右击选择新建文件夹,然后出选择文件夹放置的位置,输入文件夹名字:
新建好以后,我们在左边资源管理器可以看到有文件夹了,我们可以通过上面 1.1小节的内容添加文件,也可以直接打开文件夹所在的目录,直接把我们要的文件复制过来,如下图:
新建文件夹复制文件过来,不做任何操作直接编译,可以参与编译:
但是要备其他文件夹中的文件包含,需要添加头文件路径,如果不添加,会出现如下错误:
1.2.1 手动添加路径
在工程资源管理器界面右击点击构建配置,如下图:
然后按照下图所示步骤,把我们自己新建的头文件所在文件夹路径添加(和keil工具一样的添加)即可:
1.2.1 使用SConscript
脚本添加
在自己想要放驱动的文件夹下面新建一个SConscript
脚本,如下图:
然后把自己想添加的.c.h文件放在对应文件夹下面,新建完成刷新工程,然后再右击,选择“同步scons配置至项目”即可,脚本会把该文件路径自动添加至编译的路径中。
脚本内容如下:
from building import *
cwd = GetCurrentDir()
src = Glob('\*.c') + Glob('\*.S')
libpath = [cwd]
CPPPATH = [os.path.join(cwd)]
group = DefineGroup('mydrivers', src, depend = [''], CPPPATH = CPPPATH,LIBPATH = libpath)
Return('group')
二、I2C驱动移植
上面我们讲解了如果添加自己的驱动文件,那么我们就直接把以前驱动文件移植过来,因为 SHT21 的驱动文件,在我以前博文 STM32L051 和 nRF52832 专栏都说明过 SHT21的程序(等本次应用篇结束我会把最终的源码上传的):
nRF52832学习记录(十一、TWI总线的应用 SHT21程序移植)
我们这里只是把裸机使用的文件改成在 RT-Thread 上使用的文件。
2.1 移植步骤
首先我们把驱动文件都拷贝过来(Datadef.h 是我个人习惯使用的一些数据类型宏定义):
编译过后,还是正常通过除了上面报的那个延时函数的警告:
这是因为delay_us()
这个函数在HAL库中是没有的额,以前使用裸机的时候是我自己实现的,这里我们既然使用了 RT-Thread ,在我们《RT-Thread记录(四、RT-Thread 时钟节拍和软件定时器)》中正好介绍到过 RT-Thread 中有 us 延时函数,我们拿过来用用试试看。
我们把所有 delay_us
改成rt_hw_us_delay
,记得包含一下头文件:
然后把文件驱动文件中中所有的HAL_Delay
改成rt_thread_mdelay
,比如:
感觉已经好了……那么接下来看看效果。
2.2 使用测试
上面我们驱动移植好了,我们直接来测试一下,这里我们还是新建一个线程把,这个温湿度读取的线程我根据经验,设置为192字节,然后每隔3s读取一次温湿度打印:
程序编译正常没有问题,但是跑起来出问题了…
2.3 好多的问题= =!
按键没有修改,上篇文章一样预留的
虽然占用了7000多字节,但是应该还是有空间的,但是在程序运行直接报错:
key线程昨天测试的时候完全没问题啊,这里居然出错了,我考虑到今天也就多加了一个sht的线程,于是我将温湿度读取线程中的逻辑去掉,又出另外的问题提示:
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新
需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)
习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!**
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新
需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)