历史上的今天
返回首页

历史上的今天

今天是:2025年07月24日(星期四)

正在发生

2018年07月24日 | (STM32)使用DAC输出WAVE音频波形

2018-07-24 来源:eefocus

笔记:

本想使用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;

}


推荐阅读

史海拾趣

BusBoard公司的发展小趣事

随着公司规模的扩大和产品线的丰富,BusBoard公司开始积极寻求市场扩张的机会。通过与国内外知名电子设备制造商建立合作关系,BusBoard公司的产品逐渐打入国际市场。同时,公司还积极参与行业交流和展会,与同行分享经验、探讨合作,共同推动电子行业的发展。这种合作共赢的理念使得BusBoard公司在市场上获得了更多的机会和资源。

COMPEX公司的发展小趣事

在电子行业竞争激烈的今天,COMPEX公司始终坚持质量至上的原则。公司建立了严格的质量管理体系,从原材料采购到产品生产、检验、出货等各个环节都严格把关,确保产品质量符合客户要求。这种对质量的执着追求,使得COMPEX的产品在市场上具有很高的口碑和竞争力。

Andersen Laboratories Inc公司的发展小趣事

自1997年成立以来,AnalogicTech便致力于技术创新,不断推动电子行业的发展。公司总部位于硅谷,设计中心则分布在圣塔克拉拉和上海,汇聚了全球顶尖的研发人才。凭借深厚的技术底蕴和创新能力,AnalogicTech成功研发出一系列具有颠覆性的产品,为当今最具创造性的消费品提供了强大的技术支持。

中科银河芯(GXCAS)公司的发展小趣事
输入信号的电压范围决定了三极管何时截止、何时饱和导通。
Global Specialties公司的发展小趣事

近年来,创客文化在全球范围内兴起,Global Specialties迅速抓住了这一趋势。公司推出了一系列创客/DIY产品,包括各种模块化的电子元件和工具,旨在帮助创客们实现他们的创意和想法。通过举办线上线下的创客活动,Global Specialties不仅促进了创客之间的交流与合作,还进一步扩大了自己的品牌影响力。

Hpc Technology Inc公司的发展小趣事

为了进一步扩大市场份额,Global Specialties积极实施全球化战略。公司通过与国际分销商和代理商的合作,将产品销往全球各地。同时,公司还参加了多个国际性的电子展会和论坛,与来自世界各地的客户和合作伙伴进行交流和合作。这些举措不仅提升了Global Specialties的品牌知名度,还为公司带来了更多的国际合作机会和客户资源。通过这些努力,Global Specialties逐渐发展成为一家具有全球影响力的电子测试与测量公司。

问答坊 | AI 解惑

我从本论坛下了一个单片机电子万年历的资料有问题想请教下各位高手

具体的问题是电路数码管有的亮有的不亮,还有程序不运行请教下各位是什么问题啊 谢谢!!电路图和程序都在附件中请大家帮帮忙看下市怎么回事?…

查看全部问答>

关于论坛里曾经做过的魔幻光影棒的问题

这些天在研究论坛里曾经组织过的活动----魔幻光影棒 看了那个用MSP430F1232的电路图  看不明白了~   问几个笨笨的问题: 1. LVC573(74LCX573)的作用到底是什么呢?请详细的说下~~ 2. ULN2003的作用呢?在网上查资料 貌似 ...…

查看全部问答>

电路实用软件

本帖最后由 paulhyde 于 2014-9-15 09:17 编辑 电路实用软件  …

查看全部问答>

给大家介绍个摄像机前端维修调试供电的应急简易方法

带个DC12V的电池就ok了 比如摩托车电池 还有很多系统里面都带有后备电池都是DC12V的 要是这些都没有也可以去商店买8个1.5V的干电池传联起来用也可以 用电池供电可以保证电的质量 用这个方法可以帮助判断很多可能是电源引起的故障…

查看全部问答>

关于移植6.0bsp时的kitl编译

想把5.0的bsp移植到6.0,除了kitl,其他目录都编译通过了, 在整kitl时,发现了个问题,如下~~~ 这个是kitl目录下的source文件 [code] TARGETNAME=KITL TARGETTYPE=DYNLINK DLLENTRY=KitlDllMain DEFFILE= NOLIBC=1 SOURCES= TARGETLIBS ...…

查看全部问答>

关于gsm短信的长度会影响发送吗?

情况是这样的: 我一个在linux下跑的C程序 主要是完成GSM发短信的功能~~~ 短信短一点的情况 可以成功发出去“HELLO WORLD”这样~~ 长一点 就发布过去“fwefjweifjweofjwoiejfioewfjwoejfweo”就发不出去了~ 但是我在minicom 下是可以发送出去 ...…

查看全部问答>

如何把BINFS盘中的文件读取出来

想把WINCE5。0的BINFS盘中的DLL文件读取出来,不知道有什么方法?…

查看全部问答>

仿真器设置问题

各位高手大家好:     本人最近遇到一个奇怪的问题,我现在用的仿真器是JDT-698H,软件是KEIL UVISON2,硬件是一个主板带一个显示板,主板发送数据给控制显示板的单片机,然后显示板的单片机通过164控制LED显示,主板发送数据时用的是P1 ...…

查看全部问答>

C#或EVC获取触摸屏是否被点击

wince中, 如何使用C#或EVC获取触摸屏是否被点击? 谢谢!…

查看全部问答>