STM32单片机基本原理与应用(十一)

news2024/11/16 19:59:20

语音识别实验

此实验采用STM32核心板+ LD3320模块,通过初始化LD3320并写入待识别关键词,对麦克风说出相应关键词,实现实训平台上的流水灯相应变化的效果。
LD3320 是一颗基于非特定人语音识别 (SI-ASR:Speaker-Independent Automatic Speech Recognition)技术的语音识别/声控芯片。提供了真正的单芯片语音识别解决方案。
LD3320 芯片上集成了高精度的 A/D 和 D/A 接口,不再需要外接辅助的Flash 和 RAM,即可以实现语音识别/声控/人机对话功能。并且,识别的关键词语列表是可以动态编辑的。
主要特色功能:
在这里插入图片描述

  • 非特定人语音识别技术:不需要用户进行录音训练。
  • 可动态编辑的识别关键词语列表:只需要把识别的关键词语以字符串的形式传送进芯片,即可以在下次识别中立即生效。
  • 真正单芯片解决方案:不需要任何外接的辅助 Flash 和 RAM,真正降低系统成本。
  • 内置高精度 A/D和D/A通道:不需要外接 AD 芯片,只需要把麦克风接在芯片的AD 引脚上;可以播放声音文件,并提供 550mW 的内置放大器。
  • 高准确度和实用的语音识别效果。
  • 支持用户自由编辑 50 条关键词语条:在同一时刻,最多在 50 条关键词语中进行识别,终端用户可以根据场景需要,随时编辑和更新这 50 条关键词语的内容。

程序代码

1、 LD3320创建语音识别任务,完成关键词的设置。

void   LD3320_Task(void)
{
  uint8_t   i=0;
  uint8_t  LD_ASR_Candi_Num,LD_ASR_EXTI_IFO; //从中断代码拿过来的
	char buf[20];
	uint8_t   j=1;	
	//测试读取寄存器	
	printf("LD3320_Task...\r\n");

	ETH_CS_H();
	VS_CS_H();
	LD_CS_K_H()	; //关掉底板上的LD3320  实训平台对比测试
   LD_WriteReg(0x29,0) ;   /*关闭中断*/
   LD_WriteReg(0x02,0) ;   
		
   //1 空闲状态;2 识别成功状态;3 识别失败状态。
 
  while(1)
  {    
    switch(process)
    { 
      case  0:         /*ld3320处于空闲状态*/
      i++;
      process=LD_Run();  
      if(i==4)
      {
        printf("语音识别模块内部故障,请检查硬件连接 \r\n");
        return;
      }
      break;

      case  1:          /*ld3320语音准备OK*/
	  
	  
      if(flag)          /*中断判断*/  //判断识别是否成功
      {          
        switch(direct)  /*对结果执行相关操作*/         
        {
          case 1:       /*命令“流水灯”*/
          printf(" 流水灯 指令识别成功\r\n");
          break;

          case 2:	      /*命令“闪烁”*/
          printf(" 闪烁 指令识别成功\r\n"); 
          break;

          case 3:	      /*命令“按键触发”*/
          printf(" 开灯/点灯  指令识别成功\r\n"); 
          break;

          case 4:		    /*命令“全灭”*/
          printf(" 全灭 指令识别成功\r\n");
          break;

          default:     
          break;
        } 
        process=flag=0;        
      }
      break;
      
      case  2:         /*ld3320语音识别失败*/
      i=0;
      if(flag)         /*中断判断*/
      {
        printf("未识别到有效信息或没有声音\r\n");
        process=flag=0;            
      } 
      break;      
                     
      default:
      break;  
    }
    
	  if((process==1)&&(LD_ReadReg(0xB2)==0x21) && (LD_ReadReg(0xbf)==0x35))	
	  {
		  printf("进入判断 原中断处理 \r\n");	
		  
		  flag=1;     //!!!!!!
		  
				LD_ASR_Candi_Num = LD_ReadReg(0xba); 
				if(LD_ASR_Candi_Num>0 && LD_ASR_Candi_Num<=4) 
				{ 
					direct = LD_ReadReg(0xc5);					
					process=1;    //识别成功    
					 
					printf("接收到的语音信息 %d \r\n",direct );  
				}else
				process=2;  //识别失败
	  
	  /*完成一次语音识别后重新配置寄存器*/
		LD_WriteReg(0x2b,0);
		LD_WriteReg(0x1C,0);//写0:ADC不可用
		LD_WriteReg(0x29,0);
		LD_WriteReg(0x02,0);
		LD_WriteReg(0x2B,0);
		LD_WriteReg(0xBA,0);	
		LD_WriteReg(0xBC,0);	
		LD_WriteReg(0x08,1);//清除FIFO_DATA
		LD_WriteReg(0x08,0);//清除FIFO_DATA后 再次写0   	
	  }
    LD_Test();
   }
}

