Melvin_Klein 发表于 2022-12-12 09:58:06

关于STM32 SD初始化的一些想法

这个周末遇到了STM32CubeMX配置STM32F429的SD卡,发生了一些事情,记录一下
1.STM32CubeMX V6.7.0在使用过程中会出现窗口重叠的问题.
..使用的是联想拯救者R7000P,开始猜测是显卡问题,切换了核显 独显,自动选择三种状态,软件窗口叠影BUG没解决,排除显卡问题
..软件BUG?降低版本, 从V67.0一路降低到V6.5.0,使用过程中就没有遇到窗口显示叠影的BUG.现在看是软件的BUG,(有时候版本最新的不一定好用,趟雷是真的累)
2.STM32CubeMX配置SD 生成工程后,编译正常进入到MX_SDIO_SD_Init()的Error_Handler()中,检查代码
..在MX_SDIO_SD_Init中的hsd.Init.BusWide = SDIO_BUS_WIDE_1B;此处要求开始时默认是BUS_WIDE_1B,才不会在后面的判断中进入Error_Handler();
..在CUbeMXV6.7.0中配置的时候如果选择SD 4 bits Wide BUS

那么MX_SDIO_SD_Init中默认就会将hsd.Init.BusWide初始化为 = SDIO_BUS_WIDE_4B;需要修改为1B,原因如下 具体的要去看

具体情况请看我和硬汉哥的相关帖子
https://www.armbbs.cn/forum.php?mod=viewthread&tid=116984&page=1#pid270436
注意在低版本的CubeMX,比如V6.5.0,这个位置就不需要修改,初始化就是1B;
****************
还注意到这个hsd.Init.ClockDiv,有要求在传输的时候不超过25MHz,具体的去看SD的技术文档,硬汉哥在上面的帖子里有贴图
3.上面哪些说的没问题之后,可是还是会进去Error_Handler();
为了确信是不是进去了,我在这个函数里面增加了一段点灯代码,可以知道确实是进去了.
void Error_Handler(void)
{
/* USER CODE BEGIN Error_Handler_Debug */
/* User can add his own implementation to report the HAL error return state */
__disable_irq();
HAL_GPIO_WritePin(LED_YG_GPIO_Port,LED_YG_Pin,GPIO_PIN_RESET);
while (1)
{
}
/* USER CODE END Error_Handler_Debug */
}
最后检查代码么有发现问题,检查硬件设置,我的板子上 在D0:D3 和CMD上没有设计上拉电阻,在IO口的设置中增加PullUP,同时移除SDIO_CK的上拉,测试代码可以跑过,串口输出正常.

总结:以上都是一些细节,对新手来说,确实有必要先看一遍文档,不要求完全理解做到在遇到问题的时候知道在问题的大致原因就行,因为对新手的我来说真的是,一步一跤


eric2013 发表于 2022-12-12 10:14:55

谢谢楼主分享。
页: [1]
查看完整版本: 关于STM32 SD初始化的一些想法