[传感器MCU驱动例程] LSM6DSL读取数据STM32L4R5中断方式

littleshrimp   2018-6-28 22:30 楼主

使用STMems_Standard_C_drivers库
先通过lsm6dsl_pin_int1_route_set(&dev_ctx,lsm6dsl_int1_route);函数设置传感器DRDY中断输出引脚为INT1
再循环检测INT1引脚电平,产生中断后先读取状态寄存器再读取加速度、陀螺仪和温度传感器数据
  1. /* datalog_int1 Example --------------------------------------------------------------*/
  2. void datalog_int1(void)
  3. {
  4.   /*
  5.    *  Initialize mems driver interface
  6.    */
  7.   dev_ctx.write_reg = platform_write;
  8.   dev_ctx.read_reg = platform_read;
  9.   dev_ctx.handle = &hi2c1;  
  10.   
  11.   /*
  12.    *  Check device ID
  13.    */
  14.   whoamI = 0;
  15.   lsm6dsl_device_id_get(&dev_ctx, &whoamI);
  16.   if ( whoamI != LSM6DSL_ID )
  17.     while(1); /*manage here device not found */
  18.   /*
  19.    *  Restore default configuration
  20.    */
  21.   lsm6dsl_reset_set(&dev_ctx, PROPERTY_ENABLE);
  22.   do {
  23.     lsm6dsl_reset_get(&dev_ctx, &rst);
  24.   } while (rst);
  25.   /*
  26.    *  Enable Block Data Update
  27.    */
  28.   lsm6dsl_block_data_update_set(&dev_ctx, PROPERTY_ENABLE);
  29.   /*
  30.    * Set Output Data Rate
  31.    */
  32.   lsm6dsl_xl_data_rate_set(&dev_ctx, LSM6DSL_XL_ODR_12Hz5);
  33.   lsm6dsl_gy_data_rate_set(&dev_ctx, LSM6DSL_GY_ODR_12Hz5);
  34.   /*
  35.    * Set full scale
  36.    */  
  37.   lsm6dsl_xl_full_scale_set(&dev_ctx, LSM6DSL_2g);
  38.   lsm6dsl_gy_full_scale_set(&dev_ctx, LSM6DSL_2000dps);
  39.   
  40.   /*
  41.    * Configure filtering chain(No aux interface)
  42.    */  
  43.   /* Accelerometer - analog filter */
  44.   lsm6dsl_xl_filter_analog_set(&dev_ctx, LSM6DSL_XL_ANA_BW_400Hz);
  45.   
  46.   /* Accelerometer - LPF1 path ( LPF2 not used )*/
  47.   //lsm6dsl_xl_lp1_bandwidth_set(&dev_ctx, LSM6DSL_XL_LP1_ODR_DIV_4);
  48.   
  49.   /* Accelerometer - LPF1 + LPF2 path */   
  50.   lsm6dsl_xl_lp2_bandwidth_set(&dev_ctx, LSM6DSL_XL_LOW_NOISE_LP_ODR_DIV_100);
  51.   
  52.   /* Accelerometer - High Pass / Slope path */
  53.   //lsm6dsl_xl_reference_mode_set(&dev_ctx, PROPERTY_DISABLE);
  54.   //lsm6dsl_xl_hp_bandwidth_set(&dev_ctx, LSM6DSL_XL_HP_ODR_DIV_100);
  55.   
  56.   /* Gyroscope - filtering chain */
  57.   lsm6dsl_gy_band_pass_set(&dev_ctx, LSM6DSL_HP_260mHz_LP1_STRONG);
  58.   
  59.   //使能加速度和陀螺仪DRDY中断
  60.   lsm6dsl_int1_route_t lsm6dsl_int1_route;
  61.   lsm6dsl_int1_route.int1_drdy_xl = 1;
  62.   lsm6dsl_int1_route.int1_drdy_g = 1;
  63.   lsm6dsl_pin_int1_route_set(&dev_ctx,lsm6dsl_int1_route);
  64.   /*
  65.    * Read samples in polling mode (no int)
  66.    */
  67.   while(1)
  68.   {
  69.     if(int1_flag == 1)
  70.     {
  71.       int1_flag = 0;
  72.       /*
  73.        * Read output only if new value is available
  74.        */
  75.       lsm6dsl_reg_t reg;
  76.       lsm6dsl_status_reg_get(&dev_ctx, ®.status_reg);
  77.       if (reg.status_reg.xlda)
  78.       {
  79.         /* Read magnetic field data */
  80.         memset(data_raw_acceleration.u8bit, 0x00, 3*sizeof(int16_t));
  81.         lsm6dsl_acceleration_raw_get(&dev_ctx, data_raw_acceleration.u8bit);
  82.         acceleration_mg[0] = LSM6DSL_FROM_FS_2g_TO_mg( data_raw_acceleration.i16bit[0]);
  83.         acceleration_mg[1] = LSM6DSL_FROM_FS_2g_TO_mg( data_raw_acceleration.i16bit[1]);
  84.         acceleration_mg[2] = LSM6DSL_FROM_FS_2g_TO_mg( data_raw_acceleration.i16bit[2]);
  85.         
  86.         sprintf((char*)tx_buffer, "Acceleration [mg]:%4.2f\t%4.2f\t%4.2f\r\n",
  87.                 acceleration_mg[0], acceleration_mg[1], acceleration_mg[2]);
  88.         tx_com( tx_buffer, strlen( (char const*)tx_buffer ) );
  89.       }
  90.       if (reg.status_reg.gda)
  91.       {
  92.         /* Read magnetic field data */
  93.         memset(data_raw_angular_rate.u8bit, 0x00, 3*sizeof(int16_t));
  94.         lsm6dsl_angular_rate_raw_get(&dev_ctx, data_raw_angular_rate.u8bit);
  95.         angular_rate_mdps[0] = LSM6DSL_FROM_FS_2000dps_TO_mdps(data_raw_angular_rate.i16bit[0]);
  96.         angular_rate_mdps[1] = LSM6DSL_FROM_FS_2000dps_TO_mdps(data_raw_angular_rate.i16bit[1]);
  97.         angular_rate_mdps[2] = LSM6DSL_FROM_FS_2000dps_TO_mdps(data_raw_angular_rate.i16bit[2]);
  98.         
  99.         sprintf((char*)tx_buffer, "Angular rate [mdps]:%4.2f\t%4.2f\t%4.2f\r\n",
  100.                 angular_rate_mdps[0], angular_rate_mdps[1], angular_rate_mdps[2]);
  101.         tx_com( tx_buffer, strlen( (char const*)tx_buffer ) );
  102.       }   
  103.       if (reg.status_reg.tda)
  104.       {   
  105.         /* Read temperature data */
  106.         memset(data_raw_temperature.u8bit, 0x00, sizeof(int16_t));
  107.         lsm6dsl_temperature_raw_get(&dev_ctx, data_raw_temperature.u8bit);
  108.         temperature_degC = LSM6DSL_FROM_LSB_TO_degC( data_raw_temperature.i16bit );
  109.          
  110.         sprintf((char*)tx_buffer, "Temperature [degC]:%6.2f\r\n", temperature_degC );
  111.         tx_com( tx_buffer, strlen( (char const*)tx_buffer ) );
  112.       }
  113.     }
  114.   }
  115. }



