STM32驱动INMP441麦克风实现左右通道声音采集

news2024/11/24 2:51:49

一、参考原理图

1、INMP441

在这里插入图片描述

2、STM32

在这里插入图片描述
注意INMP441的第4引脚,用来选择左声道还是右声道。
在这里插入图片描述

二、代码生成

代码使用cubemx生成

1、iis设置

在这里插入图片描述

2、DMA设置

在这里插入图片描述

3、生成代码

在这里插入图片描述

三、代码修改

1、首先定义一个数组

	#define BUFFER_SIZE (4)
	static uint32_t simpleBuf[BUFFER_SIZE];
	/* USER CODE BEGIN PV */
	uint32_t val24;
	int val32;
/* USER CODE END PV */

2、定义接收完成中断函数

/* USER CODE BEGIN 0 */
unsigned cb_cnt=0;
//I2S接收完成回调函数
void HAL_I2S_RxCpltCallback(I2S_HandleTypeDef *hi2s)
{
	if(hi2s==&hi2s2){
		cb_cnt++;//回调次数计数
		//将两个32整型合并为一个
		//dat32 example: 0000fffb 00004f00
		val24=(dma[0]<<8)+(dma[1]>>8);
		//将24位有符号整型扩展到32位
		if(val24 & 0x800000){//negative
			val32=0xff000000 | val24;
		}else{//positive
			val32=val24;
		}
		//以采样频率的十分之一,串口发送采样值
		if(cb_cnt%10==0)
			printf("%d\r\n",val32);
	}
}
/* USER CODE END 0 */

3、启动接收

HAL_I2S_Receive_DMA(&hi2s2,(uint16_t*)simpleBuf,BUFFER_SIZE);	

4、完整代码

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2022 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "dma.h"
#include "i2s.h"
#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>
//#include "stm32f1xx_hal.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */
uint32_t dma[4];
uint32_t val24;
int val32;
/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
unsigned cb_cnt=0;
//I2S接收完成回调函数
void HAL_I2S_RxCpltCallback(I2S_HandleTypeDef *hi2s)
{
	if(hi2s==&hi2s2){
		cb_cnt++;//回调次数计数
		//将两个32整型合并为一个
		//dat32 example: 0000fffb 00004f00
		val24=(simpleBuf[0]<<8)+(simpleBuf[1]>>8);
		//将24位有符号整型扩展到32位
		if(val24 & 0x800000){//negative
			val32=0xff000000 | val24;
		}else{//positive
			val32=val24;
		}
		//以采样频率的十分之一,串口发送采样值
		if(cb_cnt%10==0)
			printf("%d\r\n",val32);
	}
}
/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  MX_DMA_Init();
  MX_I2S2_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  //开启DMA传输
  HAL_I2S_Receive_DMA(&hi2s2,(uint16_t*)simpleBuf,BUFFER_SIZE);		
  while (1)
  {
  	HAL_Delay(10);
	
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}
//后面都是Cube自动生成的代码,省略

5、代码解析

根据以上说明,最后一个参数size的单位是由数据帧的长度决定的。前面在Cube中设置的数据格式为24 Bits Data on 32 Bits Frame,因此DMA读取数据的总长度为size×4字节。前面定义的DMA缓冲区是一个长度为4的uint32_t型数组,缓冲区中的数据格式为:前2个元素表示左声道数据后2个表示右声道数据
单通道数据格式为:第一个字节:0x00000004 第一个字节:0x00004500。通过val24=(dma[0]<<8)+(dma[1]>>8);合成0x00fffb4f ,然后区分正负极:

if(val24 & 0x800000){
			val32=0xff000000 | val24;
		}else{
			val32=val24;
		}

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

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

相关文章

金属表面缺陷检测类的实践项目

【说明】&#xff1a;下面仅以Pytorch CNN Transfer Learning: Image Classifier 关于金属表面缺陷检测类的实践项目为例介绍如何创建虚拟环境以及在JuypterLab中使用对应的内核 项目已开源在https://github.com/astudent2020/Metal_Surface_Defects 提供数据集及相关代码 …

