[STM32WB]【STM32WB09KE测评】-进阶任务-芯片温度自动上报


一、进阶方向小项目背景
STM32WB09KE芯片自带了一个测量芯片结温的温度传感器,计划将该传感器数据通过蓝牙BLE发送出去。当中心设备开启Notify功能后,该传感器数据每隔1s发送一次,避免手动刷新。

二、用到的硬件模块
测量芯片温度使用到了ADC模块,发送间隔使用到了TIM2模块,无线传输用到了BLE模块。
ADC模块配置:
 


TIM2模块配置:
 


BLE模块配置:

 


 



 




三、核心代码
主函数主要是初始化各种时钟,外设,然后进入UTIL序列运行状态。

复制
int main(void)

{



  /* USER CODE BEGIN 1 */



  /* USER CODE END 1 */



  /* MCU Configuration--------------------------------------------------------*/



  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */

  HAL_Init();



  /* USER CODE BEGIN Init */



  /* USER CODE END Init */



  /* Configure the system clock */

  SystemClock_Config();



  /* Configure the peripherals common clocks */

  PeriphCommonClock_Config();



  /* USER CODE BEGIN SysInit */



  /* USER CODE END SysInit */



  /* Initialize all configured peripherals */

  MX_GPIO_Init();

  MX_USART1_UART_Init();

  MX_RNG_Init();

  MX_RADIO_Init();

  MX_RADIO_TIMER_Init();

  MX_PKA_Init();

  MX_ADC1_Init();

  MX_TIM2_Init();

  /* USER CODE BEGIN 2 */

  if (HAL_ADC_Start(&hadc1) != HAL_OK)

  {

    /* Error: ADC conversion start could not be performed */

    Error_Handler();

  }

  printf("** ADC Started ** \n\r");

  /* Start Channel1 */

  if (HAL_TIM_Base_Start_IT(&htim2) != HAL_OK)

  {

    /* Starting Error */

    Error_Handler();

  }

  printf("** Tim2 Started ** \n\r");

  /* USER CODE END 2 */



  /* Init code for STM32_BLE */

  MX_APPE_Init(NULL);



  /* Infinite loop */

  /* USER CODE BEGIN WHILE */

  while (1)

  {

    /* USER CODE END WHILE */

    MX_APPE_Process();



    /* USER CODE BEGIN 3 */

  }

  /* USER CODE END 3 */

}


在初始化的过程中会注册多个UTIL TASK,其中就包括注册触发发送传感器数据的UTIL任务:

复制
UTIL_SEQ_RegTask(1U << CFG_TASK_SIMPLEBLEAUTONOTIFY, UTIL_SEQ_RFU, APPE_SimpleBLENotifyAction);

该Task的触发是在TIM2的ISR内:

复制
void TIM2_IRQHandler(void)

{

  /* USER CODE BEGIN TIM2_IRQn 0 */



  /* USER CODE END TIM2_IRQn 0 */

  HAL_TIM_IRQHandler(&htim2);

  /* USER CODE BEGIN TIM2_IRQn 1 */

  HAL_GPIO_TogglePin(PB1_LD1_BLUE_GPIO_Port, PB1_LD1_BLUE_Pin);

  UTIL_SEQ_SetTask(1U << CFG_TASK_SIMPLEBLEAUTONOTIFY, CFG_SEQ_PRIO_0);

  /* USER CODE END TIM2_IRQn 1 */

}

该函数进而触发具体的发送函数:
 

复制
void APPE_SimpleBLENotifyAction(void)

{

  if (bleAppContext.Device_Connection_Status == APP_BLE_CONNECTED_SERVER)

  {

    UTIL_SEQ_SetTask( 1<<<span style="background-color:#ffffff;padding:0px 0px 0px 2px;"><span style="color:#000000;background-color:#ffffff;font-family:&quot;Courier New&quot;;font-size:10pt;white-space:pre;"><span style="color:#000000;"></span><span style="color:#0000c0;background-color:#d4d4d4;font-style:italic;">CFG_TASK_SIMPLEBLESEND_NOTIF</span></span></span>, CFG_SEQ_PRIO_0);

  }



  return;

}


进而调用注册在TEMPSENSOR_APP_Init函数中的UTIL序列任务,用于发送传感器更新值。

复制
void TEMPSENSOR_APP_Init(void)

