3445|10

14

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

sersontile之Bluemicrosystem2、DataLog固件库代码分析 [复制链接]

 
1、Bluemicrosystem2
从main函数看起:
首先初始化HAL_Init();
然后配置时钟SystemClock_Config();

#ifdef STM32_NUCLEO
  InitTargetPlatform(TARGET_NUCLEO);
#elif STM32_SENSORTILE
  InitTargetPlatform(TARGET_SENSORTILE);
#endif /* STM32_NUCLEO */

因为是在sersontile上运行,所以进入InitTargetPlatform(TARGET_SENSORTILE)函数。
  1. Sensor_IO_SPI_CS_Init_All();   //初始化stm32与所有传感器的通讯引脚

  2.   #ifdef OSX_BMS_ENABLE_PRINTF   //判断是否使能串口打印
  3.   /* enable USB power on Pwrctrl CR2 register */
  4.   HAL_PWREx_EnableVddUSB();

  5.   /* Configure the CDC */
  6.   /* Init Device Library */
  7.   USBD_Init(&USBD_Device, &VCP_Desc, 0); //串口初始化
  8.   /* Add Supported Class */
  9.   USBD_RegisterClass(&USBD_Device, USBD_CDC_CLASS);
  10.   /* Add Interface callbacks for AUDIO and CDC Class */
  11.   USBD_CDC_RegisterInterface(&USBD_Device, &USBD_CDC_fops);
  12.   /* Start Device Process */
  13.   USBD_Start(&USBD_Device);
  14.   /* 10 seconds ... for having time to open the Terminal
  15.   * for looking the BlueMicrosystem Initialization phase */
  16.   HAL_Delay(10000);
复制代码


接下来初始化LED灯GPIO口,BSP_LED_Init( LED1 );可以跳转到该函数看下:


  1. void BSP_LED_Init(Led_TypeDef Led)
  2. {
  3.   GPIO_InitTypeDef GPIO_InitStruct;

  4.   /* Enable VddIO2 for GPIOG */
  5.   __HAL_RCC_PWR_CLK_ENABLE();
  6.   HAL_PWREx_EnableVddIO2();

  7.   /* Enable the GPIO_LED clock */
  8.   LEDx_GPIO_CLK_ENABLE(Led);

  9.   /* Configure the GPIO_LED pin */
  10.   GPIO_InitStruct.Pin = GPIO_PIN[Led];
  11.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  12.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  13.   GPIO_InitStruct.Speed = GPIO_SPEED_FAST;

  14.   HAL_GPIO_Init(GPIO_PORT[Led], &GPIO_InitStruct);
  15. }
复制代码

接下来就是初始化所有传感器(173行):
  1.   /* Reset all the Target's Features */
  2.   memset(&TargetBoardFeatures, 0, sizeof(TargetFeatures_t));
  3.   /* Discovery and Intialize all the MEMS Target's Features */
  4.   Init_MEM1_Sensors();
复制代码

然后判断是否接电池,是的话初始化电池检测芯片:
  1. #ifdef STM32_SENSORTILE
  2.   /* Inialize the Gas Gouge if the battery is present */
  3.   if(BSP_GG_Init(&TargetBoardFeatures.HandleGGComponent) == COMPONENT_OK){
  4.   OSX_BMS_PRINTF("OK Gas Gouge Component\n\r");
  5.   } else {
  6.   OSX_BMS_PRINTF("Battery not present\n\r");
  7.   }
复制代码

到此InitTargetPlatform函数基本已经执行完毕了,接下来回到main函数,执行InitMetaDataManager函数:
  1. InitMetaDataManager((void *)known_OsxLic,MDM_DATA_TYPE_LIC,NULL);
复制代码

