stm32芯片使用STM32cube配置TFAST模式SPI读写SD卡

一、cube的相关配置

  1. 打开cube软件,选择stm32f103c8tx芯片,点击Start....进入配置页面
    在这里插入图片描述
  • 首先展示一下接下来将要配置的硬件本次配置将要使用的引脚
    在这里插入图片描述
  1. 点击FATFS勾选User-defined
    在这里插入图片描述
  2. 点击SYS,DeBug改为Serial Wire
    在这里插入图片描述
  3. 配置PA4引脚
  • 在芯片上将PA4引脚选为Output
    在这里插入图片描述
  • 在点击GPIO,将User Label填入SD_CS,其他默认不变
    在这里插入图片描述
  1. 点击SPI1,mode选项改为Full....
    在这里插入图片描述
    6.配置USART1
    在这里插入图片描述
  2. 配置NVIC
    在这里插入图片描述
  3. 配置晶振
    在这里插入图片描述
  4. 配置工程文件
    在这里插入图片描述

注意:一定要改堆栈的大小,否则会死机

  1. 生成代码
    在这里插入图片描述
    到这儿基本工程就配置完毕

二、代码移植

1. 下载源代码

百度网盘链接:https://pan.baidu.com/s/1prOba0fkgXpcpn19wqpx0g
提取码:9467

2.移植文件

  1. 将源文件中的两个相关文件复制
    在这里插入图片描述
  2. 粘贴到自己建的文件中
    在这里插入图片描述
  3. 将刚刚复制的文件添加到工程中
    在这里插入图片描述

3.代码修改

找到diskio.c文件
在这里插入图片描述
添加代码:

{
  /* USER CODE BEGIN INIT */
  uint8_t res;
	res = SD_init();//SD_Initialize() 
		 	if(res)//STM32 SPI的bug,在sd卡操作失败的时候如果不执行下面的语句,可能导致SPI读写异常
			{
				SPI_setspeed(SPI_BAUDRATEPRESCALER_256);
				spi_readwrite(0xff);//提供额外的8个时钟
				SPI_setspeed(SPI_BAUDRATEPRESCALER_2);
			}
	if(res)return  STA_NOINIT;
	else return RES_OK; //初始化成功
  /* USER CODE END INIT */
}
  • 添加头文件
    代码:
#include "diskio.h"		/* Declarations of disk functions */
#include "SDdriver.h"

在这里插入图片描述

  • 修改USER_status函数
switch (pdrv)
	{
		case 0 :
			return RES_OK;
		case 1 :
			return RES_OK;
		case 2 :
			return RES_OK;
		default:
			return STA_NOINIT;
	}

在这里插入图片描述

  • USER_read函数的修改
    在这里插入图片描述
uint8_t res;
	if( !count )
	{    
		return RES_PARERR;  /* count不能等于0,否则返回参数错误 */
	}
	switch (pdrv)
	{
		case 0:
		    res=SD_ReadDisk(buff,sector,count);	 
				if(res == 0){
					return RES_OK;
				}else{
					return RES_ERROR;
				}                                               
		default:
			return RES_ERROR;
	}
  • USE_WRITE函数的修改
    在这里插入图片描述
uint8_t  res;
	if( !count )
	{    
		return RES_PARERR;  /* count不能等于0,否则返回参数错误 */
	}
	switch (pdrv)
	{
		case 0:
		    res=SD_WriteDisk((uint8_t *)buff,sector,count);
				if(res == 0){
					return RES_OK;
				}else{
					return RES_ERROR;
				}                                                
		default:return RES_ERROR;
	}
  • USER_ioctl函数的修改
    在这里插入图片描述
DRESULT res;
	 switch(cmd)
	    {
		    case CTRL_SYNC:
						SD_CS(1);
						do{
							HAL_Delay(20);
						}while(spi_readwrite(0xFF)!=0xFF);
						res=RES_OK;
						SD_CS(0);
		        break;	 
		    case GET_SECTOR_SIZE:
		        *(WORD*)buff = 512;
		        res = RES_OK;
		        break;	 
		    case GET_BLOCK_SIZE:
		        *(WORD*)buff = 8;
		        res = RES_OK;
		        break;	 
		    case GET_SECTOR_COUNT:
		        *(DWORD*)buff = SD_GetSectorCount();
		        res = RES_OK;
		        break;
		    default:
		        res = RES_PARERR;
		        break;
	    }
		return res;

建议直接对照源工程文件看

三、硬件连接

SD卡

stm32f103c8t6SD
PA4CS
PA5SCK
PA6MISO
PA7MOSI

串口

stm32f103c8t6串口
5v5v
TDXPA10
RDXPA9

四、结果呈现

先把SD卡初始化
再打开串口助手
结果如图
在这里插入图片描述
文件写入成功后打开SD卡能看到在SD卡中有一个TXT文件
在这里插入图片描述

五、总结

整个实验本来是一个比较简单的实验,但是由于stm32的芯片性能太弱(简称弱鸡)导致这个实验很难做成功,成功的概率简直低的离谱,特别注意一下本实验stm32的电源需要用5V,很关键,3.3V电压带不动SD卡。

六、资料参考

https://blog.csdn.net/qq_39758638/article/details/103573843
完整工程代码
链接:https://pan.baidu.com/s/10Jmhxwd2rAG46Y7pBEfDxg
提取码:9467

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

浩923

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值