su-03t语音模块固件的制作与烧录(stm32实战)

这篇具有很好参考价值的文章主要介绍了su-03t语音模块固件的制作与烧录(stm32实战)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

su-03t简介

管脚定义

​​智能公元语音固件制作​​

账号注册

创建产品

产品配置

唤醒词自定义

命令词自定义

发音人配置

其他配置

生成和下载语音固件

固件烧录

下载SDK固件烧录工具

SU-03T驱动分享


su-03t简介

SU-03T 是一款低成本、低功耗、小体积的离线语音识别模组,能快速应用于智能家居,各类智能小家电,86 盒,玩具,灯具等需要语音操控的产品,SU-03T也具备强大的软件开发能力,我们可以在“​​智能公元​​”平台上实现语音固件的零代码开发,提高工作效率。

管脚定义

su-03t+stm32语音小管家,stm32,su-03t,语音固件的制作和烧录,智能公元

su-03t+stm32语音小管家,stm32,su-03t,语音固件的制作和烧录,智能公元

su-03t+stm32语音小管家,stm32,su-03t,语音固件的制作和烧录,智能公元

其中需要注意的是UART0的B0、B1是调试器的语音固件烧录口,串口烧录则选择UART1的B6、B7引脚,当固件烧录完成之后则可以使用UART1的B2、B3 引脚和MCU进行通信。

​​智能公元语音固件制作​​

账号注册

打开​​智能公元​​网页进行账号注册

su-03t+stm32语音小管家,stm32,su-03t,语音固件的制作和烧录,智能公元

创建产品

su-03t+stm32语音小管家,stm32,su-03t,语音固件的制作和烧录,智能公元

su-03t+stm32语音小管家,stm32,su-03t,语音固件的制作和烧录,智能公元

su-03t+stm32语音小管家,stm32,su-03t,语音固件的制作和烧录,智能公元

产品配置

创建产品成功后会进入产品配置,在大部分情况下都可以使用默认配置,我们只需要关注以下几个配置即可:

唤醒词自定义

唤醒词自定义可以定义语音模块的唤醒词以及唤醒之后的回复,用于唤醒语音模块,开始使用自定义命令词与模块进行语音交互

su-03t+stm32语音小管家,stm32,su-03t,语音固件的制作和烧录,智能公元

命令词自定义

命令词自定义可以自己定义的关键词来控制语音模块,例如“开灯”、“关灯”等,免唤醒的命令词可以不需要使用唤醒词直接和模块进行交互。

su-03t+stm32语音小管家,stm32,su-03t,语音固件的制作和烧录,智能公元

su-03t+stm32语音小管家,stm32,su-03t,语音固件的制作和烧录,智能公元

发音人配置

发音人配置可以用来配置语音模块的音色、音调和语速。

su-03t+stm32语音小管家,stm32,su-03t,语音固件的制作和烧录,智能公元

其他配置

su-03t+stm32语音小管家,stm32,su-03t,语音固件的制作和烧录,智能公元

生成和下载语音固件

su-03t+stm32语音小管家,stm32,su-03t,语音固件的制作和烧录,智能公元

su-03t+stm32语音小管家,stm32,su-03t,语音固件的制作和烧录,智能公元

固件烧录

下载SDK固件烧录工具

su-03t+stm32语音小管家,stm32,su-03t,语音固件的制作和烧录,智能公元

在SDK固件包的 uni_hb_m_solution-121028-20230920\uni_hb_m_solution\image_demo\Hummingbird-M-Update-Tool 下可以看到以下文件

su-03t+stm32语音小管家,stm32,su-03t,语音固件的制作和烧录,智能公元

UniOneUpdateTool.exe为串口烧录工具

USB_Update_Tool_User_Guide.pdf为烧录指导书,写的很详细,跟着烧录即可文章来源地址https://www.toymoban.com/news/detail-848118.html

SU-03T驱动分享

#include "su_03t.h"

uint8_t usart_su_RXdata;		//存放接收数据寄存器的值
uint8_t usart_su_RXflag;		//接收数据标志位
uint8_t usart_su_RXpacket[6] = {0};	//hex数据包接收数组
uint8_t usart_su_TXpacket[14] = {0};	//hex数据包接收数组

/**
  * @brief  配置串口 PC10 发送复用推挽    PC11 接收浮空模式  
  * @param  None
  * @retval None
  */