工程文件:
stm32l4r5 datalog int1.rar (9.52 MB)
(下载次数: 302, 2018-6-28 22:30 上传)

虾扯蛋,蛋扯虾,虾扯蛋扯虾

回复评论 (6)

能给我一个联系方式吗?扣扣或者微信都行,有几个地方没有搞懂或者你家我的扣扣921288716,谢谢
点赞  2018-7-3 16:08
引用: 曹伟1993 发表于 2018-7-3 16:08
能给我一个联系方式吗?扣扣或者微信都行,有几个地方没有搞懂或者你家我的扣扣921288716,谢谢

144050柒22酒
消息不能插图片,低通,低噪声,带宽为ODR/100
QQ图片20180703173431.png

QQ图片20180703174022.png

QQ图片20180703174229.png
虾扯蛋,蛋扯虾,虾扯蛋扯虾
点赞  2018-7-3 17:48

请问为什么我用同样的方式利用中断读取数据,中断只能进入一次,下面是我的配置代码:

  lsm9ds1_pin_int1_route_t lsm9ds1_pin_int1_route;
  lsm9ds1_pin_int1_route.int1_ig_xl = 1;
  lsm9ds1_pin_int1_route.int1_drdy_xl = 1;
  lsm9ds1_pin_int1_route_set(&dev_ctx_imu, lsm9ds1_pin_int1_route);

点赞  2019-8-1 11:14
引用: duguyining 发表于 2019-8-1 11:14 请问为什么我用同样的方式利用中断读取数据,中断只能进入一次,下面是我的配置代码:   lsm9ds1_p ...

请问你问题解决了嘛?我也遇到类似的问题了,可以进中断但过一个时间段会卡死

点赞  2019-11-7 09:15
引用: duguyining 发表于 2019-8-1 11:14
请问为什么我用同样的方式利用中断读取数据,中断只能进入一次,下面是我的配置代码:

  lsm9ds1_p ...

数据要在下次中断出发前读取
点赞  2019-11-8 09:04
引用: houlai 发表于 2019-11-7 09:15
请问你问题解决了嘛?我也遇到类似的问题了,可以进中断但过一个时间段会卡死

数据要在下次中断出发前读取
点赞  2019-11-8 09:05
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复