首先要感谢EEPW给这次学习的机会。
本次学习硬件使用STM32WBA55CG开发板,软件使用keil5开发。
环境安装过程中遇到很多问题,现在整理下供大家参考。
一、准备工作:NUCLEO-WBA55CG开发板套件、灯板、STM32Cube_FW_WBA_V1.5.0软件包。
1、NUCLEO-WBA55CG开发板套件:这里就不做过多介绍。

2、按键+灯板:方便调试,设计了一个小灯板。

原理如下:按键使用PB6,两组灯分别接至PA6和PA10。


3、STM32Cube_FW_WBA_V1.5.0软件包:可在官网下载适合自己的版本。
https://www.st.com.cn/zh/embedded-software/stm32cubewba.html#st-get-software

下载完成后,解压到STM32CubeMX工具目录下:

准备工作完成,根据EEPW学习视频,使用BLE_p2pServer项目进行开发。

将工程复制到自己想开发的目录,然后就可以开始进行项目开发了。

二、软件配置。
1、配置系统时钟:96MHz

2、配置TIM2:PA6

3、配置TIM3:PA10

4、导出配置。


三、STM32WBA55CG代码编写。
1、处理文件路径:因为工程BLE_p2pServer是从STM32Cube_FW_WBA_V1.5.0里面复制出来的,而BLE_p2pServer中使用了开发板的BSP按键相关的代码,所以需要修改此路径至对应位置。或者也可以将BSP相关驱动也复制到工程下,然后修改相关路径。


2、修改完路径之后,要删除感叹号!冗余的文件,即可编译通过。

3、按键代码:
首先在main中启用TIM2/TIM3,这样PWM才能正常工作。

然后在app_ble.c中修改按键PB6(BSP驱动为B2按键)相关代码。(原B2按键为B3功能,将两组功能置换,pwm1_cpValue/pwm2_cpValue定义为全局变量)

按键处理相关代码修改:
void APP_BSP_Button3Action(void)
{
tBleStatus ret;
if (bleAppContext.Device_Connection_Status != APP_BLE_CONNECTED_SERVER)
{
/* Clear Security Database */
ret = aci_gap_clear_security_db();
if (ret != BLE_STATUS_SUCCESS)
{
LOG_INFO_APP("==>> aci_gap_clear_security_db - Fail, result: 0x%02X\n", ret);
}
else
{
LOG_INFO_APP("==>> aci_gap_clear_security_db - Success\n");
}
}
else
{
/* Launch advertising for multi connection */
APP_BLE_Procedure_Gap_Peripheral(PROC_GAP_PERIPH_ADVERTISE_START_FAST);
UTIL_TIMER_StartWithPeriod(&bleAppContext.Advertising_mgr_timer_Id, ADV_TIMEOUT_MS);
}
return;
}
//eepw demo
void APP_BSP_Button2Action(void)
{
if (bleAppContext.Device_Connection_Status != APP_BLE_CONNECTED_SERVER)
{
}
else
{
APP_BLE_Procedure_Gap_Peripheral(PROC_GAP_PERIPH_CONN_PARAM_UPDATE);
}
//eepw demo PWM
pwm1_cpValue += 99;
pwm2_cpValue += 99;
if(pwm1_cpValue >= 1000)
pwm1_cpValue = 0;
if(pwm2_cpValue >= 1000)
pwm2_cpValue = 0;
LOG_INFO_APP("==>> Bsp_B2 SetPWM\n");
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_4, pwm1_cpValue);
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, pwm2_cpValue);
return;
}4、蓝牙部分代码。
在p2p_server_app.c中,修改蓝牙接收字段代码。

