2484|3

527

帖子

1

TA的资源

一粒金砂(高级)

楼主
 

SensorTile SD存储程序解析 [复制链接]

 
    SensorTile 模块不但可以实时传输传感器数据,还可以通过SD存储,这个功能使得离线数据也可以存下来进行过往传感器状态分析。在无人值守的野外环境非常有用。
    这次测评就来分析一下SensorTile的SD存储功能。
    这次分析的工程是STSW-STLKT01\en.stsw-stlkt01\STSW-STLKT01\Projects\SensorTile\Applications\DataLog 。
    首先,例程给了两个数据输出方式:
  1. /* SendOverUSB = 0 --> Save sensors data on SDCard (enable with double click) */
  2. /* SendOverUSB = 1 --> Send sensors data via USB */
  3. uint8_t SendOverUSB = 1;
复制代码

一个是USB虚拟串口输出,默认为这个,另一个是SD卡存储。SendOverUSB 值需赋值为0。
接下来程序会初始化SD部分:
  1. void DATALOG_SD_Init(void)
  2. {
  3. char SDPath[4];

  4. if(FATFS_LinkDriver(&SD_Driver, SDPath) == 0)
  5. {
  6. /* Register the file system object to the FatFs module */
  7. if(f_mount(&SDFatFs, (TCHAR const*)SDPath, 0) != FR_OK)
  8. {
  9. /* FatFs Initialization Error */
  10. while(1)
  11. {
  12. BSP_LED_On(LED1);
  13. HAL_Delay(500);
  14. BSP_LED_Off(LED1);
  15. HAL_Delay(100);
  16. }
  17. }
  18. }
  19. }
复制代码

挂载SD卡。
之后就开始轮询传感器并将传感器值写入SD卡内。
  1. RTC_Handler( &RtcHandle );

  2. Accelero_Sensor_Handler( LSM6DSM_X_0_handle );

  3. Gyro_Sensor_Handler( LSM6DSM_G_0_handle );

  4. Magneto_Sensor_Handler( LSM303AGR_M_0_handle );

  5. Pressure_Sensor_Handler( LPS22HB_P_0_handle );

  6. if(!no_T_HTS221)
  7. {
  8. Temperature_Sensor_Handler( HTS221_T_0_handle );
  9. }
  10. if(!no_H_HTS221)
  11. {
  12. Humidity_Sensor_Handler( HTS221_H_0_handle );
  13. }

  14. if(!no_GG)
  15. {
  16. Gas_Gauge_Handler(GG_handle);
  17. }
复制代码

RTC时间写入

  1. else if(SD_Log_Enabled) /* Write data to the file on the SDCard */
  2. {
  3. uint8_t size;
  4. size = sprintf( dataOut, "%d:%d:%d.%d\t", stimestructure.Hours, stimestructure.Minutes, stimestructure.Seconds, subSec);
  5. res = f_write(&MyFile, dataOut, size, (void *)&byteswritten);
  6. }
复制代码

加速度计写入
  1. else if(SD_Log_Enabled) /* Write data to the file on the SDCard */
  2. {
  3. uint8_t size;
  4. size = sprintf(dataOut, "%d\t%d\t%d\t", (int)acceleration.AXIS_X, (int)acceleration.AXIS_Y, (int)acceleration.AXIS_Z);
  5. res = f_write(&MyFile, dataOut, size, (void *)&byteswritten);
  6. }
复制代码

之后的各个传感器都是一样。

由此,每次循环记录传感器的值在SD卡里。但是有个问题就是每次都写,在什么地方关闭文件呢?如果中途断电,文件是一点都存不下来的。
于是看到程序最后这段:
  1. if(MEMSInterrupt)
  2. {
  3. MEMSInterrupt = 0;
  4. BSP_ACCELERO_Get_Double_Tap_Detection_Status_Ext(LSM6DSM_X_0_handle,&doubleTap);
  5. if(doubleTap) { /* Double Tap event */
  6. if (SD_Log_Enabled)
  7. {
  8. DATALOG_SD_Log_Disable();
  9. SD_Log_Enabled=0;
  10. }
  11. else
  12. {
  13. while(SD_Log_Enabled != 1)
  14. {
  15. if(DATALOG_SD_Log_Enable())
  16. {
  17. SD_Log_Enabled=1;
  18. }
  19. else
  20. {
  21. DATALOG_SD_Log_Disable();
  22. }
  23. HAL_Delay(100);
  24. }
  25. }
  26. }
  27. }
复制代码



这段代码的意思就是检测到双击的时候停止记录,双击过后继续记录。

  1. void DATALOG_SD_Log_Disable(void)
  2. {
  3. f_close(&MyFile);

  4. /* SD SPI Config */
  5. SD_IO_CS_DeInit();
  6. }
复制代码

而停止记录正是关闭文件。
  1. uint8_t DATALOG_SD_Log_Enable(void)
  2. {
  3. static uint16_t sdcard_file_counter = 0;
  4. char header[] = "Timestamp\tAccX [mg]\tAccY [mg]\tAccZ [mg]\tGyroX [mdps]\tGyroY [mdps]\tGyroZ [mdps]\tMagX [mgauss]\tMagY [mgauss]\tMagZ [mgauss]\tP [mB]\tT [°C]\tH [%]\tVOL [mV]\tBAT [%]\r\n";
  5. uint32_t byteswritten; /* written byte count */
  6. char file_name[30] = {0};

  7. /* SD SPI CS Config */
  8. SD_IO_CS_Init();

  9. sprintf(file_name, "%s%.3d%s", "SensorTile_Log_N", sdcard_file_counter, ".tsv");
  10. sdcard_file_counter++;

  11. HAL_Delay(100);
  12. // ret = f_open(&MyFile, (char const*)file_name, FA_CREATE_ALWAYS | FA_WRITE);

  13. if(f_open(&MyFile, (char const*)file_name, FA_CREATE_ALWAYS | FA_WRITE) != FR_OK)
  14. {
  15. return 0;
  16. }

  17. if(f_write(&MyFile, (const void*)&header, sizeof(header)-1, (void *)&byteswritten) != FR_OK)
  18. {
  19. return 0;
  20. }
  21. return 1;
  22. }
复制代码



开始记录正是重新初始化并创建文件。
这个开始和停止非常巧妙的运用了SensorTile自身的功能来实现。值得借鉴。





最新回复

赞你的头像  详情 回复 发表于 2017-2-19 16:05

赞赏

2

查看全部赞赏

点赞 关注
 
 

回复
举报

1万

帖子

25

TA的资源

版主

沙发
 
分析非常透彻。
 
 
 

回复

9795

帖子

24

TA的资源

版主

板凳
 
如果把麦克风数据写入SD卡就是一个小型录音笔了
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 
 

回复

1239

帖子

66

TA的资源

纯净的硅(中级)

4
 
赞你的头像
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表