(STM32)使用DAC输出WAVE音频波形

发布者:xinyi9008最新更新时间:2018-07-24 来源: eefocus关键字:STM32  DAC输出  WAVE  音频波形 手机看文章 扫描二维码
随时随地手机看文章

笔记:

本想使用PWM输出音频的,但无论怎么样调试,PWM的音频的频率总不对。后来,改用DAC了。

配置:

芯片:STM32F103VET

DAC:DAC通道2(8位右对齐)、定时器TIM7中断更改DAC值

WAVE数据:以const形式放于芯片上(8kHz采样、8bit、单声道)

 

弯路:

(1)使用TIM7控制DAC输出,用TRIG方式,通过DMA2通道传送数据到DAC写寄存器 => 没有任何波形输出

(2)以为不需要使用与 DAC通道 一致的定时器作驱动,故使用了 TIM3 。使TIM3工作于8K的工作频率,并允许IT_UPDATE,在TIM3定时器中断中更改DAC的值,不使用DMA2通道 => 有波形信号输出,但频率太高,1秒的音频在约50ms内输出完毕

(3)不使用TIM3,使用与DAC通道2相应的TIM7。将TIM7配置为8K工作频率,允许IT_UPDATE,在TIM7定时器中断中更改DAC的值 ,可正常驱动DAC。估计弯路(2)是由于TIM7的工作频率没有配置,导致DAC频率不正常所致,但未证实

(4)使用步骤(3)的定时器,改用DMA传送数据 => DAC无法正常输出音频 【由于时间关系暂时先不解决这问题了】

例程:

void DACInit(void)

{

DAC_InitTypeDef   DAC_InitStructure;

TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

 

// 1. 配置TIM7

TIM_DeInit(TIM7);

/* Time base configuration */

TIM_TimeBaseStructure.TIM_Period = GetARRValue(8000);        // 重置周期

TIM_TimeBaseStructure.TIM_Prescaler = 0;                // 分频

TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;        // 时钟分割

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Down;        // 计数模式

TIM_TimeBaseInit(TIM7, &TIM_TimeBaseStructure);

// 使能TIM7更新中断 

TIM_ITConfig(TIM7, TIM_IT_Update, ENABLE);

 

// 2. 配置DAC

DAC_DeInit();

/* DAC channel1 Configuration */

DAC_InitStructure.DAC_Trigger = DAC_Trigger_None;        // 

DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;

DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bits8_0;

DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable;

// DA通道2初始化

DAC_Init(DAC_Channel_2, &DAC_InitStructure);

/* Enable DAC Channel1: Once the DAC channel1 is enabled, PA.04 is 

automatically connected to the DAC converter. */

DAC_Cmd(DAC_Channel_2, ENABLE);

 

// 3. 启动TIM7

TIM_Cmd(TIM7, ENABLE);

}

 

 

void TIM7_IRQHandler(void)

{

INT16U tmpCap;

 

if (TIM_GetITStatus(TIM7, TIM_IT_Update) != RESET)

{

if( wavecount < wave0Length )

{

tmpCap = wave0[wavecount];

wavecount++;

/* Set DAC Channel1 DHR register */

DAC_SetChannel2Data(DAC_Align_8b_R,tmpCap);                        

}

else

{

// 完成传输,关闭中断

wavecount = 0;

TIM_ITConfig(TIM7, TIM_IT_Update, DISABLE);

TIM_Cmd(TIM7, DISABLE);

// 需要关闭DAC,不然在没有声音的时候会有杂音

DAC_Cmd(DAC_Channel_2, DISABLE);

}

}

 

/* Clear TIM6 update interrupt */

TIM_ClearITPendingBit(TIM7, TIM_IT_Update);

}

  

// 根据采样率获得定时器自动

// 摘自waveplayer.c

INT16U GetARRValue(INT16U sample)

{

INT16U arrValue;

/* 更新OCA值以符合.WAV文件采样率 */

switch (sample)

{

case SAMPLE_RATE_8000 :

   arrValue = (uint16_t)(72000000/8000);

   break; /* 8KHz = 2x36MHz / 9000 */

case SAMPLE_RATE_11025:

   arrValue = (uint16_t)(72000000/11025);

   break; /* 11.025KHz = 2x36MHz / 6531 */

case SAMPLE_RATE_16000:

    arrValue = (uint16_t)(72000000/16000);

   break; /* 16KHz = 2x36MHz / 4500 */

case SAMPLE_RATE_22050:

   arrValue = (uint16_t)(72000000/22050);

   break; /* 22.05KHz = 2x36MHz / 2365 */

case SAMPLE_RATE_44100:

   arrValue = (uint16_t)(72000000/44100);

   break; /* 44.1KHz = 2x36MHz / 1633 */

case SAMPLE_RATE_48000:

   arrValue = (uint16_t)(72000000/48000);

   break; /* 48KHz = 2x36MHz / 1500 */

default:

   arrValue = 0;

   break;

}

return arrValue;

}


关键字:STM32  DAC输出  WAVE  音频波形 引用地址:(STM32)使用DAC输出WAVE音频波形

上一篇:STM32 PCM1770调试
下一篇:STM32F4 FFT 音乐频谱 不要太easy!

推荐阅读最新更新时间:2024-03-16 16:09

