1.硬件设计 D1指示灯用来提示系统运行状态,串口1用来打印调试信息,使用FATFS文件系统对SD卡进行相关操作 D1指示灯 USART1串口 TF卡
2.软件设计
2.1 STM32CubeMX设置
➡️ RCC设置外接HSE,时钟设置为72M
➡️ PC0设置为GPIO推挽输出模式、上拉、高速、默认输出电平为高电平
➡️ USART1选择为异步通讯方式,波特率设置为115200Bits/s,传输数据长度为8Bit,无奇偶校验,1位停止位
➡️ 激活SDIO,详细请参考SD卡例程
➡️ 打开FATFS文件系统,按下图配置,其余默认值
➡️输入工程名,选择路径(不要有中文),选择MDK-ARM V5;勾选Generated periphera initialization as a pair of ‘.c/.h’ files per IP ;点击GENERATE CODE,生成工程代码 2.2 MDK-ARM软件编程
➡️ 在main.c文件下编写FATFS读写SD卡测试代码
- int main(void){
- HAL_Init();
- SystemClock_Config();
- /* Initialize all configured peripherals */
- MX_GPIO_Init();
- MX_CRC_Init();
- MX_FSMC_Init();
- MX_SDIO_SD_Init();
- MX_USART1_UART_Init();
- MX_FATFS_Init();
- /* USER CODE BEGIN 2 */
- uint32_t byteswritten;
- uint32_t bytesread;
- uint8_t wtext[] = "This is STM32 working with FatFs";
- uint8_t rtext[100];
- char filename[] = "STM32cube.txt";
- char SensorBuff[100];
- printf("********* STM32CubeMX FatFs Example *********\r\n\r\n");
- if(f_mount(&SDFatFS,SDPath,1) == FR_OK){
- printf("f_mount sucess!!! \r\n");
- if(f_open(&SDFile,filename,FA_CREATE_ALWAYS|FA_WRITE) == FR_OK){
- printf("f_open file sucess!!! \r\n");
- if(f_write(&SDFile,wtext,sizeof(wtext),&byteswritten) == FR_OK){
- printf("f_write file sucess!!! \r\n");
- printf("f_write Data : %s\r\n",wtext);
- if(f_close(&SDFile) == FR_OK)
- printf("f_close sucess!!! \r\n");
- else
- printf("f_close error : %d\r\n",retSD);
- }
- else
- printf("f_write file error\r\n");
- }
- else
- printf("f_open file error\r\n");
- }else
- printf("f_mount error : %d \r\n",retSD);
-
- retSD = f_open(&SDFile, filename, FA_READ);
- if(retSD)
- printf("f_open file error : %d\r\n",retSD);
- else
- printf("f_open file sucess!!! \r\n");
- retSD = f_read(&SDFile, rtext, sizeof(rtext), (UINT*)&bytesread);
- if(retSD)
- printf("f_read error!!! %d\r\n",retSD);
- else{
- printf("f_read sucess!!! \r\n");
- printf("f_read Data : %s\r\n",rtext);
- }
- retSD = f_close(&SDFile);
- if(retSD)
- printf("f_close error!!! %d\r\n",retSD);
- else
- printf("f_close sucess!!! \r\n");
- if(bytesread == byteswritten)
- printf("FatFs is working well!!!\r\n");
- if(f_open(&SDFile,(const char*)"Sensor.csv",FA_CREATE_ALWAYS|FA_WRITE) == FR_OK){
- printf("Sensor.csv was opened/created!!!\r\n");
- sprintf(SensorBuff, "Item,Temp,Humi,Light\r\n");
- f_write(&SDFile,SensorBuff,strlen(SensorBuff),&byteswritten);
- for(int i = 0; i < 10; i++){
- sprintf(SensorBuff, "%d,%d,%d,%d\r\n",i + 1, i + 20, i + 30, i + 40);
- f_write(&SDFile,SensorBuff,strlen(SensorBuff),&byteswritten);
- f_sync(&SDFile);
- }
- f_close(&SDFile);
- }
- while (1){
- HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);
- HAL_Delay(500);
- }
- }
复制代码3.下载验证 如果使用的是新SD卡,需要在电脑上进行格式化,建立FAT文件系统,FATFS才能识别并操作SD卡
编译无误下载到开发板后,可以看到D1指示灯不断闪烁,串口打印出如下信息:
将SD卡插入PC后,可以看到SD卡里建立了2个文件:Sensor.csv和STM32cube.txt,打开文件后可以看到写入的数据
转载自: 嵌入式攻城狮 |