这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 【STM32WBA55CG开发板】按键+小程序控制PWM小台灯

共1条 1/1 1 跳转至

【STM32WBA55CG开发板】按键+小程序控制PWM小台灯

高工
2025-01-15 11:33:13     打赏

首先要感谢EEPW给这次学习的机会。

本次学习硬件使用STM32WBA55CG开发板,软件使用keil5开发。

环境安装过程中遇到很多问题,现在整理下供大家参考。

一、准备工作:NUCLEO-WBA55CG开发板套件、灯板、STM32Cube_FW_WBA_V1.5.0软件包。

1、NUCLEO-WBA55CG开发板套件:这里就不做过多介绍。

image.png

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

image.png

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

image.png

image.png

3、STM32Cube_FW_WBA_V1.5.0软件包:可在官网下载适合自己的版本。

https://www.st.com.cn/zh/embedded-software/stm32cubewba.html#st-get-software

image.png

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

image.png

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

image.png

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

image.png

二、软件配置。

1、配置系统时钟:96MHz

image.png

2、配置TIM2:PA6

image.png

3、配置TIM3:PA10

image.png

4、导出配置。

image.png

image.png

三、STM32WBA55CG代码编写。

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

image.png

image.png

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

image.png

3、按键代码:

首先在main中启用TIM2/TIM3,这样PWM才能正常工作。

image.png

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

image.png

按键处理相关代码修改:

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中,修改蓝牙接收字段代码。

image.png

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教程小程序代码直接开发。

image.png

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

image.png

若导入异常,可在小程序网页蓝牙开发示例代码中导入。

https://developers.weixin.qq.com/miniprogram/dev/framework/device/bluetooth.html

image.png

4、小程序代码修改。(若是从小程序实例代码新导入的,需要手动添加device部分工程)

device.js修改:增加两组PWM数据控制。

image.png

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中增加按键开关和滑条控件。

image.png

 <!-- 开关按键控件 -->
  <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>

代码编写完之后,编译调试:

image.png

五、效果展示。

微信小程序:

image.png

image.png

灯显示效果:

image.png






关键词: STM32WBA55CG     PWM控制     小台灯    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]