CH582M,PWM模拟DAC实现WAV播放,FATFS文件
一、
利用PWM、RC电路、TCB8002D音频功率放大器。通过调制PWM的占空比输出wav音频。
不是通过调整(一开始方向搞错)
- 频率(调整音调)
- 通过delay_ms延时函数来实现四分之一音符、二分之一音符、全音符。
- 占空比调整音量
如何用单片机的PWM演奏一首歌曲 - 知乎
二、
首先配置输出PWM输出频率,源文件为44.1KHz的采样频率,所以PWM配置输出为不小于44KHz(影响播放速度,小了播放慢、大了播放快)。
SetSysClock(CLK_SOURCE_PLL_60MHz); //系统时钟GPIOB_ModeCfg(GPIO_Pin_5, GPIO_ModeOut_PP_5mA); //使能TCB8002D音频功率放大器GPIOB_SetBits(GPIO_Pin_5);GPIOB_ModeCfg(GPIO_Pin_0, GPIO_ModeOut_PP_5mA); // 配置PWM输出PWMX_CLKCfg(5); // cycle = 4/Fsys 分频PWMX_CycleCfg(PWMX_Cycle_256); // 周期 = 64*cycle 重复计数值
我们可以通过GoldWave将源音频文件转换为44.1KHz8Bit的wav,再理由WinHex获取C数组形式的数据。
#define maxSize sizeof(wavdat)const unsigned wavdat[] = {0x75, 0x74, 0x73, 0x72, 0x71, 0x70, 0x6F, 0x6F, 0x70, 0x71, 0x72, 0x74, 0x76, 0x78, 0x79, 0x79,0x7A, 0x7A, 0x7A, 0x79, 0x79, 0x7A, 0x7A, 0x7B, 0x7B, 0x7B, 0x7B, 0x7C, 0x7D, 0x7F, 0x80, 0x81,0x82, 0x82, 0x81, 0x81, 0x81, 0x81, 0x81, 0x82, 0x83, 0x84, 0x84, 0x84, 0x84, 0x83, 0x82, 0x81,0x80, 0x80, 0x81, 0x83, 0x85, 0x87, 0x89, 0x8A, 0x8C, 0x8D, 0x8F, 0x8F, 0x8F, 0x8E, 0x8D, 0x8B,0x8A, 0x89, 0x89, 0x89, 0x89, 0x89, 0x88, 0x87, 0x85, 0x83, 0x81, 0x80, 0x7E, 0x7D, 0x7D, 0x7C,0x7C, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7C, 0x7C, 0x7D, 0x7D, 0x7F, 0x80, 0x80, 0x81, 0x81,0x81, 0x81, 0x81, 0x80, 0x80, 0x7F, 0x7F, 0x7E, 0x7E, 0x7D, 0x7D, 0x7C, 0x7C, 0x7C, 0x7D, 0x7E,0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x80, 0x81, 0x82, 0x84, 0x86, 0x87, 0x89, 0x8B, 0x8C,0x8C, 0x8D, 0x8D, 0x8C, 0x8C, 0x8D, 0x8D, 0x8D, 0x8D, 0x8C, 0x8C, 0x8A, 0x89, 0x87, 0x87, 0x86,0x86, 0x85, 0x85, 0x84, 0x83, 0x83, 0x82, 0x82, 0x82, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80,0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x80, 0x7F, 0x7F, 0x7E, 0x7F, 0x7F, 0x7F, 0x80, 0x7F,0x7F, 0x7E, 0x7D, 0x7B, 0x7A, 0x79, 0x77, 0x76, 0x75, 0x75, 0x76, 0x77, 0x79, 0x7B, 0x7C, 0x7E,0x7E, 0x7F, 0x7E, 0x7F, 0x7F, 0x7F, 0x80, 0x80, 0x80, 0x81, 0x81, 0x82, 0x83, 0x85, 0x86, 0x87,
...........}
读取数据信息
while(1){PWMX_ACTOUT(CH_PWM6,(wavdat[wavIndex]), Low_Level, ENABLE); // 25% 占空比if(++wavIndex>=maxSize)wavIndex=0;}
参考文章:
使用PWM实现语音播放_嵌入式Linux,的博客-CSDN博客
stm32基于pwm语音播报设计 - 百度文库
STM32F103使用TIM DMA DAC实现播放WAV音乐_liqiang420795936的博客-CSDN博客_stm32驱动喇叭播放音乐c语言 输出音频 单片机,单片机播放WAV格式音频的理解_张溪梦 Simon的博客-CSDN博客TTS(1)单片机播放WAV语音,有原理,有代码_乘简的博客-CSDN博客_wav播放原理基于PWM控制的声音播放的实现_天上人间555的博客-CSDN博客_pwm 语音
三、 读取TF卡内WAV音频文件播放音乐
前面需要注意的是不能只单一个PWM直接扔数据給他,音频文件为44.1KHz所以要固定频率更新数据,利用定时器每隔 (44.1 kHz)产生一次中断来更新数据,而不是直接扔数据主频8Mhz直接扔数据一下会扔很多数据。
3.1挂载FATFS文件管理系统
通过文件管理系统读取我们需要的wav文件里的数据。d移植自:
【CH579开发板】+分享TF卡的FATFS例子 - - 21ic电子技术开发论坛
/******************SD卡初始化***********************/if(MSD_Init()){printf("error!\n");}else{MSD_GetCardInfo(&cardinfo);printf("OK\n");if(MSD_ReadSingleBlock(0,buf) == 0) //读取MBR扇数据打{printf("TF Card Sector Data:\n");p = buf;for(i=0; i!=512/16; i++){for(j=0; j!=16; j++){printf("%02X ",*p++);}printf("\n");}}
/******************FATFFS***********************/f_mount(&fs,"0:",1); //挂载SD卡
3.2配置TIM定时器
配置定时器,在定时器中断设置更新数据的标志位,定时器到了就更新PWM占空数据。
/******************定时器初始化***********************/
TMR0_TimerInit(FREQ_SYS / 44100); // 设置定时时间
TMR0_ITCfg(ENABLE, TMR0_3_IT_CYC_END); // 开启中断
PFIC_EnableIRQ(TMR0_IRQn);/******************定时中断***********************/
void TMR0_IRQHandler(void) // TMR0 定时中断
{if(TMR0_GetITFlag(TMR0_3_IT_CYC_END)){TMR0_ClearITFlag(TMR0_3_IT_CYC_END); // 清除中断标志GPIOB_InverseBits(GPIO_Pin_1);capFlag = 1;}
}
3.3读取数据播放音乐
一次读写512个字节数或512倍的数据到缓冲区,tf卡读写操作时每次是按块来读写,最小块是512个字节,文件系统读取TF卡数据是一次读一个块到文件系统的缓存区。
注意点:WAV格式是有符号的整型,所以要将源数据进行转换成无符号整型加上0x80后转换为u8类型。
int readdata(void )
{FATFS fs; //逻辑磁盘工作区FIL file; //文件FRESULT res;//状态变量UINT br; /* 文件读/写字节计数 */u8 table[1024];int32_t i=0 ;res=f_open(&file,"0:/1.wav",FA_OPEN_EXISTING|FA_READ);//if(res) //打开文件错误{printf("open file error.\r\n");return 0;}f_read (&file,table,sizeof(table),&br); //读取文件到bufwhile(1) //f_eof - 测试一个文件是否到达文件末尾{if(capFlag ==1){capFlag=0;PWMX_ACTOUT(CH_PWM6,(255-((u8)(table[i]+0x80))), High_Level, ENABLE);i++;}if(i>=sizeof(table)){f_read (&file,table,sizeof(table),&br);i=0;}// if(res||br==0) f_close(&file); /* 文件结束错误 */}
// printf("文件大小%d\n",f_size(&file));//获取文件大小f_close(&file); //关闭文件return 0;}
参考文章:
STM32CubeMX学习笔记(27)——FatFs文件系统使用(操作SD卡)_Leung_ManWah的博客-CSDN博客_fatfs格式化sd卡FatFs 的用户层API接口应用简单介绍(基于STM32F1)_喜暖知寒的博客-CSDN博客
STM32基于 FatFs R0.14b&SD Card 的MP3音乐播放器(也算是FatFs的简单应用了吧)_喜暖知寒的博客-CSDN博客_stm32播放mp3
CH582M,PWM模拟DAC实现WAV播放,FATFS文件相关推荐
- 我的HIFI WAV 播放器设计之三电路图DAC及模拟信号处理电路部分
DAC及LPF模拟输出部分电路SCH图纸二,DAC采用了Analog Device的AD1853DAC芯片,图纸由AD1853核心电路.供电部分.I/V变换部分.平衡LPF部分.平衡/非平衡转换电路部 ...
- 16位44.1K的纯WAV播放器实现(模拟I2S)
2020年伊始,借此时机为新的一年开一个好头,特此写一段留作留念. 在2019下半年抽出业余时间做了一下WAV播放器的验证工作,成果就是它: 整机照 基于开发板的原理图重新设计了电路,基本都是按最低要 ...
- PWM通过RC低通滤波器模拟DAC
当我们电路需要DAC而单片机并没有DAC外设时,则可采用PWM通过RC低通滤波器来模拟实现DAC功能. RC低通滤波器 当采用低通滤波器模拟DAC时,PWM频率应远大于RC低通滤波电路的截止频率fc= ...
- 嵌入式实验(四):用STM32输出PWM波形/DAC功能完成波形输出
0 实验目标 用STM32F103输出一路PWM波形,建议采用定时器方法.野火和网上大多数资源采用此方法,有完整源码.用示波器观察输出波形. 用STM32F103的DAC功能完成以下波形输出,用示波器 ...
- 脉冲宽度调制(PWM)和DAC转换练习
目录 一.STM32F103输出一路PWM波形 二.STM32F103的DAC功能输出 参考链接 一.STM32F103输出一路PWM波形 STM32F1除了基本定时器TIM6和TIM7,其他定时器都 ...
- 嵌入式学习⑩——STM的PWM和DAC
STM的PWM和DAC 目录 STM的PWM和DAC 一.STM32F103输出PWM 1.STM32F1 PWM介绍 2.源码示例 3.进行配置 二.STM32实现DAC输出 1.DAC的基本介绍 ...
- FPGA 20个例程篇:18.SD卡存放音频WAV播放(中)
第七章 实战项目提升,完善简历 18.SD卡存放音频WAV播放(中) 如图1所示是WM8731中11个寄存器功能说明概况图,我们需要对照手册,再去深入了解WM8731中的11个寄存器,怎么去配置这些寄 ...
- 我的HIFI WAV播放器设计之一
一.前言: 算起来从高一对音响发生浓厚的兴趣开始,漫长的DIY生涯至今已经将近20年的时间了,从小到DAC解码器.PASS P1.7前级到大吨位的单端甲类PASS A5等等,走过了一山又一山,淌过了一 ...
- 我的HIFI WAV 播放器设计之四PCB设计部分
五.PCB线路板设计心得(PCB的丝印和顶层.底层线路后附) PCB已经是VER1.2,这是第三个版本了,PCB的面积调整到15CM*20CM,还是有点大.曾经也考虑过是否改成双运放,不过想想还是单运 ...
- STM的PWM与DAC学习
文章目录 任务要求 PWM应用 例程编写 DAC应用 例程编写 总结 任务要求 本人所用STM32为野火家F103指南者 烧录用具ST-LINK 代码编写为KILE5 音频软件为AU 用STM32F1 ...
最新文章
- 全新开源,《Pytorch常用函数函数手册》开放下载!内含200余个函数!
- 【题解】hdu 3586 Information Disturbing 二分 树形dp
- 47 单例模式 和装饰器
- php foreach方法,forEach方法怎么使用
- HDU 1404 Digital Deletions(博弈 + SG函数打表)
- api代理提取_了解提取API
- 算法高级(41)-推荐算法实现
- TableCache设置过小造成MyISAM频繁损坏
- 第一章 ArcGis Server简介
- PCIE设备与HOST之间的地址转换
- 使用vcpkg安装指定版本的开源软件
- SCARA——OpenGL入门学习五六(三维变换、动画)
- Oracle 11g R2 RSF(Recurive Subquery factoring)
- Clojure学习笔记(一)——介绍、安装和语法
- 做项目经理的自我总结(一)
- PTA】{10-1 结构拓展实验,函数}6-3 求某学生8门课的平均分 (10 分)
- 移动端seo优化,来自对百度移动搜索建站优化白皮书的整理
- winForm欢迎界面
- 2018年“京东好店”排行榜发布 这100家店凭什么上榜
- 解析分账系统,看这篇就够了!
热门文章
- torchvision学习笔记之transforms
- 翻译:PyTorch基础知识学习 - transforms(变换)
- java学习day10(Java基础)特殊类
- idea开发SSM框架乐器租赁网站管理系统 (javaweb-php-asp.netC#-j2ee-springboot)
- 如何将手机中Word文档转换成PDF
- 基于单片机1KW高频感应加热器控制系统仿真设计(毕设)
- 嵌入式Linux驱动笔记(四)------USB键盘驱动程序
- 学术写作 系列1 HOW TO WRITE AN INTRODUCTION
- IIS配置ipa下载设置
- C语言文件操作(含详细步骤)