打印
[STM32L5]

【STM32L562E-DK试用】第3辑:板子Flash芯片测试(OSPI)

[复制链接]
67|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 qintian0303 于 2025-3-22 10:47 编辑

       OSPI(Octal Serial Peripheral Interface)是一种基于传统SPI协议扩展的高速串行接口,通过8线并行数据传输显著提升通信速率,其核心特性包括支持双倍数据速率(DDR)模式、最高200MHz时钟频率,以及兼容标准SPI、双线SPI和四线SPI等多种工作模式。相较于传统SPI的单线或四线半双工传输,OSPI利用IO0至IO7八条数据线实现并行通信,单周期可传输8位数据,理论带宽可达传统SPI的八倍,这使得OSPI特别适用于大容量Flash存储器(如64MB MX25LM51245G)和需要高速数据存取的场景(如AI模型加载或GUI资源存储)。硬件连接方面,OSPI除时钟线(SCLK)和片选线(CS)外,需严格匹配八条数据线的PCB阻抗与走线长度以保障信号完整性,而传统SPI仅需四根基础信号线(SCK/MOSI/MISO/CS),硬件设计复杂度显著更低。协议层面,OSPI支持HyperBus等高级特性并内置ECC校验机制,而SPI主要用于低速传感器或EEPROM通信。这种性能差异使OSPI成为物联网设备和高性能嵌入式系统中扩展外部存储的首选方案。
本次的STM32L562E-DK上使用的大容量Flash芯片就是基于OSPI进行的,先看一下硬件:
       本次的开发板板载的是一颗MX25LM51245GXDI0A,MX25LM51245GXDI0A是一款512Mbit(64MB)容量的Octal SPI Flash芯片,采用8线并行通信接口,支持单线、双线、四线及八线模式。其工作电压范围为1.7-2.0V,与STM32L562E-DK开发板的1.8V供电设计完全匹配。
       我们使用STM32CubeMX进行OPSI的配置:
       注意看一下引脚的配置是否和板卡匹配:
       这么高速的传播速度当然要开启DMA和中断了。
       接下来回到我们的工程里面进行MX25LM51245GXDI0A的驱动,STM32L5的固件包中提供了这款芯片的驱动:
       我们移植过来进行一下具体驱动内容的查看,在使用过程中需要继续初始化OSPI的配置:
