文章目录
1 前言
第三次记录一下配置SD卡DMA方式扇区读写的过程。测试代码基于上一个工程,测试过程全部在RTOS启动之前,所以跑裸机的童鞋们也可以参考。
注意:本文以前文为基础。默认配置好了FREERTOS,printf重定向
2 硬件
STM32F429IGT6在Cubemx内选中SDIO后默认的就是。卡槽没有detect引脚。
3 Cubemx配置
3.1 SDIO Parameter Setting
3.2 SDIO DMA Setting
3.3 SDIO NVIC Setting
此处,由于配置了FREERTOS,中断最高优先级被限制小于LIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY,所以均为5。裸机的话,这里应该都是0;
除此之外,有些文章说sdio中断优先级需要比DMA优先级高,实测不需要也可以正常运行。这个我也不懂,知道的兄弟麻烦在下面评论一下。
3.4 SDIO GPIO Setting
注意:全部上拉,否则卡死在以下SD卡驱动的以下位置
while(((sta_reg & (SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT)) == 0U) ||
((sta_reg & SDIO_FLAG_CMDACT) != 0U ));
3.5 SDIO Clock Configuration
一键生成代码即可
4 工程内的修改
4.1 定义收发数组
main.c里全局定义收发数组
uint8_t txbuf[512] = {0};
uint8_t rxbuf[512] = {0};
4.2 添加测试代码
系统启动前,一大堆MX_XX_init()之后,添加测试代码如下:
HAL_SD_CardInfoTypeDef my_info; //读取卡信息
HAL_SD_GetCardInfo(&hsd,&my_info);
printf( "CardType is :%d\r\n", hsd.SdCard.CardType);
printf( "CardCapacity is :%d\r\n", hsd.SdCard.BlockNbr);
printf( "CardBlockSize is :%d\r\n", hsd.SdCard.BlockSize);
for(int i = 0; i < 512; i++) txbuf[i] = i%100; //txbuf装填数据
HAL_SD_WriteBlocks_DMA(&hsd,txbuf,100,1); //txbuf写入
while(HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER);//等待传输完成
printf("HAL_SD_WriteBlocks_DMA success\r\n");
HAL_SD_ReadBlocks_DMA(&hsd,rxbuf,100,1); //rxbuf读出
while(HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER);
printf("HAL_SD_ReadBlocks_DMA success\r\n");
for(int i = 0; i < 512; i++) printf(" %d", rxbuf[i]); //打印rxbuf
4.3 测试
有问题请留言,需要源码请评论区下方留邮箱
.
.
.
——END