【IMDB】IMDB数据集导入PostgreSQL和join order benchmark(JOB)查询生成

目录 简述join order benchmark(JOB)查询获取IMDB导入数据到PG 简述 IMDB数据库是一个很大的&#xff0c;被广泛使用的电影&#xff0c;电视节目和演员信息的数据库&#xff0c;它包括了有关电影、电视节目、演员、制作公司、编剧、导演等信息。IMDB数据集可以为电影评论、分类…

【源码分析】Mybatis 的配置解析过程

博主介绍&#xff1a; ✌博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家✌ Java知识图谱点击链接&#xff1a;体系化学习Java&#xff08;Java面试专题&#xff09; &#x1f495;&#x1f495; 感兴趣的同学可以收…

Hadoop(CentOS)安装及MapReduce实现数据去重

Hadoop&#xff08;CentOS&#xff09;安装及MapReduce实现数据去重 1. JDK安装 1.1 资源下载&#xff1a; 下载地址&#xff1a;https://pan.quark.cn/s/17d7266205f9 hadoop的安装 包 java jdk安装包 eclipse连接hadoop工具 所学其他工具可自行在官网下载 centos下载地…

Verilog 高级知识点

目录 Verilog 高级知识点 1、阻塞赋值&#xff08;Blocking&#xff09; 2、非阻塞赋值&#xff08;Non-Blocking&#xff09; 3 、assign 和 always 区别 4、什么是 latch Verilog 高级知识点 本节给大家介绍一些高级的知识点。高级知识点包括阻塞赋值和非阻塞赋值、assi…

合宙Air724UG Cat.1模块硬件设计指南--ADC接口

ADC接口 简介 ADC(Analog-to-Digital Converter) 指模数转换器。是指将连续变化的模拟信号转换为离散的数字信号的器件。 合宙Cat.1模块ADC接口主要用来检测模拟电压信号量&#xff0c;用于电池电压检测&#xff0c;温湿度检测&#xff0c;TDS检测等应用。 特性 ADC精度&#…

华为OD机试真题 JavaScript 实现【素数之积】【2022Q4 100分】

一、题目描述 RSA加密算法在网络安全世界中无处不在&#xff0c;它利用了极大整数因数分解的困难度&#xff0c;数据越大&#xff0c;安全系数越高。 给定一个32位正整数&#xff0c;请对其进行因数分解&#xff0c;找出是哪两个素数的乘积。 二、输入描述 一个正整数num …

【自动文摘】BART实现finetune及evaluate

文章目录 BART介绍下游任务 fine tune BART介绍 我最近在看自动文摘相关的预训练模型&#xff0c;BART模型是2019-2020左右提出来的&#xff0c;首先介绍下它的基本情况。 论文&#xff1a;https://arxiv.org/abs/1910.13461 github&#xff1a; fairseq例子&#xff1a;http…

Efficient Global 2D-3D Matching for Camera Localization in a Large-Scale 3D Map

文章目录 Efficient Global 2D-3D Matching for Camera Localization in a Large-Scale 3D Map1. 相似源码choose_solution.pyeight_point.pyepipolar_match.py Efficient Global 2D-3D Matching for Camera Localization in a Large-Scale 3D Map 1. 相似源码 由于paper并没…

ChatGPT带火的提示工程师,构造自己的提示语

ChatGPT是一个大语言模型&#xff0c;学过全球几乎公开的大部分有效知识库&#xff0c;它什么都懂。 ChatGPT的风靡&#xff0c;爆火了一个年薪百万的提示工程师这个新就业岗位。 提示工程师&#xff0c;也就是AI训练师&#xff0c;即通过与AI交互写出相关提示&#xff0c;以帮…

Spring Boot进阶(48):SpringBoot之集成WebSocket及使用说明 | 超级详细,建议收藏

1. 前言&#x1f525; 对于很多小伙伴来说&#xff0c;项目现在都普遍前后端分离&#xff0c;各干各的事儿&#xff0c;在前后端进行服务调用才会有大面积的碰头&#xff0c;后端接口数据格式发生变更要通知前端&#xff0c;相反&#xff0c;前端有变化要告诉后端&#xff0c;这…

