【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 */
测试:
|