RTThreadIoTOS · 2020年11月18日

【Nano 应用作品】开源图片采集存储终端

首发:RTThread物联网操作系统
作者:赵yang

原文链接:
https://www.rt-thread.org/qa/...
方案概述
使用图片传感器进行拍照,通过485传输到mcu,mcu使用文件系统操作flash进行存储,shell可对文件系统进行操作。(获取源码请点击阅读原文)
image.png
图片来源赵洋
功能分解

  • flash驱动
  • 文件系统和flash接口实现
  • 图片传感器数据获取实现
  • ymodem实现
  • shell与文件系统以及ymodem对接实现

RT-Thread相关内容:RT-Thread Nano 、线程 、互斥量 、软件定时器。
硬件准备
使用STMF205RET6,带有485和外部w25q128 flash,图像传感器是SXH-V1/V2系列串口摄像头 。(获取源码请点击阅读原文)
软件设计

1、MCU配置

使用cube mx生成代码

  • shell和485串口配置(略)
  • spi配置

image.png

文件系统配置

image.png

其中有个配置长文件名推荐使用动态,所以我们需要将系统的设置的调大才能正确运行文件系统 ,也可将 syscall.c文件中的ff\_memalloc和ff\_memfree和操作系统对接。
RT-Thread Nano 配置
image.png

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协议可以将这个文件传出到电脑。

效果

1118G.gif

1118H.gif

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
转载已获授权,禁止二转
推荐阅读
关注数
8072
内容数
181
小而美的物联网操作系统,经过14年的累积发展,RT-Thread 已经拥有一个国内最大的嵌入式开源社区,同时被广泛应用于能源、车载、医疗、消费电子等多个行业,累积装机量超过4亿台,成为国人自主开发、国内最成熟稳定和装机量最大的开源 RTOS。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息