Thread 中讨论的其他部件:、 SYSBIOS、 CC2540
工具/软件:Code Composer Studio
是否有任何方法可以使用 SYS/BIOS 秒模块来生成以 ms 为单位的 Unix 时间戳?
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
您好!
我建议您查看 TI-RTOS 内核中的时间戳模块:
使用方法如下:
#include #include TIMESTAMP_getFreq (&freq); t0 = Timestamp_get32 (); ... 执行工作 t1 = Timestamp_get32 (); delta =(t0 - t1)/freq.lo;// S 中的时间,相应地调整
您好!
再次感谢您的响应、我想我将使用秒模块。
我目前正在使用 sensortag_cc2650stk、特别是 sensortag_mov.c
当 我获得加速计数据时,你认为在 SensorTag_processSensorEvent()中使用 seconds_get()是可以的吗?
#include #include uint32 t; seconds_set (1535526855)//当前 Unix 时间戳(2018年2月29日@7:14 AM) GTM void SensorTag576_processSensorEvent (void) { ... { //读取加速计数据 SensorMpu9250_accRead ((uint16_t*) sensorData[6]); t = seconds_get(); } 。}
此外、我知道我必须扩展移动传感器 GATT 服务才能使用 TIMESTAMP 属性、这是正确的吗? 在这种情况下、我需要在发送之前分配 t SO sensorData?
我正在按照低功耗蓝牙服装配置文件教程了解这一点。
最棒的
Alejandra
您好!
有一个与 CC2650类似的教程可供您参考:
它适用于 v2.2.1堆栈、但我希望它也适用于 v2.2.2。
尊敬的 M-W:
感谢您的教程、在完成该教程并阅读 sensortag_cc2650stk 项目中的服务文档后、我开始修改移动服务、特别是 Data 特征。
我认为向加速计数据添加时间戳的最简单方法是将 Data 特征的大小(字节)增加四倍。
通过这种方法,我可以将我的 uint32 t=seconds_get()分配到数据特征的最后四个字节中。
您认为我的推理是正确的吗? 如果是这样、是否修改以下内容就足够了:
//在 movementservice.h 中 //以字节 #define MOVITY_DATA_LEN 为单位的传感器数据长度 22 //被使用为18 //在 movementservice.c 中//特性值:数据 静态 uint8_t sensorData[sensor_data_LEN]={0、0、0、0、0、 0、0、0、0、0、 0、 0、0、0、0、0、 0、0、0、0、0、 0 };
如果没有、您是否对如何解决此问题有任何建议?
谢谢、
Alejandra
当然、
我将 MOVING_DATA_LEN 定义为22。 这就是我在 sensortag_mov.c 中所做的
#ifndef exclude_MOV /********* *包括 */ #include #include include "gatt.h" #include "gattservapp.h" #include "board.h" #include "movementservice.h" #include "sensortag_mov.h" #include "SensorMpu9250.h" #include "SensorTagTest.h" #include "SensorUtil.h" #include "u.time.h" 字符串"include "uil.h" #include /********* *宏 */ #define MOVINACT_CYCLES (MOVINACT_INACT_TIMEOUT *\ (10000/sensorPeriod)/ 10) /********* *常量和宏 */ //执行传感器读取的频率(毫秒) #define SENSOR_DEFAULT_PERIOD 1000 //此传感器的数据长度 #define SENSOR_DATA_LEN MOVACT_DATA_LEN //此传感器的事件标志 #define SENSOR_EVT ST_gyroscope_sensor_EVT //移动任务状态 #define APP_State_error 0xFF #define APP_State_off 0 #define APP_State_IDLE 1 #define APP_State_active 2 //移动任务配置 #define MOVINACT_INACT_TIMEOUT 10. // 10秒 #define GYR_Shake_THR 10.0 #define WOM_THR 10 //配置位掩码(sensor_mpu925.h 中定义的0-6位) #define MOV_WOM_ENABLE 0x0080 #define MOV_MASK_WOM_THRESHOLD 0x3C00 // TBD #define MOV_MASK_INACT_TIMEOUT 0xC000 // TBD /********* * typedef */ /********* *全局变量 */ uint32 t; //将时间设置为当前 Unix 时间戳(2018年9月5日@UTC 下午2:32) seconds_set (1536157938); /******* *局部变量 */ static Clock_Structurt periodicClock; static uint16_t sensorPeriod; static volatile bool sensorReadScheduled; static uint8_t sensorData[sensor_data_LEN]; //应用状态变量 // MPU 配置: //位0-2:加速计启用(z、y、x )/ 位3://启用 磁力计使能 //位7: WOM 使能 //位8-9:加速计范围(2、4、8、16) 静态 uint16_t mpuConfig; 静态 uint8_t appState; 静态易失性 bool mpuDataRdy; 静态 uint32_t nActivity; 静态 uint8_t movThreshold; 静态 uint8_t mpuIntStatus; 静态 uint8_t mpuIntstates;静态 uint8_t mives; /********* *本地函数 */ static void sensorChangeCB (uint8_t paramID); static void initCharacteristicValue (uint8_t paramID、uint8_t value、 uint8_t paramLen); 静态空 SensorTag_clockHandler (UArg arg); 静态空 appStateSet (uint8_t newState); 静态空 SensorTag_processInterrupt (void); / * profile 回调 */ static sensorCBs_t sensorCallback = { sensorChangeCB、//特征值更改回调 }; /********* *公共职能 */ *@fn SensorTagAG_processSensorEvent * *@SensorTag 运动传感器事件处理器简介。 * *@param none * *@return none */ void SensorTag_processSensorEvent (void) { if (sensorReadScheduled) }{ uint8_t 轴; Axes = mpuConfig & MPU_AX_ALL; 如果(轴!= ST_CFG_SENSOR_DISABLE)&&(轴!= ST_CFG_ERROR) { //获取中断状态(清除中断) mpuIntStatus = SensorMpu9250_irqStatus (); //过程陀螺仪和加速计 if (mpuDataRdy || appState == APP_State_active) { IF (mpuIntStatus 和 MPU_MOVement) { //检测到运动(小滤波器) nMods++; 如果(nModions == 2) { nActivity = MOVITY_INACT_CYCLES; } } 如果(mpuIntStatus 和 MPU_DATA_READY) { //读取陀螺仪数据 SensorMpu9250_gyroRead ((uint16_t*) sensorData); //读取加速计数据 SensorMpu9250_accRead ((uint16_t*) sensorData[6]); //获取当前 Unix 时间戳 t = seconds_get(); //将 t (即 uint32)存储到 sensorData 最后四个字节中。 sensorData[18]= t; sensorData[19]= t>>8; sensorData[20]= t>>16; sensorData[21]= t>>24; } mpuDataRdy = false; if (appState = app_State_active &&!!(mpuConfig & MPU_AX_MAG)) { uint8_t status; 状态= SensorMpu9250_magRead ((int16_t*)&sensorData[12]); //始终测量磁力计(非中断驱动) 如果(status =mag_bype_fail) { //出错时空闲 nActivity = 0; appState = app_State_error; } 否则(状态!= mag_status_OK) { SensorMpu9250_magReset(); } } 如果(nActivity >0) { if (appState!= app_State_active) { //转换到活动状态 appState = app_State_active; nModions = 0; if (SensorMpu9250_reset ()) { SensorMpu9250_enable (轴); } } IF (mpuConfig 和 MOV_WOM_ENABLE) { n 活动--; } //发送数据 Moving_SetParameter (sensor_data、sensor_data_LEN、sensorData); } 其他 { if (appState!= app_State_idle) { //从活动状态转换到空闲状态 nModions = 0; appState = app_State_Idle; if (SensorMpu9250_reset ()) { SensorMpu9250_enableWom (movThreshold); } } } sensorReadScheduled = false; } }
我仅包含了我要修改的 SensorTag_processorSensorEvent。
另一方面、如果我想要100Hz 的采样频率、我应该更改 SENSOR_DEFAULT_PERIOD、对吧?
相反,如果我在函数声明中使用 seconds_set(),如 SensorTag_init()
void SensorTagit_init (void) { //set time seconds_set (1536157938); //添加服务 Movement_addService (); //使用配置文件 Movement_registerAppCBs (&sensorCallbacks)注册回调; //初始化模块状态变量 ReadmpuConfig = ST_CFG_SENSOR_DISABLE; sensorPeriod= sensorApp_App_App_App_AppSchedules = false;sensorations_off;sensorModerned = sensorations_statement = sensorModerned;sensor if (SensorMpu9250_init() ){ SensorTagait_reset (); SensorMpu9250_registerCallback (SensorTag/TagprocessorInterrupt); } /初始化特征 initCharacteristic Value (sensor_peri、 sensor_default_period / sensor_period_resolution、 sizeof (uint8_t)); //为内部周期性事件创建连续时钟。 Util_constructClock (周期时钟、SensorTag_clockHandler、 1000、sensorPeriod、false、0); }
我得到以下结果:
您好、M-W、
随附了一个文件、其中包含我使用 LigthBlue Explore 从数据中读取的屏幕截图。 以及在其中每个 MOTION_DATA_LEN 上设置的字节数的说明。
您能指导我完成断点过程吗? 我不确定该怎么办...
谢谢、
Alejandra
尊敬的 M-W:
简单、光荣、美丽的 TI 监听器似乎无法正常工作... 未找到任何 BLE 器件。 :(
我尝试了以下教程: http://processors.wiki.ti.com/index.php/BLE_sniffer_guide
还有其他建议吗?
此外、您为什么说我没有实际观察到正确的值? 我将时间戳值放在数据数组的磁力计字节上、它们看起来是正确的。 我似乎不明白当涉及到22个字节时会发生什么情况...
您好、M-W、
我想念你:P
我仍然遇到22个字节的问题 (在大多数情况下)、非常奇怪... 我想现在我放弃了这个、我将发送时间戳而不是磁力计字节、因为我无论如何都不会使用它。
此外、我通过使用秒模块意识到我是个白痴、因为我需要的是毫秒分辨率。 是否还有任何方法也可以获得秒模块的毫秒数? 或者、我是否应该使用时间戳模块(正如您之前建议的、抱歉)、如下所示?
//在 Sensortag_mov.c #include 上 #include (笑声) void SensorTagaid_processSensorEvent (void) { ... 如果(mpuIntStatus 和 MPU_DATA_READY) { //读取陀螺仪数据 SensorMpu9250_gyroRead ((uint16_t*) sensorData); //读取加速计数据 SensorMpu9250_accRead ((uint16_t*) sensorData[6]); t = Timestamp_get32 (); sensorData[12]=t>>24; sensorData[13]= t>>16; sensorData[14]=t>>8; sensorData[15]= t; } (笑声) Moving_SetParameter (sensor_data、sensor_data_LEN、sensorData); }
在这种情况下、我是否能够获得一个时间戳来提供运动传感器的每个读数之间的差异(以毫秒为单位)?
此外、我不确定我应该如何使用时间戳频率和 Timestamp_getFreq (&freq);(在文档中、我应该使用它将时间戳值转换为实时单位、但我非常不清楚这是如何工作的)。 请指导我完成此过程吗?
谢谢、
Alejandra
尊敬的 M-W:
我有 USB 软件狗、我尝试将其与"数据包监听器"(支持 BLE 的软件包监听器)配合使用、但我无法开始数据包捕获、我始终会收到错误噪声。
我正在尝试使用 SmartRF 闪存编程器更新软件狗的固件(我还安装了 Smart RF Studio、因此我可以安装 CEBAL 驱动程序) 、但我无法在闪存编程器中看到软件狗、我是否还需要考虑其他事项?
谢谢、
Alejandra
尊敬的 M-W:
我没有获得对软件狗进行编程所需的 CC 调试器。
如果可能、我会尝试获取一个软件狗、现在我更改了软件狗的驱动器、并且能够将其与美丽的软件包监听器配合使用、因此现在可以了。
我制作了一个连接到 sensortag 的 Android 应用程序、每5秒开始读取/停止读取数据。 (它在5秒内读取、然后停止读取、并且开始再次读取、总共25秒)
我在此次采集过程中使用了监听器(随附文件)、但我不确定如何解读它。 您是否有关于如何解读接收到的数据包的指南? 我特别感兴趣的是检查从移动服务传输的数据。
我目前使用此作为指南: http://processors.wiki.ti.com/index.php/BLE_sniffer_guide
e2e.ti.com/.../Acquisition-5_2D00_5.psd
您好、M-W、
目前我没有任何黄色字段、从我的应用的调试器中、我可以看到数据正在传输、但在监听器上、我没有任何与连接包相关的内容。 我只有广播包。
即使我返回到 SensorTag 应用程序和未修改的固件、我仍然只能获取广播包。
我转到 Peripheral.c 来设置 gapRole_AdvChanMap = GAP_ADVCHAN_37;并将监听器中的通道设置为37以查看是否有任何更改、但行为保持不变。 (对38和39也是如此)
此外、我尝试将监听器上的发起方地址设置为手机地址和 sensortag 地址。
我还尝试在不那么拥挤的环境中测试这一点、但仍然没有。
附件是我通常看到的内容的屏幕截图。
我几乎确定。
是否有任何迹象表明器件实际上正在重新启动?
我对每节电池进行了5次测试、使用相同 的应用程序以100Hz 的频率运行、使用相同的 CC2650、无需修改或重新加载固件。
我使用的是 Energizer CR2032和 Duracel DL2032 (根据我的理解、它们是相同的电池、应该具有相同的行为)
首先、我使用了 Duracel 电池、并且能够以~100Hz 的频率采集数据。 (此频率由 总样本/测试持续时间以及样本之间的平均时间戳差决定)
然后、我使用了 Energizer 电池、在5次采集中、频率均下降至~30Hz。
我觉得很奇怪,我似乎不能理解这种行为。
最棒的
Alejandra
您好、M-W、
神秘更新:我对每个电池进行了五次测试、每次测试1分钟、Duracel Keept 以~ 100Hz 的频率运行、而 Energizer 的测试如下:
测试1: ~ 33.28Hz
测试 2:~ 42。 84 Hz
测试 3:~ 63.18Hz
测试 4:~ 86.58Hz
测试 5:~ 100Hz
我觉得这更奇怪、但与我之前经历的频率行为一致。 有什么关于为什么会发生这种情况的想法?