void su_o3t_init(void){
	//初始化GPIO口
	//PA9复用推挽
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
  	GPIO_InitTypeDef GPIO_InitStructure;
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  	GPIO_Init(GPIOC, &GPIO_InitStructure);
	//PA10浮空
	  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
	  GPIO_Init(GPIOC, &GPIO_InitStructure);
	
	//串口初始化
	//开启串口时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);
	//初始化串口
	USART_InitTypeDef USART_InitStruct = {0};
	USART_InitStruct.USART_BaudRate = 115200;	//设置波特率
	USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;	//硬件流控制失能
	USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//选择串口发送模式和接收模式
	USART_InitStruct.USART_Parity = USART_Parity_No;	//不需要校验
	USART_InitStruct.USART_StopBits = USART_StopBits_1;	//一位停止位
	USART_InitStruct.USART_WordLength = USART_WordLength_8b;	//字长选择8位
	USART_Init(UART4, &USART_InitStruct);
	
	//开启串口中断
	USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);
	
		//初始化NVIC
		//NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  	NVIC_InitTypeDef NVIC_InitStruct;
  	NVIC_InitStruct.NVIC_IRQChannel = UART4_IRQn;
  	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
  	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 4;
  	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
  	NVIC_Init(&NVIC_InitStruct);
	
	//使能串口
	USART_Cmd(UART4, ENABLE);
}

/**
  * @brief  串口一中断服务函数,接收一个字节的数据,并将标志位置1
	*       hex数据包		长度  6 		开始标志位 0xAA 
  * @param  None
  * @retval None
  */
void UART4_IRQHandler(void){
	static uint8_t RX_su_State = 0;
	static uint8_t su_pRXpacket = 0;
	//usart_init();
	if(USART_GetITStatus(UART4, USART_IT_RXNE) == SET){
		USART_ClearITPendingBit(UART4, USART_IT_RXNE);
			//usart_send_string("y");

		usart_su_RXdata = USART_ReceiveData(UART4);
		//判断接收的数据包头
		if(RX_su_State == 0){	
			if(usart_su_RXdata == 0XAA){	//接收到的使hex文件
				usart_su_RXpacket[0] = usart_su_RXdata;
				RX_su_State = 1;	
				su_pRXpacket = 1;
			}
		}
			else if(RX_su_State == 1){	//接收hex文件的内容
				usart_su_RXpacket[su_pRXpacket] = usart_su_RXdata;
				su_pRXpacket++;
				if(su_pRXpacket >= 5){		//接收数据包长度位4的数据
					RX_su_State = 2;
				}
			}
			else if(RX_su_State == 2){	//判断hex数据包结束标志位
				if(usart_su_RXdata == 0XAA){
					usart_send_array(USART1, usart_su_RXpacket,6);
					usart_su_RXpacket[su_pRXpacket] = usart_su_RXdata;
					RX_su_State = 0;
					usart_su_RXflag = 1;
				}
				else{
					RX_su_State = 0;
					usart_su_RXflag = 0;
					usart_send_array(USART1, usart_su_RXpacket,6);
					usart_su_RXpacket[su_pRXpacket] = usart_su_RXdata;
					//usart_send_string("$");
				}
			}
	}
}

/**
  * @brief  获取usart_su_flag的值
  * @param  None
  * @retval usart_su_RXflag 串口2接收标志位 
  */
uint8_t usart_get_su_RXflag(void){
	if(usart_su_RXflag == 1){
		usart_su_RXflag = 0;
		return 1;
	}
	return 0;
}
/**
  * @brief  处理su_03t的数据
  * @param  None
  * @retval None
  */