意法完成STM32微控制器底层软件部署
意法半导体(ST)完成了将其免费底层应用程序编程接口(Low-Layer Application Programming Interface, LL API)软件,导入支持所有的STM32微控制器(MCU)的STM32Cube软件包中。LL API软件让专业的开发人员,能够在方便好用的STMCube环境内开发应用,使用ST验证的软件,对最低到寄存器级的代码进行优化,从而缩短产品上市时间。 在所有的STM32Cube组合内,整合LL API和硬件抽象层(Hardware Abstraction Layer, HAL)软件,让开发人员能够完全自由地选择外部周边的控制方式。他们可以选择利用HAL的易用性和转移性,或采用LL API软件优
[半导体设计/制造]
STM32基础知识:中断系统
中断系统 1 数据传输方式 无条件传输 :处理器不必了解外部设备状态,直接进行数据传输,用于指示灯和按键等简单设备.。 查询方式 :传输前,一方先查询另一方的状态,若已经准备好就传输,否则就继续查询。 中断方式 :一方通过申请中断的方式与另一方进行数据传输,收发双方可以并行工作。 直接存储器访问 :处理器内部建立片内外设和内存之间的数据传输通道,传输过程不需要处理器参与。 2 中断系统的基本概念 2.1 中断全过程 中断发生: 当CPU在处理某一事件A时,发生了另一事件B,请求CPU迅速去处理。 中断处理: CPU暂停当前的工作,转去处理事件B。 中断返回: 当CPU将事件B处理完毕后,再回到事件A中被暂停的地方继
[单片机]
<font color='red'>STM32</font>基础知识:中断系统
STM32学习笔记:CAN总线的过滤器
STM32 CAN控制器,提供了28个可配置的筛选器组(F1仅互联型才有28个,其他的只有14个), STM32 CAN控制器每个筛选器组由2个32位寄存器组成(CAN_FxR1和CAN_FxR2,x=0~27)。根据位宽不同,每个筛选器组可提供: ● 1个32位筛选器,包括:STDID 、EXTID 、IDE和RTR位 ● 2个16位筛选器,包括:STDID 、IDE、RTR和EXTID 位 对于过滤器组, 可以将其配置成屏蔽位模式, 这样 CAN_FxR0中保存的就是标识符匹配值, CAN_FxR1中保存的是屏蔽码,即 CAN_FxR1中如果某一位为1,则 CAN_FxR0中相应 的位必须与收到的帧的标志符中的相应位吻合才能通
[单片机]
<font color='red'>STM32</font>学习笔记:CAN总线的过滤器
关于STM32的四类嵌入式软件(库)
1写在前面 陆续收到一些朋友的问题: 1.我是选择寄存器开发STM32,还是标准外设库呢? 2.你有STM32L0标准外设库吗? 3.HAL库和LL库有什么差异? 。。。 针对STM32开发使用的嵌入式软件,或者我们说的库,可以分为四类: STM32Snippets Standard Peripheral Library STM32Cube HAL STM32Cube LL 下面就写一下关于这四种库的相关内容、以及对比应用等。 2 STM32Snippets 什么是STM32Snippets? STM32Snippets是高度优化的代码示例集合,使用符合CMSIS的直接寄存器访问来减少代码开销,从
[单片机]
关于<font color='red'>STM32</font>的四类嵌入式软件(库)
STM32 Boot模式设置方法
1、模式设置 Boot模式设实际指的就是选择启动的起始地址区域,在STM32F20x和STM32F21x中存在以下三种模式可供选择,分别为片内Flash、系统内存、片内SRAM: 2、BOOT Pin值确认 BOOT引脚值在系统复位的4个系统时钟周期后被锁存,同时BOOT1引脚实际与GPIO引脚共享一外部接口,在4个系统时钟周期后则会被释放可作为GPIO使用。 BOOT引脚值会在待机模式后被重新检测,在待机模式中BOOT引脚状态要保持正确 3、ST Embedded Bootloader 在System Memory中预置了bootloader用于对片内Flash进行IAP, 其使用如下接口: -USART1 -US
[单片机]
STM32 ISP烧录过程
 STM32在芯片生产过程中内嵌了一段引导程序,其作用就是通过串口将程序下载到Flash中,为以后的软件更新提供了极大的便利,用户不需要利用仿真口进行下载程序,从而极大的提高了工作效率。 STM32复位之后,如果检测到Boot1引脚为低电平,boot0引脚为高电平,芯片就执行内部固话的ISP引导程序,接收来自上位机的命令和数据。整个烧录过程如下图所示: ISP的过程: 1.芯片复位 在给STM32复位之前,首先要确定BOOT0,BOOT1引脚的状态.通过各种方式,先让BOOT0处于高电平状态,BOOT1处于低电平状态,然后在RST脚上产生一个负脉冲,STM32就能进入ISP状态.注意,复位之后,一定要延时一定的时间,让IS
[单片机]
stm32虚拟串口安装失败的原因
本人在网上也看到了好多说,按照以下步骤可以解决问题,但是不幸的是我的盗版系统不行: 将mdmcpq.inf复制到c:\windows\inf 将usbser.sys复制到c:\windows\system32\drivers 但是,还是借助于这个思路去找一些原因最后发现,在c:\windows\inf 文件夹下,有一个名叫mdmcpq2.inf的文件,突发奇想将2去掉试试可不可以,后来一试可以了,成功安装了!
[单片机]
剖析STM32-定时器3
三、定时器PWM输出实验 1. 通用定时器PWM概述 PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比,例如方波的占空比就是50%。PWM的功能有很多种,比如控制呼吸灯、控制直流电机或者舵机等驱动原件等等,是单片机的一个十分重要的功能。 在STM32单片机中,可以使用定时器的输出比较功能来产生PWM波: 即PWM模式可以产生一个由TIMx_ARR寄存器确定频率、由TIMx
[单片机]
剖析STM32-定时器3
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved