STM32CubeMX ⽣成SD卡的读写程序,采⽤Fatfs的⽅式STM32CubeMX 版本:4.23.0
库版本:STM32Cube_FW_F4_V1.18.0
CPU:微雪核⼼板
⽹上有很多相关的资料,但都是15年16年的,资料上都是很⼀致的说,只要配置好CubeMX,直接⽣成的代码就可以使⽤,但是,到了我这⾥,却怎么试都不灵,尝试了好多次,都以失败告终,编译都能通过,但是,最终执⾏的时候,调⽤
f_open函数,总是返回1,即FR_DISK_ERR。曾⼏度以为是SD卡坏了,好在我在开发板的光盘资料中到了⼀个Fatfs的⼯程,测试发现,竟然可以正常的读写SD卡,兴奋⾄极,⾄少可以确认了SD卡是好的。经过⽐对,我发现
STM32Cube_FW_F4_V1.18.0库中的部分函数的参数和⼀些结构体的定义已然发⽣了变化,⽽且我发现了⼀个很重⼤的问题,就是新库⽣成的程序中竟然没有调⽤BSP_SD_Init()函数,这个问题就严重了,没有初始化,⾃然就是⽆法读取SD卡的,本以为发现了新⼤陆,对应着Fatfs的⼯程,将初始化函数放到了对应的位置,可是,仍然⽆法通过测试。⽆奈,还有某些地⽅有差异,怎奈时间有限,我已然顾不得去盘根问底了,只能采⽤最粗鲁的⽅式来实现:移植Fatfs的SD卡读写代码到新的⼯程中,
需要更新的⽂件:
syscall.c
diskio.c
diskio.h
ff.c
ff.h
ff_gen_drv.c
ff_gen_drv.h
ffconf_template.h
integer.h
sd_diskio.c
sd_diskio.h
bsp_driver_sd.c
bsp_driver_sd.h
fatfs.c
fatfs.h
stm32f4xx_hal_sd.c
stm32f4xx_hal_sd.h
stm32f4xx_ll_sdmmc.c
stm32f4xx_ll_sdmmc.h
更新之后,增加上代码
uint8_t res;
FATFS fs; // Work area (file system object) for logical drive
FIL fil; // file objects
void stm32f4x_cd_Fatfs()
{
uint32_t byteswritten;
uint32_t bytesread;
uint8_t wtext[] = "This is STM32 working with FatFs";
uint8_t rtext[100];
char filename[] = "";
printf("\r\n ****** FatFs Example ******\r\n\r\n");
res = f_mount(&fs, "", 0);
if(res)
{
printf(" mount error : %d \r\n",res);
Error_Handler();
}stm32怎么使用printf
else
printf(" mount sucess \r\n");
res = f_open(&fil, filename, FA_CREATE_ALWAYS | FA_WRITE);
if(res)
printf(" open file error : %d\r\n",res);
else
printf(" open file sucess \r\n");
res = f_write(&fil, wtext, sizeof(wtext), (void *)&byteswritten); if(res)
printf(" write file error : %d\r\n",res);
else
{
printf(" write file sucess \r\n");
printf(" Write Data : %s\r\n",wtext);
}
res = f_close(&fil);
if(res)
printf(" close error : %d\r\n",res);
else
printf(" close sucess \r\n");
res = f_open(&fil, filename, FA_READ);
if(res)
printf(" open file error : %d\r\n",res);
else
printf(" open file sucess \r\n");
res = f_read(&fil, rtext, sizeof(rtext), (UINT*)&bytesread);
if(res)
printf(" read error %d\r\n",res);
else
{
printf(" read sucess \r\n");
printf(" Write Data : %s\r\n",rtext);
}
res = f_close(&fil);
if(res)
printf(" close error %d\r\n",res);
else
printf(" close sucess \r\n");
if(bytesread == byteswritten)
{
printf(" FatFs is working well\r\n");
}
}
搞定,SD卡的读写可以正常了
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论