STM32F429IGT6项目准备3——使用STM32CubeMX初始化SDIO(DMA传输)

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

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菠萝地亚狂想曲

送我一瓶农夫山泉?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值