Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
[实战入门学习营] [第3期 空气质量分析仪]第一周作业记录
发布于 2019-10-14 21:05:27 浏览:1121
订阅该版
* 本帖最后由 wenxincao 于 2019-10-14 21:10 编辑 * 先抒发一下感想!第一周作业终于完成了,前后断断续续地花了四天时间。由于我是第一次从裸机编程转到RTOS编程,很多地方都比较陌生,所以这四天大部分的实战时间都是在看...看文档看代码:dizzy:,期间还恶补了C语言知识(没办法,以前裸机编程时都没怎么用过指针,大一时学的C指针都快忘光了,用的32的库也是固件库,没接触过HAL+CubeMX)。实际写代码时才发现rt-thread其实是很容易上手的,只要在它规定的框架之内。然而如果你是想要弄懂rt_thread提供的API在背后究竟干了些什么,没有好的C语言功底很快就被源码的一堆" -> "(指向结构体成员运算符)组成的代码绕晕:dizzy:。尤其是在调用的函数里出现诸如"a->b->c(d, e)"之类的代码实在是太烦了:curse:,函数查找到这里,再也不能直接跳转查找下去了。要彻底搞懂这一行究竟调用了什么,干了些啥真的费劲(注:再也不用MDK看别人的代码了,效率低下真的坑)。其实这都是因为rt-thread 贯彻了面向对象的设计思想,系统内的基础设施都是对象化的,于是代码风格跟裸机的代码风格有很多差异,我只是还没有从裸机编程的固定思维中跳出来而已。好在rt-thread的文档资源非常丰富,也有很多例程资源。就算我目前觉得要搞懂rt-thread还得要花很长时间,但是照猫画虎把任务完成下来的能力还是有的。而且这一周的作业也没有要求用线程来实现,那么我姑且还是用一点裸机编程,把初始化代码、工作任务都弄到main()函数里,硬件驱动就使用rt-thread的设备框架,这样慢慢地适应咯。 任务 1、BSP 跑起来 我用的开发版是官方的stm32f401re-nucleo板。本来源码里面是有stm32f401re-nucleo的BSP的,但是为了熟悉一下rt-thread BSP的制作流程,自己也尝试了一下。 根据官方文档,rt_thread的移植其实有两部分,CPU架构移植和BSP移植。由于rt_thread 直接为stm32的用户设计了新的BSP框架以及该系列的多种BSP模板,因此我就能在模板里面移植自己 的BSP。移植工作主要对board里面的文件进行修改,因为跟BSP硬件相关的文件都放在了这个文件夹里。整个制作流程就按照BSP制作文档里面的五个步骤走,具体细节我就不详细叙述了。有一个小细节是当你的BSP制作完成后最好在scos里使用scons --dist生成dist目录,把自己制作的BSP从rt-thread里弄出去,变成一个独立的工程。 实现任务 2:完成报警模块 & 实现任务 3:完成按键模块 这两个任务其实内容相似,我就放在一块论述。这一部分所要掌握的内容是学会使用pin设备。报警功能用led的亮灭来实现,在裸机开发是就需要配置输出模式的GPIO,led的亮灭通过控制GPIO的高低电平来实现,led闪烁通过加入延时函数实现。按键功能通过检测GPIO的输入电平来实现,若要使按下按键控制led亮,释放按键控制led灭,则可以引入GPIO的双边沿触发中断。在rt-thread设备驱动里,GPIO变成了一种PIN设备,但是操作方式没有改变。于是也能与裸机编程的方式类似,led功能代码如下:```#include
#include
#include
#include "led_alert.h" #define LED0_PIN GET_PIN(A, 5) void led_init(void) { rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT); rt_pin_write(LED0_PIN, PIN_LOW); } void led_on(void) { rt_pin_write(LED0_PIN, PIN_HIGH); } void led_off(void) { rt_pin_write(LED0_PIN, PIN_LOW); } void led_blink(rt_int32_t mdelay) { led_on(); rt_thread_mdelay(mdelay); led_off(); rt_thread_mdelay(mdelay); }``` 仔细一看,其实就是对PIN设备的操作函数加了一层皮,跟裸机无异。要注意的是,要想使用GET_PIN()函数来快速确定PIN设备引脚编号,需要包含board头文件。 key功能代码如下:```#include
#include
#include
#include "key.h" #include "led_alert.h" #define KEY0_PIN GET_PIN(C, 13) void key_init(void) { rt_pin_mode(KEY0_PIN, PIN_MODE_INPUT_PULLUP); rt_pin_attach_irq(KEY0_PIN, PIN_IRQ_MODE_RISING_FALLING, key_cb, (void *)"Enter key0 callback funtion"); //绑定回调函数 rt_pin_irq_enable(KEY0_PIN, PIN_IRQ_ENABLE); } void key_cb(void *args) { char *a = args;//获取参数 rt_thread_mdelay(10); //消抖处理 if (rt_pin_read(KEY0_PIN) == PIN_LOW) { led_on(); rt_kprintf("%s. key0 on!
", a); } else { led_off(); rt_kprintf("key0 off! %s
", a); } }``` 这样,把led_init() 和 key_init() 放在主函数里初始化,就能完成按键控制led亮灭。在rt_pin_attach_irq()函数里面注册了回调函数key_cb()并成功使能中断后,每次按键按下时,rt-thread系统里的中断服务函数会调用该函数,led电平变化使还会向串口打印变化信息。 实现任务 4:完成温湿度传感器的驱动 由于我使用的温湿度传感器是dht10,rt-thread的传感器组件里已经包含了该软件包,不用自己写硬件驱动,就直接在scons里添加 ```RT-Thread online packages ---> peripheral libraries and drivers ---> sensors drivers ---> aht10: digital humidity and temperature sensor aht10 driver library. [ ] Enable average filter by software Version (latest) --->```该软件包内容如下: ![1.png](/uploads/201910/14/210200fp6n721l4bxpa1h2.png) 打开文件后发现该软件包只提供了相应的接口,(adt11软件包才有例程)。具体调用还需要自己编写功能函数,于是我新建了文件 temp_humi.c ,以及相应的 .h 文件。由于aht10需要用到i2c,所以还要再scons中开启软件i2c1总线。完成之后我按照ath10软件包文档在主函数编写初始化代码: ```#include "sensor_asair_aht10.h" #define AHT10_I2C_BUS "i2c4" int rt_hw_aht10_port(void) { struct rt_sensor_config cfg; cfg.intf.dev_name = AHT10_I2C_BUS; cfg.intf.user_data = (void *)AHT10_I2C_ADDR; rt_hw_aht10_init("aht10", &cfg); return RT_EOK; } INIT_ENV_EXPORT(rt_hw_aht10_port);```为了跟任务要求提供的接口一致,我把该初始化代码移植到了主函数里面```#define AHT10_I2C_BUS "i2c1" int main(void) { struct rt_sensor_config cfg; led_init(); key_init(); cfg.intf.dev_name = AHT10_I2C_BUS; cfg.intf.user_data = (void *)AHT10_I2C_ADDR; rt_hw_aht10_init("aht10", &cfg); while (1) { rt_thread_delay(1000); } } ``` 编译烧录代码,运行时可以在串口中看到成功初始化的代码 ![TIM截图20191014202559.png](/uploads/201910/14/210251vgrr54nq4ngbwbse.png) 在Finsh中使用list_device查看挂接设备,发现传感器设备有两个Sensor Device,一个是humi_aht,另一个是temp_aht。看来rt-thread把aht10抽象成两个传感器设备了 ![TIM截图20191014202642.png](/uploads/201910/14/210330ra7byfvtc0azuftc.png) 以temp_aht为例实现传感器数据读取的接口,我是参照aht11软件包中的sample编写的,可以发现,编写风格是以标准I/O设备方式操作的,temp_aht设备变成了一种特别的文件,可以进行打开/关闭和读/写操作 ```rt_err_t aht10_read_temp(void) { rt_device_t dev = RT_NULL; rt_size_t res; struct rt_sensor_data data; dev = rt_device_find("temp_aht"); // 查找设备 if (dev == RT_NULL) { rt_kprintf("can't find temp_aht device!
"); return RT_ERROR; } else { rt_device_open(dev, RT_DEVICE_FLAG_RDONLY); // 打开温度设备 res = rt_device_read(dev, 0, &data, 1); // 读设备 if (res != 1) { rt_kprintf("read data failed! result is %d
", res); rt_device_close(dev); return RT_ERROR; } else { rt_kprintf("temp:%3d.%dC, timestamp:%5d
", data.data.temp / 10, data.data.temp % 10, data.timestamp); // 温度数据打印 } } rt_device_close(dev); // 关闭设备 return RT_EOK; } ```这种写法符合了rt-threadde I/O设备模型框架 ![TIM截图20191014204104.png](/uploads/201910/14/210408gv4ggp1vgvrzr9fo.png) 编写完成之后在主函数的while循环中每个一段时间调用一次 在此,任务4的内容全部完成,最终效果如下 ![温湿度.png](/uploads/201910/14/210408gdiwv6g02i4vgg8j.png) 搞定:loveliness:,吃饭去。
查看更多
1
个回答
默认排序
按发布时间排序
撰写答案
登录
注册新账号
关注者
0
被浏览
1.1k
关于作者
wenxincao
这家伙很懒,什么也没写!
提问
1
回答
1
被采纳
0
关注TA
发私信
相关问题
推荐文章
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组件
最新文章
1
freemodbus主机在freertos的适配,参考rtthread例程
2
开源共生 商业共赢 | RT-Thread 2024开发者大会议程正式发布!
3
【24嵌入式设计大赛】基于RT-Thread星火一号的智慧家居系统
4
RT-Thread EtherKit开源以太网硬件正式发布
5
还在担心bsp不好维护吗?快使用yml管理主线bsp
热门标签
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
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
a1012112796
20
个答案
3
次被采纳
张世争
12
个答案
3
次被采纳
踩姑娘的小蘑菇
7
个答案
3
次被采纳
用户名由3_15位
13
个答案
2
次被采纳
rv666
9
个答案
2
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
RTT_逍遥
1
篇文章
7
次点赞
大龄码农
1
篇文章
5
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部