WS8623-DB-V1.0的主控是STM32WB05KZVx。
所以可以使用STM32几件套(STM32CubeMX,STM32CudeIDE,STM32CubeProgrammer)做二次开发。
本文通过二次开发实现板载2个KEY button和BLE指令二种方式点灯。
1、引脚使用情况
2、RCC
3、时钟树
4、LED和key
5、中断
6、RADIO
7、RADIO_TIMER
8、USART1
9、PKA
10、STM32_BLE
广播
1个服务
配置平台USART支持
11、USART1 printf重定向
/* USER CODE BEGIN PFP */ #if defined(__ICCARM__) __ATTRIBUTES size_t __write(int, const unsigned char *, size_t); #endif /* __ICCARM__ */ #if defined(__ICCARM__) /* New definition from EWARM V9, compatible with EWARM8 */ int iar_fputc(int ch); #define PUTCHAR_PROTOTYPE int iar_fputc(int ch) #elif defined ( __CC_ARM ) || defined(__ARMCC_VERSION) /* ARM Compiler 5/6*/ #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #elif defined(__GNUC__) #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #endif /* __ICCARM__ */ /* USER CODE END PFP */ /** * @brief Retargets the C library printf function to the USART. * @param None * @retval None */ PUTCHAR_PROTOTYPE { /* Place your implementation of fputc here */ /* e.g. write a character to the USART1 and Loop until the end of transmission */ HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF); return ch; } #if defined(__ICCARM__) size_t __write(int file, unsigned char const *ptr, size_t len) { size_t idx; unsigned char const *pdata = ptr; for (idx = 0; idx < len; idx++) { iar_fputc((int)*pdata); pdata++; } return len; } #endif /* __ICCARM__ */
12、外部中断点灯
void HAL_GPIO_EXTI_Callback(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) { if(GPIO_Pin==KEY2_Pin){ HAL_GPIO_TogglePin(ACK_GPIO_Port,ACK_Pin); } else if(GPIO_Pin==KEY1_Pin) { HAL_GPIO_TogglePin(AUX_GPIO_Port,AUX_Pin); } }
13、BLE点灯
server1_app.c中在SERVICE1_CHAR1_WRITE_EVT事件增加处理
case SERVICE1_CHAR1_WRITE_EVT: /* USER CODE BEGIN Service1Char1_WRITE_EVT */ if(p_Notification->DataTransfered.p_Payload[0]==0x20){ HAL_GPIO_WritePin(ACK_GPIO_Port,ACK_Pin,GPIO_PIN_SET); }else if(p_Notification->DataTransfered.p_Payload[0]==0x10){ HAL_GPIO_WritePin(ACK_GPIO_Port,ACK_Pin,GPIO_PIN_RESET); }else if(p_Notification->DataTransfered.p_Payload[0]==0x30){ HAL_GPIO_WritePin(AUX_GPIO_Port,AUX_Pin,GPIO_PIN_SET); }else if(p_Notification->DataTransfered.p_Payload[0]==0x40){ HAL_GPIO_WritePin(AUX_GPIO_Port,AUX_Pin,GPIO_PIN_RESET); } /* USER CODE END Service1Char1_WRITE_EVT */ break;
通过判断BLE char1特征值写入的数值,控制灯亮灭。
14、使设备进入可发现模式
app_ble.c
524行附近、566行附近,HCI_DISCONNECTION_COMPLETE_EVT_CODE事件后增加:
/* USER CODE BEGIN APP_BLE_Init_3 */ APP_BLE_Procedure_Gap_Peripheral(PROC_GAP_PERIPH_ADVERTISE_START_FAST); /* USER CODE END APP_BLE_Init_3 */
case HCI_DISCONNECTION_COMPLETE_EVT_CODE: { hci_disconnection_complete_event_rp0 *p_disconnection_complete_event; p_disconnection_complete_event = (hci_disconnection_complete_event_rp0 *) p_event_pckt->data; /* USER CODE BEGIN EVT_DISCONN_COMPLETE_3 */ APP_BLE_Procedure_Gap_Peripheral(PROC_GAP_PERIPH_ADVERTISE_START_FAST); /* USER CODE END EVT_DISCONN_COMPLETE_3 */
用手机app:e调试定制界面给ble发送指令控制2个LED
15、关于手机ble调试工具
我手机上安装好几个ble调试工具:
1)BLE调试助手(沁恒出品):没有自定义界面,但很稳定基本上所有的蓝牙设备都能发现
2)“蓝牙串口”(有个SPP图标):自定义界面功能很好,但是在我现在的手机上闪退,其他手机上不能发现WS8623
3)e调试:广告非常多,有个自定义界面功能。
每次调试时,哪个能用用哪个,为了要自定义界面这次用了e调试
下面简单介绍下怎么使用:
1)点击下面“实验室”,可以看到有个自定义功能
2)点击"自定义界面"进入下面界面
按加号可以增加界面,其中“蓝牙点灯”是我定义好的界面
点击“编辑组件”可以进行编辑
3)在编辑界面,可以放入一些组件
4)编辑其中的按钮
可以看到这个按钮如果是开发送0x10,如果是关发送0x20,对应前面BLE开灯关灯判断。
完成后保存。
5)回到“低功耗”,会搜索到BLE设备,如果搜到WS8623的广播,连接进去
6)点击“日志”->自定义界面
回到“服务”
勾选“WRITE”特征值的那个“向上”的按钮,然后按“蓝牙点灯”的“播放”按钮,就可以控制了。