你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32CUBEMX驱动TMOS模块STHS34PF80之中断获取信号(4)

[复制链接]
攻城狮Melo 发布时间:2023-11-16 18:17
套件概述
HS34PF80的数据准备信号提供了一种机制,允许设备在新的测量数据可读取时通知系统,并触发同步操作,通过正确配置相关寄存器,可以确保系统及时捕获和处理来自设备的新数据,从而提高整体性能和响应能力。

检测人体的存在和动作,并通过特定的通信接口发送检测结果。

微信图片_20231116181648.png


参考程序中断

微信图片_20231116181645.png

中断生成
STHS34PF80具有一个可配置的内置中断生成块,允许基于温度数据样本和嵌入式智能数字算法的输出标志生成中断事件。

STHS34PF80提供了一个专门的INT引脚,用于通知数据是否准备好。您可以通过配置相关寄存器,将数据准备好的信号(DRDY信号)路由到这个INT引脚。当新的测量数据可读取时,这个引脚会被触发,从而允许系统知道数据已经准备好并可供进一步的处理和读取。

微信图片_20231116181641.png

设置中断
设置中断可以通过CTRL3 (22h)寄存器来配置。

这个寄存器为系统提供了有关设备当前状态的关键信息,可以用于驱动其他逻辑或触发相应的操作,如中断服务例程。例如,PRES_FLAG可用于确定是否有人进入了一个区域,MOT_FLAG可以用于检测人体是否运动,TAMB_SHOCK_FLAG可能用于环境监控系统以捕捉突然的温度变化。

微信图片_20231116181638.png


通过查看FUNC_STATUS (25h)可以得知,PRES_FLAG为存在检测,MOT_FLAG为运动检测,TAMB_SHOCK_FLAG为环境温度冲击检测标志。

微信图片_20231116181635.png

开启存在检测中断输出
sths34pf80_tmos_int_or_set 的主要目的是配置STHS34PF80设备的中断输出。它是用于设置和管理中断标志,其中STHS34PF80_TMOS_INT_PRESENCE为0x4,就是使能INT_MSK2为1,开启PRES_FLAG存在检测。
  1.   /* Set interrupt */
  2.   sths34pf80_tmos_int_or_set(STHS34PF80_ADDRESS, STHS34PF80_TMOS_INT_PRESENCE);
复制代码

具体操作函数如下所示。
  1. /**
  2.   * @brief  Selects interrupts output.[set]
  3.   *
  4.   * @param  ctx      read / write interface definitions
  5.   * @param  val      TMOS_INT_NONE, TMOS_INT_TSHOCK, TMOS_INT_MOTION, TMOS_INT_TSHOCK_MOTION, TMOS_INT_PRESENCE, TMOS_INT_TSHOCK_PRESENCE, TMOS_INT_MOTION_PRESENCE, TMOS_INT_ALL,
  6.   * @retval          interface status (MANDATORY: return 0 -> no Error)
  7.   *
  8.   */
  9. uint8_t sths34pf80_tmos_int_or_set(uint8_t add, sths34pf80_tmos_int_or_t val)
  10. {
  11.   sths34pf80_ctrl3_t ctrl3;
  12.   int32_t ret;

  13.   ret = sths34pf80_read_reg(add, STHS34PF80_CTRL3, (uint8_t *)&ctrl3, 1);

  14.   if (ret == HAL_OK)
  15.   {
  16.     ctrl3.int_msk = ((uint8_t)val & 0x7U);
  17.     ret = sths34pf80_write_reg(add, STHS34PF80_CTRL3, (uint8_t *)&ctrl3, 1);
  18.   }

  19.   return ret;
  20. }
复制代码

配置中断管脚
通过配置CTRL3 (22h)寄存器的IEN[1:0] 可以设置输出模式。
IEN[1:0]位在CTRL3寄存器中,它定义了应该将哪种信号路由到INT管脚(即中断输出):
00:INT管脚处于高阻态。
01:将DRDY(数据已准备好的信号)路由到INT管脚。
10:将INT_OR信号路由到INT管脚。

