2939|0

23

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【 STM32WB55 测评】_04_WEB控制实验 [复制链接]

本帖最后由 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中,有两组串口模块:LPUARTUSART,通过查询手册STM32WB55xx Data Sheets,可知这两个引脚对应着USART1功能模块,如下图所示:

2. 软件设计
这里使用官方示例代码中的STM32Cube_FW_WB_V1.0.0\Projects\NUCLEO-WB55.Nucleo\Applications\BLE\BLE_p2pServer项目,在这个项目的基础上进行功能的添加以及修改。
main函数中,添加代码:

  1. MX_USART1_UART_Init();
复制代码



该代码作用是初始化串口,把main函数里的任务主循环修改为如下代码:
  1. while(1)

  2. {



  3. if (HAL_UART_Receive_IT(&huart1, &ch, 1) == HAL_OK){

  4. protocol_decode(ch, cmd_run);    //作为通信协议数据进行解析

  5. }

  6. SCH_Run(~0);

  7.     /* USER CODE END WHILE */

  8.   }
复制代码



设计串口通信协议如下:
数据格式表
buf[0]
buf[1]
buf[2]
buf[3]
buf[length]
send_buf[n]
数据包头
设备号
数据类型
数据长度
数据
校验
0xAA
dev_no
type_data
length
data
Crc16校验
1byte
1byte
1byte
1byte
length bytes
2bytes
数据包头:家庭网关M0发送数据包头为0xAA
设备号: M0设备号(房间号)
数据类型:0x02 控制数据(命令数据)
数据长度:为数据域的字节数
校验:crc16校验位   
数据对应命令
命令
动作
0x30
LED_ON(开灯)
0x31
LED_OFF(关灯)
0x32
Fan_ON(开风扇)
0x33
Fan_OFF(关风扇)
0x34
Nixietube_ON(开数码管)
0x35
Nixietube _OFF(关数码管)
0x36
BEEP_ON(开蜂鸣器)
0x37
BEEP_OFF(关蜂鸣器



main函数前,添加如下函数的定义:

  1. /* USER CODE BEGIN 0 */

  2. /* 解析控制协议函数 */

  3. int protocol_decode(int ch, void (*cmd_proc)(unsigned char *, int))

  4. {

  5.     static unsigned char buf[20];

  6.     static int index = 0;    //记录缓冲区数组下标



  7.     if ((index == 0) && (ch == 0xAA)){//判断数据包头

  8.         buf[index++] = ch;

  9.     }else if (index > 0){ //已经收到数据头

  10.         if (index < 4){    //接收数据信息字段

  11.             buf[index++] = ch;

  12.         }else if ((index < buf[3] + 6) && (index < 20)){    //校验位

  13.             buf[index++] = ch;

  14.             if (index == buf[3] + 6){//接收到最后一个数据

  15.                 if (!cmd_proc) return -1;

  16.                 cmd_proc(buf+4, buf[3]); //根据命令代码,执行相应动作

  17.                 index = 0;    //index归零表示重新接收新数据

  18.                 return 1;

  19.             }

  20.         }else{    //无效数据包,丢弃

  21.             index = 0;

  22.             return -2;

  23.         }

  24.     }

  25.     return 0;

  26. }

  27. #include "ble_types.h"

  28. #include "uuid.h"

  29. #include "p2p_stm.h"



  30. /* 执行命令的函数 */

  31. void cmd_run(unsigned char *src, int len)

  32. {

  33.     uint8_t data[2] = {0x01, 0x00};

  34.     switch(src[0]){

  35.         case 0x30:

  36.             data[1] = 0x01;

  37.         break;

  38.         case 0x31:

  39.             data[1] = 0x00;

  40.         break;

  41.     }        //P2P_Server_App_Context.ButtonControl.ButtonStatus=data[0];

  42.     P2PS_STM_App_Update_Char(P2P_NOTIFY_CHAR_UUID, data);

  43.     HAL_UART_Transmit(&huart1, data, 2, 1000);

  44. }

  45. /* USER CODE END 0 */
复制代码



【实验现象】
·
· 使用串口调试助手测试串口通信,按照设计的通信协议,模拟控制数据的发送:
可以看到USB Dongle端的LED灯在两种不同状态下切换状态。
这里使用了自己用Python开发的物联网网关服务,主要原理如下图所示;
打开网关服务:


网关运行起来效果如上图所示,此时打开浏览器,并访问:http://127.0.0.1


点击远程控制,在右侧能看到几个控制按钮,点击控制按钮时,可以看到页面上按钮的状态会有所变化:

· 每点击一次Led灯按钮后,可以看到USB DongleLED的状态变化。






此帖出自stm32/stm8论坛
点赞 关注(1)
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表