835|3

136

帖子

2

TA的资源

一粒金砂(高级)

楼主
 

【ST NUCLEO-WB09KE测评】-8-从零创建BLE GATT空白工程 [复制链接]

本帖最后由 慕容雪花 于 2024-9-16 23:18 编辑

官方指导文档: LAT1309 一步一步创建STM32WBA BLE_Custom工程

 

第一步:在CUBEIDE里面,根据芯片型号选择WB09KEV6

 
 
接着配置串口

 

接着配置调试接口

 

使能RADIO TIMER

 

接着使能RADIO

 

接着配置时钟:

 

最后使能STM32 BLE:

 

创建一个GATT SERVER应用:
 
 
 
 
 
 

 

点击保存,自动生成代码。在

调试运行发现,一直在RADIO TIMER初始化程序卡住,后来参考官方例程,对RADIO时钟源进行了如下修改。

 

 

整个创建BLE空白工程的过程十分方便,只需要根据智能提示依次配置BLE所需的模块,最后创建Service,增加Characteristic,即可生成几乎所有的代码。

最后在APP_BLE_Init()函数里面增加下面的函数来开启广播,一切搞定!

  /* USER CODE BEGIN APP_BLE_Init_2 */
  APP_BLE_Procedure_Gap_Peripheral(PROC_GAP_PERIPH_ADVERTISE_START_FAST);
  /* USER CODE END APP_BLE_Init_2 */

打开BLE DONGE,可以扫描到WB09-KE开发板发出的广播信号:

 

 

目前Characteristic没有使能读,写,通知等特性,下面增加一个读的特性。在Cubeide里面增加即可,然后自动生成代码。

 

进入到Event handler里面,增加应用代码:

static BLEEVT_EvtAckStatus_t TEMPSENSOR_EventHandler(aci_blecore_event *p_evt)
{
  BLEEVT_EvtAckStatus_t return_value = BLEEVT_NoAck;
  aci_gatt_srv_read_event_rp0    *p_read;
  /* USER CODE BEGIN Service1_EventHandler_1 */
  uint8_t mgc_val_len;
  static uint8_t mgc_val_buff[2]={0};;
  uint8_t attr_error_code = BLE_ATT_ERR_NONE;
  /* USER CODE END Service1_EventHandler_1 */

  switch(p_evt->ecode)
  {
    case ACI_GATT_SRV_ATTRIBUTE_MODIFIED_VSEVT_CODE:
    {
      /* USER CODE BEGIN EVT_BLUE_GATT_ATTRIBUTE_MODIFIED_BEGIN */

      /* USER CODE END EVT_BLUE_GATT_ATTRIBUTE_MODIFIED_BEGIN */

      /* USER CODE BEGIN EVT_BLUE_GATT_ATTRIBUTE_MODIFIED_END */

      /* USER CODE END EVT_BLUE_GATT_ATTRIBUTE_MODIFIED_END */
      break;/* ACI_GATT_SRV_ATTRIBUTE_MODIFIED_VSEVT_CODE */
    }
    case ACI_GATT_SRV_READ_VSEVT_CODE :
    {
      /* USER CODE BEGIN EVT_BLUE_GATT_SRV_READ_BEGIN */

      /* USER CODE END EVT_BLUE_GATT_SRV_READ_BEGIN */
      p_read = (aci_gatt_srv_read_event_rp0*)p_evt->data;
	  if(p_read->Attribute_Handle == (TEMPSENSOR_Context.SenvalCharHdle + CHARACTERISTIC_VALUE_ATTRIBUTE_OFFSET))
	  {
		return_value = BLEEVT_Ack;
		/*USER CODE BEGIN Service1_Char_1_ACI_GATT_SRV_READ_VSEVT_CODE_1 */
#warning user shall call aci_gatt_srv_read_resp() function if allowed
		/*USER CODE END Service1_Char_1_ACI_GATT_SRV_READ_VSEVT_CODE_1 */

		/*USER CODE BEGIN Service1_Char_1_ACI_GATT_SRV_READ_VSEVT_CODE_2 */
		mgc_val_len = 2;
		mgc_val_buff[0] = mgc_val_buff[0] + 1;
		mgc_val_buff[1] = mgc_val_buff[1] + 2;
		aci_gatt_srv_resp(p_read->Connection_Handle,BLE_GATT_UNENHANCED_ATT_L2CAP_CID,p_read->Attribute_Handle,attr_error_code,mgc_val_len,mgc_val_buff);

		  /*USER CODE END Service1_Char_1_ACI_GATT_SRV_READ_VSEVT_CODE_2 */
	  } /* if(p_read->Attribute_Handle == (TEMPSENSOR_Context.SenvalCharHdle + CHARACTERISTIC_VALUE_ATTRIBUTE_OFFSET))*/

      /* USER CODE BEGIN EVT_BLUE_GATT_SRV_READ_END */

      /* USER CODE END EVT_EVT_BLUE_GATT_SRV_READ_END */
      break;/* ACI_GATT_SRV_READ_VSEVT_CODE */
    }
    case ACI_GATT_SRV_WRITE_VSEVT_CODE:
    {
      /* USER CODE BEGIN EVT_BLUE_SRV_GATT_BEGIN */

      /* USER CODE END EVT_BLUE_SRV_GATT_BEGIN */

      /* USER CODE BEGIN EVT_BLUE_GATT_SRV_WRITE_END */

      /* USER CODE END EVT_BLUE_GATT_SRV_WRITE_END */
      break;/* ACI_GATT_SRV_WRITE_VSEVT_CODE */
    }
    case ACI_GATT_TX_POOL_AVAILABLE_VSEVT_CODE:
    {
      aci_gatt_tx_pool_available_event_rp0 *p_tx_pool_available_event;
      p_tx_pool_available_event = (aci_gatt_tx_pool_available_event_rp0 *) p_evt->data;
      UNUSED(p_tx_pool_available_event);

      /* USER CODE BEGIN ACI_GATT_TX_POOL_AVAILABLE_VSEVT_CODE */

      /* USER CODE END ACI_GATT_TX_POOL_AVAILABLE_VSEVT_CODE */
      break;/* ACI_GATT_TX_POOL_AVAILABLE_VSEVT_CODE*/
    }
    case ACI_ATT_EXCHANGE_MTU_RESP_VSEVT_CODE:
    {
      aci_att_exchange_mtu_resp_event_rp0 *p_exchange_mtu;
      p_exchange_mtu = (aci_att_exchange_mtu_resp_event_rp0 *)  p_evt->data;
      UNUSED(p_exchange_mtu);

      /* USER CODE BEGIN ACI_ATT_EXCHANGE_MTU_RESP_VSEVT_CODE */

      /* USER CODE END ACI_ATT_EXCHANGE_MTU_RESP_VSEVT_CODE */
      break;/* ACI_ATT_EXCHANGE_MTU_RESP_VSEVT_CODE */
    }
    /* USER CODE BEGIN BLECORE_EVT */

    /* USER CODE END BLECORE_EVT */
  default:
    /* USER CODE BEGIN EVT_DEFAULT */

    /* USER CODE END EVT_DEFAULT */
    break;
  }

  /* USER CODE BEGIN Service1_EventHandler_2 */

  /* USER CODE END Service1_EventHandler_2 */

  return(return_value);
}/* end TEMPSENSOR_EventHandler */