这里通过将CTRL3(22h)寄存器的IEN[1:0]位范围设置为10,可以将STATUS(23h)寄存器的DRDY位的值驱动到INT引脚,操作如下所示。

  1. sths34pf80_tmos_route_int_set(STHS34PF80_ADDRESS, STHS34PF80_TMOS_INT_OR);
复制代码

具体的操作函数如下所示。这个函数基本上对应之前提到的IEN[1:0]位的功能,它允许用户选择要路由到中断输出管脚的特定中断信号。

  1. /**
  2.   * @defgroup Interrupt PINs
  3.   * @brief    Interrupt PINs
  4.   * @{/
  5.   *
  6.   */
  7. /**
  8.   * @brief  Selects interrupts to be routed.[set]
  9.   *
  10.   * @param  ctx      read / write interface definitions
  11.   * @param  val      TMOS_INT_HIZ, TMOS_INT_DRDY, TMOS_INT_OR,
  12.   * @retval          interface status (MANDATORY: return 0 -> no Error)
  13.   *
  14.   */
  15. uint8_t sths34pf80_tmos_route_int_set(uint8_t add,  sths34pf80_tmos_route_int_t val)
  16. {
  17.   sths34pf80_ctrl3_t ctrl3;
  18.   int32_t ret;


  19.   ret = sths34pf80_read_reg(add, STHS34PF80_CTRL3, (uint8_t *)&ctrl3, 1);


  20.   if (ret == HAL_OK)
  21.   {
  22.     ctrl3.ien = ((uint8_t)val & 0x3U);
  23.     if (val == STHS34PF80_TMOS_INT_OR) {
  24.       ctrl3.int_latched = 0; /* guarantee that latched is zero in INT_OR case */
  25.     }
  26.     ret = sths34pf80_write_reg(add, STHS34PF80_CTRL3, (uint8_t *)&ctrl3, 1);
  27.   }


  28.   return ret;
  29. }
复制代码

主程序
初始化如下。
  1.   /* USER CODE BEGIN 2 */
  2. sths34pf80_lpf_bandwidth_t lpf_m, lpf_p, lpf_p_m, lpf_a_t;  
  3.   sths34pf80_tmos_drdy_status_t status;  
  4.   sths34pf80_tmos_func_status_t func_status;  
  5.   
  6.   
  7.   
  8.   
  9.   HAL_Delay(200);  
  10.   printf("123");
  11.   uint8_t STHS34PF80_ID =STHS34PF80_getChipID(STHS34PF80_ADDRESS);
  12.   printf("STHS34PF80_ID=0x%x\n",STHS34PF80_ID);  
  13.   if (STHS34PF80_ID != 0xD3)
  14.     while(1);
  15. /* Set averages (AVG_TAMB = 8, AVG_TMOS = 32) */
  16.   sths34pf80_avg_tobject_num_set(STHS34PF80_ADDRESS, STHS34PF80_AVG_TMOS_32);
  17.   sths34pf80_avg_tambient_num_set(STHS34PF80_ADDRESS, STHS34PF80_AVG_T_8);

  18.   /* read filters */
  19.   sths34pf80_lpf_m_bandwidth_get(STHS34PF80_ADDRESS, &lpf_m);
  20.   sths34pf80_lpf_p_bandwidth_get(STHS34PF80_ADDRESS, &lpf_p);
  21.   sths34pf80_lpf_p_m_bandwidth_get(STHS34PF80_ADDRESS, &lpf_p_m);
  22.   sths34pf80_lpf_a_t_bandwidth_get(STHS34PF80_ADDRESS, &lpf_a_t);

  23. printf("lpf_m: %02d, lpf_p: %02d, lpf_p_m: %02d, lpf_a_t: %02d\r\n", lpf_m, lpf_p, lpf_p_m, lpf_a_t);
  24.   
  25.     /* Set BDU */
  26.   sths34pf80_block_data_update_set(STHS34PF80_ADDRESS, 1);
  27.   sths34pf80_tmos_route_int_set(STHS34PF80_ADDRESS, STHS34PF80_TMOS_INT_OR);

  28.   
  29.   sths34pf80_presence_threshold_set(STHS34PF80_ADDRESS, 20);  //设置存在阈值。
  30.   sths34pf80_presence_hysteresis_set(STHS34PF80_ADDRESS, 2);//“存在滞后”(Presence Hysteresis)的函数
  31.   sths34pf80_motion_threshold_set(STHS34PF80_ADDRESS, 30);//设置动作阈值
  32.   sths34pf80_motion_hysteresis_set(STHS34PF80_ADDRESS, 3);  动作滞后”(Motion Hysteresis)的函数
  33.   
  34.   /* Set interrupt */
  35.   sths34pf80_tmos_int_or_set(STHS34PF80_ADDRESS, STHS34PF80_TMOS_INT_PRESENCE);
  36.   sths34pf80_tmos_route_int_set(STHS34PF80_ADDRESS, STHS34PF80_TMOS_INT_OR);
  37.   
  38.   
  39.   /* Set ODR */
  40.   sths34pf80_tmos_odr_set(STHS34PF80_ADDRESS, STHS34PF80_TMOS_ODR_AT_30Hz);

  41.     int32_t cnt = 0;
  42.   /* USER CODE END 2 */
