Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
ART-Pi
easyflash
SPI
Art_Pi学习笔记2:驱动片外SPI_FLASH_W25Q128
发布于 2020-12-21 15:37:17 浏览:5851
订阅该版
**首先要感谢大佬的分享文章,让我更快上手。** 开发板: Art_Pi_H750 开发平台: RT-Thread Studio OS版本: 4.0.3 参考文章: [1] (https://blog.csdn.net/m0_37621078/article/details/102689903) [2] (https://blog.csdn.net/moumde/article/details/108027100) [3] (https://blog.csdn.net/weixin_41294615/article/details/99844967) 学习笔记: 使用官方板的最大好处就是硬件方面的支持度很完善,很多涉及到硬件的配置,在RT-Thread Settings里面打勾就好了。不需要自己过度的去关心底层硬件的配置之类的,这样的好处是最快的速度上手,当然了,对于硬件的配置会比较生疏,遇到一些坑的时候会比较棘手。 今天来试试SPI_FLASH的驱动,板子上有一块W25Q128挂在SPI1总线上,另外一片W25Q64挂在QSPI总线上。由于H750内部只有128K的FLASH空间,所以我们的代码基本上都是在QSPI上运行的,QSPI工作在内存映射模式。因此不推荐在QSPI上做读写操作。需要缓存数据的,都放到SPI1总线上的FLASH进行。 配置RT-Thread Settings 在“组件”使能SFUD,注意要避开QSPI模式 ![image.png](/uploads/20201221/184f2c7044eb99b1dde977774ace0909.png) 在“硬件”使能SPI_FLASH ![image.png](/uploads/20201221/31736896bbe5436346a6c46519f4ec8e.png) 保存退出,等待配置完成 ![image.png](/uploads/20201221/6c9425eaa4545db0d3ad68f90e7ba012.png) 编译一下 ![image.png](/uploads/20201221/13c8f130a40f2cb058ead2dc10eb196b.png) 下载后终端打印,自动挂载上去了。而且还有一个fal的东东?这是什么鬼? ![image.png](/uploads/20201221/44bdbb66fcd46014ed40370b48fb209c.png) 之前使用H743开发板的时候是不会自己注册的,需要编写一个命令来挂载 ![image.png](/uploads/20201221/d6761819ac53c71f0e7d7b91e25faf8d.png) 现在这里自己挂载上去了 ![image.png](/uploads/20201221/7e12b405784c286d6ff71029cf0b0075.png) 关于FAL软件包 查看项目,发现有一个fal的软件包 ![image.png](/uploads/20201221/a1615c89693e7f7edd4b8f05470118fd.png) 再次查看RT-Thread Settings的“软件包”配置选项,原来已经默认就选中了 ![image.png](/uploads/20201221/753254f403eee07a47eb470322add948.png) 然后查看rtconfig.h文件发现已经使能使用该软件包 ![image.png](/uploads/20201221/25dddfc6a28e9476164cfd267260f0f9.png) 然后查看drv_spi_flash.c文件,发现原来是在这个地方初始化的: 首先使用rt_hw_spi_device_attach函数将spi10设备注册到spi1总线上。 然后使用rt_sfud_flash_probe函数注册了spi_flash而且命名为“norflash0”。 最后调用fal_init函数完成fal初始化。 并且最后通过INIT_ENV_EXPORT(rt_flash_init);, 完成了自动初始化。 ![image.png](/uploads/20201221/4e811a0d8f7011cac7e08bd550a33aae.png) 关于FAL的详细,参考下面这个大佬的文章 IOT-OS之RT-Thread(十一)--- FAL分区管理与easyflash变量管理_流云-CSDN博客 https://blog.csdn.net/m0_37621078/article/details/102689903 下面来分析一下fal_init()函数 首先是调用了fal_flash_init函数,按fal flash table来初始化flash ![image.png](/uploads/20201221/a13121764bace73392a16b8ce176e7e7.png) 这个函数位于fal_flash.c文件中 ![image.png](/uploads/20201221/3341bfbabf6cae9036bb0649ad2b71da.png) 这的宏定义在fal_cfg.h中定义,指向norflash0,也就是前面sfud挂载的名字 ![image.png](/uploads/20201221/567700c963792d3648335eb77369ddbc.png) 而初始化结果也会在终端打印 ![image.png](/uploads/20201221/1019c87e7f065de330a52103d17614f5.png) 上面的设备初始化完成之后,就调用fal_partition_init函数进行分区初始化 ![image.png](/uploads/20201221/3359110a080e59ddbe229818ef8b6552.png) 该函数位于fal_partition.c文件中,会使用到一个分区表,指向宏定义FAL_PART_TABLE ![image.png](/uploads/20201221/bcdbb2960b8de9912caf2dc52b2169e3.png) 该宏定义位于fal_cfg.h中 ![image.png](/uploads/20201221/b5eba5c9d61a11be165392d3599e4728.png) 就是对于W25Q128的预分区定义表 包括了wifi固件区,ble固件区,固件下载区,easeflash分区,还有文件系统分区 结合大佬的文章说明: **fal_flash_dev结构体除了包含设备名、起始地址、长度、块大小等对flash设备的描述参数,还包括对flash设备的操作函数指针,这些操作函数需要在移植FAL时由下层的驱动实现。 fal_partition结构体则包含分区名、设备名、分区在设备上的偏移地址和长度等,从该结构体定义也可以看出,一个fal_partition分区不能跨flash设备分配。** 文章中提到,FAL为了便于用户调试,也提供了finsh命令fal,包括fal probe/read/write/erase/bench等命令。 ![image.png](/uploads/20201221/6dd1a15bca3a12fc9835bde1ba8be4b3.png) 那么我们也在自己的终端中来尝试一下 ![image.png](/uploads/20201221/011acfd9dd6cd1a2a87d92d6e88a9c86.png) 一开始命令挂载fal probe W25Q128不成功,因为我们的注册名是norflash0,所以命令参数要改成norflash0就挂载成功了。然后我们读取一下,也可以读取到数据。说明W25Q128出厂的时候已经烧录好固件了,一般情况下就不要随便去清除。 **总结:FAL可以实现FLASH的分区管理。** 关于filesystem的探索 既然已经对SPI FLASH进行了逻辑上的分区,那现在就来探索一下其中一些分区的应用 关于filesystem ![image.png](/uploads/20201221/282a47dfbd126d6c161835908512eb1b.png) 对应于分区表 ![image.png](/uploads/20201221/bb6e475208bac3009c6ac8d7cc5c26b4.png) 发现在系统文件中有一个filesystem.c的文件,看来官方已经帮我们处理好这一功能的代码了,我们只要使能就可以了。 ![image.png](/uploads/20201221/4682c2b844016f4088d8489903d1a9df.png) 下面就来配置RT Thread Settings使能这个功能 ![image.png](/uploads/20201221/146abe10ca3fae3970fa7c16738d206f.png) 保存退出,编译之后下载固件,运行查看终端打印,可以看到多出两行信息 ![image.png](/uploads/20201221/1c328be3db1851c3fce8a5a2bdcf484f.png) 分别注册了两个分区/flash和/sdcard 我们可以使用fatfs提供的调试指令来查看这两个分区到底是什么 ![image.png](/uploads/20201221/b152d86e898d54121a8573e176436ff1.png) Sdcard对应于我们的TF卡,可以看到里面的test_dir文件夹就是之前我们TF卡挂载到sd0的时候查看到的。 Flash对应于fal分区中的filesystem分区。里面存放的是一个网页文件。就是ArtPi最开始的固件需要用到的那个网页。 **关于filesystem.c文件的分析** 这段代码就是将FAL创建的filesystem分区挂载到文件管理提供的flash设备上 ![image.png](/uploads/20201221/a61da3708ecaf99c40324a6054e1389c.png) 而下面这段代码则是创建一个线程去挂载tf卡。 ![image.png](/uploads/20201221/825ec2a496f2c2445f51c7b20d0add4e.png) 线程的回调函数如下:一开始就检查TF卡的插入检测引脚,如果有效则说明TF卡已经在卡槽中,则可以挂载。如果没有,则进入循环,不断的检查卡槽的插入检测引脚是否有变化,如果有变化则判断是TF卡插入卡槽的动作就挂载,是TF卡拔出卡槽的动作就卸载。 ![image.png](/uploads/20201221/8da058444df2e4ebcfef7e72537e4674.png) 具体的挂载动作和卸载动作的函数如下,注意检测引脚的宏定义要和实际PCB对应上。 ![image.png](/uploads/20201221/06e86608cbf682fdf094d057f34af7b9.png) 另外需要注意的一点是,我们前面已经使能了usb_device,这时候TF卡已经自动挂载到SDCARD了,如果再插入USB,则不能识别到TF卡,而且终端会打印出一系列错误信息 ![image.png](/uploads/20201221/ea3eea48174ccf3f617bed3084807fa6.png) 试了几种不同的挂载名,都不成功。 **关于easyflash的使用** 首先试在RT-Thread Settings中“软件包”配置使能easyflash ![image.png](/uploads/20201221/f8fe87e02f4d9a89435ea93fc11a34bd.png) 保存后退出,就会看到工程中的添加了新的软件包 ![image.png](/uploads/20201221/b477d26a2e05c409c743713ef6f568ca.png) **easyflash移植有SFUD和FAL两种方式,SFUD是直接在某个Flash上使用easyflash,FAL则是在某个分区上使用easyflash,我们只需要将环境变量保存在一段较小的flash分区中,因此使用FAL移植接口文件ef_fal_port.c** 这时候如果编译工程,会出现很多错误,原因在于缺少了一个文件el_fal_port.c 不慌,该文件不用我们自己编写,只需要到软件包目录下寻找即可,路径是:EasyFlash/ports/.. 在这个目录下有两个文件和一个说明文档,因为easyflash支持两种接口方式,分别是fal和sfud,只要挑选合适自己项目的文件拷贝到src文件夹内即可。而且目录中的readme说的很清楚。 ![image.png](/uploads/20201221/1edc6b0e9b908c54e1b676c73b4cc6d1.png) 这里我选择的是fal接口的 ![image.png](/uploads/20201221/9934e9156e2f589a1b964d313216d50c.png) 接下来就是移植需要修改的内容了,按照说明文档,需要修改宏定义,这里默认是“ef”,修改成“easyflash”,对应于前面fal的分区 ![image.png](/uploads/20201221/fa04318ef877bf46f0a26d5ab13af92f.png) 然后我们创建一个调试用的条目boot_times ![image.png](/uploads/20201221/1304004445fb9faadbc3783911ef05f6.png) 然后在main.c文件中添加一个测试代码 ![image.png](/uploads/20201221/d19bc9d098bfc6e0e11811a953fca680.png) 这里的fal_init()可以注释掉,因为前面讲过在filesystem.c文件中已经初始化了,这段代码的功能就是读取特定字段boot_times下保存的数据内容,打印到终端,然后自加一处理,再存回去。 下面是代码演示: 开机后正常初始化 ![image.png](/uploads/20201221/1e1b9eca58afe2f854022d8a2781b793.png) 然后我们在终端中输入指令easyflash_sample ![image.png](/uploads/20201221/3f0bafd8200456e87f2aebe1e43a4c7b.png) 注意这里是每次调用easyflash_sample才会进行上述操作,如果开机后没有调用该指令,即使重启也不会记录次数。如果需要做到每次都自动记录,可以将指令加入到初始化代码中自动运行。 **相关文章:** [Art-Pi学习笔记10:优化多媒体扩展板的音频驱动添加录音功能](https://club.rt-thread.org/ask/article/2872.html) [Art-Pi学习笔记9:如何使用art-pi的多媒体扩展板播放TF卡中的音乐文件](https://club.rt-thread.org/ask/article/2849.html) [Art-Pi学习笔记9:如何为Art-pi的内部flash设置读保护](https://club.rt-thread.org/ask/article/2568.html) [Art_Pi学习笔记8:使用AHT10温湿度模块](https://club.rt-thread.org/ask/article/2543.html) [Art_Pi学习笔记7:自己添加硬件定时器设备HWTIMER](https://club.rt-thread.org/ask/article/2492.html) [Art_Pi学习笔记6:驱动PWM输出](https://club.rt-thread.org/ask/article/2483.html) [Art-Pi学习笔记5_4:在littlevgl中显示二维码](https://club.rt-thread.org/ask/article/2698.html) [Art-Pi学习笔记5_3:在littlevgl软件包中显示中文字体](https://club.rt-thread.org/ask/article/2695.html) [Art_Pi学习笔记5.2:LVGL模拟器安装在VS2019上的避坑指南](https://club.rt-thread.org/ask/article/2470.html) [Art_Pi学习笔记5.1:优化LVGL软件包提高刷屏的速度](https://club.rt-thread.org/ask/article/2464.html) [Art_Pi学习笔记5:移植LittleVGL2RTT软件包驱动多媒体扩展屏](https://club.rt-thread.org/ask/article/2434.html) [Art_Pi学习笔记4:驱动多媒体扩展版的LCD和触摸功能](https://club.rt-thread.org/ask/article/2436.html) [Art_Pi学习笔记3:学习驱动wifi模块AP6212](https://club.rt-thread.org/ask/article/2429.html) [Art_Pi学习笔记2:驱动片外SPI_FLASH_W25Q128](https://club.rt-thread.org/ask/article/2423.html) [Art-Pi学习笔记1:驱动SDIO和USB设备做TF读卡器](https://club.rt-thread.org/ask/article/2417.html)
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
adaphoto
这家伙很懒,什么也没写!
文章
25
回答
44
被采纳
5
关注TA
发私信
相关文章
1
BBB的SPI驱动
2
求个SPI上挂两个或多个设备的使用例子
3
SPI设备有个bug
4
spi flash 的fatfs使用一段时间后读写文件出现故障
5
SPI驱动
6
请教rt_spi_configure函数理解
7
SPI FLASH挂载的问题
8
SPI-FLASH 文件系统 SPIFFS
9
求助一个完整的 spi flash 驱动
10
关于同时使用文件系统与SPI FLASH的问题
推荐文章
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
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
ulog
C++_cpp
at_device
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
13
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
8
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
5
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部