|
我的主程序如下:
/************************* (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周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|