注册 登录
查看: 493|回复: 33

[K60] SD卡写入问题,还请山外大哥看一下,谢谢!

[复制链接]
发表于 2014-9-18 09:29:17 | 显示全部楼层 |阅读模式
我把SD卡写入数据的函数放在中断里,每隔一段时间写入6个数据到SD卡中,具体SD卡代码:
  1. #include "common.h"
  2. #include "SDHC_user.h"
  3. #include "FIRE_key.h"
  4. #include  "ff.h"
  5. #include  "MK60_gpio.h"
  6. #include "extern_variable.h"
  7. #include "FIRE_LED.H"
  8. #include "SDHC_user.h"

  9. //static uint8 sd_stop = 0;

  10. int sd_flag;
  11. char *str1 = ",多旋翼飞行器数据,\nACC_X,ACC_Y,ACC_Z,GYR_X,GYR_Y,GYR_Z,\n";
  12. char *str2 = ",";
  13. char *str3 = "\n";
  14. char SD_buff[100];
  15. uint8 sd_start,sd_stop;

  16. FIL     fdst;   //文件
  17. FATFS   fs;     //文件系统
  18. void SD_init(void)
  19. {
  20.   sd_start = 0;
  21.   sd_stop = 1;
  22.   memset(SD_buff,0,100);//对数组数据进行清零操作
  23.   f_mount(0, &fs); //挂载文件系统
  24.   //初始化 SD卡 在 f_open 上执行,目前代码只支持打开一个文件(由 _FS_SHARE 配置),频繁打开文件会消耗CPU资源
  25.   sd_flag = f_open(&fdst, "0:/Fly_data.txt", FA_OPEN_ALWAYS | FA_WRITE | FA_READ);  //打开文件,如果没有就创建,带读写打开
  26.   if((K1_fly == 1)&&(sd_flag != FR_DISK_ERR)&&(sd_flag == FR_OK))//K1_fly打开 插入SD卡 ,文件打开成功
  27.   {
  28.     f_puts(str1, &fdst);                     //往文件里写入字符串
  29.     f_sync(&fdst);                          //刚才写入了数据,实际上数据并没真正完成写入,需要调用此函数同步或者关闭文件,才会真正写入
  30.     sd_start = 1;
  31.   }
  32.   else
  33.     return;
  34. }
  35. void SD_write(void)
  36. {
  37.   sprintf((char *)SD_buff,"%s%d",str2,(int16)ACC_F.X);         //把str和i合并成一个字符串到buff里,再进行发送
  38.   f_puts(SD_buff, &fdst);                                      //往文件里写入字符串
  39.   memset(SD_buff,0,100);                                       //对数组数据进行清零操作
  40.   led_turn(LED3);
  41.   sprintf((char *)SD_buff,"%s%d",str2,(int16)ACC_F.Y);         //把str和i合并成一个字符串到buff里,再进行发送
  42.   f_puts(SD_buff, &fdst);                                      //往文件里写入字符串
  43.   memset(SD_buff,0,100);                                       //对数组数据进行清零操作
  44.   
  45.   sprintf((char *)SD_buff,"%s%d",str2,(int16)ACC_F.Z);         //把str和i合并成一个字符串到buff里,再进行发送
  46.   f_puts(SD_buff, &fdst);                                      //往文件里写入字符串
  47.   memset(SD_buff,0,100);                                       //对数组数据进行清零操作
  48.   
  49.   sprintf((char *)SD_buff,"%s%d",str2,(int16)GYRO_F.X);        //把str和i合并成一个字符串到buff里,再进行发送
  50.   f_puts(SD_buff, &fdst);                                      //往文件里写入字符串
  51.   memset(SD_buff,0,100);                                       //对数组数据进行清零操作
  52.   
  53.   sprintf((char *)SD_buff,"%s%d",str2,(int16)GYRO_F.Y);        //把str和i合并成一个字符串到buff里,再进行发送
  54.   f_puts(SD_buff, &fdst);                                      //往文件里写入字符串
  55.   memset(SD_buff,0,100);                                       //对数组数据进行清零操作
  56.   
  57.   sprintf((char *)SD_buff,"%s%d",str2,(int16)GYRO_F.Z);        //把str和i合并成一个字符串到buff里,再进行发送
  58.   f_puts(SD_buff, &fdst);                                      //往文件里写入字符串
  59.   memset(SD_buff,0,100);                                       //对数组数据进行清零操作
  60.   
  61.   f_puts(str3, &fdst);                                         //往文件里写入字符串 \n 换行
  62.   f_sync(&fdst);                                               //刚才写入了数据,实际上数据并没真正完成写入,需要调用此函数同步或者关闭文件,才会真正写入
  63.   
  64.   if(K2_fly)//PTE25
  65.   {
  66.     f_close(&fdst);//关闭文件
  67.     sd_stop = 0;
  68.   }
  69. }