{

  TEMPSENSOR_APP_Context.ConnectionHandle = 0xFFFF;

  TEMPSENSOR_Init();



  /* USER CODE BEGIN Service1_APP_Init */

  UTIL_SEQ_RegTask( 1U << CFG_TASK_SIMPLEBLESEND_NOTIF, UTIL_SEQ_RFU, TEMPSENSOR_Senval_SendNotification);

  TEMPSENSOR_APP_Context.Senval_Notification_Status = Senval_NOTIFICATION_OFF;

  /* USER CODE END Service1_APP_Init */

  return;

}


当中心设备开启Notify功能后:

复制
void TEMPSENSOR_Notification(TEMPSENSOR_NotificationEvt_t *p_Notification)

{

  /* USER CODE BEGIN Service1_Notification_1 */



  /* USER CODE END Service1_Notification_1 */

  switch(p_Notification->EvtOpcode)

  {

    /* USER CODE BEGIN Service1_Notification_Service1_EvtOpcode */



    /* USER CODE END Service1_Notification_Service1_EvtOpcode */



    case TEMPSENSOR_SENVAL_READ_EVT:

      /* USER CODE BEGIN Service1Char1_READ_EVT */



      /* USER CODE END Service1Char1_READ_EVT */

      break;



    case TEMPSENSOR_SENVAL_NOTIFY_ENABLED_EVT:

      /* USER CODE BEGIN Service1Char1_NOTIFY_ENABLED_EVT */

            TEMPSENSOR_APP_Context.Senval_Notification_Status = Senval_NOTIFICATION_ON;

      /* USER CODE END Service1Char1_NOTIFY_ENABLED_EVT */

      break;



    case TEMPSENSOR_SENVAL_NOTIFY_DISABLED_EVT:

      /* USER CODE BEGIN Service1Char1_NOTIFY_DISABLED_EVT */

            TEMPSENSOR_APP_Context.Senval_Notification_Status = Senval_NOTIFICATION_OFF;

      /* USER CODE END Service1Char1_NOTIFY_DISABLED_EVT */

      break;



    default:

      /* USER CODE BEGIN Service1_Notification_default */



      /* USER CODE END Service1_Notification_default */

      break;

  }

  /* USER CODE BEGIN Service1_Notification_2 */



  /* USER CODE END Service1_Notification_2 */

  return;

}


WB09就可以根据notification_on_off 标志位来判断是否发送更新值,代码如下:

复制
__USED void TEMPSENSOR_Senval_SendNotification(void) /* Property Notification */

{

  TEMPSENSOR_APP_SendInformation_t notification_on_off = Senval_NOTIFICATION_OFF;

  TEMPSENSOR_Data_t tempsensor_notification_data;



  tempsensor_notification_data.p_Payload = (uint8_t*)a_TEMPSENSOR_UpdateCharData;

  tempsensor_notification_data.Length = 0;



  /* USER CODE BEGIN Service1Char1_NS_1*/

  HAL_ADC_PollForConversion(&hadc1, 50);

  a_TEMPSENSOR_UpdateCharData[0] = __LL_ADC_CALC_TEMPERATURE( HAL_ADC_GetValue(&hadc1), LL_ADC_DS_DATA_WIDTH_12_BIT);

  tempsensor_notification_data.Length = 1;



  printf("\r\na_TEMPSENSOR_UpdateCharData[0] = %d , HAL_ADC_VAL = %d", 

a_TEMPSENSOR_UpdateCharData[0], __LL_ADC_CALC_TEMPERATURE( 

HAL_ADC_GetValue(&hadc1), LL_ADC_DS_DATA_WIDTH_12_BIT));

  /* USER CODE END Service1Char1_NS_1*/

  notification_on_off = TEMPSENSOR_APP_Context.Senval_Notification_Status;



  if (notification_on_off != Senval_NOTIFICATION_OFF && TEMPSENSOR_APP_Context.ConnectionHandle != 0xFFFF)

  {

    TEMPSENSOR_NotifyValue(TEMPSENSOR_SENVAL, &tempsensor_notification_data, TEMPSENSOR_APP_Context.ConnectionHandle);

  }



  /* USER CODE BEGIN Service1Char1_NS_Last*/



  /* USER CODE END Service1Char1_NS_Last*/



  return;

}




四、测试结果见附件。
 

 芯片温度自动上报.zip (2.66 MB)。
---------------------
作者:YangTwo
链接:https://bbs.21ic.com/icview-3412470-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值