我用的是STM32F103RE单片机,flash是512k的,播放几秒的音频直接存在数组里面就好了。如果要播放更长的音频要加外置flash。
主要流程:从网上下载一段音乐 ----——修剪成5秒以内——转换成WAV—— 转换成数组存到代码中
修剪音频我用的是GOLDWAVE,但是剪出来的音频都是8位44.1KHZ,不知道怎么样输出更低频率的,这也导致我播放的时间不能很长。
转换数据我用的winhex。打开wave文件后,点击右键——复制输出——C源码
废话少说直接上代码:
DAC初始化配置:
void DAC_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
DAC_InitTypeDef DAC_InitStructure;
/* 使能GPIOA时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
/* 使能DAC时钟 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
/* DAC的GPIO配置,模拟输入 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* 配置DAC 通道1 */
DAC_InitStructure.DAC_Trigger = DAC_Trigger_None; //没有触发源,在主函数里控制,后期可改成定时器触发,定时器触发的代码我放在另一个文件里
DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; //不使用波形发生器
DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable; //不使用DAC输出缓冲
DAC_Init(DAC_Channel_1, &DAC_InitStructure);
/* 配置DAC 通道2 */
DAC_Init(DAC_Channel_2, &DAC_InitStructure);
/* 使能通道1 由PA4输出 */
DAC_Cmd(DAC_Channel_1, ENABLE);
/* 使能通道2 由PA5输出 */
DAC_Cmd(DAC_Channel_2, ENABLE);
}
主函数:
int main(void)
{
uint32_t offset=44; //音频前44个是文件信息,后面才是真正的音频
int i =0;
DAC_Config();
DAC_TIM_Config();
while(1)
{
//这里就是重复改变DAC的输出值。因为我频率是44.1k,所以我一秒要改44100次
DAC_SetChannel1Data(DAC_Align_8b_R,Sine12bit[offset]); //音频放在这个数组里遍历输出
offset++;
if(offset>226598) offset =44; //226598这个值是音频数组的大小,这个按数组大小去改就好
for(int i =0 ; i<190;i++ ); //这行代码是实现延时的,我没有延时函数,所以用这个
//如果用delay的话设置19us就好了
}
}
思路:
我的音频是44100Hz,所以1s会有44100贞数据。我只要保证刚好在这1s内输出完所有的数据就好了。不能太快也不能太慢。
所以我用循环的方式去输出DAC电压值,中间有延时是保证声音的正常播放,如果延时太短的话,有可能1秒放完3秒的数据,会加快。如果延时太长,1秒的数据放好几秒。具体怎么算这个这个延时时间我也不是很清楚。我自己是一个个去试的,没有办法自己太菜了。也可以用delay函数去延时,或者用定时器触发输出。
最近做了一些升级,能直接从FLASH里面播放完整的一首音乐,感兴趣的可以去我的主页看文章来源:https://www.toymoban.com/news/detail-587266.html
升级版链接:STM32播放完整WAVE音乐文章来源地址https://www.toymoban.com/news/detail-587266.html
到了这里,关于STM32实现用DAC播放wav音频的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!