//中断函数如下:


  1. void PIT0_service(void)
  2. {
  3.   PIT_Flag_Clear(PIT0);                         //清中断标志位
  4.   
  5.   static uint32 control_cnt = 0,uart_cnt = 0,system_sign = 0,send_data = 0,sd_data = 0;  //中断次数计数器
  6.   
  7.   control_cnt++;
  8.   uart_cnt++;
  9.   system_sign++;
  10.   send_data++;
  11.   sd_data++;
  12.   if(system_init_ok)                           //判断系统是否初始化,每0.5ms判断一次
  13.   {
  14.     MPU6050_data_prepare();                    //读取 MPU6050的当前测量值,并通过上位机找零漂
  15.     IMU_DataPrepare();                         //为IMU算法需要的数据做准备
  16.     IMU_TEST();                                //把数据加载到IMU算法中,进行姿态解算
  17.   }
  18.   
  19.   if(control_cnt==2)
  20.   {
  21.     control_cnt = 0;
  22.     //PID_CAL();                              //=2时控制一次,频率500HZ
  23.   }
  24.   if(send_data==20)
  25.   {
  26.     send_data = 0;
  27.     led_turn(LED2);
  28.     Uart_Send_AF();
  29.   }
  30.   /////////////////////
  31.   if(sd_data==30)
  32.   {
  33.     sd_data = 0;
  34.     if((sd_start == 1)&&(sd_stop == 1))//SD初始化完成,且SD没有出现停止写入标志置位
  35.       SD_write();
  36.   }
  37.    /////////////////////////
  38.   if(system_sign==500)                                //每1000中断执行一次,10ms
  39.   {
  40.     system_sign=0;
  41.     led_turn(LED0);                            //系统运行指示灯
  42.   }
  43.   
  44. }

  45. void PIT0_interrupt(void)
  46. {
  47.   pit_init_ms(PIT0,1);//初始化PIT0,定时时间为:1ms
  48.   set_vector_handler(PIT0_VECTORn ,PIT0_service);//设置PIT0的中断服务函数为 PIT0_IRQHandler
  49.   enable_irq (PIT0_IRQn);//使能PIT0中断
  50. }


//每次内存卡的写入结果是这个,写入的不正常,而且只能写入一组数据???

,多旋翼飞行器数据,
ACC_X,ACC_Y,ACC_Z,GYR_X,GYR_Y,GYR_Z,
,7,0,-3,-3,-4,9
回复

使用道具 举报

 楼主| 发表于 2014-9-18 09:37:09 | 显示全部楼层
问题解决了,初始化按键没有初始化,谢谢!
回复 支持 反对

使用道具 举报

发表于 2014-9-18 09:40:34 | 显示全部楼层
写入数据不对的话,一般是函数调用有误或者漏了。你在线调试,看看转换出来的字符串是否正确的。
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-18 09:51:01 | 显示全部楼层
山外メ雲ジ 发表于 2014-9-18 09:40
写入数据不对的话,一般是函数调用有误或者漏了。你在线调试,看看转换出来的字符串是否正确的。

问题解决了,初始化按键没有初始化,谢谢!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-18 11:26:48 | 显示全部楼层
山外メ雲ジ 发表于 2014-9-18 09:40
写入数据不对的话,一般是函数调用有误或者漏了。你在线调试,看看转换出来的字符串是否正确的。

k60程序运行在哪里运行,内部的SRAM吗?程序运行过程中,我们定义的一些变量都在那里参与运算?被分配到哪里了?
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

发表于 2014-9-18 12:31:35 | 显示全部楼层
快乐的味道92 发表于 2014-9-18 11:26
k60程序运行在哪里运行,内部的SRAM吗?程序运行过程中,我们定义的一些变量都在那里参与运算?被分配到 ...

程序存储在flash,变量存储在ram,程序由cpu执行
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-18 12:59:50 | 显示全部楼层
山外メ雲ジ 发表于 2014-9-18 12:31
程序存储在flash,变量存储在ram,程序由cpu执行

