STM32 MP3播放原理与应用开发—与MY1690语音芯片交互全解析(下) | 零基础入门STM32第七十步
·
| 主题 | 内容 | 教学目的/扩展视频 |
|---|---|---|
| MP3播放芯片 | 电路原理,跳线设置,手册分析,驱动程序与调用。 | 了解指令表。 |
师从洋桃电子,杜洋老师
📑文章目录
▲ 回顾上期🔍STM32 MP3播放原理与应用开发—MY1690X-16S语音芯片全解析(上) | 零基础入门STM32第六十八步
▲ 回顾上期🔍STM32 MP3播放原理与应用开发—与MY1690语音芯片交互全解析(中) | 零基础入门STM32第六十九步
一、系统架构与通信流程
1.1 硬件连接示意图
1.2 指令通信流程图
二、核心代码解析
2.1 指令动态生成模块(MY1690.c)
2.1.1 指令帧结构解析
| 起始码 | 长度 | 操作码 | 参数 | 校验码 | 结束码 |
|--------|------|--------|------|--------|--------|
| 0x7E | N | CMD | DATA | XOR | 0xEF |
2.1.2 校验码生成算法
// 以16位参数指令为例
void MY1690_CMD3(u8 a, u16 b){
u8 c = b >> 8; // 参数高8位
u8 d = b & 0xFF; // 参数低8位
u8 i = 0x05 ^ a ^ c ^ d; // 异或校验
// 发送指令帧...
}
2.1.3 典型指令实现
// 设置音量(0x31指令)
void Set_Volume(u8 vol){
MY1690_CMD2(0x31, vol); // 操作码+8位参数
// 等效指令:7E 04 31 1E 2B EF(设置音量30级)
}
2.2 主控逻辑(main.c)
2.2.1 按键处理机制
if(KEY_A按下){
MY1690_PREV(); // 发送上一曲指令
OLED显示"-- PREV --"
}
if(KEY_D按下){
MY1690_CMD3(0x41,0x04); // 播放0004号文件
}
2.2.2 编码器集成
u8 enc_val = ENCODER_READ();
if(enc_val==1) MY1690_VUP(); // 右转音量+
if(enc_val==2) MY1690_VDOWN();// 左转音量-
if(enc_val==3) Toggle_Play(); // 播放/暂停切换
2.3 串口接收处理(usart.c)
2.3.1 中断配置
void USART3_Init(u32 BaudRate){
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
// 优先级配置...
}
2.3.2 状态机实现
void USART3_IRQHandler(void){
u8 Res = USART_ReceiveData(USART3);
if(Res == 'S') USART3_RX_STA = 1; // 检测到STOP
if(Res == 'K') USART3_RX_STA = 2; // 检测到OK
}
2.3.3 主循环处理
if(USART3_RX_STA == 1){ // 播放结束
OLED显示"-- STOP --"
MP3_State = IDLE;
}
三、协议扩展应用
3.1 复合指令示例
// 播放指定文件夹曲目(02文件夹005号文件)
void Play_Folder_Song(u8 folder, u16 song){
u16 param = (folder << 8) | song;
MY1690_CMD3(0x42, param); // 0x42指令
}
3.2 智能播放队列
u16 playlist[] = {0x0001, 0x0003, 0x0005};
void Play_Sequence(){
for(int i=0; i<3; i++){
MY1690_CMD3(0x41, playlist[i]);
while(USART3_RX_STA != 1); // 等待当前曲目结束
}
}
四、调试与优化
4.1 常见问题排查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 无音频输出 | 功放未使能 | 检查BUSY信号电平配置 |
| 指令无响应 | 校验码计算错误 | 使用逻辑分析仪抓包验证 |
| 播放卡顿 | 指令发送间隔过短 | 添加50ms延时 |
| OLED显示异常 | 数据竞争 | 关中断操作显示缓冲区 |
4.2 性能优化建议
- DMA传输:改用DMA发送指令帧
- 双缓冲机制:分离指令发送与状态处理线程
- CRC校验:增强协议可靠性
- 指令队列:实现非阻塞式控制
五、扩展应用场景
5.1 智能家居中控
5.2 工业报警系统
| 触发条件 | 响应动作 |
|---|---|
| 温度超过阈值 | 循环播放高温警报 |
| 设备异常停机 | 插播紧急停机通知 |
| 低电量警告 | 播放"请更换电池"提示 |
通过深入理解指令协议和状态机设计,开发者可以构建高可靠性的语音交互系统。建议使用示波器观察指令时序,并配合Wireshark进行协议分析,以实现更精准的控制逻辑。
六、相关资源
[1] 洋桃电子B站课程-STM32入门100步
[2] STM32官方文档手册
[3] STM32F103固件函数库用户手册(中文)
[4] MP3播放测试程序(含音乐文件)
[5] MY1690(MP3音乐播放芯片)数据手册
💬 技术讨论(请在评论区留言~)
📌 下期预告:下一期将探讨MP3语音播报程序,欢迎持续关注!
点击查阅🔍往期【STM32专栏】文章
版权声明:本文采用[CC BY-NC-SA 4.0]协议,转载请注明来源
实测开发版:洋桃1号开发版(基于STM32F103C8T6)
更新日志:
- v1.0 初始版本(2025-03-16)
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)