S32K3 usdhc外设初始化时遇到的坑
·
要点总结
初始化的时候,必须将uSDHC_Ip_Init()函数第一个参数指向的变量定义为全局变量。
代码精讲
Sd_Emmc_Ip_StatusType SdStatus;
Usdhc_Ip_StateType UsdhcIpState;
Usdhc_Ip_StatusType retValue = uSDHC_Ip_Init(&UsdhcIpState, &UsdhcControllerCfg_0, DEV_MMC);
if (retValue != STATUS_USDHC_IP_SUCCESS)
{
return STA_NOINIT;
}
SdStatus = Sd_Emmc_Ip_Init(&EmmcCfg_0);
if (SdStatus != SD_IP_STATUS_SUCCESS)
{
return STA_NOINIT;
}
Sd_Emmc_Ip_MmcSwitchPartitionAccess(&EmmcCfg_0, SD_IP_MMC_PARTITION_DEFAULT);
上面代码中的变量Usdhc_Ip_StateType UsdhcIpState;必须是全局变量才行!或者是main函数里的变量,因为main函数不可能退出去,是吧!
也就是说,上面的代码放在main()里面是没问题的,放在其他函数里就出问题,除非将这个变量定义成全局的。
原因
如果UsdhcIpState是局部变量,就会引起问题,原因是:
初始化函数所在的源文件里有一个全局的指针变量Usdhc_Ip_pxState[USDHC_INSTANCE_COUNT],这是一个只有一个元素的指针数组,而这个指针就指向我们初始化函数的第一个参数所指向的变量。
那么问题来了,局部变量在函数退出的时候就被清理了,你让它指向了一片未知的区域,那么以后用到这个指针的时候,不进hardfault就奇怪了,是不是?
更多推荐
所有评论(0)