如果K60通过Flexbus总线扩展SRAM,那这个SRAM起到告诉缓存的作用吗?程序的思路是什么?
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

发表于 2014-9-18 13:10:30 | 显示全部楼层
快乐的味道92 发表于 2014-9-18 12:59
如果K60通过Flexbus总线扩展SRAM,那这个SRAM起到告诉缓存的作用吗?程序的思路是什么?

初始化flexbus后,就可以像内部RAM那样来读写外部SRAM。

当然,在初始化前,是不可以使用的,否则杯具的
回复 支持 反对

使用道具 举报

发表于 2014-9-18 13:19:14 | 显示全部楼层
需要初始化flexbus才可以使用外部RAM.
一般,都是像堆,或者是全局数组那样,直接由程序员自行管理这空间的。
如果非要编译器来管理,那么得在初始化数据段之前初始化好外部的RAM,否则出错。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-18 14:23:29 | 显示全部楼层
虚竹 发表于 2014-9-18 13:19
需要初始化flexbus才可以使用外部RAM.
一般,都是像堆,或者是全局数组那样,直接由程序员自行管理这空间 ...

手里有块野火SRAM的模块,想扩展无线调试器K60的SRAM,这个SRAM是怎样加速程序运行的?
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-18 14:42:42 | 显示全部楼层
虚竹 发表于 2014-9-18 13:19
需要初始化flexbus才可以使用外部RAM.
一般,都是像堆,或者是全局数组那样,直接由程序员自行管理这空间 ...

编译器自动分配需要用到分散加载还需要添加一些代码到汇编里,相对来说比较麻烦。而且外部SRAM访问速度远不如内部SRAM,如果编译器将一些需要快速访问的SRAM定义到外部,将会严重拖慢程序运行速度。
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

发表于 2014-9-18 15:25:18 | 显示全部楼层
快乐的味道92 发表于 1411021409
手里有块野火SRAM的模块,想扩展无线调试器K60的SRAM,这个SRAM是怎样加速程序运行的?
我们没有SRAM的例程,这个需要自己研究一下时序
来自PC客户端 来自PC客户端
回复 支持 反对

使用道具 举报

发表于 2014-9-18 15:25:47 | 显示全部楼层
快乐的味道92 发表于 1411022562
编译器自动分配需要用到分散加载还需要添加一些代码到汇编里,相对来说比较麻烦。而且外部SRAM访问速度远不如内部SRAM,如果编译器将一些需要快速访问的SRAM定义到外部,将会严重拖慢程序运行速度。
一般像图像等大数据量的数据才放到外部RAM
来自PC客户端 来自PC客户端
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-18 20:57:39 | 显示全部楼层
山外メ雲ジ 发表于 2014-9-18 15:25
一般像图像等大数据量的数据才放到外部RAM

到现在对SRAM还有点不清楚,它是个暂存数据的地方吗?
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

发表于 2014-9-18 20:59:09 | 显示全部楼层
快乐的味道92 发表于 1411045059
到现在对SRAM还有点不清楚,它是个暂存数据的地方吗?
就是RAM,只不过需要初始化,速度不如内部而已
来自PC客户端 来自PC客户端
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-18 23:07:09 | 显示全部楼层
山外メ雲ジ 发表于 2014-9-18 20:59
就是RAM,只不过需要初始化,速度不如内部而已

如果单片机从SD卡中读取数据,是直接读取速度快,还是先把数据从SD卡中放到外部SRAM里。然后在读取SRAM数据?
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

发表于 2014-9-18 23:08:58 | 显示全部楼层
快乐的味道92 发表于 1411052829
如果单片机从SD卡中读取数据,是直接读取速度快,还是先把数据从SD卡中放到外部SRAM里。然后在读取SRAM数据?
肯定是直接从SD卡到内部RAM快啊,问题时,内部RAM空间够不?
外部RAM的读写速度都会快于SD卡。
来自PC客户端 来自PC客户端
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-18 23:11:47 | 显示全部楼层
山外メ雲ジ 发表于 2014-9-18 23:08
肯定是直接从SD卡到内部RAM快啊,问题时,内部RAM空间够不?
外部RAM的读写速度都会快于SD卡。

你的意思是只有内部RAM空间不足时,外部SRAM才起到作用吗?
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-18 23:12:36 | 显示全部楼层
山外メ雲ジ 发表于 2014-9-18 23:08
肯定是直接从SD卡到内部RAM快啊,问题时,内部RAM空间够不?
外部RAM的读写速度都会快于SD卡。

