[STM32U5] 在 STM32U5G9 上使用 HSPI 控制 QSPI Flash

[复制链接]
47|10
梧桐uuu 发表于 2026-9-19 10:29 | 显示全部楼层 |阅读模式
使用 STM32U5G9通过 HSPI 外设控制一颗 QSPI Flash MX25L51245GXDI。
针对该硬件配置,我不知道应当选用哪一套官方 HAL 库以及对应的接口函数。虽然外设硬件名称叫做 HSPI,但外接的 Flash 却是 QSPI 器件,到底使用哪一套驱动。

能否帮忙明确说明应当使用以下哪一组 API?

- HAL_SPI_…(标准 SPI 函数)
- HAL_XSPI_…(扩展 SPI 函数)
- HAL_QSPI_…(四线 SPI 函数)
- HAL_OSPI_…(八线 SPI 函数)

固件包里面并没有提供 stm32u5xx_hal_hspi.c 文件;如果针对 HSPI1 实例调用 HAL_QSPI_… 或者 HAL_SPI_… 系列函数,会出现类型强制转换报错以及编译失败。



公羊子丹 发表于 2026-9-19 15:40 | 显示全部楼层
U5 上这个外设其实叫 HSPI(High-speed SPI),它和 OSPI/XSPI 是同一套 IP 的不同配置。U5G9 的 HAL 里没有单独 stm32u5xx_hal_hspi.c,**HSPI 就是用 HAL_XSPI(在 U5 上叫 HAL_OSPI/HAL_XSPI)驱动的**。所以答案是用 HAL_XSPI_ 那一套,HSPI 实例当成 XSPI 来用。
周半梅 发表于 2026-9-19 15:41 | 显示全部楼层
我赌你类型报错的根源在这:HSPI_HandleTypeDef 和 XSPI_HandleTypeDef 是不同类型,U5 的 HAL 里 HSPI 的句柄定义可能和 XSPI 不兼容。正确做法是用 XSPI 的 Handle 和 API,HSPI1 实例在 CubeMX 里选 XSPI 模式(1/2/4/8 线),由 CubeMX 生成 stm32u5xx_hal_xspi.c 的调用。别自己去强转类型。
帛灿灿 发表于 2026-9-19 15:42 | 显示全部楼层
补充:MX25L51245GXDI 是 512Mb 的 Octal Flash(8 线),用 HSPI 的 8 线模式(GET 配置成 8 线)正好。选 API 的原则是看**数据线数**:4 线以下可选 SPI/QSPI,8 线必须用 XSPI/OSPI。你这颗 8 线 Flash 配 HSPI,就该走 XSPI HAL + 8 线模式。
童雨竹 发表于 2026-9-19 15:43 | 显示全部楼层
想问下你在 CubeMX 里把 HSPI1 配成了什么模式?U5 的 HSPI 在 CubeMX 里可能归在 XSPI 外设下,选 Single/Dual/Quad/Octal。如果你在 CubeMX 里能看到 XSPI 配置界面并选 Octal,那生成的就该是 XSPI 代码。反过来,如果 CubeMX 当成 SPI 生成(HAL_SPI),那类型就不对了——回到 CubeMX 换成 XSPI。
万图 发表于 2026-9-19 15:43 | 显示全部楼层
从 U5 手册看,HSPI 是支持最高 8 线的'全能'SPI 控制器,所以它的驱动 API 就是 XSPI 系列(HAL_XSPI_Command / HAL_XSPI_Transmit 等)。你找不到 hspi.c 是因为 ST 把它统一在 xspi.c 里了。以后遇到 U5/H5 的'HSPI',一律按 XSPI 找驱动。
Wordsworth 发表于 2026-9-19 15:44 | 显示全部楼层
测试建议:先用 STM32CubeU5 里**自带的 HSPI/XSPI 例程**(通常有 OSPI Flash 读写例程)跑通,看你板上的 MX25L51245GXDI 能不能读到 ID(0xC2 0x20 0x1A 之类)。官方例程跑通了,再照它的 API 风格写你的代码,比从零猜库函数快得多。
Bblythe 发表于 2026-9-19 15:45 | 显示全部楼层
补充个实操坑:U5 的 XSPI 和老的 QUADSPI 是两套不同的 IP,F4/F7 的 QSPI 代码不能直接搬到 U5。你如果参考的是 F7 的 QSPI 例程,API 名字对不上是必然的。务必参考 U5/H5 系列的 XSPI/OSPI 例程,那才是同代 IP。
Pulitzer 发表于 2026-9-19 15:46 | 显示全部楼层
问一下你 QSPI Flash 的 CS、CLK、IO0~IO7 接线和 HSPI 的引脚映射对吗?U5 的 HSPI 引脚可能和标准 SPI 复用不同。CubeMX 里选好 XSPI + Octal 模式后,引脚会自动分配,别手动按 QUAD SPI 的旧映射接。这个配错了,代码再对也读不到 Flash。
Uriah 发表于 2026-9-19 15:46 | 显示全部楼层
从'类型强制转换报错'看,估计你在代码里写了类似把 HSPI_HandleTypeDef* 强转成 XSPI_HandleTypeDef*。别这么做,直接用 XSPI 的类型定义句柄,CubeMX 生成时会处理好实例关联。HAL 的类型是强类型的,强转能编过也是隐患,运行时行为未定义。
Clyde011 发表于 2026-9-19 15:47 | 显示全部楼层
结论:U5G9 没有独立的 HSPI HAL,它的 HSPI 就是 XSPI(OSPI)IP,用 HAL_XSPI_ 系列函数,句柄用 XSPI_HandleTypeDef,HSPI1 实例在 CubeMX 里配成 XSPI + 对应线数模式。建议从 CubeU5 的 XSPI/OSPI 例程起步,别搬 F4/F7 的 QSPI 代码。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

205

主题

209

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
0