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就奇怪了,是不是?

更多推荐