STM32硬件基础--QaudSPI总线读写片外FLASH(二)

【海东青电子原创文章,转载请注明出处:https://www.jianshu.com/p/77f7bd0817e9

TM32F746的文档在介绍QaudSPI时,上来就说了三种工作模式:


图一

1、“间接”模式

2、状态轮询模式

3、内存映射模式

这是什么意思呢?本人当时读文档读到此处时,是一脸的懵逼。有了前一讲 《STM32硬件基础--QaudSPI总线读写片外FLASH(一)》的基础,再来理解就容易多了。QSPI的这三种工作模式,是相对于ST MCU而言的,是为了简化MCU对QSPI器件(多为FLASH)而设立的。MCU针对FLASH主要就是做了两件事:一个是读写数据等收发命令,还有一个是:要经常查询FLASH的状态。比如写入数据,在写FLASH之前,必须先进行擦除,擦除需要时间,后续的写入命令必须等待擦除完成。怎么能知道是否擦除完成了呢?就得不断查询FLASH的状态。所以,常用的读写等命令就对应了上面的模式一:间接模式(ST MCU又把它具体分为间接写、间接读两种模式),而查询FLASH状态就对应了模式二:状态轮询。

至于模式三:内存映射模式,是为了简化读FLASH的操作。实际应用中,片外FLASH大多用于图片等静态数据存储,其写入是在烧写MCU时通过ST-LINK之类软件工具完成的。MCU运行时,基本上都是只从FLASH中读出数据。为了简化这个操作,可以使用模式三,将片外FLASH的地址映射到片内的地址空间(BANK1的起始地址为0x9000 0000),从而可以像访问片内地址一样来访问外部FLASH。不难理解,模式三只能用于读、不能写。(而且,映射的最大地址空间不能超过256MB。)

下面先来看看读数据的实现(代码下载地址:https://github.com/haidongqing/qspi-readflash)。我们采用四线快读方式:


图二

注意注解5:


图三

N25Q要求在这种读数据模式下,需要10个 Dummy clock cycles。时序图:


图四

发出read指令后,需要等待10个 Dummy cycles。在读操作之前,需要先对FLASH设置这个参数。在《STM32硬件基础--QaudSPI总线读写片外FLASH(一)》中提到,N25Q有2个配置寄存器:Nonvolatile Configuration Register 和 Volatile Configuration Register,前者是非易失的,后者是易失的,这里派上了用场,我们的方式是修改易失的 Volatile Configuration Register(代码中,MCU每次上电都要做这个操作):先读出  Volatile Configuration Register 的值,设置 Dummy cycles,之后再写回 Volatile Configuration Register。


图五

因为涉及了FLASH的写操作,先要使能写操作、然后才能写。代码中专门有一个函数 QSPI_WriteEnable() 来使能“写”:


图六

FLASH的写使能状态保存在FLASH的状态寄存器 status register 中:


图七

写状态寄存器、对FLASH编程(写)、擦除时,需要使能写。发出使能写指令后,需要查询该指令是否顺利完成了,即前面提到的“模式二”。这里使用了一个函数:HAL_QSPI_AutoPolling()。查询时,我们只关心位于 bit1 的 Write enable latch 标志位是否被置1了,所以 sConfig 结构体(轮询模式参数配置)中,屏蔽字(.Mask)设为0x02(bit1有效),匹配目标(.Match)设为0x02。

完整的修改Status Resgister 的代码在函数 QSPI_DummyCyclesCfg() 中实现,然后读取FLASH数据:


图八

正确读出数据后,开发板上的LED慢闪;如出错,LED长亮。FLASH出厂时,数据全为0xFF。本实验中,先用预先提供的 set_01234.hex 文件烧写开发板、并复位运行,将在FLASH地址起始处写入 “0123456789” 十个字符,然后再运行上面例程,即可看到正确的读出结果。


再来看看模式三,内存映射模式下,如何读取FLASH数据,代码详见:https://github.com/haidongqing/qspi-readflash-mapped


图九

核心是函数:HAL_QSPI_MemoryMapped(),在其内部使用参数 QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED 调用了  QSPI_Config(),从而实现对模式三的设定:

/* Call the configuration function */

      QSPI_Config(hqspi, cmd, QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED);

然后按内部地址方式读出数据:


图十

MCU对片外FLASH的操作以读为主,到此,有关QSPI使用的关键点已经讲完了。有兴趣的同学,请继续下一讲:《QSPI如何写FLASH数据》

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269