<article data-content="[{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;Jj88-1742566111658&quot;,&quot;name&quot;:&quot;code&quot;,&quot;data&quot;:{&quot;wrap&quot;:false,&quot;tokensPerLine&quot;:[],&quot;language&quot;:&quot;&quot;,&quot;theme&quot;:&quot;default&quot;},&quot;nodes&quot;:[{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;iKa3-1742566111657&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;0Euo-1742566111656&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;OSPI_OctalModeCfg(&hospi1);\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;7ZEW-1742566123652&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;i8Od-1742566123651&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;Vfas-1742566123654&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;tTG6-1742566123653&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;  sCommand.OperationType      = HAL_OSPI_OPTYPE_COMMON_CFG;\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;7Xpl-1742566123656&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;Zvoi-1742566123655&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;  sCommand.FlashId            = HAL_OSPI_FLASH_ID_1;\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;vC1z-1742566123658&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;EW3S-1742566123657&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;  sCommand.InstructionMode    = HAL_OSPI_INSTRUCTION_8_LINES;\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;wkfn-1742566123660&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;PJTI-1742566123659&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;  sCommand.InstructionSize    = HAL_OSPI_INSTRUCTION_16_BITS;\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;EVDw-1742566123662&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;xXIW-1742566123661&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;  sCommand.InstructionDtrMode = HAL_OSPI_INSTRUCTION_DTR_DISABLE;\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;9GZR-1742566123664&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;ckLL-1742566123663&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;  sCommand.AddressSize        = HAL_OSPI_ADDRESS_32_BITS;\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;G7Qn-1742566123666&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;Bd7i-1742566123665&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;  sCommand.AddressDtrMode     = HAL_OSPI_ADDRESS_DTR_DISABLE;\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;iiEq-1742566123668&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;RzpE-1742566123667&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;  sCommand.AlternateBytesMode = HAL_OSPI_ALTERNATE_BYTES_NONE;\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;wJzL-1742566123670&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;e857-1742566123669&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;  sCommand.DataDtrMode        = HAL_OSPI_DATA_DTR_DISABLE;\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;QQeu-1742566123672&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;DpWo-1742566123671&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;  sCommand.DQSMode            = HAL_OSPI_DQS_DISABLE;\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;S02R-1742566123674&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;xyAt-1742566123673&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;  sCommand.SIOOMode           = HAL_OSPI_SIOO_INST_EVERY_CMD;&quot;,&quot;marks&quot;:[]}]}]}],&quot;state&quot;:{}}]"><div yne-bulb-block="code" data-theme="default" style="white-space-collapse: preserve;" data-language="">OSPI_OctalModeCfg(&hospi1);

  sCommand.OperationType      = HAL_OSPI_OPTYPE_COMMON_CFG;
  sCommand.FlashId            = HAL_OSPI_FLASH_ID_1;
  sCommand.InstructionMode    = HAL_OSPI_INSTRUCTION_8_LINES;
  sCommand.InstructionSize    = HAL_OSPI_INSTRUCTION_16_BITS;
  sCommand.InstructionDtrMode = HAL_OSPI_INSTRUCTION_DTR_DISABLE;
  sCommand.AddressSize        = HAL_OSPI_ADDRESS_32_BITS;
  sCommand.AddressDtrMode     = HAL_OSPI_ADDRESS_DTR_DISABLE;
  sCommand.AlternateBytesMode = HAL_OSPI_ALTERNATE_BYTES_NONE;
  sCommand.DataDtrMode        = HAL_OSPI_DATA_DTR_DISABLE;
  sCommand.DQSMode            = HAL_OSPI_DQS_DISABLE;
  sCommand.SIOOMode           = HAL_OSPI_SIOO_INST_EVERY_CMD;</div></article>

       主要的控制程序包括读字节、写字节、和块擦除等等如下:
       擦除命令:
<article data-content="[{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;ASnM-1742569915008&quot;,&quot;name&quot;:&quot;code&quot;,&quot;data&quot;:{&quot;wrap&quot;:false,&quot;tokensPerLine&quot;:[],&quot;language&quot;:&quot;&quot;,&quot;theme&quot;:&quot;default&quot;},&quot;nodes&quot;:[{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;RPBA-1742569915007&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;WGBq-1742569915006&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot; /* Enable write operations ------------------------------------------- */\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;e183-1742569940258&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;dqxp-1742569940257&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;OSPI_WriteEnable(&hospi1);\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;WyR7-1742569940260&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;O2Jj-1742569940259&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;3PLX-1742569940262&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;XF6O-1742569940261&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;/* Erasing Sequence -------------------------------------------------- */\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;NdZG-1742569940264&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;CjOw-1742569940263&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;sCommand.Instruction = OCTAL_SECTOR_ERASE_CMD;\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;tH7S-1742569940266&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;rO0n-1742569940265&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;sCommand.AddressMode = HAL_OSPI_ADDRESS_8_LINES;\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;q1JB-1742569940268&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;6z8l-1742569940267&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;sCommand.Address     = address;\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;Pwq2-1742569940270&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;okGc-1742569940269&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;sCommand.DataMode    = HAL_OSPI_DATA_NONE;\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;C5kz-1742569940272&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;wFXD-1742569940271&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;sCommand.DummyCycles = 0;\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;C7GX-1742569940274&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;CIVK-1742569940273&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;E41N-1742569940276&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;eIh8-1742569940275&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;if (HAL_OSPI_Command_IT(&hospi1, &sCommand) != HAL_OK)\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;SL2e-1742569940278&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;oekm-1742569940277&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;{\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;elwD-1742569940280&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;p6Gp-1742569940279&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;  Error_Handler();\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;gnti-1742569940282&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;NvXV-1742569940281&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;}&quot;,&quot;marks&quot;:[]}]}]}],&quot;state&quot;:{}}]"><div yne-bulb-block="code" data-theme="default" style="white-space-collapse: preserve;" data-language=""> /* Enable write operations ------------------------------------------- */
OSPI_WriteEnable(&hospi1);

