如何设置OSPI外设与ISSI的IS25LX256接口

介绍
HMI of Things应用程序具有在用户和机器之间控制和显示数据的能力是非常常见的。此类应用程序需要与外部存储器(例如可用于存储图形资产的非易失性存储器)接口的能力。STM32的集成首席技术官-S串行的P外周的接口(OSPI)外设使其易于与OSPI存储器接口。
在这篇文章中,我们将看到如何配置STM32的OSPI外围设备,以与ISSI中的IS25LX256接口——数据表可根据ISSI的要求提供:
https://www.issi.com/US/product-flash.shtml
OSPI内存可从Mouser获得,用于大众市场:

https://www.mouser.com/ProductDetail/ISSI/IS25LX256-JHLE?qs=DPoM0jnrROVUOUbt0%2FY1Mw%3D%3D

先决条件:
  • 微控制器:STM32H7B3LI
  • 软件:TouchGFX Designer、STM32CubeIDE和STM32CubeMx
STM32H7B3I-DK板包括一个512 Mbit OctoMacronix的SPI NOR闪存设备,与IS25LX256引脚间兼容。在本文中,我们将了解如何在STM32H7B3I-DK TouchGFX Board setup(TBS)中设置OSPI外围设备,以便能够在OSPI IS25LX256中保存图形资产。
步骤:
  1. 对零件U27 MX25LM51234和IS25LX256进行钎焊。
  2. 创建TouchGFX应用程序
基于STM32H7B3I-DK板设置创建TouchGFX应用程序。
如果您不知道如何执行此步骤,请参阅此链接:https://support.touchgfx.com/4.18/docs/tutorials/tutorial-02

本教程使用STM32F746G-DK,而在本文中,我们将使用STM32H7B3I-DK。
  1. 打开STM32CubeMx项目
在项目位置下,双击STM32H7B3I-DK.ioc打开STM32CubeMx项目 

4.设置OSPI时钟
从OSPI内存数据表中,我们可以看到OSPI的最大时钟为133MHz。

根据STM32H7B3LI数据表,我们发现最大OSPI时钟取决于模式(单数据速率(SDR)或双传输速率(DTR))、电源(VDD)电压和负载电容(CLoad)。表89和表90(如下)显示了不同的值:


 
在本文中,我们将使用OSPI内核时钟频率,即为OSPI外围设备供电的时钟,频率为133MHz。重要的是要注意OSPI内核时钟和OSPI时钟之间的差异:
  • OSPI内核时钟是为OSPI外围设备供电的时钟
  • OSPI时钟是您在OSPI CLK引脚上看到的时钟,它是为OSPI内存供电的时钟
第一步是设置OSPI内核时钟。在这里,我们将使用PLL2将其设置为133MHz。我们稍后会看到,OSPI时钟是从这个OSPI内核时钟派生的,使用133MHz,您可以获得高达133MHz的OSPI时钟,预分频器设置为1。参见第6)v)节

在STM32CubeMx中,在时钟配置选项卡下,我们可以看到OCTOPI时钟复用器。如下所示,OSPI时钟可以从PLL2、PLL1、HCLK3或外围时钟(PER_CK)导出。因此,我们需要在PLL2的输出之后设置DIVM2和PLL2“N”乘法器、“R”和除法器,以获得133MHz到OSPI外围设备。
一种可能的解决方案是使DIVM2=24,N=266,R=2。该解决方案提供了133MHz的OSPI内核时钟。该时钟稍后将在OSPI配置中除以4——请参阅第6)v)节。
  1. 设置OSPI模式
STM32H7B3系列嵌入了两个OSPI实例:
  • OCTOPI1:在内存映射模式下可从0x9000 0000寻址
  • OCTOPI2:在内存映射模式下可从0x7000 0000寻址
OSPI1和OSPI2的内部引脚可以分别映射到端口1或端口2,如下所示:

根据以下示意图:
  • 章鱼1.用于与OSPI存储器接口。
  • 8个引脚用于数据(IO0到IO7),这意味着在该模式下我们需要选择OCTO模式。
  • 使用DQS引脚
 
 
 

 
  • 选择OSPI端口1将内部OSPI引脚映射到GPIO引脚。例如,PG6可以映射到OCTOSIM_第1页_如设备数据表表14所示,使用AF10的NCS(P1代表端口1)。类似地,时钟、数据选通、数据[3:0]、数据[7:4]被映射到OSPI端口1。

