首先要感谢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>
代码编写完之后,编译调试:
五、效果展示。
微信小程序:
灯显示效果: