【STM32】SD卡讀寫(六)-CubeMX 生成STM32_SPI_SD_FATFS

2022年11月07日13:27:12 熱門 1253

1.打開CubeMX新建文件,選好單片機晶元

2.設置系統頻率:見下圖


【STM32】SD卡讀寫(六)-CubeMX 生成STM32_SPI_SD_FATFS - 天天要聞


【STM32】SD卡讀寫(六)-CubeMX 生成STM32_SPI_SD_FATFS - 天天要聞

3.設置SPI3,選定設置為主機模式,其他默認就行。


【STM32】SD卡讀寫(六)-CubeMX 生成STM32_SPI_SD_FATFS - 天天要聞

4.選定FATFS,勾選User-defined。其他默認設置就行,(注意分區最大、最小值都是512)。


【STM32】SD卡讀寫(六)-CubeMX 生成STM32_SPI_SD_FATFS - 天天要聞

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


【STM32】SD卡讀寫(六)-CubeMX 生成STM32_SPI_SD_FATFS - 天天要聞


【STM32】SD卡讀寫(六)-CubeMX 生成STM32_SPI_SD_FATFS - 天天要聞

完成以上設置直接點擊「GENERATE COOD」生成工程。

6.首先設置SD卡驅動,在spi.c文件中添加兩個函數:(根據需要自己命名函數名即可)

注意:記得載spi.h文件中聲明函數。spi配置和引腳初始化,已自動完成不必再次配置。


【STM32】SD卡讀寫(六)-CubeMX 生成STM32_SPI_SD_FATFS - 天天要聞

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); //一定要記得關閉文件 
            } 
       } 
   } 
}

熱門分類資訊推薦

曾小賢的上司Lisa榕,現實中不僅才貌雙全,還嫁給了CEO - 天天要聞

曾小賢的上司Lisa榕,現實中不僅才貌雙全,還嫁給了CEO

曾小賢的上司Lisa榕,現實中不僅才貌雙全,還嫁給了CEO雖然說《愛情公寓》這部劇在劇情上充滿了爭議,但是一定程度上,這部劇也是很多人的回憶,是伴隨了一代人的青春回憶,而且劇中的很多角色都成為了經典,他們的口頭禪也一直被拿來玩兒梗。
Lisa榕做主持多年沒紅,被陳赫拉進愛情公寓爆紅,如今怎樣了 - 天天要聞

Lisa榕做主持多年沒紅,被陳赫拉進愛情公寓爆紅,如今怎樣了

談到《愛情公寓》這部火爆一時的歡樂喜劇,大家肯定都不陌生。不知道大家是否還記得《愛情公寓》中那個把曾小賢治得服服帖帖的女上司Lisa榕,現實中的她名叫榕榕,和劇中的形象也判若兩人。1981年出生在遼寧瀋陽的榕榕,畢業於上海戲劇學院,後來成為了上海東方傳媒集團有限公司的一名主持人。