基于上述配置,在STM32CubeMx中,我们可以将OSPI1模式设置为OCTO模式,然后使用端口1进行控制和数据信号。
  1. 设置OSPI参数
下一步是设置以下参数:
      1. 内存类型:数据的组织方式为D0–D1–D2–D3,如下所示。在STM32CubeMx中,我们将模式设置为“微米”:
      1. 设备大小:OSPI内存的大小,以字节为单位,以2^n表示。IS25LX256的数据表为256MB位=32MB字节=0x200 0000。我们看到比特25被设置为意味着2^25=32M字节。在STM32CubeMx中,我们将设备大小字段设置为25。
      1. 芯片选择高时间是CS在命令之间必须保持高电平的最小时钟周期数。IS25LX256规定了30ns——第88页。我们将88ns除以OSPI30ns/(133MHz/预分频器)=133MHz/3的时钟持续时间。时钟周期为3/133MHz。30ns/(3/133MHz)=1.33。我们四舍五入到下一个整数值,即2。在CubeMx中,我们将芯片选择高时间设置为2。
      1. 时钟模式指定时钟的级别——在IS25LX256数据表的第47页中,我们看到内存支持模式0或低级别,模式3为高级别。内存支持高和低。在STM32CubeMx中,我们将选择低。
      1. 时钟预分频器:在STM32CubeMx中,我们将预分频器设置为3。这意味着总线上的时钟为133MHz/3=44.3MHz。
      2. 根据RM0455中的OSPI规范,在DTR模式下,样本移位需要设置为无–请参阅以下摘录。在STM32CubeMx中,我们将样本移位设置为“无”。
      3. 根据RM0455中的OSPI规范,建议启用延迟保持四分之一周期,即DTR通信中输出的四分之一循环延迟。请参阅以下RM0455摘录。
      4. 其他参数将保留默认值。
下面的屏幕截图显示了OSPI外围设备的各种参数设置:
​​​​​
  1. 设置GPIO
最后,我们选择GPIO设置选项卡,在该选项卡中,我们可以看到OSPI端口1的STM32CubeMx默认引脚与STM32H7B3I-DK示意图不同,除了OSPI端口1IO3(PF6)和OSPI端口1BO6(PG9)。下表显示了差异:

因此,我们需要更改上表中列出的OSPI引脚的映射,以匹配STM32H7B3I-DK示意图:

在引脚视图选项卡中,在搜索字段中键入引脚的名称,该引脚将高亮显示,左键单击该引脚,然后将替代功能更改为OSPI信号。
以下示例显示如何将OSPI端口1 CLK从PF10更改为PB2:

 
  1. OSPI配置顺序
默认情况下,IS25LX256使用具有有限最大时钟频率的单线SDR SPI模式。为了在高速访问中受益于OCTO和DTR模式,我们需要发送以下特定命令:
  • 步骤1:重置内存以确保从内存的默认状态开始。
  • 步骤2:设置伪周期:伪周期用于给OSPI存储器准备高速访问数据的时间。IS25LX256数据表显示,当时钟频率为50MHz时,需要将伪周期设置为5个周期。
  • 步骤3:设置八进制DTR模式:默认情况下,IS25LX256使用单线SDR SPI模式,为了从OCTO和DTR模式中受益,我们需要启用它们。
  • 步骤4:启用内存映射模式。这是OSPI外围设备的配置,用于在地址0x9000 0000映射的内部内存空间中配置外部OSPI闪存。
下面的代码片段显示了配置序列的实现:
/*用户代码开始OCTOPI1_Init 2*/*步骤1:重置OSPI内存*/if(OSPI_ResetMemory(&hospit1)!=0){Error_Handler();}/*步骤2:设置虚拟周期*/if(OSPI_SetupDummyCycles(&hospi1)!=0){Error_Handler();}if(OSPI_SetupOctalDDRMode(&hospis1)!=0){Error_Handler();}/*步骤4:启用内存映射模式*/if(OSPI_EnableMemoryMappedMode(&hospi1)!=0){Error_Handler();}/*用户代码结束OCTOPI1_Init 2*/

请在下面找到上面函数实现的代码片段:
链接
STM32H7B3LI–产品介绍
STM32H7A3/7B3和STM32H7B0价值线高级基于Arm®的32位MCU-参考手册
STM32CubeMx-STM32Cube初始化代码生成器
STM32H7B3I-DK-带STM32H7M3LI MCU的发现套件
TouchGFX文档