上次闲来无事 把以前的程序拿来修改一下
本次实验采用STM32F407
硬件环境 SDIO接口SD卡
DS18B20温度模块
读取温度数据存储到SD卡中 期间走了不少弯路 ,一开始存储的数据覆盖 查阅资料 修改程序 添加FLSSS
- #include "sys.h"
- #include "delay.h"
- #include "usart.h"
- #include "led.h"
- #include "lcd.h"
- #include "key.h"
- #include "sram.h"
- #include "malloc.h"
- #include "usmart.h"
- #include "sdio_sdcard.h"
- #include "malloc.h"
- #include "w25qxx.h"
- #include "ff.h"
- #include "exfuns.h"
- #include "ds18b20.h"
- //[mw_shl_code=c,true]FIL fil;
- //FRESULT res;
- //UINT bww;
- char filename[]={"0:/STM32测试txt.txt"}; //文件路径及文件名,“0”表示SD卡装载的逻辑驱动器号
- char wtext[20]; //要写入的内容
- char wtext1[]={"STM32测试txt.txt \r\n 温度检测\r\nHello,World!"}; //要写入的内容
- //char wtext[]={0xfe,0x23}; //要写入的内容
- char text[]={"21020-894631"}; //要写入的内容
- FRESULT res; //FATFS文件操作函数返回的枚举类型数据
- FIL fsrc; //文件指针
- FIL fdst; //文件指针
- uint8_t buffer[4096]; //存放从SD卡中读出的数据
- //FIL file;//定义文件指针
- //FATFS fs;
- //LCD参数
- _lcd_dev1 tftlcd_data={200,16}; //管理LCD重要参数
- int main(void)
- {
- u32 total,free;
- u8 t=0;
- u8 t2=0;
- u8 res=0;
- // u8 *data_nanme=0;
- short temperature;
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
- delay_init(168); //初始化延时函数
- uart_init(115200); //初始化串口波特率为115200
- LED_Init(); //初始化LED
- usmart_dev.init(84); //初始化USMART
- LCD_Init(); //LCD初始化
- KEY_Init(); //按键初始化
- W25QXX_Init(); //初始化W25Q128
- my_mem_init(SRAMIN); //初始化内部内存池
- my_mem_init(SRAMCCM); //初始化CCM内存池
-
- POINT_COLOR=RED;//设置字体为红色
- LCD_ShowString(30,50,200,16,16,"Explorer STM32F4");
- LCD_ShowString(30,70,200,16,16,"FATFS TEST");
- LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
- LCD_ShowString(30,110,200,16,16,"2014/5/15");
- LCD_ShowString(30,130,200,16,16,"Use USMART for test");
- while(SD_Init())//检测不到SD卡
- {
- LCD_ShowString(30,150,200,16,16,"SD Card Error!");
- delay_ms(500);
- LCD_ShowString(30,150,200,16,16,"Please Check! ");
- delay_ms(500);
- LED0=!LED0;//DS0闪烁
- }
- exfuns_init(); //为fatfs相关变量申请内存
- f_mount(fs[0],"0:",1); //挂载SD卡
- res=f_mount(fs[1],"1:",1); //挂载FLASH.
- if(res==0X0D)//FLASH磁盘,FAT文件系统错误,重新格式化FLASH
- {
- LCD_ShowString(30,150,200,16,16,"Flash Disk Formatting..."); //格式化FLASH
- res=f_mkfs("1:",1,4096);//格式化FLASH,1,盘符;1,不需要引导区,8个扇区为1个簇
- if(res==0)
- {
- f_setlabel((const TCHAR *)"1:ALIENTEK"); //设置Flash磁盘的名字为:ALIENTEK
- LCD_ShowString(30,150,200,16,16,"Flash Disk Format Finish"); //格式化完成
- }else LCD_ShowString(30,150,200,16,16,"Flash Disk Format Error "); //格式化失败
- delay_ms(1000);
- }
- LCD_Fill(30,150,240,150+16,WHITE); //清除显示
- while(exf_getfree("0",&total,&free)) //得到SD卡的总容量和剩余容量
- {
- LCD_ShowString(30,150,200,16,16,"SD Card Fatfs Error!");
- delay_ms(200);
- LCD_Fill(30,150,240,150+16,WHITE); //清除显示
- delay_ms(200);
- LED0=!LED0;//DS0闪烁
- }
- POINT_COLOR=BLUE;//设置字体为蓝色
- LCD_ShowString(30,150,200,16,16,"FATFS OK!");
- LCD_ShowString(30,170,200,16,16,"SD Total Size: MB");
- LCD_ShowString(30,190,200,16,16,"SD Free Size: MB");
- LCD_ShowNum(30+8*14,170,total>>10,5,16); //显示SD卡总容量 MB
- LCD_ShowNum(30+8*14,190,free>>10,5,16); //显示SD卡剩余容量 MB
- #if 0 //初始化 创建文件 新创建文件
- // /* 打开文件 */
- res=f_open(&fsrc, (const TCHAR*)filename, FA_CREATE_ALWAYS | FA_WRITE);
- /* 将缓冲区的数据写到文件中 */
- /* f_write函数:向文件中写入数据
- fp:文件指针
- write_buf:要写入文件的数据
- 第三个参数:写入多少个字节
- 第四个参数:指针,返回已经写入到文件的字节数
- */
- res = f_write(&fsrc, wtext1, sizeof(wtext1), &bw);
- /* f_close:关闭文件,使用f_open必须使用f_close,不然会有缓存
- fp:文件指针
- */
- // /* 打开文件 */
- f_close(&fsrc); //关闭文件
- #endif
- while(DS18B20_Init()) //DS18B20初始化
- {
- LCD_ShowString(30,130,200,16,16,"DS18B20 Error");
- delay_ms(200);
- LCD_Fill(30,130,239,130+16,WHITE);
- delay_ms(200);
- }
- LCD_ShowString(30,130,200,16,16,"DS18B20 OK");
- POINT_COLOR=BLUE;//设置字体为蓝色
- LCD_ShowString(30,210,200,16,16,"Temp: . C");
- while(1)
- {
-
- // delay_ms(200);
- LED0=0;
- // *data_nanme=f_typetell("test");
- // printf(data_nanme);
- // LCD_ShowString(30,290,200,16,16,*u8 data_nanme) ;
-
- // sprintf(write_buff,"%04d\r\n",ad_value[i]*3300/4096);
- //res_ad=f_lseek(&fil_ad,f_size(&fil_ad));
- //res_ad=f_write(&fil_ad,write_buff,6,&bww_ad);
- // if(KEY_Scan(1)==KEY0_PRES)
- if(KEY0==1)
- {
- t++;
- if(t%10==0)//每100ms读取一次
- {
- temperature=DS18B20_Get_Temp();
- if(temperature<0)
- {
- LCD_ShowChar(30+40,210,'-',16,0); //显示负号
- temperature=-temperature; //转为正数
- }else LCD_ShowChar(30+40,210,' ',16,0); //去掉负号
- LCD_ShowNum(30+40+8,210,temperature/10,2,16); //显示正数部分
- LCD_ShowNum(30+40+32,210,temperature%10,1,16); //显示小数部分
- t2++;//t2时间
- }
- delay_ms(10);
- LED0=1;
-
- // f_mount(0, &fs);
- //如果data.txt存在,则打开;否则,创建一个新文件
- // res = f_open(&file, "0:/data.txt",FA_OPEN_ALWAYS|FA_READ|FA_WRITE );
- //(const TCHAR*) 转换为字符串
- /* f_open函数:创建文件
- fp:文件指针
- 1:test.txt:文件名
- 第三个参数是文件操作的权限,读/写/不管文件是否存在都创建(存在就覆盖)
- */
-
-
-
- /* 打开文件 没有文件则重新创建*/
- res=f_open(&fsrc,(const TCHAR*)filename, FA_OPEN_EXISTING | FA_WRITE);
- f_lseek(&fsrc, f_size(&fsrc)); //将文件指针移动到文件末尾
- sprintf((char*)wtext," timer is:%2d.%2d\r\n",temperature/10,temperature%10);//输出格式 写入回车换行符
- //填充两行数据
- printf(" timer is:%2d.%2d\r\n",temperature/10,temperature%10);//输出格式 写入回车换行符
- /* 将缓冲区的数据写到文件中 */
- //sizeof(*wtext) d 指针指向数组第一个t
- res = f_write(&fsrc,wtext , sizeof(wtext), &bw);
- //写入回车换行
- // res=f_write(&fsrc,"\r\n",4,&bw);
- //写入回车换行
- //res=f_write(&fdst,"\r\n",br,&bw);
- /* f_close:关闭文件,使用f_open必须使用f_close,不然会有缓存
- fp:文件指针
- */
- f_close(&fsrc); //关闭文件
- if(res!=FR_OK) //判断是否打开成功
- {
- LCD_ShowString(10,230,tftlcd_data.width,tftlcd_data.height,16,"f_open error!");
- LCD_ShowString(30,230,200,16,16,"f_open error!");
- }
- /*
- 1.打开文件
- f_open(filescr2, "0:/201711022.txt", FA_OPEN_DEFAULT);
- 2.写数据
- f_write(filescr1, test_buff0, sizeof(test_buff0), &bw1);
- 3.关闭文件
- f_close(filescr1);//一定要关闭
- 第二次写入数据
- 1.打开文件
- f_open(filescr2, "0:/201711022.txt", FA_OPEN_DEFAULT);
- 2.按照文件现有大小移动指针
- f_lseek(filescr1,filescr1->fptr+filescr1->fsize);
- 3.写数据
- f_write(filescr1, test_buff0, sizeof(test_buff0), &bw1);
- 4.关闭文件
- f_close(filescr1);//一定要关闭
- 其实,多次写入的时候就是需要将指针移动,
- 这样的h我们就可以根据自己的需求进行在相同文件内连续写入数据了。
- 但是如果要在指定行进行修改就比较麻烦了,
- 就需要计算指针移动的位置,者相比于面向对象的编程语言而言要麻烦的多。
- */
- //f_lseek(&fsrc,(&fsrc)->fsize);
- // f_lseek(&fsrc,(&fsrc)->fptr-1);
-
- #if 0
- /*注册一个工作区域*/
- // f_mount(0,&fs);
- /* 打开创建一个新文件 */
- res=f_open(&fdst,"0:/DATA.CSV",FA_CREATE_NEW | FA_WRITE);
- /* 写入标题数据 */
- res=f_write(&fdst,"年-月-日-时-分-秒,fix,track\n",29,&bw);
- /* 关闭文件 */
- f_close(&fdst);
- /* 数据转换 */
- // size = format_data(text,324,12585);
- /* 打开文件 没有文件则重新创建*/
- res=f_open(&fdst,"0:/DATA.CSV",FA_OPEN_EXISTING | FA_WRITE);
- /* 查找文件的结尾 */
- res=f_lseek(&fdst,f_size(&fdst));
- /* 写入数据 */
- res=f_write(&fdst,text,sizeof(text),&bw);
- //写入回车换行
- res=f_write(&fdst,"\r\n",br,&bw);
- /* 关闭文件 */
- f_close(&fdst);
- #endif
- if ( res == FR_OK )
- {
- //写入成功
- }
-
- // res=f_write(&fsrc, wtext, sizeof(wtext), &bw); //向SD卡指定路径写入数据
- //LCD_ShowString(30,230,200,16,16,res);
- if(res!=FR_OK) //判断是否写入成功
- {
- LCD_ShowString(10,230,tftlcd_data.width,tftlcd_data.height,16,"f_write error!");
- LCD_ShowString(30,230,200,16,16,"f_write error!");
- }else
- {
- LCD_ShowString(10,230,tftlcd_data.width,tftlcd_data.height,16,"f_write ok!");
- }
- }
- //if(KEY_Scan(1)==KEY1_PRES)
- if(KEY1==0)
- {
- res=f_open(&fsrc, (const TCHAR*)filename, FA_READ); //打开文件,如果文件不存在,则创建该文件
- if(res!=FR_OK) //判断是否打开成功
- {
- LCD_ShowString(10,230,tftlcd_data.width,tftlcd_data.height,16,"f_open error!");
- }
- res=f_read(&fsrc, buffer, sizeof(buffer), &br); //读取SD卡指定路径的内容,并存放在buffer数组中
- if(res!=FR_OK) //判断是否读取成功
- {
- LCD_ShowString(10,230,tftlcd_data.width,tftlcd_data.height,16,"f_read error!");
- }
- else //如果读取成功,则使用LCD显示
- {
- LCD_ShowString(10,230,tftlcd_data.width,tftlcd_data.height,16,"f_read ok!");
- LCD_ShowString(10,260,tftlcd_data.width,tftlcd_data.height,16,buffer);
- f_close(&fsrc);
-
- }
- }
- }
复制代码
|