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为例。若是你使用不一样的型号,请注意区分,既然是评估板,那么就只是给你们参考,在正式的项目中,还须要考虑一些其余的问题。spa
5. 驱动架构.net
驱动的架构能够参考STM32Cube_FW_H7中对QSPI Flash驱动架构,也能够本身作架构,尽可能简单明了,易用且稳定。对具体型号Flash的驱动能够放在一个文件下创建一个.c和.h. 如咱们以华邦的W25Q系列为例,3d
还能够创建一个文本文档,用来记录驱动的一些变动,发布笔记等。
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源创计划”,欢迎正在阅读的你也加入,一块儿分享。