OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7717|回复: 14

原子哥,不知为什么我SDIO写很慢?

[复制链接]

17

主题

81

帖子

0

精华

高级会员

Rank: 4

积分
591
金钱
591
注册时间
2013-11-13
在线时间
61 小时
发表于 2014-5-5 21:13:30 | 显示全部楼层 |阅读模式
5金钱
这是我的程序,你先看看

SD+MPU6050.rar

4.87 MB, 下载次数: 211

最佳答案

查看完整内容[请看2#楼]

如果你是要连续写: 1,f_open,f_close,只需要在开始写和结束写的时候,各执行一次即可. 2,f_lseek,也只需要在第一次写的时候执行一次,后续写地址会自增的. 3,f_sync,这句话,我倒是没用过,你去掉试试.没必要每次写入就刷新一下. 精简后的伪代码: f_open f_lseek while(1) {         f_write } f_close
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-5-5 21:13:31 | 显示全部楼层
如果你是要连续写:
1,f_open,f_close,只需要在开始写和结束写的时候,各执行一次即可.
2,f_lseek,也只需要在第一次写的时候执行一次,后续写地址会自增的.
3,f_sync,这句话,我倒是没用过,你去掉试试.没必要每次写入就刷新一下.

精简后的伪代码:
f_open
f_lseek
while(1)
{
        f_write
}
f_close
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

17

主题

81

帖子

0

精华

高级会员

Rank: 4

积分
591
金钱
591
注册时间
2013-11-13
在线时间
61 小时
 楼主| 发表于 2014-5-5 23:01:05 | 显示全部楼层
我的主程序如下:
/************************* (C) COPYRIGHT 2014 wachworld ************************
* File Name       : malloc.c
* Author          : Wang Chao
* Version         : V1
* Date            : 04/22/2014
* Description     : SDIO-SDCARD实验@ 硬件平台:战舰STM32开发板
*******************************************************************************/

/* Includes ------------------------------------------------------------------*/
#include "sdio_sdcard.h"
#include "diskio.h"
#include "malloc.h"
#include "ff.h"
#include "sys.h"
#include "usart.h"                
#include "delay.h"
#include "lcd.h"
#include "led.h"
#include "key.h"
#include "mpu6050.h"
#include "iic_analog.h"        

/* rivate typedef -----------------------------------------------------------*/
/* rivate define ------------------------------------------------------------*/

u8 Dis_buffer[512];        //显示缓存

/* 文件系统公共文件操作区域----------------------------------------------------*/
//打开文件方式宏定义,针对f_open函数
#define FA_OPEN_DEFAULT                        (uint8_t)(FA_OPEN_EXISTING | FA_READ | FA_WRITE)        //可读写操作

#define FA_OPEN_READONLY                (uint8_t)(FA_OPEN_EXISTING | FA_READ)                                //只读取,不执行写
#define FA_OPEN_ADD_DATA                (uint8_t)(FA_OPEN_ALWAYS | FA_READ | FA_WRITE)                //文件不存在则创建新文件
                                                                                    //可用f_lseek函数在文件上追加数据
#define FA_OPEN_NEW_FAIL                (uint8_t)(FA_CREATE_NEW | FA_READ | FA_WRITE)                //新建文件,如果存在则失败
#define FA_OPEN_NEW_COVER                (uint8_t)(FA_CREATE_ALWAYS | FA_READ | FA_WRITE)        //新建文件,如果存在则覆盖

//文件系统工作区相关定义
FATFS *fs[_VOLUMES];        //逻辑磁盘工作区
FIL *filescr;                        //文件1
FIL *filedst;                        //文件2
UINT br,bw;                                //读写变量
FRESULT f_res;                        //FatFs通用结果码

u8 *SDdatabuff;            //SD卡数据缓存
u16 rlen;                        //读取到数据长度

DIR *dir;                                //文件夹

FILINFO fileinfo;                //文件信息结构体

u8 test_buff[] = {"SDCard SDIO Test wachworld!"};        //测试字符串

__align(4) u8 databuf[]={1,5,2,};//大数组
/**********************************************************
* 函数功能 ---> 文件系统信息初始化
* 入口参数 ---> none
* 返回数值 ---> 0:成功
*               1:失败
* 功能说明 ---> 主要是为变量申请内存
**********************************************************/
uint8_t myf_init(void)
{
        fs[0] = (FATFS*)mymalloc(SRAMIN, sizeof(FATFS));        //为磁盘0工作区申请内存
        fs[1] = (FATFS*)mymalloc(SRAMIN, sizeof(FATFS));        //为磁盘1工作区申请内存
        filescr = (FIL*)mymalloc(SRAMIN, sizeof(FIL));                //为文件1申请内存
        filedst = (FIL*)mymalloc(SRAMIN, sizeof(FIL));                //为文件2申请内存
        dir = (DIR*)mymalloc(SRAMIN, sizeof(DIR));                        //为文件夹申请内存
        SDdatabuff = (uint8_t*)mymalloc(SRAMIN, 512);                //为SD卡数据缓存申请内存
        
        if(fs[0]&&fs[1]&&filescr&&filedst&&dir&&SDdatabuff)
    {
        return 0;        //申请有一个失败, 即失败
    }        
        else
    {
        return 1;        //申请成功
    }        
}

/**********************************************************
* 函数功能 ---> 打印SD卡信息到串口
* 入口参数 ---> none
* 返回数值 ---> none
* 功能说明 ---> 1、打印卡的容量到串口
*               2、打印卡的类型到串口
*               3、打印卡的其他信息
**********************************************************/
void SD_Card_Printf_Info(void)
{
        switch(SDCardInfo.CardType)        //卡类型
        {
                case SDIO_HIGH_CAPACITY_SD_CARD:        //高容量卡
                        printf("Card Type: SDHC V2.0\r\n");
            LCD_ShowString(30,224,200,16,16,"Card Type: SDHC V2.0");
                        break;
                        
                case SDIO_STD_CAPACITY_SD_CARD_V1_1:        //标准容量V1.1
                        printf("Card Type: SDSC V1.1\r\n");
            LCD_ShowString(30,224,200,16,16,"Card Type: SDSC V1.1");
                        break;
                        
                case SDIO_STD_CAPACITY_SD_CARD_V2_0:        //标准容量V2.0
                        printf("Card Type: SDSC V2.0\r\n");
            LCD_ShowString(30,224,200,16,16,"Card Type: SDSC V2.0");
                        break;

                case SDIO_MULTIMEDIA_CARD:        //MMC卡
                        printf("Card Type: MMC Card\r\n");
            LCD_ShowString(30,224,200,16,16,"Card Type: MMC Card");
                        break;
        }

        printf("Card ManufacturerID: %d\r\n",SDCardInfo.SD_cid.ManufacturerID);                        //制造商ID
        printf("Card RCA: %d\r\n",SDCardInfo.RCA);                                                                                //卡相对地址
        printf("Card Capacity: %d MB\r\n",(uint32_t)SDCardInfo.CardCapacity);        //显示容量
        printf("Card BlockSize: %d\r\n\r\n",SDCardInfo.CardBlockSize);                                        //显示块大小
}

/**********************************************************
                           主函数
**********************************************************/
int main(void) 
{
        u8 SDtatus;        //SD卡初始化状态        
        u8 i;
    float Temp;
    short Angle_X,Angle_Y,Angle_Z;        

    Sys_Configuration();     //初始化模拟IIC端口以及MPU6050寄存器配置        
        MY_NVIC_PriorityGroup_Config(NVIC_PriorityGroup_2);        //设置中断分组
        delay_init(72);            //初始化延时函数
        USARTx_Init(9600);        //初始化串口,设置波特率为9600bps
        LED_Init();                //初始化LED接口
        LCD_Init();                //初始化TFT_LCD
        KEY_Init();         //按键初始化
    mem_init(SRAMIN);        //初始化内部内存池
        myf_init();                //为文件系统申请内存

        /******************************************************
                              显示基本信息
                             从LCD顶部开始 
        ******************************************************/
    OINT_COLOR=RED;//设置字体为红色 
        LCD_ShowString(30,0,200,16,16,"Software Compiled Time: ");        
        LCD_ShowString(30,16,200,16,16,__DATE__);
    LCD_ShowString(150,16,200,16,16,__DATE__);        
        LCD_ShowString(30,32,200,16,16,"WarShip STM32.");
        LCD_ShowString(30,48,200,16,16,"SDIO SDCard&FatFs Test.");        
        LCD_ShowString(30,64,200,16,16,"2014/02/26 week3");
    LCD_ShowString(30,80,200,16,16,"By@Wang Chao.");           
    OINT_COLOR=BLUE;//设置字体为蓝色 
        sprintf((char*)Dis_buffer, "LCD ID:%04X", lcddev.id);   //将LCD ID打印到lcd_id数组
        LCD_ShowString(72, 96,200,16,16, Dis_buffer);                //显示LCDID到显示屏上



        /******************************************************
                              SD卡初始化 
        ******************************************************/
        if(SD_Init() != SD_OK)        //初始化失败
        {
                SDtatus = SD_Init();
        LCD_ShowString(30, 112,200,16,16, "SD Init Faild!");
        }
        else        //初始化成功了
        {                
        OINT_COLOR=BLUE;
        LCD_ShowString(30,112,200,16,16,"SD Init OK!!!!");        
            SD_Card_Printf_Info();        //打印卡信息到串口
            sprintf((char*)Dis_buffer, "MID is: %d", (u8)SDCardInfo.SD_cid.ManufacturerID);        //制造商ID
        OINT_COLOR=RED;
        LCD_ShowString(30,128,200,16,16,(u8*)Dis_buffer);

        OINT_COLOR=BLUE;            
        LCD_ShowString(30,144,200,16,16,"SD Size is:     MB");        //显示卡容量到TFT
            OINT_COLOR = BLACK;
            LCD_ShowNum(126, 144, SDCardInfo.CardCapacity, 4, 16);
        }

        
        /******************************************************
                            测试FatFs用函数 
        ******************************************************/
        f_res = f_mount(0, fs[0]);        //挂载SD卡

        //读测试
        f_res = f_open(filescr, "0:/demo.txt", FA_OPEN_DEFAULT);        //打开文件
        
        if(f_res == FR_OK)        //打开文件成功
        {
                f_res = f_read(filescr, SDdatabuff, 30, &br);        //读取文件内容
                
                f_res = f_close(filescr);        //关闭文件
                
                LCD_Fill(30, 160, 239, 192, WHITE);        //清除显示区域
        OINT_COLOR=RED;
        LCD_ShowString(30,160,200,16,16,"Read demo.txt data:");
        OINT_COLOR=BLUE;
        LCD_ShowString(30,176,200,16,16,(u8*)SDdatabuff); //显示读取到的内容        
        }
        else        //打开失败
        {
                LCD_Fill(30, 160, 239, 192, WHITE);        //清除显示区域
        LCD_ShowString(30,160,200,16,16,"No demo.txt File.");
        }        

        //写测试
        f_res = f_open(filedst, "0:/test.txt", FA_OPEN_NEW_COVER);        //创建文件,如果存在则覆盖
        f_res = f_write(filedst, test_buff, sizeof(test_buff), &bw);        //写入字符串
        f_res = f_close(filedst);        //关闭文件

        //打开刚才创建的文件
        f_res = f_open(filescr, "0:/test.txt", FA_OPEN_DEFAULT);        //打开文件        
        f_res = f_read(filescr, SDdatabuff, 30, &br);        //读取文件内容
        f_res = f_close(filescr);        //关闭文件

    POINT_COLOR=RED;
    LCD_ShowString(30,192,200,16,16,"Write/Read test.txt data:");
    POINT_COLOR=BLUE;
    LCD_ShowString(30,208,208,16,16,(u8*)SDdatabuff);//显示读取到的内容        

    POINT_COLOR=BLACK;//设置字体为红色 
        LCD_ShowString(10,272,200,16,16,"AccX: ");        
        LCD_ShowString(10,288,200,16,16,"AccY: ");        
        LCD_ShowString(10,304,200,16,16,"AccZ: ");
    POINT_COLOR=DARKBLUE;//设置字体为红色 
    
        //excel写测试
        f_res = f_open(filedst, "0:/Acc.xls", FA_OPEN_NEW_COVER);        //创建文件,如果存在则覆盖
        f_res = f_close(filedst);        //关闭文件
                     
        while(1)
        {
                i++;
        Angle_X=MPU6050_Get_Angle(getAccX(),getAccY(),getAccZ(),1); //把得到的加速度值转换为与X轴的夹角
        Angle_Y=MPU6050_Get_Angle(getAccX(),getAccY(),getAccZ(),2); //把得到的加速度值转换为与Y轴的夹角
        Angle_Z=MPU6050_Get_Angle(getAccX(),getAccY(),getAccZ(),0); //把得到的加速度值转换为与Z轴的夹角
        MPU6050_Show_Num(50,272,getAccX(),0);          //显示X轴的加速度值
        MPU6050_Show_Num(50,288,getAccY(),0);          //显示Y轴的加速度值
        MPU6050_Show_Num(50,304,getAccZ(),0);          //显示Z轴的加速度值
        MPU6050_Show_Num(100,272,Angle_X,1);             //显示与X轴的夹角
        MPU6050_Show_Num(100,288,Angle_Y,1);             //显示与Y轴的夹角
        MPU6050_Show_Num(100,304,Angle_Z,1);             //显示与Z轴的夹角
        MPU6050_Show_Num(150,272,getGyroX(),0);      //显示绕X轴的角速度
        MPU6050_Show_Num(150,288,getGyroY(),0);     //显示绕Y轴的角速度
        MPU6050_Show_Num(150,304,getGyroZ(),0);     //显示绕Z轴的角速度
      

                //excel写测试
            f_res = f_open(filedst, "0:/Acc.xls", FA_OPEN_DEFAULT);    //可读写操作
        sprintf((char*)Dis_buffer, "AccX:\t%6d\t AccY:\t%6d\t AccZ:\t%6d\t GyroX:\t%6d\t GyroY:\t%6d\t GyroZ:\t%6d\r\n",
                                    getAccX(), getAccY(), getAccZ(), getGyroX(), getGyroY(), getGyroZ());       
        f_res = f_lseek(filedst,filedst->fsize );                   //指针移动到文件末尾以附加数据
            f_res = f_write(filedst, Dis_buffer, sizeof(Dis_buffer), &bw);  //写入字符串
        f_res = f_sync(filedst);    //刷新文件缓存,及时保存
            f_res = f_close(filedst);   //关闭文件

         
//                delay_ms(10);
                if(i==20)
                {
                        LED0=!LED0;//提示系统正在运行        
                        i=0;
                }
                           
        }

}
回复

使用道具 举报

17

主题

81

帖子

0

精华

高级会员

Rank: 4

积分
591
金钱
591
注册时间
2013-11-13
在线时间
61 小时
 楼主| 发表于 2014-5-5 23:03:55 | 显示全部楼层
测了测才18Hz;即使把
“sprintf((char*)Dis_buffer, "AccX:\t%6d\t AccY:\t%6d\t AccZ:\t%6d\t GyroX:\t%6d\t GyroY:\t%6d\t GyroZ:\t%6d\r\n", getAccX(), getAccY(), getAccZ(), getGyroX(), getGyroY(), getGyroZ()); ”
改为“sprintf((char*)Dis_buffer, "AccX:\t%6d\t AccY:\t%6d\t AccZ:\t%6d\t GyroX:\t%6d\t GyroY:\t%6d\t GyroZ:\t%6d\r\n",0,0, 0, 0, 0,0); ”
结果也是一样为18.2Hz。
不知道时间耗费在哪里了?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-5-6 00:10:51 | 显示全部楼层
回复【3楼】wgco:
---------------------------------
你确定是写的问题?
不是你读MPU的问题?
你把写SD卡的全部注释掉,测试下速度,看看。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-5-6 08:08:32 | 显示全部楼层
回复【3楼】wgco:
---------------------------------
读取MPU6050它的速度多少?因为你要从MPU6050读取数据保存到SD卡里面,如果你读取速度慢了,也存在这个写入慢的假象,单独测试SD卡写入数据速度快还是慢?
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

17

主题

81

帖子

0

精华

高级会员

Rank: 4

积分
591
金钱
591
注册时间
2013-11-13
在线时间
61 小时
 楼主| 发表于 2014-5-6 09:17:36 | 显示全部楼层
回复【5楼】Badu_Space:
---------------------------------
是的,就是不读MPU只写现成的0,0,0,0几乎一样
回复

使用道具 举报

17

主题

81

帖子

0

精华

高级会员

Rank: 4

积分
591
金钱
591
注册时间
2013-11-13
在线时间
61 小时
 楼主| 发表于 2014-5-6 09:24:06 | 显示全部楼层
回复【5楼】Badu_Space:
---------------------------------
我把LCD注释掉的话,速度提高到50Hz,如下:
/************************* (C) COPYRIGHT 2014 wachworld ************************
* File Name       : malloc.c
* Author          : Wang Chao
* Version         : V1
* Date            : 04/22/2014
* Description     : SDIO-SDCARD实验@ 硬件平台:战舰STM32开发板
*******************************************************************************/

/* Includes ------------------------------------------------------------------*/
#include "sdio_sdcard.h"
#include "diskio.h"
#include "malloc.h"
#include "ff.h"
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "lcd.h"
#include "led.h"
#include "mpu6050.h"
#include "iic_analog.h"

/* rivate typedef -----------------------------------------------------------*/
/* rivate define ------------------------------------------------------------*/

u8 Dis_buffer[512]; //显示缓存

/* 文件系统公共文件操作区域----------------------------------------------------*/
//打开文件方式宏定义,针对f_open函数
#define FA_OPEN_DEFAULT (uint8_t)(FA_OPEN_EXISTING | FA_READ | FA_WRITE) //可读写操作
#define FA_OPEN_READONLY (uint8_t)(FA_OPEN_EXISTING | FA_READ) //只读取,不执行写
#define FA_OPEN_ADD_DATA (uint8_t)(FA_OPEN_ALWAYS | FA_READ | FA_WRITE) //文件不存在则创建新文件
                                                                                    //可用f_lseek函数在文件上追加数据
#define FA_OPEN_NEW_FAIL (uint8_t)(FA_CREATE_NEW | FA_READ | FA_WRITE) //新建文件,如果存在则失败
#define FA_OPEN_NEW_COVER (uint8_t)(FA_CREATE_ALWAYS | FA_READ | FA_WRITE) //新建文件,如果存在则覆盖

//文件系统工作区相关定义
FATFS *fs[_VOLUMES]; //逻辑磁盘工作区
FIL *filescr; //文件1
FIL *filedst; //文件2
UINT br,bw; //读写变量
FRESULT f_res; //FatFs通用结果码

u8 *SDdatabuff;     //SD卡数据缓存
u16 rlen; //读取到数据长度

DIR *dir; //文件夹

FILINFO fileinfo; //文件信息结构体

__align(4) u8 databuf[]={1,5,2,};//大数组
/**********************************************************
* 函数功能 ---> 文件系统信息初始化
* 入口参数 ---> none
* 返回数值 ---> 0:成功
*               1:失败
* 功能说明 ---> 主要是为变量申请内存
**********************************************************/
uint8_t myf_init(void)
{
fs[0] = (FATFS*)mymalloc(SRAMIN, sizeof(FATFS)); //为磁盘0工作区申请内存
fs[1] = (FATFS*)mymalloc(SRAMIN, sizeof(FATFS)); //为磁盘1工作区申请内存
filescr = (FIL*)mymalloc(SRAMIN, sizeof(FIL)); //为文件1申请内存
filedst = (FIL*)mymalloc(SRAMIN, sizeof(FIL)); //为文件2申请内存
dir = (DIR*)mymalloc(SRAMIN, sizeof(DIR)); //为文件夹申请内存
SDdatabuff = (uint8_t*)mymalloc(SRAMIN, 512); //为SD卡数据缓存申请内存

if(fs[0]&&fs[1]&&filescr&&filedst&&dir&&SDdatabuff)
    {
        return 0; //申请有一个失败, 即失败
    }
else
    {
        return 1; //申请成功
    }
}

/**********************************************************
                           主函数
**********************************************************/
int main(void) 
{
u8 i;
    short Angle_X,Angle_Y,Angle_Z;

    Sys_Configuration();     //初始化模拟IIC端口以及MPU6050寄存器配置
MY_NVIC_PriorityGroup_Config(NVIC_PriorityGroup_2); //设置中断分组
delay_init(72);     //初始化延时函数
USARTx_Init(9600); //初始化串口,设置波特率为9600bps
LED_Init();         //初始化LED接口
LCD_Init();         //初始化TFT_LCD
    mem_init(SRAMIN); //初始化内部内存池
myf_init();         //为文件系统申请内存

/******************************************************
                      显示基本信息
                     从LCD顶部开始 
******************************************************/
    OINT_COLOR=RED;//设置字体为红色 
LCD_ShowString(30,0,200,16,16,"Software Compiled Time: ");
LCD_ShowString(30,16,200,16,16,__DATE__);
    LCD_ShowString(150,16,200,16,16,__DATE__);
LCD_ShowString(30,32,200,16,16,"WarShip STM32.");
LCD_ShowString(30,48,200,16,16,"SDIO SDCard&FatFs Test.");
LCD_ShowString(30,64,200,16,16,"2014/02/26 week3");
    LCD_ShowString(30,80,200,16,16,"By@Wang Chao.");   
    OINT_COLOR=BLUE;//设置字体为蓝色 
sprintf((char*)Dis_buffer, "LCD ID:%04X", lcddev.id);   //将LCD ID打印到lcd_id数组
LCD_ShowString(72, 96,200,16,16, Dis_buffer);         //显示LCDID到显示屏上



/******************************************************
                      SD卡初始化 
******************************************************/
if(SD_Init() != SD_OK) //初始化失败
{
SD_Init();
        LCD_ShowString(30, 112,200,16,16, "SD Init Faild!");
}
else //初始化成功了
{
        OINT_COLOR=BLUE;
        LCD_ShowString(30,112,200,16,16,"SD Init OK!!!!");
     sprintf((char*)Dis_buffer, "MID is: %d", (u8)SDCardInfo.SD_cid.ManufacturerID); //制造商ID
        OINT_COLOR=RED;
        LCD_ShowString(30,128,200,16,16,(u8*)Dis_buffer);

        OINT_COLOR=BLUE;    
        LCD_ShowString(30,144,200,16,16,"SD Size is:     MB"); //显示卡容量到TFT
     POINT_COLOR = BLACK;
     LCD_ShowNum(126, 144, SDCardInfo.CardCapacity, 4, 16);
}


/******************************************************
                    测试FatFs用函数 
******************************************************/
f_res = f_mount(0, fs[0]); //挂载SD卡

    OINT_COLOR=BLACK;//设置字体为红色 
LCD_ShowString(10,272,200,16,16,"AccX: ");
LCD_ShowString(10,288,200,16,16,"AccY: ");
LCD_ShowString(10,304,200,16,16,"AccZ: ");

    f_res = f_open(filedst, "0:/Acc.xls", FA_OPEN_NEW_COVER);
    f_res = f_close(filedst);

    OINT_COLOR=DARKBLUE;//设置字体为红色 
              
while(1)
{
i++;
     f_res = f_open(filedst, "0:/Acc.xls", FA_WRITE);    //可读写操作
        sprintf((char*)Dis_buffer, "AccX:\t%6d\t AccY:\t%6d\t AccZ:\t%6d\t GyroX:\t%6d\t GyroY:\t%6d\t GyroZ:\t%6d\r\n",
                                    getAccX(), getAccY(), getAccZ(), getGyroX(), getGyroY(), getGyroZ());  
        f_res = f_lseek(filedst,filedst->fsize );                   //指针移动到文件末尾以附加数据
     f_res = f_write(filedst, Dis_buffer, sizeof(Dis_buffer), &bw);  //写入字符串
        f_res = f_sync(filedst);    //刷新文件缓存,及时保存
     f_res = f_close(filedst);   //关闭文件
      
if(i==20)
{
LED0=!LED0;//提示系统正在运行
i=0;
}
            
}

}
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-5-6 12:45:52 | 显示全部楼层
回复【7楼】wgco:
---------------------------------
建议你建立一个结构体保存MPU6050读取到的数据,写入数据到SD卡就直接操作结构体即可,快速

像你这样很慢的
sprintf((char*)Dis_buffer, "AccX:\t%6d\t AccY:\t%6d\t AccZ:\t%6d\t GyroX:\t%6d\t GyroY:\t%6d\t GyroZ:\t%6d\r\n", 
                                    getAccX(), getAccY(), getAccZ(), getGyroX(), getGyroY(), getGyroZ());
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

17

主题

81

帖子

0

精华

高级会员

Rank: 4

积分
591
金钱
591
注册时间
2013-11-13
在线时间
61 小时
 楼主| 发表于 2014-5-6 14:24:49 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
恩,是的,原子哥,速度以下提高到220Hz了,谢谢,我再继续优化看看,谢谢
回复

使用道具 举报

17

主题

81

帖子

0

精华

高级会员

Rank: 4

积分
591
金钱
591
注册时间
2013-11-13
在线时间
61 小时
 楼主| 发表于 2014-5-6 14:25:13 | 显示全部楼层
回复【8楼】Badu_Space:
---------------------------------
恩,好的,我试试,谢谢!
回复

使用道具 举报

17

主题

81

帖子

0

精华

高级会员

Rank: 4

积分
591
金钱
591
注册时间
2013-11-13
在线时间
61 小时
 楼主| 发表于 2014-5-6 16:16:28 | 显示全部楼层
回复【8楼】Badu_Space:
-------------------------------
你好:我现在定义结构体如下:
/* 定义从MPU6050读取的数据结构体----------------------------------------------*/
struct mpu6050
{
    short accx;
    short accy;
    short accz;
    short gyrox;
    short gyroy;
    short gyroz;
    short temp;    
}mpu;
然后读取数据:
        mpu.accx=getAccX();
        mpu.accy=getAccY();
        mpu.accz=getAccZ();
        mpu.gyrox=getGyroX();
        mpu.gyroy=getGyroY();
        mpu.gyroz=getGyroZ();
        mpu.temp=getTemperature();
可是要怎样像你说的“写入数据到SD卡就直接操作结构体即可,快速 ”,即:怎么把结构体写入SD卡中?
回复

使用道具 举报

17

主题

81

帖子

0

精华

高级会员

Rank: 4

积分
591
金钱
591
注册时间
2013-11-13
在线时间
61 小时
 楼主| 发表于 2014-5-6 16:39:24 | 显示全部楼层
如果:
        sprintf((char*)Dis_buffer, "AccX:\t%6d\t AccY:\t%6d\t AccZ:\t%6d\t GyroX:\t%6d\t GyroY:\t%6d\t GyroZ:\t%6d\r\n",
                                    mpu.accx, mpu.accy, mpu.accz, mpu.gyrox, mpu.gyroy, mpu.gyroz);
     f_res = f_write(filedst, Dis_buffer, sizeof(Dis_buffer), &bw);  //写入字符串
这样的画,意义也不大,试了试,速度基本一样!

如果不格式化位字符串再写入SD卡,而是直接把结构体struct mpu6050写入SD卡,要怎么实现?能这样吗?
回复

使用道具 举报

17

主题

81

帖子

0

精华

高级会员

Rank: 4

积分
591
金钱
591
注册时间
2013-11-13
在线时间
61 小时
 楼主| 发表于 2014-5-6 17:09:43 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
原子哥,现在速度有330Hz,即:每秒钟采集330组数据,算一下,即存储速度102KB/s,这个速度还能提高吗?
其中,我是用的是:高速SD卡模式即:SDIO(24MHz),模拟IIC,MPU6050的输出数据速度为1000Hz
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-5-6 18:06:37 | 显示全部楼层
回复【13楼】wgco:
---------------------------------
转换成字符后保存到结构体中,在写入SD卡即可
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-7 22:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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