如何在STM32WB上与USB CDC同时运行Bluetooth®低能耗P2P服务器第2部分

欢迎回来!如果您没有看到第1部分,在转到代码之前,请使用链接将硬件设置到位,现在您有了,让我们编码!

我们使用以下文件来实现我们的代码:
  • 应用程序_文件.c
  • p2p服务器应用程序
  • 应用程序_函数.h
  • 应用程序条目.c
  • 主要的c
在STM32_WAN>app>app_ble.c文件中,在用户代码“BEGIN”和“END”RADIO_ACTIVITY_EVENT之间的第750行左右插入以下代码:
#如果(RADIO_ACTIVITY_EVENT!=0)case ACI_HAL_END_OF_RADIO_ACTIVITY_VEVT_CODE:/*用户代码开始RADIO_AACTIVITY_EVENT*/HAL_GPIO_WritePin(LD2_GPIO_Port,LD2_Pin,GPIO_Pin_SET);HAL_延迟(5);HAL_GPIO_WritePin(LD2_GPIO_Port、LD2_Pin、GPIO_Pin_RESET);/*用户代码结束RADIO_ACTIVITY_EVENT*/break;/*ACI_HAL_END_OF_RADIO_ACTIVITY_VEVT_CODE*/#endif/*无线电激活事件!=0个*/
每次无线电射频活动结束后,都会触发无线电活动事件。每当发生这种情况时,上述线路将使LD2(绿色LED)每5毫秒闪烁一次。
对于下一步,仍然在STM32_WAN>应用程序中,打开p2p_server_app.c文件并添加以下代码,以在每次通过手机发出此命令时将蓝色指示灯设置为亮起。
 
