STM32之HAL开发——QSPI协议介绍

QSPI协议

OSPI是Oueued SPl的简写,是Motorola公司推出的 SPI接口的扩展,比SPI应用更加广泛。在 SPI协议的基础上,Motorola公司对其功能进行了增强,增加了队列传输机制,推出了队列串行外围接口协议(即 OSPI协议)。OSPI是一种专用的通信接口连接单、双或四(数据线)SPIFlash存储介质。STM32上将种接口称为OUADSPI接口。

QSPI——FLASH硬件接线图

QSPI(四线传输模式)协议层与SPI对比

QSPI在发送指令时,只能用一根数据线进行数据的传输,在传输地址和数据时则可以用4根数据线进行传输。

QSPI三种操作模式

  1. 间接模式:使用 QSPI 寄存器执行全部操作。此模式下,所有数据传输通过数据寄存器和FIFO(32位)。如果进行擦除或编程操作,则必须使用该模式。
  2. 状态轮询模式:周期性读取外部 FLASH 状态寄存器,而且标志位置 1 时会产生中断(如擦除或烧写完成,会产生中断)。
  3. 内存映射模式:外部 FLASH 映射到微控制器地址空间,从而系统将其视作内部存储器。可以用于阅读操作、可以从外部QSPI FLASH执行代码。在该模式下只支持读取不支持修改,该模式最大支持256MB

SIOO(Send instruction only-once)

某些厂商会称为continuous-read mode、burst mode、performance-enhanced mode.该特性支三种操作模式。当SIOO使能后,读操作只会发送一次指令,后面只会发送地址。指令只会在开始读操作时发送一次。如果发生了一个新的读操作,只会发送地址。该特性可以有效减少QSPI flash访问开销并促进性能。
 

### STM32F446 QSPI 接口用于屏幕驱动 #### 初始化QSPI接口配置 为了使STM32F446通过QSPI接口成功连接并驱动屏幕,需按照特定流程完成初始化设置。首先应开启QSPI外设及其关联时钟资源,并配置GPIO引脚为AF(Alternate Function)模式以便于信号传输[^2]。 ```c // 开启QSPI时钟以及相关外设时钟 __HAL_RCC_QSPI_CLK_ENABLE(); __HAL_RCC_GPIOE_CLK_ENABLE(); // 假设QSPI引脚位于GPIOE端口上 // 配置QSPI GPIO引脚 static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /*Configure GPIO pins : PE2 PE6 PE7 PE8 ... */ GPIO_InitStruct.Pin = GPIO_PIN_2 | GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_8; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // 设置为复用推挽输出模式 GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF9_QUADSPI; // AF9对应QSPI功能 HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); } ``` #### 参数设定与初始化结构体填充 接着定义`QUADSPI_HandleTypeDef`类型的句柄变量来存储有关硬件的信息,并利用该句柄调用`HAL_QSPI_Init()`函数执行具体的初始化操作。在此之前,还需根据实际需求调整各项参数,如频率、数据宽度等。 ```c QUADSPI_HandleTypeDef hqspi; void QSPI_Init(void){ hqspi.Instance = QUADSPI; hqspi.Init.ClockPrescaler = 1; hqspi.Init.FifoThreshold = 4; hqspi.Init.SampleShifting = QSPI_SAMPLE_SHIFTING_HALFCYCLE; hqspi.Init.FlashSize = 24; hqspi.Init.ChipSelectHighTime = QSPI_CS_HIGH_TIME_5_CYCLE; hqspi.Init.DualFlash = QSPI_DUALFLASH_DISABLE; if (HAL_QSPI_Init(&hqspi) != HAL_OK){ Error_Handler(); } } ``` #### 发送命令至外部设备 当QSPI接口准备就绪之后,可以构建相应的命令序列向外界显示屏发送控制指令或写入图像数据。这通常涉及到创建一个包含不同阶段信息的对象——例如指令码、地址长度、等待周期数目的描述符——并通过API传递给底层驱动程序处理。 ```c #define CMD_WRITE_REG 0xXX // 替换成具体屏控寄存器写入命令 uint8_t regValue[] = {/* 寄存器值 */}; QSPI_CommandTypeDef sCommand; sCommand.InstructionMode = QSPI_INSTRUCTION_1_LINE; sCommand.AddressMode = QSPI_ADDRESS_NONE; sCommand.DataMode = QSPI_DATA_1_LINE; sCommand.NbData = sizeof(regValue); sCommand.SIOOMode = QSPI_SIOO_INST_EVERY_CMD; sCommand.Instruction = CMD_WRITE_REG; sCommand.DummyCycles = 0; if(HAL_QSPI_Send(&hqspi,&sCommand,regValue,HAL_MAX_DELAY)!= HAL_OK){ Error_Handler(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值