STM32H743VIT6使用STM32CubeMX通过I2S驱动WM8978(5)
接前一篇文章:STM32H743VIT6使用STM32CubeMX通过I2S驱动WM8978(4)
本文参考以下文章及视频:
STM32CbueIDE Audio播放音频 WM8978 + I2S_stm32 cube配置i2s录音和播放-CSDN博客
STM32第二十二课(I2S,HAL,cubemx)_i2s cubemax-CSDN博客
STM32:I2S驱动WM8978_stm32 iis输出-CSDN博客
STM32:利用VM8978和I2S实现录音的频率分析-CSDN博客
第35讲-I2S 6(配套例程讲解)_哔哩哔哩_bilibili
第83讲 音乐播放器实验讲解_哔哩哔哩_bilibili
特此致谢!

上一回讲解了WM8978初始化函数wm8978_init中的寄存器6的配置操作,本文接着讲解对于其它寄存器的配置。
为了便于理解和回顾,再次贴出正点原子和野火的代码,分别如下:
- 正点原子代码
//WM8978初始化
//返回值:0,初始化正常
// 其它,错误代码
u8 WM8978_Init(void)
{u8 res;IIC_Init(); //初始化I2C接口res = WM8978_Write_Reg(0, 0); //软复位WM8978if(res) //发送指令失败,WM8978异常return 1;//以下为通用设置WM8978_Write_Reg(1, 0x01B); //R1,MICEN设置为1(MIC使能),BIASEN设置为1(模拟器工作),VMIDSEL[1:0]设置为11(5K)WM8978_Write_Reg(2, 0x1B0); //R2,ROUT1、LOUT1输出使能(耳机可以工作),BOOSTENR、BOOSTENL使能WM8978_Write_Reg(3, 0x06C); //R3,LOUT2、ROUT2输出使能(喇叭工作),RMIX、LMIX使能WM8978_Write_Reg(6, 0); //R6,MCLK由外部提供WM8978_Write_Reg(43, 1<<4); //R43,INVROUT2反向,驱动喇叭WM8978_Write_Reg(47, 1<<8); //R47,PGABOOSTL,左通道MIC获得20倍增益WM8978_Write_Reg(48, 1<<8); //R48,PGABOOSTR,右通道MIC获得20倍增益WM8978_Write_Reg(49, 1<<1); //R49,TSDEN,开启过热保护WM8978_Write_Reg(49, 1<<2); //R49,SPEAKER BOOST,1.5xWM8978_Write_Reg(10, 1<<3); //R10,SOFTMUTE关闭,128x采样,最佳SNR(信噪比)WM8978_Write_Reg(14, 1<<3); //R14,ADC 128x采样率return 0;
}
- 野火代码
/*** @brief 配置I2C GPIO,并检查I2C总线上的WM8978是否正常* @param 无* @retval 1,初始化成功* 0,初始化失败*/
uint8_t wm8978_Init(void)
{uint8_t res;I2cMaster_Init(); //初始化I2C接口res = wm8978_Reset(); //硬件复位WM8978所有寄存器到缺省状态wm8978_CtrlGPIO1(1); //控制WM8978的一个GPIO接口,控制其为放音状态return res;
}
/*** @brief 复位wm8978* @param 无* @retval 1:复位成功* 0:复位失败*/
uint8_t wm8978_Reset(void)
{//wm8978寄存器缺省值const uint16_t reg_default[] = {0x000, 0x000, 0x000, 0x000, 0x050, 0x000, 0x140, 0x000,0x000, 0x000, 0x000, 0x0FF, 0x0FF, 0x000, 0x100, 0x0FF,0x0FF, 0x000, 0x12C, 0x02C, 0x02C, 0x02C, 0x02C, 0x000,0x032, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,0x038, 0x00B, 0x032, 0x000, 0x008, 0x00C, 0x093, 0x0E9,0x000, 0x000, 0x000, 0x000, 0x003, 0x010, 0x010, 0x100,0x100, 0x002, 0x001, 0x001, 0x039, 0x039, 0x039, 0x039,0x001, 0x001};uint8_t res;uint8_t i;res = wm8978_WriteReg(0x00, 0);for (i = 0; i < sizeof(reg_default) / 2; i++)wm8978_RegCash[i] = reg_default[i];return res;
}
//WM8978寄存器缓存
//由于WM8978的I2C两线接口不支持读取操作,因此寄存器值缓存在内存中
//当写寄存器同步更新缓存,读寄存器时直接返回缓存中的值
static uint16_t wm8978_RegCash[] = {0x000, 0x000, 0x000, 0x000, 0x050, 0x000, 0x140, 0x000,0x000, 0x000, 0x000, 0x0FF, 0x0FF, 0x000, 0x100, 0x0FF,0x0FF, 0x000, 0x12C, 0x02C, 0x02C, 0x02C, 0x02C, 0x000,0x032, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,0x038, 0x00B, 0x032, 0x000, 0x008, 0x00C, 0x093, 0x0E9,0x000, 0x000, 0x000, 0x000, 0x003, 0x010, 0x010, 0x100,0x100, 0x002, 0x001, 0x001, 0x039, 0x039, 0x039, 0x039,0x001, 0x001
};
寄存器6
- 正点原子代码
WM8978_Write_Reg(6, 0); //R6,MCLK由外部提供
- 野火代码
void wm8978_CfgAudioIF(uint16_t _usStandard, uint8_t _ucWordLen)
{uint16_t usReg;……//// R6,时钟产生控制寄存器// MS = 0, WM8978被动时钟,由MCU提供MCLK时钟//wm8978_WriteReg(6, 0x000);
}
关于寄存器6的说明,参见笔者文章:
WM8978 —— 带扬声器驱动程序的立体声编解码器(5)-CSDN博客