那这样的话外扩个SRAM也没多大用处啊
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

发表于 2014-9-18 23:14:32 | 显示全部楼层
快乐的味道92 发表于 1411053156
那这样的话外扩个SRAM也没多大用处啊
有啊,速度虽然不如内部RAM,但比SD卡快多了。
跑gui等大数据的时候,就用到外部RAM
来自PC客户端 来自PC客户端
回复 支持 反对

使用道具 举报

发表于 2014-9-18 23:15:37 | 显示全部楼层
快乐的味道92 发表于 2014-9-18 23:11
你的意思是只有内部RAM空间不足时,外部SRAM才起到作用吗?

内部RAM够用,就没必要用外部RAM
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-18 23:15:42 | 显示全部楼层
山外メ雲ジ 发表于 2014-9-18 23:08
肯定是直接从SD卡到内部RAM快啊,问题时,内部RAM空间够不?
外部RAM的读写速度都会快于SD卡。

K60FX512和K60DN512内部RAM分别是多大?像自己焊接K60烙铁温度最高控制在什么温度下?
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

发表于 2014-9-18 23:17:33 | 显示全部楼层
快乐的味道92 发表于 2014-9-18 23:15
K60FX512和K60DN512内部RAM分别是多大?像自己焊接K60烙铁温度最高控制在什么温度下?

128k吧,FX 再多 16k。
如果焊得慢,一般250度左右。如果焊得快,350度也行。
回复 支持 反对

使用道具 举报

发表于 2014-9-18 23:18:05 | 显示全部楼层
快乐的味道92 发表于 2014-9-18 23:15
K60FX512和K60DN512内部RAM分别是多大?像自己焊接K60烙铁温度最高控制在什么温度下?

你是搞四轴吧?有没有图片欣赏一下?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-18 23:24:20 | 显示全部楼层
山外メ雲ジ 发表于 2014-9-18 23:18
你是搞四轴吧?有没有图片欣赏一下?

现在还在写程序,PCB画了一个多月,才画好,还没有印刷,现在我在写程序,姿态解算出来了,什么机架的,电调之类的东西还没有购买,等能飞的时候我会把相关东西公布在论坛里的
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

发表于 2014-9-18 23:25:45 | 显示全部楼层
快乐的味道92 发表于 2014-9-18 23:24
现在还在写程序,PCB画了一个多月,才画好,还没有印刷,现在我在写程序,姿态解算出来了,什么机架的, ...

四轴,我也像搞搞,顶一个。
外部RAM,一般是用于大数据量频繁读写处理的,SD卡用于存储数据,两者用途不同。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-18 23:26:34 | 显示全部楼层
汤静云 发表于 2014-9-18 23:25
四轴,我也像搞搞,顶一个。
外部RAM,一般是用于大数据量频繁读写处理的,SD卡用于存储数据,两者用途 ...

可以多交流交流,我用的主控K60
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

发表于 2014-9-18 23:35:19 | 显示全部楼层
快乐的味道92 发表于 2014-9-18 23:24
现在还在写程序,PCB画了一个多月,才画好,还没有印刷,现在我在写程序,姿态解算出来了,什么机架的, ...

现在很多人玩四轴,唉,没时间,不然也搞搞
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-18 23:41:16 | 显示全部楼层
虚竹 发表于 2014-9-18 23:35
现在很多人玩四轴,唉,没时间,不然也搞搞

我也是一时来了兴趣,就开始搞了起来
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-18 23:42:23 | 显示全部楼层
虚竹 发表于 2014-9-18 23:35
现在很多人玩四轴,唉,没时间,不然也搞搞

时间可以挤挤就出来了
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

发表于 2014-9-18 23:46:56 | 显示全部楼层
快乐的味道92 发表于 2014-9-18 23:42
时间可以挤挤就出来了

唉,重要事情一大堆,准备进社会大学!
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-18 23:48:19 | 显示全部楼层
虚竹 发表于 2014-9-18 23:46
唉,重要事情一大堆,准备进社会大学!

大几了?
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

发表于 2014-9-18 23:55:29 | 显示全部楼层
快乐的味道92 发表于 2014-9-18 23:48
大几了?

大四,现在跟着山外哥学习。突然发现很大差距,很多要学的。
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-19 07:15:10 | 显示全部楼层
虚竹 发表于 2014-9-18 23:55
大四,现在跟着山外哥学习。突然发现很大差距,很多要学的。

是啊,我也是啊,不知道得太多了
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回列表 返回顶部