STM32H743VIT6使用STM32CubeMX通过I2S驱动WM8978(1)

文章讲述了在STM32CubeMX中通过I2S驱动WM8978音频处理器的初始化过程,对比了正点原子和野火开发板的代码实现,以帮助读者理解并应用到实际项目中。
ViT图像分类-中文-日常物品

阿里开源图像识别

接前一篇文章:STM32H743VIT6使用STM32CubeMX通过I2S驱动WM8978(1)

本文参考以下文章及视频:

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

特此致谢!

按照常理,应该先来讲STM32CubeMX中对于STM32H743VIT6芯片的引脚配置。不过这里笔者反其道而行之,既然之前的系列文章已经对于WM8978这个芯片作了介绍和研究,那么在此就直接上代码,先来讲解一下Keil下WM8978的初始化代码。这里会分别给出正点原子以及野火开发板中配套例程的相关代码以作对比和验证,以期在此过程中能够对于代码加深理解。

当然这里要说明和强调的是,正点原子和野火开发板的相应代码已经公开,在此并没有侵权行为。

开始上第1个函数:WM8978初始化。

1. wm8978_init函数

  • 正点原子代码
//WM8978初始化
//返回值:0,初始化正常
//     其它,错误代码
u8 WM8978_Init(void)
{
	u8 res;

	IIC_Init(); //初始化I2C接口

	res = WM8978_Write_Reg(0, 0); //软复位WM8978
	if(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.5x
	WM8978_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
};

由正点原子和野火的代码对比可以发现,双方代码各有千秋。正点原子的WM8978初始化代码突出了那些不是默认值的寄存器,同时给出了各位的意义,使得重点较为突出。读代码的人自然有详细查看寄存器各个位的倾向;而野火的初始化代码则更为规矩和全面,把WM8978的58各寄存器的复位值都列出来了。

WM8978的58各寄存器的整体说明参见WM8978G.pdf的第80~81页的Table 63 —— WM8978 Register Map。如下图所示:

由上表可以看到,0~57这58各寄存器的默认值与野火代码中的reg_default[]中的值一一对应。

先来看一下最开始调用的复位函数,即对WM8978的寄存器0进行操作(写任意值)。正点原子的代码和野火的代码基本一样,只是函数名稍有区别。

  • 正点原子代码
    res = WM8978_Write_Reg(0,0); //软复位WM8978
	if(res) //发送指令失败,WM8978异常
        return 1;
  • 野火代码
    res = wm8978_WriteReg(0x00, 0);

关于寄存器0的说明,参见笔者文章:WM8978 —— 带扬声器驱动程序的立体声编解码器(4)-CSDN博客

实际上,这里对于寄存器0写入其它值也是可以的。

更多寄存器的配置详解请看下回。

您可能感兴趣的与本文相关的镜像

ViT图像分类-中文-日常物品

ViT图像分类-中文-日常物品

图文对话
PyTorch
Cuda

阿里开源图像识别

### 使用STM32H743VIT6驱动I8080接口的8位MCU显示屏 尽管当前提供的引用主要集中在STM32H743VIT6通过I2S驱动音频芯片WM8978以及串口通信相关内容[^1][^2][^3][^4],但针对I8080接口的8位MCU显示屏驱动需求,可以通过以下方法实现。 #### 1. 硬件连接 I8080接口是一种并行数据传输协议,通常用于LCD控制器与微处理器之间的通信。为了使STM32H743VIT6能够成功驱动此类显示屏,需完成如下硬件连接: - 数据线(D0-D7):连接到GPIO端口。 - 控制信号线: - RS(Register Select):决定写入的是指令还是数据。 - RW(Read/Write):控制读或写操作。 - EN(Enable):触发一次有效的数据传输。 这些信号均应映射至STM32的通用输入输出引脚,并确保其工作电压匹配目标显示屏的要求。 #### 2. 软件配置 ##### GPIO设置 利用STM32CubeMX工具创建项目时,需要手动配置多个GPIO引脚作为推挽输出模式来模拟I8080总线行为。具体步骤包括但不限于: - 打开Pinout视图,分配足够的GPIO资源给上述提到的数据和控制线路; - 设置每个选定管脚的功能为“GPIO_Output”,方向设为“Output Push Pull”。 ##### 定义宏定义简化访问过程 ```c #define LCD_DATA_PORT GPIOA /* 假定数据引脚位于PORT A */ #define LCD_CTRL_PORT GPIOB /* 假定控制引脚位于PORT B */ /* Control Pins */ #define LCD_RS_PIN LL_GPIO_PIN_0 #define LCD_RW_PIN LL_GPIO_PIN_1 #define LCD_EN_PIN LL_GPIO_PIN_2 void lcd_write_command(uint8_t cmd){ LL_GPIO_ResetOutputPin(LCD_CTRL_PORT, LCD_RS_PIN); // Set RS low for command mode. LL_GPIO_WritePortBit(LCD_DATA_PORT, cmd); toggle_enable(); } void lcd_write_data(uint8_t data){ LL_GPIO_SetOutputPin(LCD_CTRL_PORT, LCD_RS_PIN); // Set RS high for data mode. LL_GPIO_WritePortBit(LCD_DATA_PORT, data); toggle_enable(); } ``` 此处采用LL库函数直接操控寄存器以提高效率[^5]。 #### 3. 初始化序列 每款液晶屏都有特定的初始化命令集,在正式显示图像前必须按照厂商手册执行相应流程才能正常运作。一般涉及重置屏幕参数、设定对比度等级等方面的操作。 #### 4. 图形绘制基础功能构建 基于以上框架进一步扩展支持像素点绘图、直线画法乃至复杂图形渲染等功能模块,则可逐步搭建起完整的嵌入式GUI系统雏形。 ---
### 关于 STM32H743VIT6 的技术资料 STM32H743VIT6 是一款高性能微控制器,属于 STMicroelectronics 的 STM32H7 系列。以下是关于该芯片的技术资料、引脚图、价格和购买渠道的相关信息。 #### 技术资料 STMicroelectronics 官方提供了详尽的数据手册和技术文档,涵盖了 STM32H743VIT6 的所有特性和规格。数据手册中包含了详细的寄存器描述、外设功能说明以及功耗分析等内容[^1]。开发者可以通过访问官方网站下载最新的版本。 对于 I2S 驱动 WM8978 的应用实例,可以参考 STM32CubeMX 和 CubeIDE 提供的项目模板。这些工具能够帮助快速生成初始化代码并简化复杂配置过程。 #### 引脚图 STM32H743VIT6 采用 LQFP176 封装形式,具有丰富的 GPIO 接口和其他外围设备接口。具体的引脚排列及其对应功能可以在官方发布的封装与引脚分配文档中找到。通常情况下,LQFP176 的引脚分布遵循一定的逻辑顺序,便于设计 PCB 布局。 以下是一个简单的 Python 脚本用于解析 CSV 文件中的引脚映射表(假设已存在这样的文件): ```python import csv def parse_pin_map(file_path): pin_mapping = {} with open(file_path, newline='') as csvfile: reader = csv.DictReader(csvfile) for row in reader: pin_number = int(row['Pin']) function = row['Function'] pin_mapping[pin_number] = function return pin_mapping pin_map = parse_pin_map('stm32h743vit6_pins.csv') print(pin_map) ``` 此代码片段仅作为示例展示如何自动化处理引脚信息。 #### 价格与购买建议 STM32H743VIT6 的市场价格因批量大小和地区差异而有所不同。一般而言,在线分销商如 Digi-Key、Mouser Electronics 或者本地授权经销商均提供零售服务。为了获取最新报价,可以直接联系供应商查询库存状态及单价范围[^3]。 另外值得注意的是,部分电商平台也可能出售带有 STM32H743VIT6 的开发板产品。这类商品往往附带额外组件比如 OLED 显示屏或者扩展连接头,适合初学者学习使用 MicroPython 编程语言完成基础实验项目。 #### 开发板推荐 针对希望深入研究这款 MCU 性能潜力的研究人员来说,“麦哲伦”系列开发板因其良好的兼容性和易用性受到广泛好评。它预载了 MicroPython 固件,并集成了多种传感器单元方便测试不同场景下的表现效果[^2]。 如果目标侧重于多媒体领域,则可考虑其他专门优化过的型号来满足更高分辨率图像捕捉需求或是流畅播放高清视频的要求。 ---
要获取适用于 **STM32H743VIT6** 的固件包及开发资源,可以通过以下官方和社区支持渠道进行访问。 ### 固件包下载 1. **STM32CubeH7 固件包**: - STM32CubeH7 是 STMicroelectronics 提供的官方固件库,包含 HAL 库、底层驱动程序、示例代码以及 STM32CubeMX 配置工具的支持。 - 官方下载链接:[https://www.st.com/en/embedded-software/stm32cubeh7.html](https://www.st.com/en/embedded-software/stm32cubeh7.html) - 该固件包提供了针对 STM32H7 系列微控制器的完整软件支持,包括 STM32H743VIT6 所需的所有外设驱动程序和示例项目[^1]。 2. **STM32CubeMX 支持文件**: - 在 STM32CubeMX 中配置 STM32H743VIT6 时,需要确保安装了最新的器件支持包。 - 可通过 STM32CubeMX 内部的“Check for Update”功能自动下载并安装对应的 MCU 支持文件,或手动从官网下载更新包。 ### 开发工具与环境 1. **集成开发环境(IDE)**: - **STM32CubeIDE**:ST 提供的官方集成开发环境,基于 Eclipse,集成了编译器、调试器、代码生成器等功能,支持 STM32H743VIT6 的工程创建和调试。下载地址:[https://www.st.com/en/development-tools/stm32cubeide.html](https://www.st.com/en/development-tools/stm32cubeide.html) - **Keil MDK** 和 **IAR Embedded Workbench**:也提供对 STM32H743 的支持,适合商业级项目开发[^2]。 2. **调试工具**: - **ST-LINK/V2 或 ST-LINK/V3**:用于连接目标板进行烧录和调试。 - **OpenOCD**:开源调试工具链,支持 JTAG/SWD 接口调试 STM32 微控制器。 ### 开发文档与参考手册 1. **数据手册(Datasheet)**: - 《STM32H743xI/G Reference Manual》:详细描述了芯片架构、内存映射、外设寄存器等关键信息。 - 下载地址:[https://www.st.com/resource/en/reference_manual/dm00176841.pdf](https://www.st.com/resource/en/reference_manual/dm00176841.pdf) 2. **用户手册(User Manual)**: - 例如:《STM32H743 Nucleo-144 User Manual》,如果你使用的是 NUCLEO-H743ZI2 开发板,可以从中获取硬件接口定义和引脚配置说明。 3. **应用笔记(Application Notes)**: - ST 提供多个关于音频接口(如 I2S)、DMA 控制、定时器高级用法的应用笔记,可作为开发 WM8978 音频驱动的重要参考资料。 ### 示例代码与社区资源 1. **GitHub 示例仓库**: - 可以在 GitHub 上搜索 `stm32h743 i2s wm8978` 查找已有的开源项目,如音频播放、录音实现等。 - 示例项目结构通常包括: ```c main.c stm32h7xx_hal_conf.h wm8978_driver.c i2s_audio_config.c ``` 2. **STM32 社区论坛**: - [https://community.st.com/](https://community.st.com/) 是一个活跃的技术交流平台,开发者可以在其中查找类似问题的解决方案或发布新问题。 3. **中文技术博客与教程**: - 包括 CSDN、知乎专栏、掘金等平台上的 STM32H7 开发实践文章,尤其是涉及 I2S 驱动 WM8978 的具体配置步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝天居士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值