/* Erasing Sequence -------------------------------------------------- */
sCommand.Instruction = OCTAL_SECTOR_ERASE_CMD;
sCommand.AddressMode = HAL_OSPI_ADDRESS_8_LINES;
sCommand.Address     = address;
sCommand.DataMode    = HAL_OSPI_DATA_NONE;
sCommand.DummyCycles = 0;

if (HAL_OSPI_Command_IT(&hospi1, &sCommand) != HAL_OK)
{
  Error_Handler();
}</div></article>

       写命令:
<article data-content="[{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;JtjQ-1742569986663&quot;,&quot;name&quot;:&quot;code&quot;,&quot;data&quot;:{&quot;wrap&quot;:false,&quot;tokensPerLine&quot;:[],&quot;language&quot;:&quot;&quot;,&quot;theme&quot;:&quot;default&quot;},&quot;nodes&quot;:[{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;QLCH-1742569986662&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;jGGx-1742569986661&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot; /* Configure automatic polling mode to wait for end of erase ------ */  \r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;lk6N-1742569987970&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;2GB7-1742569987969&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;OSPI_AutoPollingMemReady(&hospi1);\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;eCPZ-1742569987972&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;tMKt-1742569987971&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;PvSn-1742569987974&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;nvLY-1742569987973&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;/* Enable write operations ---------------------------------------- */\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;mFTo-1742569987976&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;Ssht-1742569987975&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;OSPI_WriteEnable(&hospi1);\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;igEG-1742569987978&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;tiWP-1742569987977&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;BdeJ-1742569987980&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;zEfJ-1742569987979&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;/* Writing Sequence ----------------------------------------------- */\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;7Ecu-1742569987982&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;D6EV-1742569987981&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;sCommand.Instruction = OCTAL_PAGE_PROG_CMD;\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;XkJw-1742569987984&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;Ffid-1742569987983&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;sCommand.DataMode    = HAL_OSPI_DATA_8_LINES;\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;eHxU-1742569987986&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;EV2G-1742569987985&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;//          sCommand.NbData      = BUFFERSIZE;&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;FSri-1742570598733&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;1rrH-1742570598731&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;sCommand.Address     = address+tmp_flag*4-4;\r\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;gmwn-1742569987988&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;nSAL-1742569987987&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;sCommand.NbData      = 4;\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;Om6D-1742569987990&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;aw5w-1742569987989&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;oZkl-1742569987992&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;zImB-1742569987991&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;if (HAL_OSPI_Command(&hospi1, &sCommand, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;lavS-1742569987994&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;Z2f6-1742569987993&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;{\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;SR9z-1742569987996&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;NJVF-1742569987995&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;Error_Handler();\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;7jvV-1742569987998&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;fD4K-1742569987997&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;}\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;mIzL-1742569988000&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;1Yig-1742569987999&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;8ZaM-1742569988002&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;uWU4-1742569988001&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;if (HAL_OSPI_Transmit_DMA(&hospi1, bTxBuffer) != HAL_OK)\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;8PXm-1742569988004&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;etBt-1742569988003&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;{\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;RkNe-1742569988006&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;BALb-1742569988005&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;Error_Handler();\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;ejDL-1742569988008&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;t9oN-1742569988007&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;}&quot;,&quot;marks&quot;:[]}]}]}],&quot;state&quot;:{}}]"><div yne-bulb-block="code" data-theme="default" style="white-space-collapse: preserve;" data-language=""> /* Configure automatic polling mode to wait for end of erase ------ */  
OSPI_AutoPollingMemReady(&hospi1);

/* Enable write operations ---------------------------------------- */
OSPI_WriteEnable(&hospi1);

/* Writing Sequence ----------------------------------------------- */
sCommand.Instruction = OCTAL_PAGE_PROG_CMD;
sCommand.DataMode    = HAL_OSPI_DATA_8_LINES;
//          sCommand.NbData      = BUFFERSIZE;
sCommand.Address     = address+tmp_flag*4-4;

sCommand.NbData      = 4;

