cube sdio fatfs 初始化sd卡_【STM32】SD卡读写(六)-CubeMX 生成STM32_SPI_SD_FATFS

1.打开CubeMX新建文件,选好单片机芯片

2.设置系统频率:见下图

7ce8568fda85c9d0135e0143a7d80c5d.png
4d2407ce13f594c4b08e9f84457220ff.png

3.设置SPI3,选定设置为主机模式,其他默认就行。

3d276e512ebe1e118fdaab5ac65a1406.png

4.选定FATFS,勾选User-defined。其他默认设置就行,(注意分区最大、最小值都是512)。

ff6fd14510a801ddcea47ba0967918cc.png

5.以上配置基本完成,现在生成工程的最后配置:

6c93e5df236be0e5282c6fc154c873cc.png
0752b2cd0bd57457f2cd863936d6708c.png

完成以上设置直接点击“GENERATE COOD”生成工程。

6.首先设置SD卡驱动,在spi.c文件中添加两个函数:(根据需要自己命名函数名即可)

注意:记得载spi.h文件中声明函数。spi配置和引脚初始化,已自动完成不必再次配置。

c18075b50e798ffdc9ed84646daf031a.png

7.新建一个SD_Driver.c 和SD_Driver.h文件(实现对SD卡的驱动)。

其中主要包括:

void SD_CS(uint8_t p)   //SPI3选用引脚控制 uint8_t SD_GETCID(uint8_t *cid_data)  //读取SD卡的CID信息 uint8_t SD_GETCSD(uint8_t *cid_data)  //读取SD卡的CID信息 uint32_t SD_GetSectorCount(void) //读取SD卡的扇区数 uint8_t SD_init(void)   //SD卡初始化函数 uint8_t SD_ReadDisk(uint8_t*buf,uint32_t sector,uint8_t cnt) //读取SD卡的数据 uint8_t SD_ReceiveData(uint8_t *data, uint16_t len) //读取SD卡中指定长度的数据 uint8_t SD_SendBlock(uint8_t*buf,uint8_t cmd) //向SD卡中写入一个512字节的数据 int SD_sendcmd(uint8_t cmd,uint32_t arg,uint8_t crc) //通过SPI向SD卡发送命令 uint8_t SD_WriteDisk(uint8_t*buf,uint32_t sector,uint8_t cnt)  //向SD卡中写入数据

8.在"user_diskio.c"文件中填充如下五个函数,实现文件系统与SD的关联.

USER_initialize(); USER_ioctl(); USER_read(); USER_status(); USER_write();

如果有需要可在 fatfs.c 中填充get_fattime();函数设置日期

DWORD get_fattime (void) {     return ((2010UL-1980) << 25) /* Year = 2010 */     | (11UL << 21) /* Month = 11 */     | (2UL << 16) /* Day = 2 */     | (15U << 11) /* Hour = 15 */     | (0U << 5) /* Min = 0 */     | (0U >> 1) /* Sec = 0 */ ; }

9.这样基本上就配置完了!下面就是在main函数里实现SD卡的读写了;

//定义一些变量 FATFS fs; FIL file; uint8_t res=0; UINT Br,Bw; char path[4]="0:"; uint8_t testBuffer[]="SD¿¨Ð´ÈëÖÐÓ¢ÎIJâÊÔ,SD card Chinese and English reading and writing test!! "; uint8_t ReadBuffer[512]; char success[]="数据写入 Ok!"; char error[]="error!"; char mount[]="文件系统挂载成功! "; char open[]="Î文件已打开! "; int main(){     /***各种初始化就不再多写了***/     res=f_mount(&fs,"0:",0); //挂载文件系统     if(res!=FR_OK){         HAL_UART_Transmit(&huart2,(uint8_t *) &error,sizeof(error),100);     }else{         HAL_UART_Transmit(&huart2,(uint8_t *) &mount,sizeof(mount),100);     }     while(1)    {         if(f_open(&file,"hello.txt",FA_OPEN_ALWAYS|FA_WRITE)==FR_OK){                                    HAL_UART_Transmit(&huart2,(uint8_t *) &open,sizeof(open),100);             f_lseek(&file, f_size(&file)); //接着写不会擦除之前的数据                                                                                      if(f_write(&file,testBuffer,sizeof(testBuffer),&Bw)==FR_OK){                  HAL_UART_Transmit(&huart2,(uint8_t *) &success,sizeof(success),100);                 f_close(&file); //一定要记得关闭文件             }        }    } }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值