普中STM32-PZ6806L开发板(USART2 串口 + HI-LINK-V20离线语音模块控制LED灯)

简介

买了HI-LINK-V20型号的离线语音识别模块, 为了后面可以做有意思的东西, 现在先来用用, 使用USART2 串口 接收来自我在HI-LINK-V20中预设的动作, 当识别到词条时发送对应的指令到串口, HI-LINK串口接的就是STM32F03ZET6的USART2, 且往下看。

电路原理图

连线图

连线引脚表

STM32F103ZET6RX(PA3)TX(PA2)3.3VGND
HI-LINK-V20TXRXVCCGND

实物图

其他知识

更新离线词条

海凌科HLK-V2语音识别模块更新词条

协议

在这里插入图片描述
协议帧如上图,
头部 三字节
指令 两字节
地址 四字节
值 四字节
尾部 两字节
控灯指令 0x0A、灯的编址1~8\0xFF(全部灯), 灯的状态是值0/1/0xFF(全部灯打开)
控制灯1打开, 指令是: AA BB CC 00 0A 00 00 00 01 00 00 00 01 0A 0D
控制全部灯打开是 : AA BB CC 00 0A 00 00 00 FF 00 00 00 FF 0A 0D

实现步骤

创建项目

参考 普中STM32-PZ6806L开发板(HAL库函数实现-USART2 中断接收)

添加用户代码

hlk_v20.h

#ifndef __HLK_V20_H__
#define __HLK_V20_H__#include "stm32f1xx_hal.h"#define HLK_V20_COMMAND_VERSION 0x01uint8_t HLK_V20_PreActionCheck(uint8_t *dat, uint32_t len);
void HLK_V20_ActionCallback(uint16_t cmd, uint32_t addr, uint32_t value); // 检测到完整指令, 将调用此函数#endif //__HLK_V20_H__

hlk_v20.c

#include "hlk_v20.h"#if HLK_V20_COMMAND_VERSION == 0x01
#define  HLK_V20_COMMAND_LENGTH 15#endif__weak void HLK_V20_ActionCallback(uint16_t cmd, uint32_t addr, uint32_t value)
{}/* * HLK_V20_PreActionCheck: 指令预处理1. 检查指令是否完整;2. 解析完完整指令则调用HLK_V20_ActionCallback执行指令dat : buflen : buf有效数据长度return  0 : 命令不完整1 : 命令完整并执行
*/
uint8_t HLK_V20_PreActionCheck(uint8_t *dat, uint32_t len)
{if (HLK_V20_COMMAND_LENGTH > len) // 数据长度要达到指令数据长度return 0;uint16_t cmd = 0;uint32_t addr = 0;uint32_t value = 0;#if HLK_V20_COMMAND_VERSION == 0x01/*Frame:Head : 0xAA 0xBB 0xCC -> 3字节, 第1~3字节CMD  : 16bit -> 2 字节, 第4~5字节ADDR : 32bit -> 4字节, 第6~9字节Value: 32bit -> 4字节, 第10~13字节Tail : 0x0A 0x0D-> 2字节, 第14~15字节*/if ( !(0xAA ==  dat[0] && 0xBB == dat[1] && 0xCC == dat[2] && 0x0A == dat[13] && 0x0D == dat[14]) ){return 0;}cmd = (dat[3]<<8)|dat[4];addr = (dat[5]<<24) | (dat[6]<<16) | (dat[7]<<8) | dat[8];value = (dat[9]<<24) | (dat[10]<<16) | (dat[11]<<8) | dat[12];#endifHLK_V20_ActionCallback(cmd, addr, value);return 1;
}

绑定指令与相关功能
hlk_v20_demo.h

#ifndef __HLK_V20_DEMO_H__
#define __HLK_V20_DEMO_H__#include "usart.h"#define HLK_V20_DEMO_USART huart2void HLK_V20_DEMO_Usart_RxCallback(UART_HandleTypeDef *huart);
void HLK_V20_DEMO_Action_Init(void);#endif // __HLK_V20_DEMO_H__

