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

这篇具有很好参考价值的文章主要介绍了普中STM32-PZ6806L开发板(USART2 串口 + HI-LINK-V20离线语音模块控制LED灯)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介

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

电路原理图

连线图

连线引脚表

STM32F103ZET6 RX(PA3) TX(PA2) 3.3V GND
HI-LINK-V20 TX RX VCC GND

实物图

其他知识

更新离线词条

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

协议

普中STM32-PZ6806L开发板(USART2 串口 + HI-LINK-V20离线语音模块控制LED灯),普中STM32-PZ6806L,stm32,嵌入式硬件,单片机,语音识别,普中
协议帧如上图,
头部 三字节
指令 两字节
地址 四字节
值 四字节
尾部 两字节
控灯指令 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 0x01

uint8_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 : buf
   len : 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];
	#endif
	
	
	HLK_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 huart2

void 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 中断接收)文章来源地址https://www.toymoban.com/news/detail-771066.html

到了这里,关于普中STM32-PZ6806L开发板(USART2 串口 + HI-LINK-V20离线语音模块控制LED灯)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32单片机(九)USART串口----第一节:USART串口协议

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月16日
    浏览(35)
  • 【【STM32-USART串口协议】】

    USART串口协议 •通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统 •通信协议:制定通信的规则,通信双方按照协议规则进行数据收发 就是我们并不能在芯片上设计完全部的一下子完成所有的设计,我们总需要一些外设 所以需要学会通信接口 掌握通信协议来

    2024年02月12日
    浏览(31)
  • STM32——USART串口协议

    下图是51单片机串口通信的区分,跟stm32差不多,51单片机的串口通信的uart是只能异步通信,而stm32串口的usart是同步跟异步都可以选择,同步靠时钟线,异步靠比特率,比特率就是通信速度不一样,可以调成一样的。 (1).图一是串口通信的基本介绍。 (2).图二是串口通信的连线

    2024年02月03日
    浏览(28)
  • STM32单片机(九)USART串口----第三节:USART串口实战练习(串口发送)

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月10日
    浏览(33)
  • STM32单片机(九)USART串口----第四节:USART串口实战练习(串口发送+接收)

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月10日
    浏览(34)
  • 【STM32】STM32学习笔记-USART串口协议(25)

    按数据传送的方式,通讯可分为串行通讯与并行通讯,串行通讯是指设备之间通过少量数据信号线(一般是8根以下), 地线以及控制信号线,按数据位形式一位一位地传输数据的通讯方式。而并行通讯一般是指使用8、16、32及64根或更多的数据线进行传输的通讯方式, 它们的通

    2024年01月19日
    浏览(36)
  • 「STM32入门」USART串口通信

    通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统 通信协议:制定通信的规则,通信双方按照协议规则进行数据收发 本文将介绍USART  概念解释 TX、RX分别是Transmit和Receive的缩写,代表发送、接受数据 全双工的含义是发送线路和接受线路互不影响,可以同时进

    2024年02月06日
    浏览(34)
  • 【STM32】STM32学习笔记-USART串口数据包(28)

    串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持该通讯方式, 电子工程师在调试设备时也经常使用该通讯方式输出调试信息。 在计算机科学里,大部分复杂的问题都可以通过分层来简化。如芯片被分为内核层和

    2024年01月18日
    浏览(33)
  • stm32学习笔记-9 USART串口

    注:笔记主要参考B站 江科大自化协 教学视频“STM32入门教程-2023持续更新中”。 注:工程及代码文件放在了本人的Github仓库。 从本节开始,将逐一学习STM32的通信接口。首先介绍以下stm32都集成了什么通信外设。 为了控制或读取外挂模块,stm32需要与外挂模块进行通信,来扩

    2024年02月14日
    浏览(31)
  • 串口屏(USART HMI)与STM32

    目录 一、前期准备 二、串口屏上位机 三、STM32软件编程 1.STM32单片机 2.HMI USART串口屏 本人使用使用的是陶晶驰的串口屏。型号为TJC4832T135_011 3.USB转TTL串口模块电源板(CP2102芯片)(CH340也可以) 官网资料:USART HMI 资料中心 可拖动左侧工具箱进行界面设计,常用文本、按钮、

    2024年02月05日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包