case P2PS_STM_WRITE_EVT:/*用户代码开始P2PS_STM_WRITE_EVT*/if(pNotification->DataTransfered.pPayload[1]==0x01){HAL_GPIO_WritePin(LD1_GPIO_Port、LD1_Pin、GPIO_Pin_SET);}否则{HAL_GPIO_WritePin(LD1_GPIO_Port、LD1_Pin、GPIO_Pin_RESET);}/*用户编码结束P2PS_STM.WRITE_EVT*/break;
现在,仍然在p2p_server_app.c中,添加以下函数及其原型:
/*私有函数原型--------------------------------------------------------*/*用户代码开始PFP*/static void P2PS_Send_Notification(void);/*用户代码结束PFP*/*用户代码开始FD*/static void P2PS_Send_Notification(void){/*更新P2P_NOTIFU特性*/P2PS_STM_App_Update_Char(P2P_NOTFY_Char_UUID,0X00);return;}/*用户代码结束FD*/
现在,转到Core>Inc>app_conf.h,在/*USER CODE BEGIN/END CFG_Task_ Id_With_HCI_Cmd_t*/之间,我们将创建一个任务,该任务将通过蓝牙向手机发送消息,通知何时按下用户按钮。
/**<在该列表中添加所有可能发送ACI/HCI命令的任务*/typedef enum{CFG_TASK_ADV_CANCEL_ID,#if(L2CAP_REQUEST_NEW_CONN_PARAM!=0)CFG_TASK_CONN_UPDATE_REG_ID,#endif CFG_TASK_HCI_ASYNCH_EVT_ID,/*用户代码开始CFG_TASK_ID_With_HCI_Cmd_t*/CFG_TASK_SW1_BUTTON_PUSHED_ID,/*<添加此行*/*用户代码结束CFG_TASK_idWith_HCI_Cmd_t[/CFG_LAST_TASK_ID_With_HCICMD,/**<应为列表中的最后一个*/}CFG_TASK_ID_With_HCI_Cmd;
返回到p2p_server_app.c文件,在“P2PS_app_Init函数”中添加以下代码以注册发送通知任务ID:
void P2PS_APP_Init(void){/*用户代码BEGIN P2PS_APP_Init*/UTIL_SEQ_RegTask(1<<CFG_TASK_SW1_BUTTON_PUSHED_ID,UTIL_SEQ-RFU,P2PS_Send_Notification);/*用户编码END P2PS_APPS_Init*/return;}
现在,在Core>Src>app_entry.c上,添加Interrupt Callback以在按下用户按钮时执行任务。
/*用户代码BEGIN FD*/void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){switch(GPIO_Pin){case BUTTON_SW1_Pin:UTIL_SEQ_SETask(1<<CFG_TASK_SW1_BUTTON_PUSHED_ID,CFG_SCH_PRIO_0);break;default:break;}return;}/*用户代码结束FD*/
现在,为了让Bluetooth®Low Energy代码与USB代码一起工作,我们通过采用HSEM5来执行一个简单的解决方案,从而防止CPU2利用其控制CLK48时钟的能力。
为此,我们创建了一个锁定HSEM5的功能,启用HSI48作为USB时钟,并配置时钟恢复系统,以便在与USB一起使用时自动重新校准。
转到Core>Src>main.c,添加Function Prototype:
/*用户代码开始PFP*/void PeriphUsbBlock_Config(void);/*用户代码端PFP*/
此外,在同一文件中,添加函数,您可以使用USER CODE BEGIN 4注释定位自己:
/*用户代码开始4*/void PeriphUsbBlock_Config(void){#if(CFG_USB_INTERFACE_ENABLE!=0)RCC_PeriphCLKInitTypeDef PeriphClkInitStruct={0};RCC_CRSInitTypeDef RCC_CRSInitStruct={0};/*当*不再使用RNG IP*/LL_HSEM_1StepLock(HSEM,5)时,这可防止CPU2禁用HSI48振荡器;/*启用HSI48时钟源*/LL_RCC_HSI48_Enable();while(!LL_RCC_HSI48_IsReady());/*选择HSI48作为USB时钟源*/PeriphClkInitStruct.PeriphClockSelection=RCC_PERIPHCLK_USB;PeriphClkInitStruct.UsbBlockSelection=RCC_USBCLKSOURCE_HSI48;HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);/*配置时钟恢复系统(CRS)**************************//*启用CRS时钟*/__HAL_RCC_CRS_CLK_Enable();/*默认同步信号分频因子(未分频)*/RCC_CRSInitStruct.Prescaler=RCC_CRS_SYNC_DIV1;/*根据CRS_Source值*/RCC_CRSInitStruct.Source=RCC_CRS_SYNC_Source_USB设置SYNCSRC[1:0]位;/*HSI48以1KHz速率与USB SOF同步*/RCC_CRSInitStruct.ReaadValue=RCC_CRS_ReloadValue_DEFAULT;RCC_CRSInitStruct.ErrorLimitValue=RCC_CRS_ERRORLIMIT_DEFAULT;RCC_CRSInitStruct.Paricity=RCC_CRS_SYNC_Polarity_RISING;/*将TRIM[5:0]设置为默认值*/RCC_CRSInitStruct.HSI48CalibrationValue=RCC_CRS_HSI48CALIBRATION_default;/*启动自动同步*/HAL_RCCEx_CRSConfig(&RCC_CRSInitStruct)#endif return;}/*用户代码端4*/
记住要启用USB接口,请在第465行的Core>Inc>app_conf.h上将CFG_USB_interface_enable设置为1,如下所示:
 
/*******************************************************************************USB接口**************************************//***启用/禁用USB接口*/#定义CFG_USB_interface_Enable 1
请注意,每次重新生成代码时,都需要再次启用USB外围设备。
为了测试和验证一切是否按预期工作,STBLESensor应用程序可以使用,并且很容易地连接到板上。
生成代码,检查错误和警告,然后运行它:

绿色指示灯必须闪烁,表示已准备好连接。

打开Bluetooth®Low Energy传感器应用程序,您已经可以看到可用于连接的板。

单击图像会更改LED状态,您可以看到蓝色LED已打开。
按下用户按钮SW1,应用程序中将显示消息“按钮已按下”。

在用户USB正确连接的情况下,我们可以看到虚拟COM端口打开时没有任何问题:

干得好!
有了这个设置,USB CDC类与Bluetooth®低能耗对等服务器一起工作得很好!