hlk_v20_demo.c

#include "hlk_v20_demo.h"
#include "hlk_v20.h"
#include "LED/led.h"
#include "BEEP/beep.h"#include <string.h>
#include <stdio.h>static uint8_t gCmdBuffer[1024];
static uint16_t gCmdIndex = 0;static void HLK_V20_Command_Reset(void)
{memset(gCmdBuffer, 0, sizeof(gCmdBuffer)/sizeof(uint8_t));gCmdIndex = 0;
}void HLK_V20_ActionCallback(uint16_t cmd, uint32_t addr, uint32_t value)
{switch (cmd){case 0x0A: {if (addr == 0xff){LED_LightControl(LED_ALL, (LED_Status)(0xFF==value?1:0));printf ("LED_ALL %s!\r\n",  value ? "ON":"OFF");}else{LED_LightControl((LED_Number)(addr-1), (LED_Status)value);printf ("LED_%d %s\r\n", addr, value ? "ON":"OFF");}}break;case 0x0B:BEEP_5KHzAction(5000);break;default:break;}
}/*
HLK_V20_DEMO_Usart_RxCallback : 在Usart Ex中断回调函数中调用此函数即可*/
void HLK_V20_DEMO_Usart_RxCallback(UART_HandleTypeDef *huart)
{if (HLK_V20_DEMO_USART.Instance == huart->Instance){if ( !HLK_V20_PreActionCheck(gCmdBuffer, gCmdIndex+1) ){++gCmdIndex;}else{HLK_V20_Command_Reset();}HAL_UART_Receive_IT(&huart2, &gCmdBuffer[gCmdIndex], 1); // USART继续中断接收}
}/*使用此功能前先调用一次, 开始接收任务
*/
void HLK_V20_DEMO_Action_Init(void)
{HLK_V20_Command_Reset();HAL_UART_Receive_IT(&HLK_V20_DEMO_USART, &gCmdBuffer[gCmdIndex], 1); // USART开始中断接收
}

启用功能
main.c

/*串口接收中断函数回调
*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) 
{HLK_V20_DEMO_Usart_RxCallback(huart); // 加入HLK_V20数据处理
}int main()
{....HLK_V20_DEMO_Action_Init();...while(1){HAL_Delay(1000); // 延时获得空闲资源}...
}

共赏

普中STM32-PZ6806L开发板(USART2 串口 + HI-LINK-V20离线语音模块控制LED灯)

代码

不需要下载, 基本代码上面都提供了

参考

普中STM32-PZ6806L开发板(HAL库函数实现-批量操作GPIO引脚实现跑马灯)
海凌科HLK-V2语音识别模块更新词条
普中STM32-PZ6806L开发板(HAL库函数实现-USART2 中断接收)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/314303.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【HarmonyOS开发】分布式应用的开发实践(元旦快乐)

元旦快乐&#xff0c;再见2023&#xff0c;加油2024&#xff0c;未来可期&#xff0c;愿新的一年带来健康、幸福和成功&#xff01;&#x1f4aa; &#x1f4aa;&#x1f4aa; 多种设备之间能够实现硬件互助、资源共享&#xff0c;依赖的关键技术包括分布式软总线、分布式设备虚…

LM386简易OCL功放电路

LM386简易OCL功放电路是使用低功耗集成功率放大器LM386构成的OCL功放电路&#xff0c;电路结构简单&#xff0c;容易调试&#xff0c;非常适于自制。 电路工作原理&#xff1a;图中IC1和IC2是两片集成功放LM386&#xff0c;接成OCL电路。C1起到电源滤波及退耦作用&#xff0c;C…

WPF+Halcon 培训项目实战 完结(13):HS 鼠标绘制图形

文章目录 前言相关链接项目专栏运行环境匹配图片矩形鼠标绘制Halcon添加右键事件Task封装运行结果个人引用问题原因推测 圆形鼠标绘制代码运行结果 课程完结&#xff1a; 前言 为了更好地去学习WPFHalcon&#xff0c;我决定去报个班学一下。原因无非是想换个工作。相关的教学视…

记一次Oracle Cloud计算实例ssh恢复过程

#ssh秘钥丢失# &#xff0c; #Oracle Cloud# 。 电脑上的ssh秘钥文件不知道什么时候丢失了&#xff0c;直到用的时候才发现没有了&#xff0c;这下可好&#xff0c;Oracle Cloud的计算实例连不上了&#xff0c;这个实例只能通过ssh连接上去&#xff1a; 以下是解决步骤&#x…

【PTA-C语言】编程练习6 - 结构体与共用体 - 函数题

如果代码存在问题&#xff0c;麻烦大家指正 ~ ~有帮助麻烦点个赞 ~ ~ 编程练习6 - 结构体与共用体 - 编程题 7-1 查找书籍&#xff08;分数 20&#xff09;7-2 一帮一&#xff08;分数 15&#xff09;7-3 计算职工工资&#xff08;分数 15&#xff09; 7-1 查找书籍&#xff08…

72内网安全-域横向CSMSF联动及应急响应知识

拿到才行&#xff0c;拿不到就是多余的 案例一MSF&CobaltStrike 联动 Shell 有一些功能可能cs或者msf强大一些&#xff0c;他们两个可以相互调用&#xff0c;在真实情况下也是可以cs和msf同时启动的&#xff0c; cs移交给msf .创建Foreign监听器 “Listeners”“Add”…

Portraiture4.1汉化版PS磨皮插件(支持原生m1芯片m2)

Portraiture汉化版PS磨皮插件。本期推荐一款全新ai算法ps2024中文汉化版ps磨皮插件Portraiture 4.1.2美颜滤镜安装包最新版ps调整肤色插件! 全新Portraiture 4.1.2版本PS人像修图美颜磨皮插件&#xff0c;升级AI算法&#xff0c;并支持多人及全身磨皮美化模式&#xff0c;推荐…

Python爬虫---selenium基本使用

为什么使用selenium&#xff1f; 使用urllib.request.urlopen()模拟浏览器有时候获取不到数据,所以使用selenium (1) selenium是一个用于web应用程序测试的工具 (2) selenium 测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样 (3) 支持通过各种driver (FirfoxDri…

appium入门基础

介绍 appium支持在不同平台的UI自动化&#xff0c;如web,移动端,桌面端等。还支持使用java&#xff0c;python&#xff0c;js等语言编写自动化代码。主要用于自动化测试脚本&#xff0c;省去重复的手动操作。 Appium官网 安装 首先必须环境有Node.js用于安装Appium。 总体来…

c盘扩容时,d盘无法删除卷问题

C盘扩容时&#xff0c;磁盘管理中D盘右键无法删除卷的原因 首先&#xff0c;D盘下文件夹为空&#xff0c;但是显示可用空间不是100%&#xff0c;经过排查&#xff0c;发现是虚拟内存设置在了D盘导致无法删除卷&#xff0c;这里只需要将虚拟内存放到其他盘&#xff0c;如E盘即可…

骑砍战团MOD开发(29)-module_scenes.py游戏场景

骑砍1战团mod开发-场景制作方法_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Cw411N7G4/ 一.骑砍游戏场景 骑砍战团中进入城堡,乡村,战斗地图都被定义为场景,由module_scenes.py进行管理。 scene(游戏场景) 天空盒(Skyboxes.py) 地形(terrain code) 场景物(scene_…

Halcon闭运算closing

Halcon闭运算 文章目录 Halcon闭运算 闭运算的计算步骤&#xff0c;为先膨胀&#xff0c;后腐蚀。这两步操作能将看起来很接近的元素&#xff0c;如区域内部的空洞或外部孤立的点连接成一体&#xff0c;区域的外观和面积也不会有明显的改变。通俗地说&#xff0c;就是类似于“填…