void vioce_analysis(void){
	//usart_send_array(usart_su_RXpacket, 5);

	time_t rawtime;
	struct tm *info = NULL;
	//info = localtime(&rawtime);
	if(usart_get_su_RXflag() == 1){
		//char str[5] = {0};
		switch(usart_su_RXpacket[3]){
			case 0x01: //温度
				usart_su_TXpacket[0] = 0XAA;
				usart_su_TXpacket[1] = 0X55;
				usart_su_TXpacket[3] = dht_data.tmp;
				usart_su_TXpacket[4] = dht_data.tmp_flo;
				usart_su_TXpacket[5] = 0X55;
				usart_su_TXpacket[6] = 0XAA;
				if(dht_data.tmp_flag == 0){	//温度为正
					usart_su_TXpacket[2] = 0x02;
				}
				else{
					usart_su_TXpacket[2] = 0x09;
				}
				usart_send2su_array(usart_su_TXpacket, 6); 
				break;
			case 0x02://湿度
				usart_su_TXpacket[0] = 0XAA;
				usart_su_TXpacket[1] = 0X55;
				usart_su_TXpacket[2] = 0X03;
				usart_su_TXpacket[3] = dht_data.hum;
				usart_su_TXpacket[4] = 0X55;
				usart_su_TXpacket[5] = 0XAA;
				usart_send2su_array(usart_su_TXpacket, 6);
				break;
			case 0x03://空气成分
				
				usart_su_TXpacket[0] = 0XAA;
				usart_su_TXpacket[1] = 0X55;
				usart_su_TXpacket[2] = 0X01;
				usart_su_TXpacket[6] = 0X55;
				usart_su_TXpacket[7] = 0XAA;
				//sprintf(str,"0x%x",(int)(kqm_data.VOC * 100));
				//usart_su_TXpacket[4] = atoi(str);
				usart_su_TXpacket[3] = (uint8_t)(kqm_data.VOC * 100);
			//	printf("%d", usart_su_TXpacket[3]);
				usart_su_TXpacket[4] = (uint8_t)(kqm_data.CHO * 100);
				//printf("%d", usart_su_TXpacket[4]);
				usart_su_TXpacket[5] = kqm_data.CO2;
			//	printf("%d", usart_su_TXpacket[5]);
				usart_send2su_array(usart_su_TXpacket, 8);
			//	usart_send_array(usart_su_TXpacket,8);
				break;
			case 0x04://开灯
				led_enable(LED1);
				break;
			case 0x05://关灯
				led_disable(LED1);
				break;
			case 0x06://甲烷
				usart_su_TXpacket[0] = 0XAA;
				usart_su_TXpacket[1] = 0X55;
				usart_su_TXpacket[3] = (uint8_t)(kqm_data.CHO * 100);
				usart_su_TXpacket[4] = 0X55;
				usart_su_TXpacket[5] = 0XAA;
				if(kqm_data.CHO <0.03){
					usart_su_TXpacket[2] = 0x04;
				}
				else if(kqm_data.CHO >=0.03 && kqm_data.CHO <0.1){
					usart_su_TXpacket[2] = 0x05;
				}
				else{
					usart_su_TXpacket[2] = 0x06;
				}
				usart_send2su_array(usart_su_TXpacket, 6);
				break;
			case 0x07://开启蜂鸣器
				buzzer_enable();
				break;
			case 0x08://关闭蜂鸣器
				buzzer_disable();
				break;
			case 0x9://二氧化碳
				usart_su_TXpacket[0] = 0XAA;
				usart_su_TXpacket[1] = 0X55;
				usart_su_TXpacket[2] = 0x07;
				usart_su_TXpacket[3] = kqm_data.CO2;
				usart_su_TXpacket[4] = 0X55;
				usart_su_TXpacket[5] = 0XAA;
				usart_send2su_array(usart_su_TXpacket, 6);
				break;
			case 0x10://时间
				rawtime = RTC_GetCounter();
				info = localtime(&rawtime);
				
				//info=gmtime(&rawtime);
				usart_su_TXpacket[0] = 0XAA;
				usart_su_TXpacket[1] = 0X55;
				usart_su_TXpacket[2] = 0x08;
				usart_su_TXpacket[3] = (info->tm_year + 1900) / 1000;
				usart_su_TXpacket[4] = ((info->tm_year + 1900) / 100) % 10;
				usart_su_TXpacket[5] = ((info->tm_year + 1900) / 10) % 100;
				usart_su_TXpacket[6] = (info->tm_year + 1900) % 10;
				usart_su_TXpacket[7] = info->tm_mon + 1;
				usart_su_TXpacket[8] = info->tm_mday;
				usart_su_TXpacket[9] = info->tm_hour;
				usart_su_TXpacket[10] = info->tm_min;
				usart_su_TXpacket[11] = info->tm_sec;
				usart_su_TXpacket[12] = 0X55;
				usart_su_TXpacket[13] = 0XAA;
				usart_send_array(USART1, usart_su_TXpacket, 14);
				printf("%d\t%d\t%d\t%d\t", info->tm_year, info->tm_mon, info->tm_mday, info->tm_hour);
				usart_send2su_array(usart_su_TXpacket, 14);
				break;
		}
	}
}

/**
	* @brief  发送一个数组
	* @param  uint8_t *array 需要发送的数组
	* @param	uint16_t len	发送的数组长度
  * @retval None
  */
void usart_send2su_array(uint8_t *array, uint16_t len){
	uint16_t i = 0;
	for(i = 0; i < len; i++){
		usart_send2su_bit(array[i]);
	}
}

/**
  * @brief  发送单个字节
* @param  uint8_t data	需要发送的字节
  * @retval None
  */
void usart_send2su_bit(uint8_t data){
	while(USART_GetFlagStatus(UART4, USART_FLAG_TC) != 1); //等待上一次数据发送完成
	USART_SendData(UART4, data);	//发送数据
}

