蓝牙控制LED灯开关的例程在STM32Cube_FW_WB0_V1.0.0\Projects\NUCLEO-WB09KE\Applications\BLE\BLE_p2pServer文件夹下。烧写到板卡后,可以用ST网页版蓝牙测试工具进行测试。链接为蓝牙测试网页版。之前一直使用的是手机进行测试,但是发现设备一直扫描不到,手机系统是鸿蒙4版本的。手机测试蓝牙安装包下载链接为手机测试蓝牙安装包链接。
当板卡烧写玩程序后,打开网页版测试链接,可以看到如下界面
点击connect按钮,前提是电脑支持蓝牙连接且已打开蓝牙。点击后会自动搜索对应的蓝牙设备,也可以删选出不是ST板卡的蓝牙。扫描到后会在界面显示对应蓝牙设备的名称,点击后再点击配对就可以连接设备了。连接如下图
配对后出现例程的名称服务器p2pServer,如下图
点击后会出现对应的测试界面,烧写不同的程序会进入不同的界面。LED灯状态控制界面如下
点击蓝色LED灯可以改变板卡蓝色LED的状态,旁边的绿灯一直闪烁表明板卡正常运行。当点击读取后可以看到获取到的内容如下
读取的值为0,0,这两个数值表明两个LED的状态,第一个值代表的是红灯,第二个值代表的是蓝灯。修改第二个值为1,然后点击Write后就可以看见板卡的蓝灯亮了。
搞懂完例程的功能后便是分析代码了。用MDK打开MDK-ARM文件夹下的工程后,可以在Application/User/Core文件夹下找到main文件。打开后会发现main函数的的代码如下
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_RADIO_Init();
MX_RADIO_TIMER_Init();
MX_PKA_Init();
/* USER CODE BEGIN 2 */
/* 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 */
}
其中初始化蓝牙的代码为
/* Init code for STM32_BLE */
MX_APPE_Init(NULL);
由于用了ST的蓝牙栈,所以所有的功能都是在任务中进行的,而while(1)中只有一行代码,为MX_APPE_Process();。
首先看初始化的代码,在app_entry.c中被定义,初始化代码为
uint32_t MX_APPE_Init(void *p_param)
{
UNUSED(p_param);
APP_DEBUG_SIGNAL_SET(APP_APPE_INIT);
#if (CFG_DEBUG_APP_ADV_TRACE != 0)
UTIL_ADV_TRACE_Init();
UTIL_ADV_TRACE_SetVerboseLevel(VLEVEL_L); /* functional traces*/
UTIL_ADV_TRACE_SetRegion(~0x0);
#endif
/* USER CODE BEGIN APPE_Init_1 */
#if (CFG_LED_SUPPORTED == 1)
Led_Init();
#endif
#if (CFG_BUTTON_SUPPORTED == 1)
Button_Init();
#endif
#if (CFG_DEBUG_APP_TRACE != 0) && (CFG_DEBUG_APP_ADV_TRACE == 0)
COM_InitTypeDef COM_Init =
{
.BaudRate = 115200,
.WordLength= COM_WORDLENGTH_8B,
.StopBits = COM_STOPBITS_1,
.Parity = COM_PARITY_NONE,
.HwFlowCtl = COM_HWCONTROL_NONE
};
BSP_COM_Init(COM1, &COM_Init);
#endif
RxUART_Init();
/* USER CODE END APPE_Init_1 */
if (HW_RNG_Init() != HW_RNG_SUCCESS)
{
Error_Handler();
}
/* Init the AES block */
HW_AES_Init();
HW_PKA_Init();
APP_BLE_Init();
#if (CFG_LPM_SUPPORTED == 1)
/* Low Power Manager Init */
UTIL_LPM_Init();
#endif /* CFG_LPM_SUPPORTED */
/* USER CODE BEGIN APPE_Init_2 */
/* USER CODE END APPE_Init_2 */
APP_DEBUG_SIGNAL_RESET(APP_APPE_INIT);
return BLE_STATUS_SUCCESS;
}
其中也初始化了串口,在下面就有串口调试相关的程序。但是进行测试后没有任何的反应,而且也不能进行仿真,不过这些不影响蓝牙功能的使用。
在网页版调试蓝牙的时候同时打开串口会发现在收到蓝牙指令后会打印如下内容
-- GATT : LED CONFIGURATION RECEIVED
-- P2P APPLICATION SERVER : LED1 ON
看其意思应该是板卡收到打开LED1的指令,所以可以全局搜索以上内容可以找到蓝牙接收入口。不过也可以搜索APP_DBG_MSG函数,该函数的功能是向串口打印调试信息。蓝牙接收到数据的函数名为P2P_SERVER_Notification,在文件p2p_server_app.c中。
可以在该文件的前面看到相关协议的定义,定义如下
#define P2P_SERVER_UUID 0x8f,0xe5,0xb3,0xd5,0x2e,0x7f,0x4a,0x98,0x2a,0x48,0x7a,0xcc,0x40,0xfe,0x00,0x00
#define LED_C_UUID 0x19,0xed,0x82,0xae,0xed,0x21,0x4c,0x9d,0x41,0x45,0x22,0x8e,0x41,0xfe,0x00,0x00
#define SWITCH_C_UUID 0x19,0xed,0x82,0xae,0xed,0x21,0x4c,0x9d,0x41,0x45,0x22,0x8e,0x42,0xfe,0x00,0x00
|