今天不经意间在手机SD卡里面看到保存的.CSV格式的传感器数据,打开一看,确认就是SensorTile开发板数据,于是今天再看了看程序。记录如下
SD保存文件如下,每个传感器一个文件
打开气压传感器,数据如下
其中时间戳值变化感觉和手机界面的曲线的横坐标值变化挺像的
其中RawData值是怎么转成pressure值的?我是没找到方法。另外,时间戳是怎么加上去的?SensorTile上无时钟芯片啊,STM32L476内部晶振?但没见设置的程序啊?又想了一下,这个日期显示是我第一次上电连接APP使用时间,也就是说官方出厂程序既支持蓝牙通信,又支持SD存储。但是目前又发现核心板、mini板、arduino板三个不能同时使用啊。我后面专门发过一篇返回出厂程序的帖子,见
https://bbs.eeworld.com.cn/thread-521170-1-1.html
可是,三个板子确实不能同时使用啊。这个数据是怎么保存进SD卡的?用哪个程序?让我捋一捋
之前发帖讨论过使用DataLog_USB程序未能成功在SD中保存数据,见
蓝牙搜素无设备,SD卡无数据记录 - 意法半导体AMG SensorTile开发大赛 - 电子工程世界-论坛
https://bbs.eeworld.com.cn/thread-520890-1-1.html
注意程序说明
- This application contains an example which shows how to obtain data from the various sensors on the SensorTile. The data can either be streamed to the PC via USB or saved on SD Card
复制代码
这个例程是不带BLE的,蓝牙搜不到,这个例程是通过USB虚拟串口发送到电脑或是存到SD卡中,也就是二选一。
当SD存储选择时,见下说明,数据会保存为.tsv文件,但是我明明是.CSV啊
- If SD Card is selected, the data stream is logged on a tsv file (Tab Separated Values).
- After the application is started:
- - the user can view/record data from the on-board environmental sensors like Temperature,
- Humidity (if available) and Pressure.
- - the user can view/record data from the on-board MEMS sensors like Accelerometer,
- Gyroscope and Magnetometer.
- - the user can view/record data from the Gas Gauge IC to monitor the battery status.
复制代码
不知道存储的电池电量监测数据是什么样的?大家有兴趣看一下
下来看程序,打开DataLog工程,有一个头文件是
#include
/* trunc */
trunc是一种函数,功能是截取日期或数字,返回指定的值。语法TRUNC(number,num_digits)
Number 需要截尾取整的数字
Num_digits 用于指定取整精度的数字
宏定义数据请求周期100ms
- #define DATA_PERIOD_MS (100)
复制代码
这两句很重要,初始值是1
- /* SendOverUSB = 0 --> Save sensors data on SDCard (enable with double click) */
- /* SendOverUSB = 1 --> Send sensors data via USB */
复制代码
关于RTC_Config定义如下,采用12小时制
- static void RTC_Config( void )
- {
- RtcHandle.Instance = RTC;
- RtcHandle.Init.HourFormat = RTC_HOURFORMAT_12;
- RtcHandle.Init.AsynchPrediv = RTC_ASYNCH_PREDIV;
- RtcHandle.Init.SynchPrediv = RTC_SYNCH_PREDIV;
- RtcHandle.Init.OutPut = RTC_OUTPUT_DISABLE;
- RtcHandle.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
- RtcHandle.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
-
- if ( HAL_RTC_Init( &RtcHandle ) != HAL_OK )
- {
-
- /* Initialization Error */
- Error_Handler();
- }
- }
复制代码
后面RTC_TimeStampConfig定义中,初始时间默认2000-1-1 00:00:00,星期一
main中,变量初始定义
- uint32_t msTick, msTickPrev = 0;
- uint8_t doubleTap = 0;//双击核心板标志,
复制代码
NVIC:嵌套中断向量控制器,优先级4
如果数据传到串口,LED1亮
- if(SendOverUSB)
- {
- /* Initialize LED */
- BSP_LED_Init(LED1);
- BSP_LED_On(LED1);
- }
复制代码
紧接着初始化USB库,否则初始化SD
只有SendOverUSB为0的时候才会判断SD_Log_Enabled是否为1,进而写入数据
- if(SD_Log_Enabled)
- {
- DATALOG_SD_NewLine();
- }
复制代码
如下关于双击核心板中断,保存文件的操作
- if(MEMSInterrupt)
- {
- MEMSInterrupt = 0;
- BSP_ACCELERO_Get_Double_Tap_Detection_Status_Ext(LSM6DSM_X_0_handle,&doubleTap);
- if(doubleTap) { /* Double Tap event */
- if (SD_Log_Enabled)
- {
- DATALOG_SD_Log_Disable();
- SD_Log_Enabled=0;
- }
- else
- {
- while(SD_Log_Enabled != 1)
- {
- if(DATALOG_SD_Log_Enable())
- {
- SD_Log_Enabled=1;
- }
- else
- {
- DATALOG_SD_Log_Disable();
- }
- HAL_Delay(100);
- }
- }
- }
- }
复制代码
后面initializeAllSensors( void )中关于双击核心板硬件使能
- if(!SendOverUSB)
- {
- BSP_ACCELERO_Enable_Double_Tap_Detection_Ext(LSM6DSM_X_0_handle);
- BSP_ACCELERO_Set_Tap_Threshold_Ext(LSM6DSM_X_0_handle, LSM6DSM_TAP_THRESHOLD_MID);
- }
复制代码
函数BSP_ACCELERO_Enable_Double_Tap_Detection_Ext定义,设置ODR 416HZ,不知道这里ODR是引脚电平输出的寄存器吗?
DrvStatusTypeDef BSP_ACCELERO_Enable_Double_Tap_Detection_Ext( void *handle )
{
DrvContextTypeDef *ctx = (DrvContextTypeDef *)handle;
if(ctx == NULL)
{
return COMPONENT_ERROR;
}
if ( ctx->pExtVTable == NULL )
{
return COMPONENT_ERROR;
}
/* At the moment this feature is only implemented for LSM6DS3 */
if ( ctx->who_am_i == LSM6DSM_ACC_GYRO_WHO_AM_I )
{
LSM6DSM_X_ExtDrv_t *extDriver = ( LSM6DSM_X_ExtDrv_t * )ctx->pExtVTable;
if ( extDriver->Enable_Double_Tap_Detection == NULL )
{
return COMPONENT_ERROR;
}
else
{
return extDriver->Enable_Double_Tap_Detection( ctx );
}
}
else
{
return COMPONENT_ERROR;
}
}
把程序看完也没明白当时这个文件是怎么保存的,当时确实将SD插到SD上试了一下,没反应又拔了,当时未刷程序
不明白是怎么SD卡新建.tsV文件?还请指点,我之前操作SD卡都是txt文件