本帖最后由 lvxinn2006 于 2019-5-21 21:30 编辑
本次活动测评开发板STM32WB55 Nucleo Pack由ST意法半导体提供,感谢意法半导体对EEWorld测评的支持!
【实验目的】
· 熟悉如何使用STM32Cube提供的示例程序;
· 熟悉如何使用STM32WB55的串口通信功能。
【实验环境】
· NUCLEO-WB55 Nucleo Pack开发板
· Keil MDK-ARM(Keil uVision 5.25.2.0)
· Keil.STM32WBxx_DFP.1.0.0.pack
【实验资料】
· NUCLEO-WB55 Nucleo Pack开发板原理图
· STM32WB55xx Data Sheets
· STM32WB55xx Reference manual(参考手册)
【实验分析】
本示例主要使用NUCLEO-WB55的串口通信功能,并且配合Python实验远程控制USB Dongle上的灯亮灭的功能。
本文从简单实用的角度,直接使用HAL库实现应用的开发。
1. 硬件设计
下图是STlink的虚拟串口与芯片之间的连接原理图,可以知道串口使用了单片机的PB6和PB7。
在STM32WB55中,有两组串口模块:LPUART和USART,通过查询手册STM32WB55xx Data Sheets,可知这两个引脚对应着USART1功能模块,如下图所示:
2. 软件设计
这里使用官方示例代码中的STM32Cube_FW_WB_V1.0.0\Projects\NUCLEO-WB55.Nucleo\Applications\BLE\BLE_p2pServer项目,在这个项目的基础上进行功能的添加以及修改。
在main函数中,添加代码:
该代码作用是初始化串口,把main函数里的任务主循环修改为如下代码:
- while(1)
- {
-
- if (HAL_UART_Receive_IT(&huart1, &ch, 1) == HAL_OK){
- protocol_decode(ch, cmd_run); //作为通信协议数据进行解析
- }
- SCH_Run(~0);
- /* USER CODE END WHILE */
- }
复制代码
设计串口通信协议如下:
数据格式表
数据包头:家庭网关向M0发送数据包头为0xAA
设备号: 为M0设备号(房间号)
数据类型:0x02 控制数据(命令数据)
数据长度:为数据域的字节数
校验:crc16校验位
数据对应命令
在main函数前,添加如下函数的定义:
- /* USER CODE BEGIN 0 */
- /* 解析控制协议函数 */
- int protocol_decode(int ch, void (*cmd_proc)(unsigned char *, int))
- {
- static unsigned char buf[20];
- static int index = 0; //记录缓冲区数组下标
-
- if ((index == 0) && (ch == 0xAA)){//判断数据包头
- buf[index++] = ch;
- }else if (index > 0){ //已经收到数据头
- if (index < 4){ //接收数据信息字段
- buf[index++] = ch;
- }else if ((index < buf[3] + 6) && (index < 20)){ //校验位
- buf[index++] = ch;
- if (index == buf[3] + 6){//接收到最后一个数据
- if (!cmd_proc) return -1;
- cmd_proc(buf+4, buf[3]); //根据命令代码,执行相应动作
- index = 0; //index归零表示重新接收新数据
- return 1;
- }
- }else{ //无效数据包,丢弃
- index = 0;
- return -2;
- }
- }
- return 0;
- }
- #include "ble_types.h"
- #include "uuid.h"
- #include "p2p_stm.h"
-
- /* 执行命令的函数 */
- void cmd_run(unsigned char *src, int len)
- {
- uint8_t data[2] = {0x01, 0x00};
- switch(src[0]){
- case 0x30:
- data[1] = 0x01;
- break;
- case 0x31:
- data[1] = 0x00;
- break;
- } //P2P_Server_App_Context.ButtonControl.ButtonStatus=data[0];
- P2PS_STM_App_Update_Char(P2P_NOTIFY_CHAR_UUID, data);
- HAL_UART_Transmit(&huart1, data, 2, 1000);
- }
- /* USER CODE END 0 */
复制代码
【实验现象】
·
· 使用串口调试助手测试串口通信,按照设计的通信协议,模拟控制数据的发送:
可以看到USB Dongle端的LED灯在两种不同状态下切换状态。
这里使用了自己用Python开发的物联网网关服务,主要原理如下图所示;
打开网关服务:
点击远程控制,在右侧能看到几个控制按钮,点击控制按钮时,可以看到页面上按钮的状态会有所变化:
· 每点击一次Led灯按钮后,可以看到USB Dongle端LED的状态变化。