使用VSCode+CubeMx开发STM32,这里介绍使用I2S接口连接MAX98357模块播放声音;

1.建立工程

1.1 创建项目文件

从已有的仓库中创建一个工程:

1
git clone https://github.com/makerinchina-iot/vscode_stm32cubemx_hello.git MAX98357

使用VSCode打开工程后,需要更改如下名字:

  • 文件夹根目录下CMakeLists.txt 文件中修改工程名字为MAX98357:
1
set(CMAKE_PROJECT_NAME MAX98357)
  • stm32cubemx配置文件更改为 ntc.ioc ,并更改以下文件名:
1
2
3
4
...
ProjectManager.ProjectFileName=MAX98357.ioc
ProjectManager.ProjectName=MAX98357
...
1.2 引脚配置

使用STM32CubeMx打开ioc配置文件,然后配置对应的I2S引脚;

image-20250809215954330

2. 编写代码

2.1 i2s输出音频

配置好i2s接口后,直接使用i2s函数输出数据到MAX89357模块即可听到声音;

  • 声音输出:
1
2
3
4
5
6
HAL_StatusTypeDef res = HAL_I2S_Transmit(&hi2s1, (uint16_t *)voice8k16b, sizeof(voice8k16b) / sizeof(voice8k16b[0]), HAL_MAX_DELAY);
if (res != HAL_OK)
{
log_error("I2S - ERROR, res = %d!\r\n", res);
break;
}
  • 声音测试数据

这里voice8k16b数组存放的即为测试音频数据,由如下代码生成:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import numpy as np
from pydub import AudioSegment
import sys, os

INPUT_FILE = 'test.mp3' # 测试音频
OUTPUT_H = 'voice8k16b.h'
MAX_BYTES = 64000 #数据量
SAMPLE_RATE = 8000
# ==================

def main():
if not os.path.isfile(INPUT_FILE):
print('file not found: %s' % INPUT_FILE)
sys.exit(1)

# 读文件 → 转 8 kHz → 单声道
audio = AudioSegment.from_file(INPUT_FILE).set_frame_rate(SAMPLE_RATE).set_channels(1)

# 转 numpy int16
samples = np.array(audio.get_array_of_samples(), dtype=np.int16)

# 限制长度
max_samples = MAX_BYTES // 2
if len(samples) > max_samples:
samples = samples[:max_samples]

# 调整声音大小
vol = 0.02
samples = (samples.astype(np.float32) * vol).astype(np.int16)

# 写 C 数组
with open(OUTPUT_H, 'w') as f:
f.write('#ifndef VOICE8K16B_H\n#define VOICE8K16B_H\n\n')
f.write(f'const int16_t voice8k16b[{len(samples)}] = {{\n')
for i, v in enumerate(samples):
f.write(f'{v},')
if (i % 16) == 15: f.write('\n')
f.write('\n};\n\n#endif\n')

if __name__ == '__main__':
main()

由于之前设置I2S接口的音频频率为8KHz,因此这里把mp3数据也转换为8KHz采样率的数据;

3.编译并烧录代码

3.1 编译和烧录
  • 点击生成按键即可编译工程;

  • 在VSCode中执行task:openocd-flash烧录;

3.2 硬件连接与结果
  • 按照如下方式连接硬件:
STM32 MAX89357
3.3V 3V3
PA7 (I2S1_SD) DIN
PA5 (I2S1_CK) BCLK
PA4 (I2S1_WS) LRC
GND GND
+ 接喇叭正极
- 接喇叭负极
  • 运行后可以听到声音播放;