如何写好QSPI驱动
1. 摘要
本篇笔记主要介绍,如何开发稳定可靠,功能齐全的QSPI驱动。
2. 准备工作
1, IAR 8.32.1
2, STM32Cube_FW_H7_V1.6.0
3. QSPI简介
4. QSPI驱动
在项目的开发中,我们经常会使用外挂Flash在做一些应用,而STM32H743带QSPI接口,可以用来外挂QSPI Flash,在之前的推送中我们以winbond华邦的W25Q256为例给大家说明了下QSPI的操作,借助ST的HAL库例程可以快速验证,不同型号的QSPI Flash会有一些参数和命令区别,大家应用时候要注意,例如美光和华邦的有的命令码就不同。ST的驱动里STM32H743的评估板是以美光的MT25T_QLKT_L_01G为例。如果你使用不同的型号,请注意区分,既然是评估板,那么就只是给大家参考,在正式的项目中,还需要考虑一些其他的问题。
5. 驱动架构
驱动的架构可以参考STM32Cube_FW_H7中对QSPI Flash驱动架构,也可以自己做架构,尽量简单明了,易用且稳定。对具体型号Flash的驱动可以放在一个文件下建立一个.c和.h. 如我们以华邦的W25Q系列为例,
还可以建立一个文本文档,用来记录驱动的一些变更,发布笔记等。
BSP层可以在BSP文件夹下建立QSPI的驱动,名字可以参考ST库,也可以按照自己的命名规则来定,或者企业的软件文件命名规则来定。
建立好这些文件后,接下来可以动手开发了。开发的时候可以先画一些图,除过正常的初始化,去初始化,外,考虑都包含那些功能,那些模式,那些命令,那些安全管理。那些中断,是否可以用DMA操作等。还要考虑数据结构类型,配置信息,错误码等。这些一定要结合数据手册来考虑和分析。
5.1 初始化和去初始化
这部分相对比较简单,可以参考例程,市面上的开发板,编码风格和良莠不齐,大家尽量参考官方的资料和文档,要考虑检查返回值,初始化有没有成功。跟硬件相关的管脚,时钟等大家根据自己的应用去定,H743我一般跑400M. 官方的大部分例程也都是跑在400M.
5.2 驱动模式
从手册可以知道分为间接模式,状态轮询模式,内存映射模式,那么我们的驱动就要能够分别支持这三种模式。在stm32h743i_eval_qspi.h里面定义这些模式和其他数据类型。这些可以参考官方的定义
在w25q256.h中定义跟flash相关的数据类型,结构体,宏定义等。如QSPI的操作模式,这里要明白1-1-1,1-1-2,1-1-4,1-4-4等的含义,因为QSPI包含这四种,指令单线,地址单线/4线,数据单线/两线/四线,这些在flash的数据手册指令表里都会标出,支持那种操作,而我们在驱动中要综合考虑这四种。
命令表的定义,这个要注意不同型号的FLASH,会稍有区别,即使同一家的不同型号的可能也有区别,如华邦256M和1G的指令就有一些个别的不同。恰好这两款我都用过,在这里给大家提一下。由于指令比较多,这里就不一一列举了,只截取其中一部分,具体指令表的定义可以参考flash手册,
但是建议大家在做驱动的时候对所有指令做支持,这样在用的时候就很方便,而不是用的时候发现少,在去填补。可以分别做成子函数,例如读取ID,可以做一些校验
很多指令的内容官网的驱动里都没有,需要我们自己去做。
5.3 状态寄存器读写
W25Q系列一般有三个状态寄存器,用来表示一些状态,如状态寄存器1就可以通过读取来判断flash的状态,有没有忙,写使能有没有打开,以及保护位保护了那些地址,这些都要自己去实现,市面上包括官方的例程驱动里都没有,假如你不判断的话,如果要写的地址被保护,是写不进去的,还有可能出现异常,这些都可以通过读取状态寄存器1和2来判断和处理。以及结合WP脚。
这些功能在正式的产品中我们一定要考虑,否则你的驱动就不稳定,不安全,因为工业现场各种干扰,以及其他异常情况。可能你在实验室跑的好好的代码,到现场就不行了
5.4 读写擦驱动
擦除操作比较耗时,所以如果你是用查询模式的话,要不断去查询状态,而不能死等,从手册可以看除时间量级,擦除正片最大需要1000s,还是比较耗时,即使最小的擦除单元4k擦除,最坏情况也需要400ms。用中断或者DMA方式操作的话不涉及,但DMA的话中断需要好几个,有命令,完成,状态匹配,收发完成等。要熟悉这些大概时间量级。方便参考。基于不同模式的驱动我们在公众号里都给大家介绍过。
读写驱动,可以参考官网的例程,但是要加一些改动,如考虑读写失败怎么办,超时退出,如果连续两次还是失败,怎么考虑,我们一般会考虑尝试三次,如果第一次失败就尝试第二次读取,第二次失败,尝试第三次,这样可以大大加强安全性,可能99.99%的情况下一次就成功,但不排除失败的可能性。此外还要考虑参数的保护。
5.4.1 擦除
可以按照擦除单位来综合写一个函数
这里要注意就是W25Q256 和W25Q01J 的一些区别。如有的指令前者支持指令地址四线,而后者不支持。
5.4.2 读操作
读操作要考虑是single还是dual模式,分别出两个子函数,读的指令不同,时序也不同
建议大家一个指令做一个子函数。如0x6C和0xEC的时序和操作模式就不同,如0X6c
代码实现
从时序图可以看到指令单线,地址单线,数据4线即 1-1-4模式。0xEC留给大家去联系实现。
5.4.3 写操作
写操纵也有几条不同的命令
不同的时序和方式,可以写成不同的子函数,我们以34h为例子
通过时序图可以看到是指令单线,地址单线,数据四线,这样就可以实现写操作了。
5.5 异常
通常我们还需要去管理和处理一些异常情况,例如下面的定义,你也可以按照自己的方式,总之要对异常和错误做一些管理。
官方的例子基本上每个都有返回值,大家可以去参考,这样使你的驱动更安全可靠。
5.6 其他
其他一些应考虑的问题,大家可以根据自己的需求和应用在添加,这里就不在赘述。
6. 测试验证
开发完后,就可以写一个简答的测试程序,对自己的驱动进行测试,因为我是在freeRTOS系统下用的,所以建立一个QSPI的测试任务,去实现擦,写,读,比较的功能和验证。截取几张测试图
7. 参考文档
序号 | 文献 |
1 | STM32H743RM |
2 | STM32Cube_FW_H7_V1.6.0 |
本文分享自微信公众号 - 嵌入式程序猿(InterruptISR)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
面向产品经理的简单物联网框架
在本文中,我将介绍一个物联网框架,以帮助产品经理解决物联网产品的复杂性。该框架提供了易于遵循的结构,可揭示物联网堆栈每一层的需求,包括业务决策,技术决策等。 物联网产品的管理可能会非常艰巨和令人困惑,即使对于经验丰富的产品经理而言也是如此。这是因为物联网产品比普通产品复杂,因为您需要考虑五层技术的复杂性:设备硬件,设备软件,通信,云平台和云应用程序。 您不仅需要在这五个层中的每一个上做出关键的业务和技术决策,而且还需要确保这无数决策与您的整体策略相一致并且在这五个层中都一致。这成倍地增加了管理物联网产品的难度。为了帮助产品经理解决这种复杂性,我了解到了一个称为IoT决策框架。 该物联网框架提供了一种结构化的方法来创建可靠的物联网产品策略。这种策略就是制定决策。物联网决策框架可帮助您了解决策领域,并确保所有战略决策的一致性。 物联网框架将帮助您及早将错误的时间和金钱投入到产品上,从而发现陷阱。 要开始使用IoT决策框架,让我们看一下IoT技术堆栈的五层。 物联网技术栈的5层 管理物联网解决方案的最大挑战是物联网技术栈中有五层,并且需要在每一层做出决策。 从角度看,SaaS应用程序仅在右侧...
- 下一篇
你还以为StringBuffer是线程安全?别天真了。
你还以为StringBuffer是线程安全?别天真了。 每一个学过java的小伙伴都会背,StringBuffer是线程安全的,StringBuilder是非线程安全的;Hashtable是线程安全的,HashMap是非线程安全的。把这几条当成公理在用了,我面试的同学中,不管能力好坏,这几句都能背出来。 我们看一下StringBuffer的官方注释: StringBuffer is A thread-safe, mutable sequence of characters. A string buffer is like a String, but can be modified. At any point in time it contains some particular sequence of characters, but the length and content of the sequence can be changed through certain method calls. String buffers are safe for use by multiple ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS7设置SWAP分区,小内存服务器的救世主
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,CentOS8安装Elasticsearch6.8.6
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- 2048小游戏-低调大师作品
- CentOS8编译安装MySQL8.0.19