????????使用官方例程發現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 中斷,恢復定時功能。