寄存器6复位默认值为0x140(0b101000000)。
- CLKSEL
参见WM8978手册第68~69页,如下:


参见WM8978手册第69页,如下:

- BCLKDIV
参见WM8978手册第69页,如下:

同时参见WM8978手册第69页,如下:

这里由于将WM8978设置为了slave mode即从模式,因此BCLKDIV并不需要设置。
- MS
参见WM8978手册第69页,如下:

同时参见WM8978手册第69页,如下:

对应STM32CubeMX中的设置为(PC7为笔者实际方案中的MCLK引脚):


根据正点原子和野火的代码,实际并没有使用默认值0x140(0b101000000),而是使用了0x000(0b000000000),即WM8978的MCLK为被动时钟,由外部MCU提供。
更多寄存器配置的详细说明与讲解请看下回。
相关文章:
STM32H743VIT6使用STM32CubeMX通过I2S驱动WM8978(5)
接前一篇文章:STM32H743VIT6使用STM32CubeMX通过I2S驱动WM8978(4) 本文参考以下文章及视频: STM32CbueIDE Audio播放音频 WM8978 I2S_stm32 cube配置i2s录音和播放-CSDN博客 STM32第二十二课(I2S,HAL&am…...
Objective-C学习笔记(block,协议)4.10
1.block:是一个数据类型,存储一段代码,代码可以有参数有返回值。 2.声明block: 返回值类型 (^block变量名称)(参数列表); int (^myblock) (int num1,int num2); 代码段格式:^返回值类型(参数列表){ 代码段 }; int (^m…...
AD7982BRMZRL7 二进制 500kSPS 模数转换芯片 ADI
AD7982BRMZRL7是一款由Analog Devices(亚德诺)公司生产的18位逐次逼近型模数转换器(ADC)。它主要用于将模拟信号转换为数字信号,适用于数据采集系统、嵌入式系统、工业控制和医疗设备等领域。 AD7982BRMZRL7的主要功能…...
采集某新闻网资讯网站保存PDF
网址:融资总额近3亿美元、药明康德押注,这家抗衰老明星公司有何过人之处-36氪 想要抓取文章内容,但是找不到啊,可能是文字格式的问题,也可能文章内容进行了加密。 在元素中查看,window.initialState返回的就…...
03攻防世界-unserialize3
根据题目可以看出,这是个反序列化的题目 打开网址观察题目可以看到这里是php的代码,那么也就是php的反序列化 本题需要利用反序列化字符串来进行解题,根据源码提示我们需要构造code。 序列化的意思是:是将变量转换为可保存或传输…...
蓝桥杯备考随手记: 常见的二维数组问题
在Java中,二维数组是一种可以存储多个元素的数据结构。它由多个一维数组组成,这些一维数组可以看作是行和列的组合,形成了一个矩阵。 1. 二维数组旋转问题 二维数组的旋转是指将数组中的元素按照一定规则进行旋转。通常有两种常见的旋转方式…...
Java | Leetcode Java题解之第28题找出字符串中第一个匹配项的下标
题目: 题解: class Solution {public int strStr(String haystack, String needle) {int n haystack.length(), m needle.length();if (m 0) {return 0;}int[] pi new int[m];for (int i 1, j 0; i < m; i) {while (j > 0 && needl…...
【数据结构与算法】:二叉树经典OJ
目录 1. 二叉树的前序遍历 (中,后序类似)2. 二叉树的最大深度3. 平衡二叉树4. 二叉树遍历 1. 二叉树的前序遍历 (中,后序类似) 这道题的意思是对二叉树进行前序遍历,把每个结点的值都存入一个数组中,并且返回这个数组。 思路&…...
uniapp——长按识别二维码
说明 转变思路,长按图片,进入预览图片,这时候再长按就可以了。 <view class"codeMain"><view class"codeWhite" longpress"handleLongPress(i.image(qrcode))"><image :src"i.image(qrc…...
云服务器环境web环境搭建之JDK、redis、mysql
一、Linux安装jdk,手动配置环境 链接: https://pan.baidu.com/s/1LRgRC5ih7B9fkc588uEQ1whttps://pan.baidu.com/s/1LRgRC5ih7B9fkc588uEQ1w 提取码: 0413 tar -xvf 压缩包名 修改配置文件/etc/profile 二、安装redis环境 方案一: Linux下安装配置r…...
第1章 计算机网络体系结构
王道学习 【考纲内容】 (一)计算机网络概述 计算机网络的概念、组成与功能;计算机网络的分类; 计算机网络的性能指标 (二)计算机网络体系结构与参考模型 计算机网络分层结…...
Docker之自定义镜像上传至阿里云
一、Alpine介绍 Alpine Linux是一个轻量级的Linux发行版,专注于安全、简单和高效。它采用了一个小巧的内核和基于musl libc的C库,使得它具有出色的性能和资源利用率。 Alpine Linux的主要特点包括: 小巧轻量:Alpine Linux的安装…...
《深入Linux内核架构》第2章 进程管理和调度 (2)
目录 2.4 进程管理相关的系统调用 2.4.1 进程复制 2.4.2 内核线程 2.4.3 启动新程序 2.4.4 退出进程 本专栏文章将有70篇左右,欢迎关注,订阅后续文章。 2.4 进程管理相关的系统调用 2.4.1 进程复制 1. _do_fork函数 fork vfork clone都最终调用_…...
(四)PostgreSQL的psql命令
PostgreSQL的psql命令 基础信息 OS版本:Red Hat Enterprise Linux Server release 7.9 (Maipo) DB版本:16.2 pg软件目录:/home/pg16/soft pg数据目录:/home/pg16/data 端口:5777psql 是 PostgreSQL 数据库的命令行界面…...
前端使用minio传输文件
minio官方文档 minio-js可以支持ts。 安装完可能会出现 Can‘t import the named export ‘xxx‘ from non EcmaScript module (only default export is available)可以尝试降低minio的版本 npm install minio7.0.18 --save代码: 初始化 const Minio require(…...
[大模型] BlueLM-7B-Chat WebDemo 部署
BlueLM-7B-Chat WebDemo 部署 模型介绍 BlueLM-7B 是由 vivo AI 全球研究院自主研发的大规模预训练语言模型,参数规模为 70 亿。BlueLM-7B 在 C-Eval 和 CMMLU 上均取得领先结果,对比同尺寸开源模型中具有较强的竞争力(截止11月1号)。本次发布共包含 7…...
一文了解ERC404协议
一、ERC404基础讲解 1、什么是ERC404协议 ERC404协议是一种实验性的、混合的ERC20/ERC721实现的,具有原生流动性和碎片化的协议。即该协议可让NFT像代币一样进行拆分交易。是一个图币的互换协议。具有原生流动性和碎片化的协议。 这意味着通过 ERC404 协议…...
iOS cocoapods pod FrozenError and RuntimeError
0x00 报错日志 /Library/Ruby/Gems/2.6.0/gems/cocoapods-1.12.0/lib/cocoapods/user_interface/error_report.rb:34:in force_encoding: cant modify frozen String (FrozenError)from /Library/Ruby/Gems/2.6.0/gems/cocoapods-1.12.0/lib/cocoapods/user_interface/error_r…...
【鸿蒙开发】第二十章 Camera相机服务
1 简介 开发者通过调用Camera Kit(相机服务)提供的接口可以开发相机应用,应用通过访问和操作相机硬件,实现基础操作,如预览、拍照和录像;还可以通过接口组合完成更多操作,如控制闪光灯和曝光时间、对焦或调焦等。 2 …...
JS阅读笔记
myweb3.html <video id"video" width"400" height"300" autoplay></video> <button id"capture-btn">拍摄图片</button> <canvas id"canvas" width"400" height"300">&…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...
学习一下用鸿蒙DevEco Studio HarmonyOS5实现百度地图
在鸿蒙(HarmonyOS5)中集成百度地图,可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API,可以构建跨设备的定位、导航和地图展示功能。 1. 鸿蒙环境准备 开发工具:下载安装 De…...
