Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
ART-Pi
easyflash
SPI
Art_Pi学习笔记2:驱动片外SPI_FLASH_W25Q128
发布于 2020-12-21 15:37:17 浏览:6184
订阅该版
**首先要感谢大佬的分享文章,让我更快上手。** 开发板: 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模式  在“硬件”使能SPI_FLASH  保存退出,等待配置完成  编译一下  下载后终端打印,自动挂载上去了。而且还有一个fal的东东?这是什么鬼?  之前使用H743开发板的时候是不会自己注册的,需要编写一个命令来挂载  现在这里自己挂载上去了  关于FAL软件包 查看项目,发现有一个fal的软件包  再次查看RT-Thread Settings的“软件包”配置选项,原来已经默认就选中了  然后查看rtconfig.h文件发现已经使能使用该软件包  然后查看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);, 完成了自动初始化。  关于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  这个函数位于fal_flash.c文件中  这的宏定义在fal_cfg.h中定义,指向norflash0,也就是前面sfud挂载的名字  而初始化结果也会在终端打印  上面的设备初始化完成之后,就调用fal_partition_init函数进行分区初始化  该函数位于fal_partition.c文件中,会使用到一个分区表,指向宏定义FAL_PART_TABLE  该宏定义位于fal_cfg.h中  就是对于W25Q128的预分区定义表 包括了wifi固件区,ble固件区,固件下载区,easeflash分区,还有文件系统分区 结合大佬的文章说明: **fal_flash_dev结构体除了包含设备名、起始地址、长度、块大小等对flash设备的描述参数,还包括对flash设备的操作函数指针,这些操作函数需要在移植FAL时由下层的驱动实现。 fal_partition结构体则包含分区名、设备名、分区在设备上的偏移地址和长度等,从该结构体定义也可以看出,一个fal_partition分区不能跨flash设备分配。** 文章中提到,FAL为了便于用户调试,也提供了finsh命令fal,包括fal probe/read/write/erase/bench等命令。  那么我们也在自己的终端中来尝试一下  一开始命令挂载fal probe W25Q128不成功,因为我们的注册名是norflash0,所以命令参数要改成norflash0就挂载成功了。然后我们读取一下,也可以读取到数据。说明W25Q128出厂的时候已经烧录好固件了,一般情况下就不要随便去清除。 **总结:FAL可以实现FLASH的分区管理。** 关于filesystem的探索 既然已经对SPI FLASH进行了逻辑上的分区,那现在就来探索一下其中一些分区的应用 关于filesystem  对应于分区表  发现在系统文件中有一个filesystem.c的文件,看来官方已经帮我们处理好这一功能的代码了,我们只要使能就可以了。  下面就来配置RT Thread Settings使能这个功能  保存退出,编译之后下载固件,运行查看终端打印,可以看到多出两行信息  分别注册了两个分区/flash和/sdcard 我们可以使用fatfs提供的调试指令来查看这两个分区到底是什么  Sdcard对应于我们的TF卡,可以看到里面的test_dir文件夹就是之前我们TF卡挂载到sd0的时候查看到的。 Flash对应于fal分区中的filesystem分区。里面存放的是一个网页文件。就是ArtPi最开始的固件需要用到的那个网页。 **关于filesystem.c文件的分析** 这段代码就是将FAL创建的filesystem分区挂载到文件管理提供的flash设备上  而下面这段代码则是创建一个线程去挂载tf卡。  线程的回调函数如下:一开始就检查TF卡的插入检测引脚,如果有效则说明TF卡已经在卡槽中,则可以挂载。如果没有,则进入循环,不断的检查卡槽的插入检测引脚是否有变化,如果有变化则判断是TF卡插入卡槽的动作就挂载,是TF卡拔出卡槽的动作就卸载。  具体的挂载动作和卸载动作的函数如下,注意检测引脚的宏定义要和实际PCB对应上。  另外需要注意的一点是,我们前面已经使能了usb_device,这时候TF卡已经自动挂载到SDCARD了,如果再插入USB,则不能识别到TF卡,而且终端会打印出一系列错误信息  试了几种不同的挂载名,都不成功。 **关于easyflash的使用** 首先试在RT-Thread Settings中“软件包”配置使能easyflash  保存后退出,就会看到工程中的添加了新的软件包  **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说的很清楚。  这里我选择的是fal接口的  接下来就是移植需要修改的内容了,按照说明文档,需要修改宏定义,这里默认是“ef”,修改成“easyflash”,对应于前面fal的分区  然后我们创建一个调试用的条目boot_times  然后在main.c文件中添加一个测试代码  这里的fal_init()可以注释掉,因为前面讲过在filesystem.c文件中已经初始化了,这段代码的功能就是读取特定字段boot_times下保存的数据内容,打印到终端,然后自加一处理,再存回去。 下面是代码演示: 开机后正常初始化  然后我们在终端中输入指令easyflash_sample  注意这里是每次调用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
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
rt-smart
FAL
I2C_IIC
UART
ESP8266
cubemx
WIZnet_W5500
ota在线升级
PWM
BSP
flash
freemodbus
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
keil_MDK
ulog
SFUD
msh
C++_cpp
MicroPython
本月问答贡献
RTT_逍遥
8
个答案
2
次被采纳
KunYi
8
个答案
1
次被采纳
三世执戟
7
个答案
1
次被采纳
winfeng
2
个答案
1
次被采纳
chenyaxing
2
个答案
1
次被采纳
本月文章贡献
catcatbing
2
篇文章
5
次点赞
swet123
1
篇文章
4
次点赞
Days
1
篇文章
3
次点赞
YZRD
1
篇文章
2
次点赞
阳光的掌控者
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部