使用官方例程发现FLEXSPI_Init会引起硬件故障,查阅相关帖子发现主要有两个可能:
1、外部闪存配置差异
- 修改 LUT(查找表)命令:示例中擦除扇区命令为 0xD7,写状态寄存器命令为 0x01,需分别改为 闪存对应的 0x20 和 0x31;
- 调整 QE 位配置:将头文件中 FLASH_QUAD_ENABLE 的定义从 0x40 修改为 0x02,适配目标闪存的 QE 位设置;
- 检查硬件引脚:确认 DQS 引脚(GPIO_SD_B1_05)处于浮动状态,避免影响 flexSPI 频率。若无法保证浮动,可将 flexSPI 频率降至 60MHz,并设置 FlexSPIn_MCR0 [RXCLKSRC] = 0x0,使用控制器内部环回的虚拟读取选通。
完成上述修改后, 配置从 RAM 运行程序(确保代码加载到 RAM 中测试,排除 Flash 启动相关问题),发现 SDK 示例程序能正常实现外部闪存的擦除、读写操作,但硬故障依然存在。
2. 中断干扰:PIT 模块
既然硬件配置和基础代码逻辑没问题,发现项目中启用了 PIT(周期中断定时器)中断,用于实现定时功能。当注释掉 PIT 初始化代码后,FLEXSPI_Init 硬故障消失,外部闪存访问恢复正常。
进一步验证发现:在进行 flexSPI 操作(尤其是初始化阶段的 SoftwareReset)时,若 PIT 中断触发,会打断 flexSPI 的正常时序流程,导致控制器进入硬故障状态。这是因为 flexSPI 操作对时序稳定性要求极高,任何外部中断的干扰都可能破坏其初始化过程。
解决方法:
针对 PIT 中断干扰问题,最直接有效的方案是在执行 flexSPI 操作前后进行中断控制:
- 在调用 FLEXSPI_Init 或发起闪存读写、擦除等操作前,通过中断屏蔽寄存器禁用 PIT 中断;
- 待 flexSPI 操作完全完成后,再重新使能 PIT 中断,恢复定时功能。