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

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扩展软件包
关注我们
st-img 微信公众号
st-img 手机版