STM32H723使用CubeMX配置FMC为NOR FLASH后程序卡死!具体表现为程序卡死在void Error_Handler(void)函数中!
直接说问题原因:
FMC读取外设失败,H723的NOR_HandleTypeDef结构体比F407芯片多了一个CommandSet参数!从外设中读取不到对应值导致无法失败!
解决方法:在HAL_NOR_Init函数中第331行左右对CommandSet进行赋值1或2直接使用!
具体看本文最后的250407
初始化中的参数配置:
hnor3.Init.WriteOperation = FMC_WRITE_OPERATION_ENABLE;
改为:
hnor3.Init.WriteOperation = FMC_WRITE_OPERATION_DISABLE;
最开始工程的FMC配置情况如下图:
最终出现的问题是程序启动不了!
通过一步步的断点调试,先是发现程序执行到MX_FMC_Init();后程序直接报错!
通过断点最后定位到:
HAL_StatusTypeDef HAL_NOR_ReturnToReadMode(NOR_HandleTypeDef *hnor)
Primary command set not supported by the driver:驱动程序不支持主命令集
之前推测有两种原因:
第一种是FMC的配置出现问题了;第二种是H723芯片的FMC使用需要配置MPU,MPU的配置出现问题!
为了验证第一种情况:使用CubeMX从新配置了FMC引脚定义也是相同的!同时简单配置了一下串口,用于打印信息!如下图
生成工程后编译运行,发现MX_FMC_Init();可以正常执行了!
通过对比发现是
对应MX_FMC_Init函数里面的
然后自己又单独试了一下!ENABLE后又出现初始化问题!
问题出现在此!禁用写操作后问题解决,这可能意味着在初始化阶段,FMC尝试进行某种写操作,而存储器无法响应,导致总线挂起或超时。当写操作被启用时,控制器可能在初始化过程中发送了写命令,而存储器没有正确响应,导致HAL库函数在等待应答时卡死。
CubeMX重新配置FMC和MPU后,问题依旧如此!
MPU的配置如下:
对应代码中:
问题没有得到解决,说明不是MPU的配置问题!
250407
一步一步调试H7的FMC,今天发现在FMC的初始化中的CommandSet 参数的设置是导致之前FMC写操作初始化失败的原因,目前这个参数的配置只有1和2,但基于自己使用的外设作为NOR FLASH的情况下,不确定该参数应该设置成哪一个,如果不设置这两个参数,就可能要自己写一个读、写、擦除的时序操作!
定位到在FMC.C中关于HAL_NOR_Init函数有问题!
跳转后来到stm32h7xx_hal_nor.c文件233行
HAL_StatusTypeDef HAL_NOR_Init(NOR_HandleTypeDef *hnor, FMC_NORSRAM_TimingTypeDef *Timing,
FMC_NORSRAM_TimingTypeDef *ExtTiming)
可以看到有一个NOR_HandleTypeDef的结构体定义!继续跳转!
参数配置如下,只有两种模式,其他的不支持!
继续回到刚才的HAL_NOR_Init函数中去看,发现在函数里面第331行左右对CommandSet进行赋值引用!
直接去读取芯片对应地址的值获取CommandSet值,因为使用的外设不符合上述两种模式!所以读取不到特定值!
这里我们就直接进行手动赋值,直接让它等于1!
修改后:
hnor->CommandSet = (uint16_t)1;
更保险一点直接让status = HAL_OK,即可完成初始化!
最后程序可以正常初始化运行,问题解决!
为什么之前不设置写使能就可以正常初始化,就和一点有关!
关闭写使能时,不用读取CommandSet去判断使用什么时序去写入外设!返回值status正常,进而初始化正常!
刚开始不太熟悉FMC的使用,不知道如何下手,以为是配置出现问题,一直卡着,不知道如何下手,现在看来,还是要一步一步调试,具体分析原因,看看什么位置出现问题,为什么这个函数的返回值不对,具体在函数的哪一步出现问题,有时候可能调用的函数太多,调试起来比较繁琐,但是,要想找到问题还是得一点一点的调试!!!遇到问题不要慌,走一步看一步!