一、

利用PWM、RC电路、TCB8002D音频功率放大器。通过调制PWM的占空比输出wav音频。

不是通过调整(一开始方向搞错)

  1. 频率(调整音调)
  2. 通过delay_ms延时函数来实现四分之一音符、二分之一音符、全音符。
  3. 占空比调整音量

如何用单片机的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文件相关推荐

  1. 我的HIFI WAV 播放器设计之三电路图DAC及模拟信号处理电路部分

    DAC及LPF模拟输出部分电路SCH图纸二,DAC采用了Analog Device的AD1853DAC芯片,图纸由AD1853核心电路.供电部分.I/V变换部分.平衡LPF部分.平衡/非平衡转换电路部 ...

  2. 16位44.1K的纯WAV播放器实现(模拟I2S)

    2020年伊始,借此时机为新的一年开一个好头,特此写一段留作留念. 在2019下半年抽出业余时间做了一下WAV播放器的验证工作,成果就是它: 整机照 基于开发板的原理图重新设计了电路,基本都是按最低要 ...

  3. PWM通过RC低通滤波器模拟DAC

    当我们电路需要DAC而单片机并没有DAC外设时,则可采用PWM通过RC低通滤波器来模拟实现DAC功能. RC低通滤波器 当采用低通滤波器模拟DAC时,PWM频率应远大于RC低通滤波电路的截止频率fc= ...

  4. 嵌入式实验(四):用STM32输出PWM波形/DAC功能完成波形输出

    0 实验目标 用STM32F103输出一路PWM波形,建议采用定时器方法.野火和网上大多数资源采用此方法,有完整源码.用示波器观察输出波形. 用STM32F103的DAC功能完成以下波形输出,用示波器 ...

  5. 脉冲宽度调制(PWM)和DAC转换练习

    目录 一.STM32F103输出一路PWM波形 二.STM32F103的DAC功能输出 参考链接 一.STM32F103输出一路PWM波形 STM32F1除了基本定时器TIM6和TIM7,其他定时器都 ...

  6. 嵌入式学习⑩——STM的PWM和DAC

    STM的PWM和DAC 目录 STM的PWM和DAC 一.STM32F103输出PWM 1.STM32F1 PWM介绍 2.源码示例 3.进行配置 二.STM32实现DAC输出 1.DAC的基本介绍 ...

  7. FPGA 20个例程篇:18.SD卡存放音频WAV播放(中)

    第七章 实战项目提升,完善简历 18.SD卡存放音频WAV播放(中) 如图1所示是WM8731中11个寄存器功能说明概况图,我们需要对照手册,再去深入了解WM8731中的11个寄存器,怎么去配置这些寄 ...

  8. 我的HIFI WAV播放器设计之一

    一.前言: 算起来从高一对音响发生浓厚的兴趣开始,漫长的DIY生涯至今已经将近20年的时间了,从小到DAC解码器.PASS P1.7前级到大吨位的单端甲类PASS A5等等,走过了一山又一山,淌过了一 ...

  9. 我的HIFI WAV 播放器设计之四PCB设计部分

    五.PCB线路板设计心得(PCB的丝印和顶层.底层线路后附) PCB已经是VER1.2,这是第三个版本了,PCB的面积调整到15CM*20CM,还是有点大.曾经也考虑过是否改成双运放,不过想想还是单运 ...

  10. STM的PWM与DAC学习

    文章目录 任务要求 PWM应用 例程编写 DAC应用 例程编写 总结 任务要求 本人所用STM32为野火家F103指南者 烧录用具ST-LINK 代码编写为KILE5 音频软件为AU 用STM32F1 ...

最新文章

  1. 全新开源,《Pytorch常用函数函数手册》开放下载!内含200余个函数!
  2. 【题解】hdu 3586 Information Disturbing 二分 树形dp
  3. 47 单例模式 和装饰器
  4. php foreach方法,forEach方法怎么使用
  5. HDU 1404 Digital Deletions(博弈 + SG函数打表)
  6. api代理提取_了解提取API
  7. 算法高级(41)-推荐算法实现
  8. TableCache设置过小造成MyISAM频繁损坏
  9. 第一章 ArcGis Server简介
  10. PCIE设备与HOST之间的地址转换
  11. 使用vcpkg安装指定版本的开源软件
  12. SCARA——OpenGL入门学习五六(三维变换、动画)
  13. Oracle 11g R2 RSF(Recurive Subquery factoring)
  14. Clojure学习笔记(一)——介绍、安装和语法
  15. 做项目经理的自我总结(一)
  16. PTA】{10-1 结构拓展实验,函数}6-3 求某学生8门课的平均分 (10 分)
  17. 移动端seo优化,来自对百度移动搜索建站优化白皮书的整理
  18. winForm欢迎界面
  19. 2018年“京东好店”排行榜发布 这100家店凭什么上榜
  20. 解析分账系统,看这篇就够了!

热门文章

  1. torchvision学习笔记之transforms
  2. 翻译:PyTorch基础知识学习 - transforms(变换)
  3. java学习day10(Java基础)特殊类
  4. idea开发SSM框架乐器租赁网站管理系统 (javaweb-php-asp.netC#-j2ee-springboot)
  5. 如何将手机中Word文档转换成PDF
  6. 基于单片机1KW高频感应加热器控制系统仿真设计(毕设)
  7. 嵌入式Linux驱动笔记(四)------USB键盘驱动程序
  8. 学术写作 系列1 HOW TO WRITE AN INTRODUCTION
  9. IIS配置ipa下载设置
  10. C语言文件操作(含详细步骤)