前言:
本文主要演示如何使用I2S驱动TM8211,因此不使用外部存储,使用芯片内部flash存储WAV格式音频,音频数据加上程序不超过内部flash大小即可。
芯片介绍:
TM8211是两路16位数模转换集成电路,广泛应用于数字音频、多媒体系统。
具体关于TM8211的介绍这里不再赘述,详见数据手册。
软件模拟I2S驱动TM8211的方法可参考博客:tm8211 双路16位DAC使用方法-CSDN博客
准备:
硬件:
1、STM32F401RET6
2、STLinkV2
3、TM8211+功放+喇叭
软件:
1、CubeMX - (用于配置I2S)
2、CubeIDE - (代码编写和编译烧录)
电气连接:
STM32 --------- TM8211
PB15 ---------- I2S_DIN
PB13 ---------- I2S_CK
PB12 ---------- I2S_WS
Cube相关配置:
生成CubeIDE代码:
程序部分:
由于CubeMX已经把硬件I2S驱动配置好了,TM8211使用硬件I2S驱动非常简单。
此段代码参考博客:STM32CbueIDE Audio播放音频 WM8978 + I2S_stm32 cube配置i2s录音和播放-CSDN博客
音频播放部分代码:
/* I2S 音频播放代码 */
#define BUFFER_SIZE 2048
// 播放一段测试音频
void Paly_TestAudio(void)
{
uint32_t DataLength = 0;
uint8_t* DataAddress = NULL;
uint16_t* TempAddress = NULL;
DataLength = sizeof(data) - 0x2c;
DataAddress = (unsigned char *)(data+ 0x2c);
TempAddress = (uint16_t*)DataAddress;
while(1)
{
HAL_I2S_Transmit(&hi2s2, TempAddress, BUFFER_SIZE / 2, 1000);
DataLength -= BUFFER_SIZE;
TempAddress += (BUFFER_SIZE / 2);
if(DataLength < BUFFER_SIZE) break;
}
}
PS:代码中data数组存放WAV音频数据。(在datas.h中定义)
main部分代码:
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_CRC_Init();
MX_I2S2_Init();
Palyer();
while (1)
{
}
}
需要引入的头文件:
#include "main.h"
#include "cmsis_os.h"
#include "i2s.h"
#include "rtc.h"
#include "tim.h"
#include "gpio.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "datas.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
测试使用的音频,datas.h下载链接:
I2SAudio.rar_w800i2s播放mp3资源-CSDN文库https://download.csdn.net/download/sudaroot/12497400