用的是原子哥的FATFS代码,但是无论怎么设置,写入的总是“???”,我希望将MUP6050读到的数据,能够保真的写入SD中的.TXT中,方便查看。我之前已经实现用ministm32板子打印出加速度值了,但是无法使用FATFS写入SD,刚玩原子的miniSTM32才三个月,新手一枚请高手指点。
[mw_shl_code=c,true]#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "lcd.h"
#include "key.h"
#include "spi.h"
#include "math.h"
#include "24l01.h"
#include "24cxx.h"
#include "mpu6050.h"
#include "IOI2C.h"
#include "stm32f10x_tim.h"
#include "usmart.h"
#include "malloc.h"
#include "MMC_SD.h"
#include "ff.h"
#include "exfuns.h"
#include "fattester.h"
int time=100;
float Accel_x,Accel_y,Accel_z;
float Angle; //最终测量角度
u8 AsciiBuff[33];
float MPU6050_DATAFIFO[3][11];
void HexToASCII(float data);
void NVIC_Configuration(void);
void Angle_Calculate(void);
void MPU6050_Get_Accel(void);
void TIM2_Configuration(void);
//void KALMANFITER(float A_Z,float B_Z,float C_Z);
//float p1=10,p2=10,p3=10; //covariance of the estimated value
//float Aout=0,Bout=0,Cout=0;//variable saving data from sensors
float A[1],B,C; //estimated value
//float k1,k2,k3;
float Temp;
int main(void)
{
u32 total,free;
delay_init();
NVIC_Configuration();
uart_init(115200);
LED_Init();
LCD_Init();
KEY_Init(); //KEY initialization
IIC_Init();
exfuns_init(); //为fatfs相关变量申请内存
usmart_dev.init(72);
mem_init(); //初始化内存池
MPU6050_initialize(); //accelerometers initialization TIM2_Configuration();//open or close the timer
POINT_COLOR=RED;//设置字体为红色
LCD_ShowString(60,50,200,16,16,"Mini STM32");
LCD_ShowString(60,70,200,16,16,"FATFS TEST");
LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
LCD_ShowString(60,110,200,16,16,"Use USMART for test");
LCD_ShowString(60,130,200,16,16,"2014/3/14");
while(SD_Initialize()) //检测SD卡
{
LCD_ShowString(60,150,200,16,16,"SD Card Error!");
delay_ms(200);
LCD_Fill(60,150,240,150+16,WHITE);//清除显示
delay_ms(200);
LED0=!LED0;//DS0闪烁
}
exfuns_init(); //为fatfs相关变量申请内存
f_mount(fs[0],"0:",1); //挂载SD卡
f_mount(fs[1],"1:",1); //挂载FLASH.
while(exf_getfree("0",&total,&free)) //得到SD卡的总容量和剩余容量
{
LCD_ShowString(60,150,200,16,16,"Fatfs Error!");
delay_ms(200);
LCD_Fill(60,150,240,150+16,WHITE);//清除显示
delay_ms(200);
LED0=!LED0;//DS0闪烁
}
POINT_COLOR=BLUE;//设置字体为蓝色
LCD_ShowString(60,150,200,16,16,"FATFS OK!");
LCD_ShowString(60,170,200,16,16,"SD Total Size: MB");
LCD_ShowString(60,190,200,16,16,"SD Free Size: MB");
LCD_ShowNum(172,170,total>>10,5,16); //显示SD卡总容量 MB
LCD_ShowNum(172,190,free>>10,5,16); //显示SD卡剩余容量 MB
LCD_ShowString(60,250,100,32,16,"X:");
mf_mkdir ("0:test1"); //创建目录
mf_opendir("0://test1"); //打开目录
mf_open("0://test1//test.txt",0x04); //创建路径下的文件
mf_close(); //关闭文件
mf_open("0://test1//test.txt",0x02);// 以写方式打开文件test
while(1)
{
delay_ms(500);
LED1=!LED1;
[/mw_shl_code]
[mw_shl_code=c,true] while(time)//连续写入100个数据
{
mf_write(&A[0],0xA);
time--;
}
mf_close();
}
} //main函数
/****************Timer2 interrupt service function**********************/
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
MPU6050_Get_Accel();//collect acceleration from three sensors
}
}
/***************Change the data form for transmit***************/
void HexToASCII(float data)
{
if ((data>0)||(data==0))
{
AsciiBuff[0] =7;// reserved for testing输入空格
AsciiBuff[1] =( u8 )(data/100)%10 + 0x30;
AsciiBuff[2] =( u8 )(data/10)%10 + 0x30;
AsciiBuff[3] =( u8 )(int)(data)%10+ 0x30;
AsciiBuff[4] =46; //输入冒号
AsciiBuff[5] = ( int )(data*10)%10+ 0x30;
AsciiBuff[6] = ( int )(data*100)%10 + 0x30;
AsciiBuff[7] =0x0A;
if(AsciiBuff[1]==48 && AsciiBuff[2]==48) //如果第1、2位都为零,则都输入为空格
{
AsciiBuff[1] =32;
AsciiBuff[2] =32;
}
if( AsciiBuff[1]==48 )
{
AsciiBuff[1] =32;
}
}
else
{
data=-data;
AsciiBuff[0] =7;
AsciiBuff[1] =45; // insert a - :
AsciiBuff[2] =( u8 )(data/10)%10 + 0x30;
AsciiBuff[3] =( u8 )(int)(data)%10+ 0x30;
AsciiBuff[4] =46; //输入小数点
AsciiBuff[5] = ( int )(data*10)%10+ 0x30;
AsciiBuff[6] = ( int )(data*100)%10 + 0x30;
AsciiBuff[7] =0x0A;
if(AsciiBuff[2]==48) AsciiBuff[2] =32; //如果第1、2位都为零,则都输入为空格
}
}
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0000);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
/******************注册定时器2中断处理函数***********************/
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/******************注册串口1中断服务函数************************/
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//配置串口中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//占先式优先级设置为0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //副优先级设置为0
NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;//中断禁止
NVIC_Init(&NVIC_InitStructure);//中断初始化
}
void MPU6050_Get_Accel(void)
{
static uint8_t DataBuffer[6]; //数据缓存
IICreadBytes(devAddr, MPU6050_RA_ACCEL_XOUT_H, 2, DataBuffer);
Accel_x= (short)((DataBuffer[0]<<8)+DataBuffer[1]); //databuffer0左移八位,与databuffer1相加,读取X轴加速度
// Accel_y= (short)((DataBuffer[2]<<8)+DataBuffer[3]); //读取Y轴加速度
// Accel_z= (short)((DataBuffer[4]<<8)+DataBuffer[5]); //读取Z轴加速度
// Accel_z= (short)((DataBuffer[0]<<8)+DataBuffer[1]); //读取Z轴加速度
// IICreadBytes(devAddr, MPU6050_RA_TEMP_OUT_H, 2, DataBuffer);
// Temp= (short)((DataBuffer[0]<<8)+DataBuffer[1]); //读取温度
// Temp=(Temp/340)+ 36.53;
//±8g
A[0] =(Accel_x -0) /16384; //去除零点偏移,计算得到加速度(g)
// B = (Accel_y +0) /16384;
// C = (Accel_z +2131) /16384;
// A = (Accel_x -80) /4096; //去除零点偏移,计算得到加速度(g)
// B = (Accel_y +0) /4096;
// C = (Accel_z +0) /4096;
//printf("%f\n",Accel_x);
printf("%f\n",A[0]);/////////////////////////////////////////
// printf("%f\n",C);/////////////////////////////////////////
// printf("%f\n",Temp);/////////////////////////////////////////
}
[/mw_shl_code]
|