该函数本人理解为初始化数据算法的初始化(不知是否理解有误),然后后面的代码就是判断是否有某种算法然后使能加载算法的功能了:
  1. {
  2.   int32_t Index=0;
  3.   while(known_OsxLic[Index].LicEnum!=OSX_END) {
  4.   MDM_PayLoadLic_t *PayLoad = (MDM_PayLoadLic_t *) MDM_LicTable[known_OsxLic[Index].LicEnum].Address;
  5.   if(PayLoad->osxLicenseInitialized) {
  6.   switch(known_OsxLic[Index].LicEnum) {

  7.   /* Code for MotionFX integration - Start Section */
  8.   case OSX_MOTION_FX: //osxMotionFX (iNEMOEngine PRO) 实时的运动数据传感器融合
  9.   MCR_OSX_COPY_LICENSE_FROM_MDM(osx_mfx_license,PayLoad->osxLicense);
  10.   MotionFX_License_init(PayLoad);
  11.   break;
  12.   /* Code for MotionFX integration - End Section */

  13.   /* Code for MotionAR integration - Start Section */
  14.   case OSX_MOTION_AR: //osxMotionAR (iNEMOEngine PRO) 提供实时的运动姿态是识别 (OPEN.MEMS license)
  15.   MCR_OSX_COPY_LICENSE_FROM_MDM(osx_mar_license,PayLoad->osxLicense);
  16.   MotionAR_License_init(PayLoad);
  17.   break;
  18.   /* Code for MotionAR integration - End Section */

  19.   /* Code for MotionCP integration - Start Section */
  20.   case OSX_MOTION_CP: //osxMotionCP (iNEMOEngine PRO) 提供穿戴位置识别
  21.   MCR_OSX_COPY_LICENSE_FROM_MDM(osx_mcp_license,PayLoad->osxLicense);
  22.   MotionCP_License_init(PayLoad);
  23.   break;
  24.   /* Code for MotionCP integration - End Section */

  25.   /* Code for MotionGR integration - Start Section */
  26.   case OSX_MOTION_GR: //osxMotionGR (iNEMOEngine PRO) 提供手势识别
  27.   MCR_OSX_COPY_LICENSE_FROM_MDM(osx_mgr_license,PayLoad->osxLicense);
  28.   MotionGR_License_init(PayLoad);
  29.   break;
  30.   /* Code for MotionGR integration - End Section */
  31. .......
  32. }
复制代码

虽然阅读了该算法库,但好像没什么收获,我还是不知道数据从哪获取,又存放于何处,就是说我还是无法利用sersontile的数据。。。
通过逛论坛我进一步得知了想利用硬件,想利用数据得看en.stsw-stlkt01固件库,好吧,看了这么就还是白费功夫。。。不过也不能说是白费功夫,至少对我理解另一个固件库有很大的帮助,还是有收获的。

2.DataLog固件库
en.stsw-stlkt01固件库里面有三个文件,我查看了DataLog固件库,因为我最主要的是获取传感器数据。
还是从main函数看起:
     首先还是一初始化函数:
  1. HAL_Init();

  2.   /* Configure the system clock */
  3.   SystemClock_Config();

  4.   if(SendOverUSB) //此例程 SendOverUSB 宏定义为1
  5.   {
  6.   /* Initialize LED */
  7.   BSP_LED_Init(LED1); //LED灯GPIO的初始化
  8.   BSP_LED_On(LED1);  //LED灯亮
  9.   }
  10. else
  11.   {
  12.   /* Initialize LEDSWD: Cannot be used during debug because it overrides SWDCLK pin configuration */
  13.   BSP_LED_Init(LEDSWD);
  14.   BSP_LED_Off(LEDSWD);
  15.   }

  16.   RTC_Config();
  17.   RTC_TimeStampConfig();

  18. 然后使能USB并做相应配置:

  19.   HAL_PWREx_EnableVddUSB();

  20.   if(SendOverUSB) /* Configure the USB */
  21.   {
  22.   /*** USB CDC Configuration ***/
  23.   /* Init Device Library */
  24.   USBD_Init(&USBD_Device, &VCP_Desc, 0);
  25.   /* Add Supported Class */
  26.   USBD_RegisterClass(&USBD_Device, USBD_CDC_CLASS);
  27.   /* Add Interface callbacks for AUDIO and CDC Class */
  28.   USBD_CDC_RegisterInterface(&USBD_Device, &USBD_CDC_fops);
  29.   /* Start Device Process */
  30.   USBD_Start(&USBD_Device);
  31.   }
  32.   else /* Configure the SDCard */   // 若sendoverUSB = 0 则进行SD传输存储的初始化
  33.   {
  34.   DATALOG_SD_Init();
  35.   }

  36. 初始化各个传感器的通讯配置,并使能所有传感器:

  37. /* Configure and disable all the Chip Select pins */
  38.   Sensor_IO_SPI_CS_Init_All();

  39.   /* Initialize and Enable the available sensors */
  40.   initializeAllSensors();
  41.   enableAllSensors();
复制代码

接下来进入一个while(1)循环:
  1. while (1)
  2.   {
  3.   /* Get sysTick value and check if it's time to execute the task */
  4.   msTick = HAL_GetTick();
  5.   if(msTick % DATA_PERIOD_MS == 0 && msTickPrev != msTick)
  6.   {
  7.   msTickPrev = msTick;
  8.   if(SendOverUSB)
  9.   {
  10.   BSP_LED_On(LED1);
  11.   }
  12. #ifdef NOT_DEBUGGING
  13.   else if (SD_Log_Enabled)
  14.   {
  15.   BSP_LED_On(LEDSWD);
  16.   }
  17. #endif
  18.   RTC_Handler( &RtcHandle );

  19.   Accelero_Sensor_Handler( LSM6DSM_X_0_handle );

  20.   Gyro_Sensor_Handler( LSM6DSM_G_0_handle );

  21.   Magneto_Sensor_Handler( LSM303AGR_M_0_handle );

  22.   Pressure_Sensor_Handler( LPS22HB_P_0_handle );

  23.   if(!no_T_HTS221)
  24.   {
  25.   Temperature_Sensor_Handler( HTS221_T_0_handle );
  26.   }
  27.   if(!no_H_HTS221)
  28.   {
  29.   Humidity_Sensor_Handler( HTS221_H_0_handle );
  30.   }

  31.   if(!no_GG)
  32.   {
  33.   Gas_Gauge_Handler(GG_handle);
  34.   }
  35.     ......
  36.   }
复制代码

while循环里面有各个传感器的数值传送函数,我们可以打开其中一个,例如Accelero_Sensor_Handler( LSM6DSM_X_0_handle )函数
  1. void Accelero_Sensor_Handler( void *handle )
  2. {

  3.   uint8_t who_am_i;
  4.   float odr;
  5.   float fullScale;
  6.   uint8_t id;
  7.   SensorAxes_t acceleration;
  8.   uint8_t status;
  9.   int32_t d1, d2;

  10.   BSP_ACCELERO_Get_Instance( handle, &id );

  11.   BSP_ACCELERO_IsInitialized( handle, &status );

  12.   if ( status == 1 )
  13.   {
  14.   if ( BSP_ACCELERO_Get_Axes( handle, &acceleration ) == COMPONENT_ERROR )
  15.   {
  16.   acceleration.AXIS_X = 0;
  17.   acceleration.AXIS_Y = 0;
  18.   acceleration.AXIS_Z = 0;
  19.   }

  20.   if(SendOverUSB) /* Write data on the USB */
  21.   {
  22.   sprintf( dataOut, "\n\rACC_X: %d, ACC_Y: %d, ACC_Z: %d", (int)acceleration.AXIS_X, (int)acceleration.AXIS_Y, (int)acceleration.AXIS_Z );                                                              //发送数据至USB串口
  23.   CDC_Fill_Buffer(( uint8_t * )dataOut, strlen( dataOut ));

  24.   if ( verbose == 1 )                                                             //例程设置为0,即下面程序均不执行
  25.   {
  26.   if ( BSP_ACCELERO_Get_WhoAmI( handle, &who_am_i ) == COMPONENT_ERROR )
  27.   {
  28.   sprintf( dataOut, "WHO AM I address[%d]: ERROR\n", id );
  29.   }
  30.   else
  31.   {
  32.   sprintf( dataOut, "WHO AM I address[%d]: 0x%02X\n", id, who_am_i );
  33.   }

  34.   CDC_Fill_Buffer(( uint8_t * )dataOut, strlen( dataOut ));

  35.   if ( BSP_ACCELERO_Get_ODR( handle, &odr ) == COMPONENT_ERROR )
  36.   {
  37.   sprintf( dataOut, "ODR[%d]: ERROR\n", id );
  38.   }
  39.   else
  40.   {
  41.   floatToInt( odr, &d1, &d2, 3 );
  42.   sprintf( dataOut, "ODR[%d]: %d.%03d Hz\n", (int)id, (int)d1, (int)d2 );
  43.   }

  44.   CDC_Fill_Buffer(( uint8_t * )dataOut, strlen( dataOut ));

  45.   if ( BSP_ACCELERO_Get_FS( handle, &fullScale ) == COMPONENT_ERROR )
  46.   {
  47.   sprintf( dataOut, "FS[%d]: ERROR\n", id );
  48.   }
  49.   else
  50.   {
  51.   floatToInt( fullScale, &d1, &d2, 3 );
  52.   sprintf( dataOut, "FS[%d]: %d.%03d g\n", (int)id, (int)d1, (int)d2 );
  53.   }

  54.   CDC_Fill_Buffer(( uint8_t * )dataOut, strlen( dataOut ));
  55.   }
  56.   }
  57.   else if(SD_Log_Enabled) /* Write data to the file on the SDCard */
  58.   {
  59.   uint8_t size;
  60.   size = sprintf(dataOut, "%d\t%d\t%d\t", (int)acceleration.AXIS_X, (int)acceleration.AXIS_Y, (int)acceleration.AXIS_Z);
  61.   res = f_write(&MyFile, dataOut, size, (void *)&byteswritten);
  62.   }
  63.   }
  64. }
复制代码

通过跳转至该函数我们得知数据是放在哪里,例如加速度计三轴的数值 x=(int)acceleration.AXIS_X, y=(int)acceleration.AXIS_Y,
z=(int)acceleration.AXIS_Z,,其他传感器的数值存放也是一样可以查看。


通过USB串口连接电脑,装好驱动,打开串口助手,我们可以看到各个传感器的数值,不过我看不到温湿度的数值,打印出来的温湿度数值均为0,也不知道是什么原因,查看了代码好像也已经初始化了。。。望坛友门能帮忙解决本菜鸟的疑惑,谢谢。


最新回复

就是文件名的区别  详情 回复 发表于 2017-4-30 18:00
点赞 关注
 
 

回复
举报

9790

帖子

24

TA的资源

版主

沙发
 
使用DataLog例程
如果你的小板安装在Arduino板上
因为小板和Arduino板都没有温湿度传感器
串口正常不会输出温度数据

如果使用其它例程,温度是读取气压传感器里的数据

点评

DataLog保存在SD卡中示意.CSV格式,我一直没明白在SD卡中保存数据到EXcel中,之前在单片机操作文件系统,只知道可以保存为.txt  详情 回复 发表于 2017-4-29 09:14
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 
 

回复

2721

帖子

0

TA的资源

纯净的硅(中级)

板凳
 
DataLog保存在SD卡中示意.CSV格式,我一直没明白在SD卡中保存数据到EXcel中,之前在单片机操作文件系统,只知道可以保存为.txt
 
 
 

回复

2721

帖子

0

TA的资源

纯净的硅(中级)

4
 
littleshrimp 发表于 2017-4-29 09:02
使用DataLog例程
如果你的小板安装在Arduino板上
因为小板和Arduino板都没有温湿度传感器
串口正常不会 ...

DataLog保存在SD卡中示意.CSV格式,我一直没明白在SD卡中保存数据到EXcel中,之前在单片机操作文件系统,只知道可以保存为.txt

点评

.csv就是以逗号分隔的文本格式 相当于你把“1,2,3,4”数据存在example.txt中 然后把.txt改成.csv就可以用EXCEL打开  详情 回复 发表于 2017-4-29 09:17
 
 
 

回复

9790

帖子

24

TA的资源

版主

5
 
suoma 发表于 2017-4-29 09:14
DataLog保存在SD卡中示意.CSV格式,我一直没明白在SD卡中保存数据到EXcel中,之前在单片机操作文件系统, ...

.csv就是以逗号分隔的文本格式

相当于你把“1,2,3,4”数据存在example.txt中
然后把.txt改成.csv就可以用EXCEL打开

点评

我知道,就是不知道怎么通过单片机创建这种文件?  详情 回复 发表于 2017-4-29 15:12
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 
 

回复

2721

帖子

0

TA的资源

纯净的硅(中级)

6
 
本帖最后由 suoma 于 2017-4-29 15:13 编辑
littleshrimp 发表于 2017-4-29 09:17
.csv就是以逗号分隔的文本格式

相当于你把“1,2,3,4”数据存在example.txt中
然后把.txt改成.csv就可 ...

我知道,就是不知道怎么通过单片机创建这种文件?FATFS.h支持吗?

点评

单片机建立 .txt文本文件你会弄没  详情 回复 发表于 2017-4-29 15:29
 
 
 

回复

9790

帖子

24

TA的资源

版主

7
 


单片机建立 .txt文本文件你会弄没

点评

会,按你意思是我保存的数据中间用,分隔,然后修改文件类型txt为.csv就好了,我想直接建.csv文件,保存出来就是.csv文件,像sensorTile SD中保存的数据一样  详情 回复 发表于 2017-4-29 19:04
 
 
 

回复

2721

帖子

0

TA的资源

纯净的硅(中级)

8
 
littleshrimp 发表于 2017-4-29 15:29
单片机建立 .txt文本文件你会弄没

会,按你意思是我保存的数据中间用,分隔,然后修改文件类型txt为.csv就好了,我想直接建.csv文件,保存出来就是.csv文件,像sensorTile SD中保存的数据一样

点评

保存时你把文件名设成.csv可以吗 就是代码里的文件名  详情 回复 发表于 2017-4-29 19:28
 
 
 

回复

9790

帖子

24

TA的资源

版主

9
 


保存时你把文件名设成.csv可以吗
就是代码里的文件名

点评

[mw_shl_code=c,true]uint8_t DATALOG_SD_Log_Enable(void) { static uint16_t sdcard_file_counter = 0; char header[] = "Timestamp\tAccX [mg]\tAccY [mg]\tAccZ [mg]\tGyroX [mdps]\tGyroY [mdps]\tGyroZ  详情 回复 发表于 2017-4-30 17:15
 
 
 

回复

2721

帖子

0

TA的资源

纯净的硅(中级)

10
 
littleshrimp 发表于 2017-4-29 19:28
保存时你把文件名设成.csv可以吗
就是代码里的文件名
  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.   
  8.   /* SD SPI CS Config */
  9.   SD_IO_CS_Init();
  10.   
  11.   sprintf(file_name, "%s%.3d%s", "SensorTile_Log_N", sdcard_file_counter, ".tsv");
  12.   sdcard_file_counter++;

  13.   HAL_Delay(100);

  14.   if(f_open(&MyFile, (char const*)file_name, FA_CREATE_ALWAYS | FA_WRITE) != FR_OK)
  15.   {
  16.     return 0;
  17.   }
  18.   
  19.   if(f_write(&MyFile, (const void*)&header, sizeof(header)-1, (void *)&byteswritten) != FR_OK)
  20.   {
  21.     return 0;
  22.   }
  23.   return 1;
  24. }
复制代码


找到了,函数里面确实定义新建.tsv文件,以后我也会新建.tsv文件了

点评

就是文件名的区别  详情 回复 发表于 2017-4-30 18:00
 
 
 

回复

9790

帖子

24

TA的资源

版主

11
 
suoma 发表于 2017-4-30 17:15
[code]uint8_t DATALOG_SD_Log_Enable(void)
{
  static uint16_t sdcard_file_counter  ...

就是文件名的区别
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表