if (HAL_OSPI_Command(&hospi1, &sCommand, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
{
Error_Handler();
}

if (HAL_OSPI_Transmit_DMA(&hospi1, bTxBuffer) != HAL_OK)
{
Error_Handler();
}</div></article>

       读命令:
<article data-content="[{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;XQc5-1742570048044&quot;,&quot;name&quot;:&quot;code&quot;,&quot;data&quot;:{&quot;wrap&quot;:false,&quot;tokensPerLine&quot;:[],&quot;language&quot;:&quot;&quot;,&quot;theme&quot;:&quot;default&quot;},&quot;nodes&quot;:[{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;JtFF-1742570048043&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;oISa-1742570048042&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot; /* Configure automatic polling mode to wait for end of program ---- */  \r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;BIFv-1742570049492&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;MY2h-1742570049491&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;OSPI_AutoPollingMemReady(&hospi1);\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;mPlw-1742570049494&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;eG0r-1742570049493&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;1VMN-1742570049496&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;us7T-1742570049495&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;/* Reading Sequence ----------------------------------------------- */\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;6ow3-1742570049498&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;HZJ8-1742570049497&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;sCommand.Instruction = OCTAL_IO_READ_CMD;\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;Rc1h-1742570049500&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;BlRI-1742570049499&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;sCommand.DummyCycles = DUMMY_CLOCK_CYCLES_READ;&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;Y08U-1742570610714&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;F4G3-1742570610713&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;sCommand.Address     = address;\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;TIAP-1742570610965&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;VwRt-1742570610964&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;sCommand.NbData      = tmp_flag*4;\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;Nf3B-1742570049502&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;NwKC-1742570049501&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;O1oC-1742570049504&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;GCl0-1742570049503&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;if (HAL_OSPI_Command(&hospi1, &sCommand, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;kjOL-1742570049506&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;WPIe-1742570049505&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;{\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;X4bs-1742570049508&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;tsz6-1742570049507&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;Error_Handler();\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;5HxP-1742570049510&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;wAyM-1742570049509&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;}\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;Oc2a-1742570049512&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;OgF0-1742570049511&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;wWLd-1742570049514&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;VPpJ-1742570049513&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;if (HAL_OSPI_Receive_DMA(&hospi1, aRxBuffer) != HAL_OK)\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;C16n-1742570049516&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;mUBJ-1742570049515&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;{\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;3EAg-1742570049518&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;DygL-1742570049517&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;Error_Handler();\r&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;CtH1-1742570049520&quot;,&quot;name&quot;:&quot;code-line&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;ktTo-1742570049519&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;}&quot;,&quot;marks&quot;:[]}]}]}],&quot;state&quot;:{}}]"><div yne-bulb-block="code" data-theme="default" style="white-space-collapse: preserve;" data-language=""> /* Configure automatic polling mode to wait for end of program ---- */  
OSPI_AutoPollingMemReady(&hospi1);

/* Reading Sequence ----------------------------------------------- */
sCommand.Instruction = OCTAL_IO_READ_CMD;
sCommand.DummyCycles = DUMMY_CLOCK_CYCLES_READ;
sCommand.Address     = address;
sCommand.NbData      = tmp_flag*4;

if (HAL_OSPI_Command(&hospi1, &sCommand, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
{
Error_Handler();
}

if (HAL_OSPI_Receive_DMA(&hospi1, aRxBuffer) != HAL_OK)
{
Error_Handler();
}</div></article>

       为了方便测试,我们引入了串口,每一次我们发送0x01后会执行一次“擦除——写——读”的操作,然后将读到的数据发送出来,每一次写的位置都是后面的位置(通过tmp_flag计数进行递增),每一次读出来的数量+4个,为什么一定要进行擦除?这是因为Flash是上电不丢失的存储介质,如果对应的位置不是1就不能进行写入的,更准确的说是写入的数据与存储的数据不一致,只有在擦除后为0xff的时候,写入的数据才会正确的存储起来,擦除的时机我们可以相对把握一下。
       接下来看一下串口接收的效果:

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:硬件工程师
简介:有着多年硬件开发经验的专业人员,专注于医疗电子领域,热衷于对新鲜事物的探索,喜欢DIY!

405

主题

2134

帖子

10

粉丝