我在 MK20FX512 上遇到 FLASH_LDD 驱动程序问题。当完成擦除后执行写入操作(通过 IntFLASH 的 SetFlash 方法)时,Command Compete 中断处理程序会尝试通过调用 FTFE_PDD_DisableInterrupts 来禁用命令完成中断。
if (DeviceDataPrv->DataCounter == 0U) { /* 如果所有数据都处理成功,结束操作 */
DeviceDataPrv->CurrentOpera
tionStatus = LDD_FLASH_IDLE; /* 如果是,将运行状态改为IDLE */
FMC_PDD_InvalidateFlashCache(FMC_BASE_PTR);
PE_NOP();
PE_NOP();
PE_NOP();
FTFE_PDD_DisableInterrupts(FTFE_BASE_PTR, FTFE_PDD_COMMAND_COMPLETE_INT); /* 禁用命令完成中断 */
IntFlashLdd2_OnOperationComplete(DeviceDataPrv->UserDataPtr); /* 调用 OnOperationComplete 事件 */
返回; /* 结尾 */
}
然而,大多数时候它似乎不起作用,但偶尔操作会成功完成。当它不起作用时,应用程序会卡在不断调用的中断处理程序中。
使用调试器并观察 FTFE_FCNFG 寄存器,如果我在上面的第 8 行中断,我可以看到中断启用标志仍然设置。如果我在第 7 行中断,并单步执行汇编代码,它会正常工作并且我不会遇到问题。
由于这表明存在计时问题或竞争条件,因此我在调用 FTFE_PDD_DisableInterrupts 之前修改了代码以禁用中断 (asm("cpsid.n i");)。这接缝解决了这个问题,但是我不确定这是否是一个真正的解决方法,或者我是否只是将时间转移到足以避免这个问题。
** 处理器:MK20FX512VLQ12
** 组件:FLASH_LDD
** 版本:组件 01.099,驱动程序 01.12,CPU 数据库:3.00.000