复制代码

main函数如下所示。
  1.   /* Infinite loop */
  2.   /* USER CODE BEGIN WHILE */
  3.   while (1)
  4.   {
  5. //    sths34pf80_tmos_drdy_status_get(STHS34PF80_ADDRESS, &status);
  6. //    if (status.drdy)
  7. //    {
  8. //      sths34pf80_tmos_func_status_get(STHS34PF80_ADDRESS, &func_status);
  9. //      printf("-->环境温度冲击检测标志位 %d - 存在检测标志位 %d - 运动检测标志位 %d\r\n",func_status.tamb_shock_flag, func_status.pres_flag, func_status.mot_flag);
  10. //   }
  11.    
  12.    
  13.     printf("PA7=%d",HAL_GPIO_ReadPin  ( GPIOA, GPIO_PIN_7));
  14.    
  15.    
  16.     sths34pf80_tmos_func_status_t func_status;
  17.     uint8_t motion;
  18.     uint8_t presence;   
  19.     /* handle event in a "thread" alike code */
  20.     if(HAL_GPIO_ReadPin  ( GPIOA, GPIO_PIN_7))
  21.     {
  22.       motion = 0;
  23.       presence = 0;

  24.       do {
  25.         sths34pf80_tmos_func_status_get(STHS34PF80_ADDRESS, &func_status);

  26.         if (func_status.pres_flag != presence)
  27.         {
  28.           presence = func_status.pres_flag;

  29.           if (presence) {
  30.             printf("Start of Presence\r\n");

  31.           } else {
  32.             printf("End of Presence\r\n");            

  33.           }
  34.         }

  35.         if (func_status.mot_flag != motion)
  36.         {
  37.           motion = func_status.mot_flag;

  38.           if (motion) {
  39.             printf("Motion Detected!\r\n");            
  40.             
  41.           }
  42.         }
  43.       } while (func_status.pres_flag);
  44.         
  45.    
  46.    
  47.     }
  48.    
  49.    
  50.       HAL_Delay(1000);   
  51.    
  52.     /* USER CODE END WHILE */

  53.     /* USER CODE BEGIN 3 */
  54.   }
  55.   /* USER CODE END 3 */
复制代码

测试结果
在未有人的情况下。

微信图片_20231116181630.png

在人体纯在情况下。

微信图片_20231116181610.png

转载自:记帖
如有侵权请联系删除


收藏 评论0 发布时间:2023-11-16 18:17

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版