实验:

 

 

打开串口发现竟然没有数据,一顿操作:

1. 配置开关

 

2. printf重定向

/* USER CODE BEGIN 4 */
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif

PUTCHAR_PROTOTYPE
{
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
  return ch;
}
/* USER CODE END 4 */

测试:

 

此帖出自无线连接论坛

最新回复

cubeIDE有兼容新问题,通过MX进行程序更新后,代码框若隐若现没法对应上,就是上面那块的打开的C和H文件名那块   详情 回复 发表于 2024-9-18 11:13
点赞 关注
 

回复
举报

6483

帖子

9

TA的资源

版主

沙发
 

这个是不是得最新版本的STM32CubeMX? 

此帖出自无线连接论坛

点评

是的,最新版本的CUBEMX才支持最新的WB09KE芯片。CUBEIDE更省事,全家桶  详情 回复 发表于 2024-9-18 08:43
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 

回复

136

帖子

2

TA的资源

一粒金砂(高级)

板凳
 
秦天qintian0303 发表于 2024-9-17 19:19 这个是不是得最新版本的STM32CubeMX? 

是的,最新版本的CUBEMX才支持最新的WB09KE芯片。CUBEIDE更省事,全家桶

此帖出自无线连接论坛

点评

cubeIDE有兼容新问题,通过MX进行程序更新后,代码框若隐若现没法对应上,就是上面那块的打开的C和H文件名那块  详情 回复 发表于 2024-9-18 11:13
 
 
 

回复

6483

帖子

9

TA的资源

版主

4
 
慕容雪花 发表于 2024-9-18 08:43 是的,最新版本的CUBEMX才支持最新的WB09KE芯片。CUBEIDE更省事,全家桶

cubeIDE有兼容新问题,通过MX进行程序更新后,代码框若隐若现没法对应上,就是上面那块的打开的C和H文件名那块

此帖出自无线连接论坛
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
快速回复 返回顶部 返回列表