你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32F407存储SD卡FATFS

[复制链接]
吃饭睡觉吃豆豆 发布时间:2020-9-24 13:21
上次闲来无事  把以前的程序拿来修改一下

本次实验采用STM32F407

硬件环境 SDIO接口SD卡
DS18B20温度模块
读取温度数据存储到SD卡中  期间走了不少弯路  ,一开始存储的数据覆盖   查阅资料 修改程序 添加FLSSS

  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "led.h"
  5. #include "lcd.h"
  6. #include "key.h"  
  7. #include "sram.h"   
  8. #include "malloc.h"
  9. #include "usmart.h"  
  10. #include "sdio_sdcard.h"   
  11. #include "malloc.h"
  12. #include "w25qxx.h"   
  13. #include "ff.h"  
  14. #include "exfuns.h"  
  15. #include "ds18b20.h"


  16. //[mw_shl_code=c,true]FIL fil;
  17. //FRESULT res;
  18. //UINT bww;








  19. char filename[]={"0:/STM32测试txt.txt"}; //文件路径及文件名,“0”表示SD卡装载的逻辑驱动器号
  20. char wtext[20];    //要写入的内容
  21. char wtext1[]={"STM32测试txt.txt \r\n 温度检测\r\nHello,World!"};    //要写入的内容
  22. //char wtext[]={0xfe,0x23};    //要写入的内容

  23. char text[]={"21020-894631"};    //要写入的内容
  24. FRESULT res;                      //FATFS文件操作函数返回的枚举类型数据
  25. FIL fsrc;                         //文件指针
  26. FIL fdst;                         //文件指针

  27. uint8_t buffer[4096];             //存放从SD卡中读出的数据
  28. //FIL file;//定义文件指针
  29. //FATFS fs;
  30. //LCD参数
  31. _lcd_dev1 tftlcd_data={200,16};        //管理LCD重要参数
  32. int main(void)
  33. {        
  34.         u32 total,free;
  35.         u8 t=0;       
  36.         u8 t2=0;       
  37.         u8 res=0;       
  38. //        u8 *data_nanme=0;       
  39.         short temperature;  
  40.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
  41.         delay_init(168);  //初始化延时函数
  42.         uart_init(115200);                //初始化串口波特率为115200
  43.         LED_Init();                                        //初始化LED
  44.         usmart_dev.init(84);                //初始化USMART
  45.         LCD_Init();                                        //LCD初始化  
  46.         KEY_Init();                                        //按键初始化
  47.         W25QXX_Init();                                //初始化W25Q128
  48.         my_mem_init(SRAMIN);                //初始化内部内存池
  49.         my_mem_init(SRAMCCM);                //初始化CCM内存池
  50.        
  51.         POINT_COLOR=RED;//设置字体为红色
  52.         LCD_ShowString(30,50,200,16,16,"Explorer STM32F4");       
  53.         LCD_ShowString(30,70,200,16,16,"FATFS TEST");       
  54.         LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
  55.         LCD_ShowString(30,110,200,16,16,"2014/5/15");   
  56.         LCD_ShowString(30,130,200,16,16,"Use USMART for test");          
  57.         while(SD_Init())//检测不到SD卡
  58.         {
  59.                 LCD_ShowString(30,150,200,16,16,"SD Card Error!");
  60.                 delay_ms(500);                                       
  61.                 LCD_ShowString(30,150,200,16,16,"Please Check! ");
  62.                 delay_ms(500);
  63.                 LED0=!LED0;//DS0闪烁
  64.         }
  65.         exfuns_init();                                                        //为fatfs相关变量申请内存                                 
  66.           f_mount(fs[0],"0:",1);                                         //挂载SD卡
  67.         res=f_mount(fs[1],"1:",1);                                 //挂载FLASH.       
  68.         if(res==0X0D)//FLASH磁盘,FAT文件系统错误,重新格式化FLASH
  69.         {
  70.                 LCD_ShowString(30,150,200,16,16,"Flash Disk Formatting...");        //格式化FLASH
  71.                 res=f_mkfs("1:",1,4096);//格式化FLASH,1,盘符;1,不需要引导区,8个扇区为1个簇
  72.                 if(res==0)
  73.                 {
  74.                         f_setlabel((const TCHAR *)"1:ALIENTEK");        //设置Flash磁盘的名字为:ALIENTEK
  75.                         LCD_ShowString(30,150,200,16,16,"Flash Disk Format Finish");        //格式化完成
  76.                 }else LCD_ShowString(30,150,200,16,16,"Flash Disk Format Error ");        //格式化失败
  77.                 delay_ms(1000);
  78.         }                                                                                                            
  79.         LCD_Fill(30,150,240,150+16,WHITE);                //清除显示                          
  80.         while(exf_getfree("0",&total,&free))        //得到SD卡的总容量和剩余容量
  81.         {
  82.                 LCD_ShowString(30,150,200,16,16,"SD Card Fatfs Error!");
  83.                 delay_ms(200);
  84.                 LCD_Fill(30,150,240,150+16,WHITE);        //清除显示                          
  85.                 delay_ms(200);
  86.                 LED0=!LED0;//DS0闪烁
  87.         }                                                                                                                                      
  88.         POINT_COLOR=BLUE;//设置字体为蓝色          
  89.         LCD_ShowString(30,150,200,16,16,"FATFS OK!");         
  90.         LCD_ShowString(30,170,200,16,16,"SD Total Size:     MB");         
  91.         LCD_ShowString(30,190,200,16,16,"SD  Free Size:     MB");             
  92.         LCD_ShowNum(30+8*14,170,total>>10,5,16);                                //显示SD卡总容量 MB
  93.         LCD_ShowNum(30+8*14,190,free>>10,5,16);                                        //显示SD卡剩余容量 MB       
  94. #if 0   //初始化  创建文件          新创建文件
  95.                                  //     /* 打开文件 */
  96.                 res=f_open(&fsrc, (const TCHAR*)filename, FA_CREATE_ALWAYS | FA_WRITE);                       
  97.                 /* 将缓冲区的数据写到文件中 */               
  98.                      /* f_write函数:向文件中写入数据
  99.         fp:文件指针
  100.         write_buf:要写入文件的数据
  101.         第三个参数:写入多少个字节
  102.         第四个参数:指针,返回已经写入到文件的字节数
  103.         */
  104.                 res = f_write(&fsrc, wtext1, sizeof(wtext1), &bw);     
  105.                     /* f_close:关闭文件,使用f_open必须使用f_close,不然会有缓存
  106.         fp:文件指针
  107.         */
  108.                  //     /* 打开文件 */
  109.                 f_close(&fsrc);                         //关闭文件        
  110.                 #endif       
  111.                          while(DS18B20_Init())        //DS18B20初始化       
  112.         {
  113.                 LCD_ShowString(30,130,200,16,16,"DS18B20 Error");
  114.                 delay_ms(200);
  115.                 LCD_Fill(30,130,239,130+16,WHITE);
  116.                 delay_ms(200);
  117.         }   
  118.         LCD_ShowString(30,130,200,16,16,"DS18B20 OK");
  119.         POINT_COLOR=BLUE;//设置字体为蓝色
  120.         LCD_ShowString(30,210,200,16,16,"Temp:   . C");         
  121.         while(1)
  122.         {
  123.                
  124.         //        delay_ms(200);                                           
  125.                 LED0=0;
  126. //                *data_nanme=f_typetell("test");
  127. //                printf(data_nanme);
  128. //                LCD_ShowString(30,290,200,16,16,*u8 data_nanme) ;
  129.                
  130. //                sprintf(write_buff,"%04d\r\n",ad_value[i]*3300/4096);
  131. //res_ad=f_lseek(&fil_ad,f_size(&fil_ad));
  132. //res_ad=f_write(&fil_ad,write_buff,6,&bww_ad);

  133. //        if(KEY_Scan(1)==KEY0_PRES)
  134.                 if(KEY0==1)       
  135.         {
  136.                 t++;
  137.                                          if(t%10==0)//每100ms读取一次
  138.                 {                                                                          
  139.                         temperature=DS18B20_Get_Temp();       
  140.                         if(temperature<0)
  141.                         {
  142.                                 LCD_ShowChar(30+40,210,'-',16,0);                        //显示负号
  143.                                 temperature=-temperature;                                        //转为正数
  144.                         }else LCD_ShowChar(30+40,210,' ',16,0);                        //去掉负号
  145.                         LCD_ShowNum(30+40+8,210,temperature/10,2,16);        //显示正数部分            
  146.                            LCD_ShowNum(30+40+32,210,temperature%10,1,16);        //显示小数部分        
  147.                 t2++;//t2时间                       
  148.                 }                                  
  149.                  delay_ms(10);               
  150.                 LED0=1;
  151.                
  152. //        f_mount(0, &fs);
  153.                         //如果data.txt存在,则打开;否则,创建一个新文件
  154. //        res = f_open(&file, "0:/data.txt",FA_OPEN_ALWAYS|FA_READ|FA_WRITE );
  155.                 //(const TCHAR*)  转换为字符串
  156.                    /* f_open函数:创建文件
  157.         fp:文件指针
  158.         1:test.txt:文件名
  159.         第三个参数是文件操作的权限,读/写/不管文件是否存在都创建(存在就覆盖)
  160.                 */
  161.                
  162.                

  163.                      /* 打开文件   没有文件则重新创建*/
  164.                 res=f_open(&fsrc,(const TCHAR*)filename, FA_OPEN_EXISTING | FA_WRITE);                                          
  165.                 f_lseek(&fsrc, f_size(&fsrc)); //将文件指针移动到文件末尾
  166.                 sprintf((char*)wtext,"  timer is:%2d.%2d\r\n",temperature/10,temperature%10);//输出格式  写入回车换行符
  167.                                     //填充两行数据
  168.                         printf("  timer is:%2d.%2d\r\n",temperature/10,temperature%10);//输出格式  写入回车换行符
  169.                 /* 将缓冲区的数据写到文件中 */
  170.                 //sizeof(*wtext)   d  指针指向数组第一个t
  171.                 res = f_write(&fsrc,wtext , sizeof(wtext), &bw);   
  172.                                 //写入回车换行  
  173. //                res=f_write(&fsrc,"\r\n",4,&bw);       
  174.                 //写入回车换行  
  175.                 //res=f_write(&fdst,"\r\n",br,&bw);               
  176.                     /* f_close:关闭文件,使用f_open必须使用f_close,不然会有缓存
  177.         fp:文件指针
  178.         */
  179.                 f_close(&fsrc);                         //关闭文件   






  180.                                 if(res!=FR_OK)                          //判断是否打开成功
  181.                 {
  182.                         LCD_ShowString(10,230,tftlcd_data.width,tftlcd_data.height,16,"f_open error!");
  183.                         LCD_ShowString(30,230,200,16,16,"f_open error!");        
  184.                 }               


  185. /*               
  186. 1.打开文件

  187. f_open(filescr2, "0:/201711022.txt", FA_OPEN_DEFAULT);

  188. 2.写数据

  189. f_write(filescr1, test_buff0, sizeof(test_buff0), &bw1);

  190. 3.关闭文件

  191. f_close(filescr1);//一定要关闭

  192. 第二次写入数据

  193. 1.打开文件

  194. f_open(filescr2, "0:/201711022.txt", FA_OPEN_DEFAULT);
  195. 2.按照文件现有大小移动指针

  196. f_lseek(filescr1,filescr1->fptr+filescr1->fsize);

  197. 3.写数据

  198. f_write(filescr1, test_buff0, sizeof(test_buff0), &bw1);

  199. 4.关闭文件

  200. f_close(filescr1);//一定要关闭

  201. 其实,多次写入的时候就是需要将指针移动,
  202. 这样的h我们就可以根据自己的需求进行在相同文件内连续写入数据了。
  203. 但是如果要在指定行进行修改就比较麻烦了,
  204. 就需要计算指针移动的位置,者相比于面向对象的编程语言而言要麻烦的多。               
  205. */       
  206.                 //f_lseek(&fsrc,(&fsrc)->fsize);
  207.         //        f_lseek(&fsrc,(&fsrc)->fptr-1);
  208.        


  209. #if 0
  210.     /*注册一个工作区域*/
  211. //    f_mount(0,&fs);                             
  212.     /* 打开创建一个新文件 */
  213.     res=f_open(&fdst,"0:/DATA.CSV",FA_CREATE_NEW | FA_WRITE);   
  214.     /* 写入标题数据 */
  215.     res=f_write(&fdst,"年-月-日-时-分-秒,fix,track\n",29,&bw);
  216.     /* 关闭文件 */
  217.     f_close(&fdst);
  218.      /* 数据转换 */
  219. //   size = format_data(text,324,12585);
  220.      /* 打开文件   没有文件则重新创建*/
  221.     res=f_open(&fdst,"0:/DATA.CSV",FA_OPEN_EXISTING | FA_WRITE);
  222.     /* 查找文件的结尾 */
  223.     res=f_lseek(&fdst,f_size(&fdst));
  224.     /* 写入数据 */
  225.     res=f_write(&fdst,text,sizeof(text),&bw);
  226.                 //写入回车换行  
  227.                 res=f_write(&fdst,"\r\n",br,&bw);
  228.     /* 关闭文件 */
  229.     f_close(&fdst);


  230. #endif


  231.         if ( res == FR_OK )
  232.          {
  233. //写入成功
  234.           }   
  235.                
  236. //                res=f_write(&fsrc, wtext, sizeof(wtext), &bw);          //向SD卡指定路径写入数据
  237.                 //LCD_ShowString(30,230,200,16,16,res);
  238.                 if(res!=FR_OK)                          //判断是否写入成功
  239.                 {
  240.                         LCD_ShowString(10,230,tftlcd_data.width,tftlcd_data.height,16,"f_write error!");
  241.                         LCD_ShowString(30,230,200,16,16,"f_write error!");        
  242.                 }else
  243.                 {
  244.                 LCD_ShowString(10,230,tftlcd_data.width,tftlcd_data.height,16,"f_write ok!");
  245.                 }

  246.                 }
  247.         //if(KEY_Scan(1)==KEY1_PRES)
  248.                 if(KEY1==0)       
  249.         {
  250. res=f_open(&fsrc, (const TCHAR*)filename, FA_READ);     //打开文件,如果文件不存在,则创建该文件
  251. if(res!=FR_OK)                          //判断是否打开成功
  252. {
  253.         LCD_ShowString(10,230,tftlcd_data.width,tftlcd_data.height,16,"f_open error!");
  254. }
  255. res=f_read(&fsrc, buffer, sizeof(buffer), &br);         //读取SD卡指定路径的内容,并存放在buffer数组中
  256. if(res!=FR_OK)                          //判断是否读取成功
  257. {
  258.         LCD_ShowString(10,230,tftlcd_data.width,tftlcd_data.height,16,"f_read error!");
  259. }
  260. else                                    //如果读取成功,则使用LCD显示
  261. {
  262.                 LCD_ShowString(10,230,tftlcd_data.width,tftlcd_data.height,16,"f_read ok!");
  263.         LCD_ShowString(10,260,tftlcd_data.width,tftlcd_data.height,16,buffer);

  264. f_close(&fsrc);
  265.                
  266.         }       
  267.         }
  268. }





复制代码
企业微信截图_16007651047359.png 00a66226-4c4f-496b-b7ea-97472b4d227f.png f4ba51b0-05d2-4b58-86ae-b3cc23ac0938.png 1564994177119.jpg



1 收藏 2 评论1 发布时间:2020-9-24 13:21

举报

1个回答
xiaoshen-372360 回答时间:2020-9-24 15:44:37
支持一下,有源码就好了,哈哈

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版