CubeMX 生成STM32_SPI_SD_FATFS

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

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

CubeMX 生成STM32_SPI_SD_FATFS_第1张图片CubeMX 生成STM32_SPI_SD_FATFS_第2张图片

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

CubeMX 生成STM32_SPI_SD_FATFS_第3张图片

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

CubeMX 生成STM32_SPI_SD_FATFS_第4张图片

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

CubeMX 生成STM32_SPI_SD_FATFS_第5张图片 CubeMX 生成STM32_SPI_SD_FATFS_第6张图片

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

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

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

CubeMX 生成STM32_SPI_SD_FATFS_第7张图片

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!! \r\n";
uint8_t ReadBuffer[512];
char success[]="数据写入 Ok!\r\n";
char error[]="error!\r\n";
char mount[]="文件系统挂载成功! \r\n";
char open[]="Î文件已打开! \r\n";


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); //一定要记得关闭文件
              }
           }
    }

    
}

10,补充关于更多的FATFS文件系统的应用可参考:http://elm-chan.org/fsw/ff/doc/open.html

里面介绍的很详细.

 

11.程序(我用的时STM32F103RET)

链接:https://pan.baidu.com/s/1qmp4w5QZUJZqh611x45_dA 
提取码:bbb5 
 

 

 

 

 

 

 

你可能感兴趣的:(STM32笔记)