社区导航

 
快捷导航
  • 首页
  • 论坛
  • 查看新帖
  • 最新回复
  • 精华区
  • 社区活动
  • 联系管理员
  • 消灭零回复
  • E金币兑换
搜索
查看: 473|回复: 3

[设计过程分享] SensorTile SD存储程序解析

[复制链接]

449

TA的帖子

1

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2017-2-19 13:44:20 | 显示全部楼层 |阅读模式
    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自身的功能来实现。值得借鉴。





评分

2

查看全部评分


回复

使用道具 举报

6113

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

发表于 2017-2-19 13:55:12 | 显示全部楼层
分析非常透彻。

回复

使用道具 举报

4225

TA的帖子

8

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-2-19 15:35:59 | 显示全部楼层
如果把麦克风数据写入SD卡就是一个小型录音笔了
虾扯蛋

回复

使用道具 举报

545

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-2-19 16:05:21 | 显示全部楼层
赞你的头像

回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2017-9-19 19:42 , Processed in 0.292468 second(s), 20 queries , Redis On.

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