一、cube的相关配置
- 打开cube软件,选择
stm32f103c8tx
芯片,点击Start....
进入配置页面
- 首先展示一下接下来将要配置的硬件本次配置将要使用的引脚
- 点击
FATFS
勾选User-defined
- 点击
SYS
,DeBug改为Serial Wire
- 配置PA4引脚
- 在芯片上将
PA4
引脚选为Output
- 在点击
GPIO
,将User Label填入SD_CS
,其他默认不变
- 点击
SPI1
,mode选项改为Full....
6.配置USART1
- 配置NVIC
- 配置晶振
- 配置工程文件
注意:一定要改堆栈的大小,否则会死机
- 生成代码
到这儿基本工程就配置完毕
二、代码移植
1. 下载源代码
百度网盘链接:https://pan.baidu.com/s/1prOba0fkgXpcpn19wqpx0g
提取码:9467
2.移植文件
- 将源文件中的两个相关文件复制
- 粘贴到自己建的文件中
- 将刚刚复制的文件添加到工程中
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卡
stm32f103c8t6 | SD |
---|---|
PA4 | CS |
PA5 | SCK |
PA6 | MISO |
PA7 | MOSI |
串口
stm32f103c8t6 | 串口 |
---|---|
5v | 5v |
TDX | PA10 |
RDX | PA9 |
四、结果呈现
先把SD卡初始化
再打开串口助手
结果如图
文件写入成功后打开SD卡能看到在SD卡中有一个TXT文件
五、总结
整个实验本来是一个比较简单的实验,但是由于stm32的芯片性能太弱(简称弱鸡)导致这个实验很难做成功,成功的概率简直低的离谱,特别注意一下本实验stm32的电源需要用5V,很关键,3.3V电压带不动SD卡。
六、资料参考
https://blog.youkuaiyun.com/qq_39758638/article/details/103573843
完整工程代码
链接:https://pan.baidu.com/s/10Jmhxwd2rAG46Y7pBEfDxg
提取码:9467