音乐播放器实验

单片机首先挂载FATS文件系统,接着在加载指定路径下的音频文件,最终通过VS1053解码并输出音频。VS1053采用SPI协议传输音频数据。但其还有两种不同的工作模式一种是串行数据接口的串行协议(SDI),一种是串行命令接口的串行协议(SCI)。所以片选有两个XCS and XDCS。
SCI 串行总线命令接口包含了一个指字节、一个地址字节和一个 16 位的数据字。读写操作可以读写单个寄存器,在 SCK 的上升沿读出数据位,所以主机必须在下降沿刷新数据SCI 的字节数据总是高位在前低位在后的。第一个字节指令字节, 只有 2 个指令,也就是读和写,读为0X03,写为 0X02。
在这里插入图片描述

对于SCI的读时序,是向 VS1053 读取数据,通过先拉低 XCS,然后发送读指令(0X03),再发送一个地址,最后,我们在 SO 线(VS_MISO)上就可以读到输出的数据了。而同时SI(VS_MOSI)上的数据将被忽略。
在这里插入图片描述
对于SCI的写时序,与读时序一样都是先发指令,再发地址。不过写时序中,我们的指令是写指令(0X02),并且数据是通过 SI 写入 VS1053的, SO 则一直维持低电平。在这两个图中,DREQ 信号上都产生了一个短暂的低脉冲,也就是执行时间。我们在写入和读出 VS1053 的数据之后,它需要一些时间来处理内部的事情,这段时间,是不允许外部打断的,所以,我们在 SCI 操作之前,最好判断一下DREQ 是否为高电平,如果不是,则等待 DREQ 变为高。

程序代码

这里我们仅对主函数进行展示:

int main(void)
 {	 
 
	delay_init();	    	 //延时函数初始化	  
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
	uart_init(115200);	 	//串口初始化为115200
 	LED_Init();		  			//初始化与LED连接的硬件接口
//	 KEY_Init();					//初始化按键
	LCD_Init();			   		//初始化LCD     
//	W25QXX_Init();				//初始化W25Q128
	 

 	VS_Init();	  				//初始化VS1053 
 	my_mem_init(SRAMIN);		//初始化内部内存池
	exfuns_init();				//为fatfs相关变量申请内存  
// 	f_mount(fs[0],"0:",1); 		//挂载SD卡 
// 	f_mount(fs[1],"1:",1); 		//挂载FLASH.
	POINT_COLOR=RED;       
// 	while(font_init()) 				//检查字库
//	{	    
//		LCD_ShowString(30,50,200,16,16,"Font Error!");
//		delay_ms(200);				  
//		LCD_Fill(30,50,240,66,WHITE);//清除显示	     
//	}

	while(SD_Init())			//检测SD卡
		{
			LCD_ShowString(30,70,200,16,16,"SD Card Failed!");
			delay_ms(200);
			LCD_Fill(30,70,200+30,70+16,WHITE);
			delay_ms(200);		    
		}								 						    
		LCD_ShowString(30,70,200,16,16,"SD Card OK");

	 
 	Show_Str(30,50,200,16,"战舰 STM32实训平台",16,0);				    	 
	Show_Str(30,70,200,16,"音乐播放器实验",16,0);				    	 
	Show_Str(30,90,200,16,"正点原子@ALIENTEK",16,0);				    	 
	Show_Str(30,110,200,16,"2015年1月20日",16,0);
	Show_Str(30,130,200,16,"KEY0:NEXT   KEY2:PREV",16,0);
	Show_Str(30,150,200,16,"KEY_UP:VOL+ KEY1:VOL-",16,0);
	

	
	while(1)
	{
  		LED1=0; 	  
		Show_Str(30,170,200,16,"存储器测试...",16,0);
		printf("Ram Test:0X%04X\r\n",VS_Ram_Test());//打印RAM测试结果	    
		Show_Str(30,170,200,16,"正弦波测试...",16,0); 	 	 
 		VS_Sine_Test();	 
		Show_Str(30,170,200,16,"<<音乐播放器>>",16,0); 		 
		LED1=1;
		
		mp3_play();
		
	} 	   										    
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

新版ui周易测算网站H5源码/在线起名网站源码/运势测算网站系统源码,附带系统搭建教程

支持对接第三方支付 安装方法以linux为例 1、建议在服务器上面安装宝塔面板&#xff0c;以便操作&#xff0c;高逼格技术员可以忽略这步操作。 2、把安装包文件解压到根目录&#xff0c;同时建立数据库&#xff0c;把数据文件导入数据库 3、修改核心文件config/inc_config.…

【LeetCode每日一题】299. 猜数字游戏

文章目录 [299. 猜数字游戏](https://leetcode.cn/problems/bulls-and-cows/)思路&#xff1a;代码&#xff1a; 299. 猜数字游戏 思路&#xff1a; 遍历两个字符串 secret 和 guess&#xff0c;若字符既在相同位置上又相等&#xff0c;则位置和数字都正确&#xff0c;对应的 …

uniapp隐藏状态栏并强制横屏

uniapp隐藏状态栏并强制横屏 1.manifest.json中&#xff1a; "screenOrientation": ["landscape-primary", //可选&#xff0c;字符串类型&#xff0c;支持横屏"landscape-secondary" //可选&#xff0c;字符串类型&#xff0c;支持反向横屏]…

力扣--76. 最小覆盖子串

给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串&#xff0c;则返回空字符串 "" 。 注意&#xff1a; 对于 t 中重复字符&#xff0c;我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。如…

vscode插件-TONGYILingma

通义灵码&#xff0c;是一款基于通义大模型的智能编码辅助工具&#xff0c;提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码注释生成、代码解释、研发智能问答、异常报错排查等能力&#xff0c;并针对阿里云 SDK/API 的使用场景调优&#xff0c;为开发者带来高…

深度学习:推动可持续发展与社会责任的创新引擎!

随着科技的飞速发展和全球化的推进&#xff0c;可持续发展和社会责任逐渐成为各个领域关注的焦点。深度学习作为人工智能的重要分支&#xff0c;在可持续发展和社会责任方面发挥着越来越重要的作用。本文旨在探讨深度学习在环境保护、资源利用、犯罪预防和残障人士辅助等领域的…

鸿蒙视频播放的实现

文章目录 前言播放效果视频播放的实现总结 一、前言 现在市面上很多应用都跟视频有关&#xff0c;那么在鸿蒙系统上怎么来播放视频呢&#xff0c;今天就讲解视频播放控件&#xff0c;让你也能快速地进行视频播放功能开发。 最后呢&#xff0c;我会提供一个鸿蒙中涉及的主要…

16. 获取社区详情

文章目录 一、建表、插入测试数据、并生成对应的model二、添加路由&#xff0c;以及controller、logic、dao三层分别实现对应代码三、编译运行 登录之后&#xff0c;我们可以发表帖子&#xff0c;但是发表帖子之前&#xff0c;需要先选择一个频道&#xff0c;可以理解是社区分类…

USB协议学习(三)大容量存储设备SCSI协议分析

笔者来简单介绍一下SCSI得协议命令 1、SCSI协议认识 SCSI&#xff1a;Small Computer System Interface&#xff0c;用于计算机外部设备得接口标准&#xff0c;定义了与外部设备得一套协议。SCSI标准协议族支持很多钟SCSI设备&#xff0c;像盘&#xff0c;打印机&#xff0c;扫…

算法-双指针、BFS与图论-1224. 交换瓶子

题目 思路 可以交换任意两个瓶子&#xff0c;最多n-1次&#xff1b;如果是只能交换相邻的瓶子&#xff0c;那么相当于逆序对的个数&#xff08;这篇博客是介绍如何计算逆序对的算法&#xff1a;算法篇&#xff1a;逆序对_逆序对算法-CSDN博客&#xff09;本题转换为图论去看:边…

【C++】类和对象(六个默认成员函数)

文章目录 类的六个默认成员函数**构造函数****构造函数的目的****构造函数的特性** 析构函数析构函数概念析构函数处理的顺序析构函数清理细节 拷贝构造函数拷贝构造函数典型调用场景 赋值运算符重载运算符重载赋值运算重载前置和后置 重载 const成员函数再提权限的问题: 取地址…

HAproxy反向代理与负载均衡

目录 一、HAproxy介绍 1. 概述 2. 关于4/7层负载均衡 2.1 无负载均衡 2.1.1 图示 2.1.2 说明 2.2 四层负载均衡 2.2.1 图示 2.2.2 说明 2.3 七层负载 2.3.1 图示 2.3.2 说明 3. 特性 4. HAProxy负载均衡常见策略 5. 处理模式 二、HAproxy安装 1. yum安装 2. 第…

文献阅读笔记:全卷积神经网络

文献阅读笔记&#xff1a;全卷积神经网络 摘要Abstract1. 全卷积神经网络1.1 文献摘要1.2 全卷积神经网络1.2.1 网络结构1.2.0 从分类器到密集 FCN1.2.2 上采样 Upsampling1.2.3 跳级结构1.2.4 FCN训练 1.3 实验1.4 总结 2. 代码实现 摘要 本周学习了全卷积神经网络&#xff0…

模板不存在:./Application/Home/View/OnContact/Index.html 错误位置

模板不存在:./Application/Home/View/OnContact/Index.html 错误位置FILE: /home/huimingdedhpucixmaihndged5e/wwwroot/ThinkPHP123/Library/Think/View.class.php  LINE: 110 TRACE#0 /home/huimingdedhpucixmaihndged5e/wwwroot/ThinkPHP123/Library/Think/View.class.php(…

关于迁移数据库的一些问题

开发人员&#xff0c;并且需要将数据库迁移到另一个分库&#xff0c;尽量采取以下步骤&#xff1a; 备份源数据库&#xff1a; 在进行任何操作之前&#xff0c;首先要确保对源数据库进行备份&#xff0c;以防止意外数据丢失或损坏。 创建目标分库&#xff1a; 在目标数据库服务…

mockjs学习

1.前言 最近面试发现之前团队协同合作的项目没有mock数据难以向面试官直接展示&#xff0c;所以迟到得来速学一下mockjs。 参考视频&#xff1a;mockJs 妈妈再也不用担心我没有后端接口啦_哔哩哔哩_bilibili 一开始查阅了一些资料&#xff0c;先是看了下EasyMock&#xff0c…

windows安装ElasticSearch踩坑记

ElasticSearch是一个开源的分布式搜索和分析引擎。它提供实时分布式搜索功能&#xff0c;可以索引和搜索大量的结构化和非结构化数据。Elasticsearch以其速度、可伸缩性和处理复杂查询的能力而闻名。它常用于日志分析、全文搜索、文档搜索和数据分析等领域。使用ElasticSearch的…

AHU 算法分析 实验四 动态规划

实验四&#xff1a;动态规划 实验目的 • 理解动态规划的基本思想&#xff0c;理解动态规划算法的两个基本要素最 优子结构性质和子问题的重叠性质。 • 熟练掌握典型的动态规划问题。 • 掌握动态规划思想分析问题的一般方法&#xff0c;对较简单的问题能正确 分析&#x…

Day31:安全开发-JS应用WebPack打包器第三方库JQuery安装使用安全检测

目录 打包器-WebPack-使用&安全 第三方库-JQuery-使用&安全 思维导图 JS知识点&#xff1a; 功能&#xff1a;登录验证&#xff0c;文件操作&#xff0c;SQL操作&#xff0c;云应用接入&#xff0c;框架开发&#xff0c;打包器使用等 技术&#xff1a;原生开发&…

章六、集合(1)—— 概念、API、List 接口及实现类、集合迭代

零、 关闭IDEA调试时自动隐藏空元素 一、 集合的概念 存储一个班学员信息&#xff0c;假定一个班容纳20名学员 当我们需要保存一组一样&#xff08;类型相同&#xff09;的元素的时候&#xff0c;我们应该使用一个容器来存储&#xff0c;数组就是这样一个容器。 数组有什么缺…