到了这里,关于su-03t语音模块固件的制作与烧录(stm32实战)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • STM32发送数据ESP8266固件烧录MQTT和AT指令调试与链接OneNET

    STM32连接ESP8266发送数据到OneNET平台 1.硬件型号:ESP8266-01s 和 USBTTL转接口模块 2.固件:1471_esp8266-at_mqtt-1m(MQTT透传AT固件(固件号:1471)) 3.固件烧录工具:flash_download_tool_3.9.4 固件下载和烧录工具均可在安信可官网下载安信可AT固件下载 本文章使用的是XCOM V2.6 串口助手 4.On

    2024年02月04日
    浏览(53)
  • ESP32的MQTT AT固件烧录+STM32以ESP32的MQTT AT固件的AT指令连接EMQX下mqtt服务器实现消息订阅和发布

    目录 写在前面 三种方案(利用ESP32连接EMQX下的MQTT) 步骤 ESP32烧录固件并AT指令进行测试。 下载固件  烧录工具下载 烧录固件(选择ESP32)  关于AT 指令与MQTT服务器断开后自动重连MQTT服务器 关于AT指令设置上电自动连接WIFI 关于AT指令设置断开后自动重新连接WIFI STM32对接E

    2023年04月12日
    浏览(30)
  • 智能家居离线语音识别控制系统设计(SU-03T)

    1.1 模块介绍 语音识别模块是在一种基于嵌入式的语音识别技术的模块,主要包括语音识别芯片和一些其他的附属电路,能够方便的与主控芯片进行通讯,开发者可以方便的将该模块嵌入到自己的产品中使用,实现语音交互的目的。 模块实物图如下: 1.2 模块的IO口说明 **这款

    2024年02月05日
    浏览(37)
  • STM32驱动JQ8900语音模块

    上次写了esp32驱动JQ8900模块,我做设计一般会把外设先在esp32上实现一般,再移植到比较复杂的stm32上去。直接上正常运行的干货代码。 STM32F10x系列任意开发板(这里我使用的是f103zet6正点原子开发板) JQ8900播报模块一个,喇叭一个,12V/5V电源适配器一个,杜邦线若干 代码如

    2024年02月13日
    浏览(28)
  • STM32——SYN6288语音合成模块

           语音模块是我们学习工程中常见的模块之一,今天给大家分享SYN6288模块的简单使用,软件部分我会提供stm32f103zet6/stm32f407zgt6的完整代码供大家参考。深入的学习,还需要仔细阅读数据手册等资料。希望这篇文章能帮到大家!          SYN6288语音合成模块是一款基于

    2024年01月19日
    浏览(46)
  • STM32 使用SYN6288语音模块

    本篇文章带大家学习一下SYN6288语音模块,这个模块可以用于车载设备,语音电子书等众多产品当中,而且这个模块支持多种编码格式,GB2312,GBK等字符编码格式。 SYN6288语音合成模块是一种语音合成设备,其可实现文字转语音功能,将输入的文字信息通过内部的处理和合成,

    2024年02月08日
    浏览(29)
  • ESP8266模块教程,包含电路连接,固件烧录,串口通信

    Author : w2y        Date : 2022.06.28 资料下载: 链接:https://pan.baidu.com/s/1cSpXo7lVzewLXiB9PyWlvg?pwd=wh8a  提取码:wh8a    GPIO0 接地进入下载(烧录)模式,不接进入运行模式                     (下载模式)                                    (运行模式) MQTT_ESP-12S_D

    2024年02月01日
    浏览(48)
  • STM32控制JQ8400语音播报模块

    时间记录:2024/2/7 标示 说明 ONE LINE 一线操作引脚 BUSY 忙信号引脚,正在播放语音时输出高电平 RX 串口两线操作接收引脚 TX 串口两线操作发送引脚 GND 电源地引脚 DC-5V 电源引脚,3.3-5V DAC-R DAC输出右声道引脚 DAC-L DAC输出左声道引脚 SPK- 喇叭-引脚 SPK+ 喇叭+引脚 (1)时序图 (

    2024年04月11日
    浏览(29)
  • STM32驱动BY9301语音播报模块

    简介:STM32F103C8T6驱动BY9301语音播报模块源码介绍。 开发平台:KEIL ARM MCU型号:STM32F103C8T6 传感器型号:BY9301 特别提示:驱动内可能使用了某些其他组件,比如delay等,在文末外设模板下载地址内有。 1积分源码下载地址在文末!!! 接口图: 使用举例:  驱动源码: BY9301

    2024年02月09日
    浏览(34)
  • STM32使用ASR01语音播报模块

    先下载天问block软件 点击这里下载天问block  选上设备:  添加扩展:   自己再根据鹿小班模块进行操作进行相关操作,先接上usb数据线 记得先生成模型再去编译下载    发送给单片机通信时只需要vcc gnd 还有tx接上单片机rx,如果想用stm32控制语音模块,可以接线,让asr01读

    2024年02月16日
    浏览(59)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包