感谢EEPW提供这么好的学习机会给我这个无线通信方面的小白~
也感谢各位论坛上的大佬分享出自己宝贵的经验供我们学习参考~
谢谢各位!!!
开发环境
cubeIDE
software packet WBA1.15.0
0、 BLE GATT协议内容简介
GATT是BLE设备之间进行通信的协议,它定义了一种多层的数据结构。在这个结构中,已连接的低功耗蓝牙设备使用它来进行通信。具体来说,一个Profile(可以理解为一种规范或标准的通信协议)可以由一个或多个Service(服务)组成,而每个Service又包含多个Characteristic(特征值)。每个Characteristic则由其属性(Properties)、值(Value)以及可选的描述符(Descriptor)组成。
在BLE GATT协议中,通常涉及两个角色:Client(客户端)和Server(服务端)。Client主要向Server发送命令和请求,并接收Server的响应;而Server则负责接收Client的命令和请求,并发送相应的响应。
每个server和char有自己的UUID,用于识别不同的功能,对应于cube MX中的server配置。
1、 基于B2P_Server例程的修改
a) 例程本身有一个server两个char组成
i. LED_C是通过client控制LED的亮灭
ii. SWITCH_C是server通知client按键是否按下
b) 在p2p_server_app.c的文件中能够找到对应的执行代码,简单的实验如下:
Notify 的返回值也可以通过此处进行修改
c) 修改write的执行程序:可以在此处定义一些行为,通过写入不同的值来控制center 设备执行不同的行为。
这里简单实现一下LED的GLUE和RED根据不同传输值执行操作
if(p_Notification->DataTransfered.p_Payload[1] == 0x01)
{
BSP_LED_On(LED_BLUE);
BSP_LED_Off(LED_RED);
LOG_INFO_APP("-- P2P APPLICATION SERVER : LED1 ON\n");
P2P_SERVER_APP_Context.LedControl.Led1 = 0x01; /* LED1 ON */
}
if(p_Notification->DataTransfered.p_Payload[1] == 0x02)
{
BSP_LED_On(LED_RED);
BSP_LED_Off(LED_BLUE);
LOG_INFO_APP("-- P2P APPLICATION SERVER : LED1 OFF\n");
P2P_SERVER_APP_Context.LedControl.Led1 = 0x00; /* LED1 OFF */
}
2、PWM部分
a) cubeMX配置:使用tim2 ch3 PWM 输出,对应于PA7的GPIO。
通过原理图,寻找对应的引脚
b)通过tim.c了解PWM内部的数据结构
使用TIM_HandleTypeDef类型声明tim2,其中TIM_TypeDef声明了所有timer相关的寄存器。
从配置函数中可以看到,是通过配置CCR3的值来确定PWM脉冲宽度值的。
3、 整体电路部分
是由STM32WBA55CG作为主控,包含驱动搭配驱动电路和供电电路的小台灯。驱动电路的输入开关部分是PA7输出的PWM。
以下是实物连接图
4、修改后的b2p_server
通过直接修改寄存器的值,来进行PWM脉冲宽度的调整。
p2p_server_app.c中进行如下修改。
if(p_Notification->DataTransfered.p_Payload[1] == 0x01)
{
BSP_LED_On(LED_BLUE);
BSP_LED_Off(LED_RED);
LOG_INFO_APP("-- P2P APPLICATION SERVER : LED1 ON\n");
P2P_SERVER_APP_Context.LedControl.Led1 = 0x01; /* LED1 ON */
//TIM2->CCR3 = 0;
}
if(p_Notification->DataTransfered.p_Payload[1] == 0x02)
{
BSP_LED_On(LED_RED);
BSP_LED_Off(LED_BLUE);
LOG_INFO_APP("-- P2P APPLICATION SERVER : LED1 OFF\n");
P2P_SERVER_APP_Context.LedControl.Led1 = 0x00; /* LED1 OFF */
//TIM2->CCR3 = 800;
}
//P2P_SERVER_APP_Context.LedControl.Led1 = p_Notification->DataTransfered.p_Payload[1]%10;
//__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_3,P2P_SERVER_APP_Context.LedControl.Led1*100);
TIM2->CCR3 = p_Notification->DataTransfered.p_Payload[1];
/* USER CODE END Service1Char1_WRITE_NO_RESP_EVT */
break;
main.c中使用库函数启动PWM
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_GPDMA1_Init();
MX_RAMCFG_Init();
MX_RTC_Init();
MX_RNG_Init();
MX_ICACHE_Init();
MX_TIM2_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_3);
//__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_3,100);
/* USER CODE END 2 */
成果内容请移步视频链接。
感谢刘工、论坛和各位大佬,本次BLE无线开发确实充满了未知和乐趣,当前阶段的成果并不代表着结束,而是新的开始。感谢能有这次接触无线开发的机会。也希望论坛的发展越来越好~
【[EEPW] Let's Do!STM32WBA55无线MCU开发大作战活动----成果展示】 https://www.bilibili.com/video/BV1Ka6CYGEYk/?share_source=copy_web&vd_source=04797ffdab6fd66e680b88b685c351f7