搜索
bottom↓
回复: 3

不知道我的STM32+SDIO+FatFs的写速度很慢?求助

[复制链接]

出0入0汤圆

发表于 2014-5-5 23:00:12 | 显示全部楼层 |阅读模式
我的主程序如下:
/************************* (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"       

/* Private typedef -----------------------------------------------------------*/
/* Private 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顶部开始
        ******************************************************/
    POINT_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.");          
    POINT_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        //初始化成功了
        {               
        POINT_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
        POINT_COLOR=RED;
        LCD_ShowString(30,128,200,16,16,(u8*)Dis_buffer);

        POINT_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卡

        //读测试
        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);        //清除显示区域
        POINT_COLOR=RED;
        LCD_ShowString(30,160,200,16,16,"Read demo.txt data:");
        POINT_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;
                }
                          
        }

}

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2014-5-5 23:04:08 | 显示全部楼层
测了测才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。  不知道时间耗费在哪里了?

出0入4汤圆

发表于 2014-5-7 21:00:20 | 显示全部楼层
还没弄过这个,顶起

出0入0汤圆

发表于 2014-6-12 06:25:46 | 显示全部楼层
可能打印信息时间较长,关闭打印,速度有质地飞跃,试试吧
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-25 22:17

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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