首发:RTThread物联网操作系统
作者:赵yang
原文链接:
https://www.rt-thread.org/qa/...
方案概述
使用图片传感器进行拍照,通过485传输到mcu,mcu使用文件系统操作flash进行存储,shell可对文件系统进行操作。(获取源码请点击阅读原文)
图片来源赵洋
功能分解
- flash驱动
- 文件系统和flash接口实现
- 图片传感器数据获取实现
- ymodem实现
- shell与文件系统以及ymodem对接实现
RT-Thread相关内容:RT-Thread Nano 、线程 、互斥量 、软件定时器。
硬件准备
使用STMF205RET6,带有485和外部w25q128 flash,图像传感器是SXH-V1/V2系列串口摄像头 。(获取源码请点击阅读原文)
软件设计
1、MCU配置
使用cube mx生成代码
- shell和485串口配置(略)
- spi配置
文件系统配置
其中有个配置长文件名推荐使用动态,所以我们需要将系统的设置的调大才能正确运行文件系统 ,也可将 syscall.c文件中的ff\_memalloc和ff\_memfree和操作系统对接。
RT-Thread Nano 配置
2、外部flash驱动实现
外部FLASH产品型号为W25Q128,容量:16Mbytes,一页为256个字节,一个扇区为4K个字节,一块有12个扇区,共有256个块。
我们需要完成的是读取数据和写数据
1) 读取数据
首先需要进行测试FLASH是否是存在的,可以通过FLASH型号进行对比,步骤是,先将设备上电操作,发送读取Device ID指令(90H),FLASH返回Device ID值。
读取内部数据时,步骤是,发送一个字节读指令(03H)接着发送三个字节地址,FLASH就返回所需要的数据,可以一直读完整个FLASH。
2) 写数据
FLASH有一个保护机制叫作写保护,需要进行允许写入使能指令(06H)之后并且数据区域擦除过才可以开始进行写数据,写数据可以一次性写256个字节最多,也就是一页的数据,如果超过一页数据那么会出现以设定地址为头页数据为尾形成环形,页编程时地址需要对齐,一页256个字节,所以页编程的地址末字节为0。
总结:写数据步骤为,先进行写使能,擦除扇区,写使能,写入数据。
3、文件系统与FLASH驱动对接
文件系统移植部分软件已经生成,文件系统的意义是用户实现底层驱动,也就是对存储设备的读写状态等驱动,用户就可以使用文件系统的方式进行抽象存储数据管理了,比如打开一个文本文件,创建个文件夹。
所需实现的文件系统底层驱动函数均在 user\_diskio.c 文件中。
需要实现函数
1) USER\_initialize函数
USER\_initialize函数是初始化的作用,比如开启外部FLASH电压,获取DI看外部FLASH是否工作正常。我们使用读取ID函数,成功返回FR\_OK代表成功
2) USER\_status函数
USER\_status用来查看外部FLASH工作状态,比如写大量数据的时候会出现忙状态,此时就不可以进行数据的写入,比如写保护状态,就不可以写入数据。这里我们使用FLASH寄存器只看BUSY状态,就是写多个数据时等处理完,BUSY状态取消返回正确值。
3) USER\_read函数
USER\_read用来读取数据,只需要将我们写好的读取数据函数封装起来就可以了。
4) USER\_write函数
写数据函数,因为我们的FLASH写是一次性写256字节最多,这里参数是以扇区的方式,就需要将写函数多次写入,写完一页将地址变为下一页写入,直到完成全部写入。
5) USER\_ioctl函数
这里是文件系统的一些控制命令,比如对设备的扇区大小,扇区数量,擦除块大小值的获取。
在开始疑惑配置文件系统的 sector 最大和最小参数,实际上在这个函数中进行指定,对于flash就是写成固定4k,因为数据擦除最小是4k。
基本的功能已经实现后,MX\_FATFS\_Init()函数是文件系统的初始化,在此函数添加部分代码,进行测试文件系统。文件系统步骤,进行f\_mount挂载,如果没有文件系统就进行格式化,再重新挂载。 文件系统操作时候建议加上互斥量,避免多个文件同时操作有影响,需要一个一个操作。
图片传感器数据获取实现
实际上不同的传感器协议是不同的,我们只需要了解想法,图片操作顺序,拍照,读取数据(比如每次1K数据)。这里都抽象成一个就好了,拍照,获取总数据大小,读取指定地址多少数据。使用软件定时器定时拍照存储。
ymodem实现
这里有很多开源的,我看nano没有所以才采用的开源,使用的是Free YModem implementation.使用也简单,使用xshell可支持YModem 协议
需要对接的接口函数:
- \_\_ym\_getchar
- \_\_ym\_putchar
- \_\_ym\_sleep\_ms
- \_\_ym\_flush
主要使用发送函数,具体可见工程代码。
shell与文件系统以及ymodem对接实现
shell和文件系统实现就比较简单,因为输入参数直接可以和文件系统函数对接起来,这里我实现了一个扫描函数,扫描全部文件,保留最后一个文件名,用ymodem协议可以将这个文件传出到电脑。
效果
RT-Thread
让物联网终端的开发变得简单、快速,芯片的价值得到最大化发挥。Apache2.0协议,可免费在商业产品中使用,不需要公布源码,无潜在商业风险。
推荐阅读
【RT-Thread开发之路】使用at_device软件包通过ESP8266连接到网络
RT-Thread 编程风格指南
【RT-Thread作品秀】使用RT-Thread和TouchGFX实现DIY数字仪表
原文链接:https://mp.weixin.qq.com/s/gw0rabSErpZ-LmLYPvY8dA
转载已获授权,禁止二转