void P2P_SERVER_Notification(P2P_SERVER_NotificationEvt_t *p_Notification)
{
/* USER CODE BEGIN Service1_Notification_1 */
/* USER CODE END Service1_Notification_1 */
switch(p_Notification->EvtOpcode)
{
/* USER CODE BEGIN Service1_Notification_Service1_EvtOpcode */
/* USER CODE END Service1_Notification_Service1_EvtOpcode */
case P2P_SERVER_LED_C_READ_EVT:
/* USER CODE BEGIN Service1Char1_READ_EVT */
/* USER CODE END Service1Char1_READ_EVT */
break;
case P2P_SERVER_LED_C_WRITE_NO_RESP_EVT:
/* USER CODE BEGIN Service1Char1_WRITE_NO_RESP_EVT */
if(p_Notification->DataTransfered.p_Payload[1] == 0x01)
{
BSP_LED_On(LED_BLUE);
LOG_INFO_APP("-- P2P APPLICATION SERVER : LED1 ON\n");
P2P_SERVER_APP_Context.LedControl.Led1 = 0x01; /* LED1 ON */
LOG_INFO_APP("-- P2P APPLICATION SERVER : SetPWM ON\n");
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_4, pwm1_cpValue);
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, pwm2_cpValue);
}
if(p_Notification->DataTransfered.p_Payload[1] == 0x00)
{
BSP_LED_Off(LED_BLUE);
LOG_INFO_APP("-- P2P APPLICATION SERVER : LED1 OFF\n");
P2P_SERVER_APP_Context.LedControl.Led1 = 0x00; /* LED1 OFF */
LOG_INFO_APP("-- P2P APPLICATION SERVER : SetPWM OFF\n");
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_4, 0);
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 0);
}
//eepw demo
if(p_Notification->DataTransfered.p_Payload[0] == 0x03)
{
LOG_INFO_APP("-- P2P APPLICATION SERVER : SetPWM1\n");
pwm1_cpValue = p_Notification->DataTransfered.p_Payload[1] * 20;
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_4, pwm1_cpValue);
}
if(p_Notification->DataTransfered.p_Payload[0] == 0x05)
{
LOG_INFO_APP("-- P2P APPLICATION SERVER : SetPWM2\n");
pwm2_cpValue = p_Notification->DataTransfered.p_Payload[1] * 20;
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, pwm2_cpValue);
}
/* USER CODE END Service1Char1_WRITE_NO_RESP_EVT */
break;
case P2P_SERVER_SWITCH_C_NOTIFY_ENABLED_EVT:
/* USER CODE BEGIN Service1Char2_NOTIFY_ENABLED_EVT */
P2P_SERVER_APP_Context.Switch_c_Notification_Status = Switch_c_NOTIFICATION_ON;
LOG_INFO_APP("-- P2P APPLICATION SERVER : NOTIFICATION ENABLED\n");
LOG_INFO_APP(" \n\r");
/* USER CODE END Service1Char2_NOTIFY_ENABLED_EVT */
break;
case P2P_SERVER_SWITCH_C_NOTIFY_DISABLED_EVT:
/* USER CODE BEGIN Service1Char2_NOTIFY_DISABLED_EVT */
P2P_SERVER_APP_Context.Switch_c_Notification_Status = Switch_c_NOTIFICATION_OFF;
LOG_INFO_APP("-- P2P APPLICATION SERVER : NOTIFICATION DISABLED\n");
LOG_INFO_APP(" \n\r");
/* USER CODE END Service1Char2_NOTIFY_DISABLED_EVT */
break;
default:
/* USER CODE BEGIN Service1_Notification_default */
/* USER CODE END Service1_Notification_default */
break;
}
/* USER CODE BEGIN Service1_Notification_2 */
/* USER CODE END Service1_Notification_2 */
return;
}至此,STM32WBA55CG已经配置完成。接下来处理小程序。
四、小程序代码编写。
1、准备工作:下载小程序开发工具,然后使用微信登录小程序开发工具。
微信开发者工具WIN7以上稳定版本:
https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html
微信开发者工具win7稳定版本:
https://developers.weixin.qq.com/community/minihome/doc/0004a0b97fca00d5e1cd4a94951801?blockType=99
以上根据自己电脑配置选择。
2、使用EEPW教程小程序代码直接开发。

3、打开微信开发者工具并登录,导入代码即可。

若导入异常,可在小程序网页蓝牙开发示例代码中导入。
https://developers.weixin.qq.com/miniprogram/dev/framework/device/bluetooth.html

4、小程序代码修改。(若是从小程序实例代码新导入的,需要手动添加device部分工程)
device.js修改:增加两组PWM数据控制。

sendPWM1Value: function (e) {
const valuepwm1 = e.detail.value;
const checked = e.detail.value;
let buffer = new ArrayBuffer(2)
let dataView = new DataView(buffer)
dataView.setUint8(0, 3);
dataView.setUint8(1,valuepwm1);
this.setData({ pwm1Value: valuepwm1 });
wx.writeBLECharacteristicValue({
deviceId: this._deviceId,
serviceId: this._serviceId,
characteristicId: this._characteristicId,
value: buffer,
success (res) {
console.log('writeBLECharacteristicValue success', res.errMsg)
},
fail (err) {
console.log('writeBLECharacteristicValue fail', err.errMsg)
}
})
},
sendPWM2Value: function (e) {
const valuepwm2 = e.detail.value;
const checked = e.detail.value;
let buffer = new ArrayBuffer(2)
let dataView = new DataView(buffer)
dataView.setUint8(0, 5);
dataView.setUint8(1,valuepwm2);
this.setData({ pwm2Value: valuepwm2 });
wx.writeBLECharacteristicValue({
deviceId: this._deviceId,
serviceId: this._serviceId,
characteristicId: this._characteristicId,
value: buffer,
success (res) {
console.log('writeBLECharacteristicValue success', res.errMsg)
},
fail (err) {
console.log('writeBLECharacteristicValue fail', err.errMsg)
}
})
},device.wxml中增加按键开关和滑条控件。

<!-- 开关按键控件 -->
<switch checked="{{switchChecked}}" bindchange="switchChange" />
<!-- LED灯滑条控件 -->
<slider bindchange="sendPWM1Value" min="0" max="50" value="{{pwm1Value}}"></slider>
<slider bindchange="sendPWM2Value" min="0" max="50" value="{{pwm2Value}}"></slider>代码编写完之后,编译调试:

五、效果展示。
微信小程序:


灯显示效果:

我要赚赏金