【这小文章绝了!】一文看穿,MATLAB | 数组与矩阵超详细入门进阶必须看

目录 介绍 一、数组的创建和操作 通过 : 创建一维数组 通过logspace函数创建一维数组 通过linspace函数创建一维数组 二、数组的运算 数组的关系运算 数组的逻辑运算 三、矩阵 矩阵的构造 矩阵的下标引用 矩阵大小 四、矩阵元素的运算 矩阵的差分 矩阵运算 矩阵…

Spring Boot进阶(50):Spring Boot如何全局统一处理异常?| 超级详细,建议收藏

1. 前言&#x1f525; 今天和大家讨论的是Spring Boot如何统一处理异常。这里先说一下我们为什么需要全局统一处理异常&#xff1f;其实理由很简单&#xff0c;因为程序在运行的过程中&#xff0c;不可避免会产生各种各样的错误。比如说用户传过来的参数不正确&#xff0c;无法…

4端到端协议-4.2【实验】【计算机网络】

4端到端协议-4.2【实验】【计算机网络】 前言推荐4端到端协议4.2 TCP协议流捕获与TCP协议分析实验目的实验内容及实验环境实验原理实验过程实验过程演示 4.2.1实验章节测验一.单选题&#xff08;共5题,25.0分&#xff09;二.阅读理解&#xff08;共1题,70.0分&#xff09;三.填…

xxl-job核心源码解析

xxl-job源码解析 如何自研一个xxljob 注册服务调度服务RPC组件(基建&#xff0c;底层严重依赖)日志服务告警服务 系统架构 执行流程 各大调度中心对比 1&#xff09;服务端启动流程 首先找到配置类 XxlJobAdminConfig 可以发现该类实现 InitializingBean接口&#xff0c;…

openpose保姆级教程代码详细解析——训练部分

一&#xff1a;前言 OpenPose是一个基于深度学习的人体姿势估计库&#xff0c;它可以从图像或视频中准确地检测和估计人体的关键点和姿势信息。OpenPose的目标是将人体姿势估计变成一个实时、多人、准确的任务。它的原理部分已经在上一篇非常详细的讲解了——本节介绍训…

Dynamic .NET TWAIN 8.3.3 for NetCore Crack

用于 WinForms 和 WPF 应用程序的扫描仪和网络摄像头捕获 SDK 适用于 .NET 应用程序的简单高效的扫描和网络摄像头 SDK Dynamsoft 的 Dynamic .NET TWAIN 是一个基于 TWAIN 和 DirectShow 标准的 .NET 文档成像 SDK。它为扫描仪和网络摄像头软件开发提供了丰富、高效且…

修改依赖包下的子依赖版本,前端项目安全扫描出来的漏洞——解决过程

为什么要升级&#xff0c;如图云桌面&#xff08;相当于堡垒机-远程桌面&#xff09;的项目审查是大概基于node16版本进行扫描的&#xff0c;本来我方是通过降版本从14到12绕过大范围更新&#xff0c;但现在躲得过初一躲不过十五&#xff0c;如何更新 package-lock.json 中的一…

DAY24:二叉树(十四)二叉搜索树中的插入操作+删除二叉搜索树中的节点(二叉树结构修改难点)

文章目录 701.二叉搜索树中的插入操作思路递归法如何保证连接的节点就是空节点的父节点&#xff1f; 迭代法迭代法注意debug测试 450.删除二叉搜索树中的节点&#xff08;坑较多&#xff0c;注意复盘&#xff09;思路最开始的写法debug测试1.使用了释放后的空间ERROR: AddressS…

通知!2023年湖北住建厅七大员新考和继续教育要求有变化了?启程别

通知&#xff01;2023年湖北住建厅七大员新考和继续教育要求有变化了&#xff1f;启程别 湖北住建厅七大员新考以及继续教育的相关要求都即将有一些变化了目前在征集意见的阶段&#xff0c;具体实施等后续具体通知 对于新考的变化主要是&#xff1a; 1.由原先报名之后只需要完成…