OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
12
返回列表 发新帖
楼主: 骤雨龙元

传个自己写的WAV播放器程序,直接内部DAC输出,无需外接芯片

[复制链接]

54

主题

248

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
484
金钱
484
注册时间
2012-3-23
在线时间
0 小时
发表于 2012-8-19 11:49:33 | 显示全部楼层
从心所欲
正点原子逻辑分析仪DL16劲爆上市
回复 支持 反对

使用道具 举报

0

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2012-2-4
在线时间
9 小时
发表于 2013-1-20 17:22:48 | 显示全部楼层
正在做这个,做个记号
回复 支持 反对

使用道具 举报

0

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2012-2-4
在线时间
9 小时
发表于 2013-1-29 11:29:53 | 显示全部楼层
这个硬件电路改如何连接呢?我把DAC接到功放板PAM8403,然后接到喇叭上面,没有任何反应捏?
回复 支持 反对

使用道具 举报

30

主题

210

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
373
金钱
373
注册时间
2012-11-22
在线时间
12 小时
发表于 2013-1-29 17:29:26 | 显示全部楼层
回复【8楼】螃蟹爱虫:
---------------------------------
vs1053b
VLSI?大陆区一级授权代理商,提供技术支持,QQ839638158?VS1003?VS1053?VS1063?VS1011?VS1005?VS1205?VS1103?VS1033?VS8005?VS8053?VS1000?VS23S010?VS1163?开发板,淘宝店铺http://shop105947990.taobao.com/?QQ2355355257
回复 支持 反对

使用道具 举报

0

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2012-2-4
在线时间
9 小时
发表于 2013-2-3 15:55:52 | 显示全部楼层
大家伙儿,请问用什么样子的.WAV文件可以正常播放呢?我目前用的单声道,22.05k采样率的文件
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2013-6-6
在线时间
0 小时
发表于 2013-6-13 16:48:05 | 显示全部楼层
学习了
回复 支持 反对

使用道具 举报

0

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2013-4-3
在线时间
33 小时
发表于 2013-7-14 19:34:42 | 显示全部楼层
厉害!学习了!
回复 支持 反对

使用道具 举报

27

主题

308

帖子

1

精华

高级会员

Rank: 4

积分
774
金钱
774
注册时间
2012-6-19
在线时间
19 小时
发表于 2014-7-3 11:13:30 | 显示全部楼层
顶楼主! 谢谢分享!
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2015-1-13
在线时间
1 小时
发表于 2015-1-13 13:30:10 | 显示全部楼层
这个可以移植到stm8上面吗?
回复 支持 反对

使用道具 举报

0

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2012-11-11
在线时间
6 小时
发表于 2016-1-14 14:33:58 | 显示全部楼层
不错,赞一个。
回复 支持 反对

使用道具 举报

0

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2012-11-11
在线时间
6 小时
发表于 2016-1-14 14:34:22 | 显示全部楼层
赞一个。
回复 支持 反对

使用道具 举报

1

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2016-6-1
在线时间
27 小时
发表于 2016-6-3 13:23:50 | 显示全部楼层
朋友,你做的这个是带系统的,能给我讲解一下裸板方式的开发么。(官方的固件)。。。挺好的东西。
回复 支持 反对

使用道具 举报

1

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2016-6-1
在线时间
27 小时
发表于 2016-6-7 09:35:29 | 显示全部楼层
龙哥,能帮我看看这一段代码吗?我是直接从数组里调用音频数据的,不是从外部的存储器件上调用的:
#include "sys.h"
#include "delay.h"
#include "stm32l1xx_gpio.h"
#include "stm32l1xx_rcc.h"

#define  SAMPLE_RATE_8000                            8000
#define  SAMPLE_RATE_11025                           11025
#define         SAMPLE_RATE_16000                                                                                16000
#define  SAMPLE_RATE_22050                           22050
#define  SAMPLE_RATE_44100                           44100
#define  SAMPLE_RATE_48000                           48000
#define RCC_APB2Periph_GPIOA             ((uint32_t)0x00000004)//zhuyi
#define RCC_APB2Periph_AFIO              ((uint32_t)0x00000001)
#define RCC_APB2Periph_GPIOC             ((uint32_t)0x00000010)//zhuyi

void RCC_Init(void);
void RCC_Configuration(void);
void GPIOA_Configuration(void);
void TIM6_Configuration(void);
void DAC1_Configuration(void);
void SystemInit(void);
void DMA2_Configuration(void);        //PA->DAC??3
void NVIC_Configuration(void);

uint32_t wavecount;

#define                WAVELENGTH                64044
const uint8_t wavedata[64044]={
xxxxxxxxxxxxxxxxxxxx
};
u16 GetARRValue(u16 sample)
{
        u16 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;
}



void TIM6_Int_Init(u16 arr,u16 psc)
{
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); //????
       
        //???TIM2???
        TIM_TimeBaseStructure.TIM_Period = arr; //???????????????????????????       
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //??????TIMx???????????
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //??????:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM??????
        TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure); //??????????TIMx???????
  
        TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE ); //?????TIM2??,??????

        //?????NVIC??
        NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;  //TIM2??
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //?????0?
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //????3?
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ?????
        NVIC_Init(&NVIC_InitStructure);  //???NVIC???

//         TIM_Cmd(TIM6, ENABLE);  //??TIMx                                         
}


void DACInit(void)
{
        GPIO_InitTypeDef                         GPIO_InitStructure;
        DAC_InitTypeDef                           DAC_InitStructure;
        TIM_TimeBaseInitTypeDef         TIM_TimeBaseStructure;
        NVIC_InitTypeDef                         NVIC_InitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);          //使能PORTA通道时钟
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);          //使能DAC通道时钟
       
        /***********************************************************************************
        问:PA4为什么要设置为模拟输入?
        答:STM32F103ZET6 的 DAC 通道 1 在 PA4 上,所以,我们先要使能 PORTA 的时钟, 然后设
                置 PA4 为模拟输入。 DAC 本身是输出,但是为什么端口要设置为模拟输入模式呢?因为一但
                使能 DACx 通道之后,相应的 GPIO 引脚( PA4 或者 PA5)会自动与 DAC 的模拟输出相连,设
                置为输入,是为了避免额外的干扰。
        ***********************************************************************************/
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;                                 // 端口配置
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                  //模拟输入
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        GPIO_SetBits(GPIOA,GPIO_Pin_4)        ;//PA.4 输出高
       
        TIM6_Int_Init(8999,0);
       
        DAC_DeInit();
//        DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO;
        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_Disable;
        DAC_Init(DAC_Channel_1, &DAC_InitStructure);
        DAC_Cmd(DAC_Channel_1, ENABLE);

        TIM_Cmd(TIM6, ENABLE);
}

void NVIC_Configuration(void)
{

        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);        //设置NVIC中断分组2:2位抢占优先级,2位响应优先级

}

/*DMA通道3中断-------------------------*/

void DMAChannel3_IRQHandler(void)
{
        if(DMA_GetFlagStatus(DMA2_IT_GL3)!=RESET)
        {
                DMA_ClearFlag(DMA2_IT_TC3);
                DMA_Cmd(DMA2_Channel3, ENABLE);
                DMA2_Channel3->CNDTR = 32;          
                DMA_Cmd(DMA2_Channel3, ENABLE);
        }
}

/*RCC_Configuration---------------------------------*/
void RCC_Configuration(void)
{
        /*开启相关通道的时钟使能*/
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);
}

/*DMA2_Channle配置----------------------------------*/
void DMA2_Configuration(void)
{
        rw_DMA2_CCR3&=0xffff8000;//寄存器清0
        rw_DMA2_CPAR3=0x40007410;
        rw_DMA2_CMAR3=(u32)&wavedata;
        rw_DMA2_CNDTR3=37040;

        rw_DMA2_CCR3|=(0<<14);//启动非存储器到存储器模式
        rw_DMA2_CCR3|=(0x03<<12);//设置通道优先级为高
        rw_DMA2_CCR3|=(0x00<<10);//设置存储数据宽度为8位
        rw_DMA2_CCR3|=(0x00<<8);//设置外设数据宽度为8位
        rw_DMA2_CCR3|=(1<<7);//启动存储器增量模式
        rw_DMA2_CCR3|=(0<<6);//关闭外存储器增量模式
        rw_DMA2_CCR3|=(1<<5);//开启循环模式
        rw_DMA2_CCR3|=(1<<4);//从存储器读
        rw_DMA2_CCR3|=(0<<1);//关闭传输完成中断

//        rw_DMA2_CCR3|=(1<<0);//开启通道
//        rw_DAC_CR|=(1<<12);//开启DAC->DMA通道
}


int main(void)
{               
        delay_init();                     //延时函数初始化          
        NVIC_Configuration();          //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
        uart_init(9600);         //串口初始化为9600
        DACInit();
        while(1)
        {
               
        };
}

void TIM6_IRQHandler(void)
{
        u16 tmpCap;         
        if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET)
        {
                if( wavecount < 48474)
                {
                        tmpCap = wavedata1[wavecount];
                        wavecount++;
                        /* Set DAC Channel1 DHR register */
                        DAC_SetChannel1Data(DAC_Align_8b_R,tmpCap);                        
                }
                else
                {
                        // 完成传输,关闭中断
                        wavecount = 0;
//                        TIM_ITConfig(TIM6, TIM_IT_Update, DISABLE);
//                        TIM_Cmd(TIM6, DISABLE);
//                         // 需要关闭DAC,不然在没有声音的时候会有杂音
//                        DAC_Cmd(DAC_Channel_1, DISABLE);
                }
        }
        TIM_ClearITPendingBit(TIM6, TIM_IT_Update);
}
回复 支持 反对

使用道具 举报

1

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2013-10-18
在线时间
20 小时
发表于 2016-8-1 16:12:06 | 显示全部楼层
顶楼主
回复 支持 反对

使用道具 举报

1

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2013-10-18
在线时间
20 小时
发表于 2016-8-6 14:37:46 | 显示全部楼层
你好 龙哥 你这代码接耳机实验没问题? 你接功放没? 我用示波器看着没波形啊
回复 支持 反对

使用道具 举报

1

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2013-10-18
在线时间
20 小时
发表于 2016-8-6 14:38:04 | 显示全部楼层
能把你调试用的音频文件发一份不?
回复 支持 反对

使用道具 举报

1

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2013-10-18
在线时间
20 小时
发表于 2016-8-6 14:40:00 | 显示全部楼层
螃蟹爱虫 发表于 2011-12-15 21:24
龙兄,想请教一下,我现在移植你的程序到STM32F103VE上,现在遇到两个问题,帮忙看一下:
1,在调试程序的 ...

请问 你移植成功没?  我移植着没问题 但是用示波器看没波形
回复 支持 反对

使用道具 举报

1

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2013-10-18
在线时间
20 小时
发表于 2016-8-6 14:42:30 | 显示全部楼层
        Timerx_Init(1000000/wav1.SampleRate,72);//1MHz的计数频率,产生和采样率一

是不是 改成          Timerx_Init(999999/wav1.SampleRate,71);//1MHz的计数频率,产生和采样率一
回复 支持 反对

使用道具 举报

6

主题

17

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2014-7-20
在线时间
7 小时
发表于 2016-8-20 21:07:14 | 显示全部楼层
经过测试,根本不能用
回复 支持 反对

使用道具 举报

3

主题

130

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3132
金钱
3132
注册时间
2017-3-2
在线时间
324 小时
发表于 2017-3-14 00:30:53 | 显示全部楼层
这个帖子过去好久了,不知道还有人回答不。外面不接功放能播放音乐么?应该不行吧?还有16位的WAV信号有负值,该怎么处理?也只这么处理?
坚持不懈的努力!
回复 支持 反对

使用道具 举报

1

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2017-7-13
在线时间
22 小时
发表于 2017-8-24 15:29:50 | 显示全部楼层
我现在做一个adc 输出wav  用串口发送文件  但是ADC  输出的波形不对  声音也就不对了  跟速率有关吗  是怎么回事呢  
回复 支持 反对

使用道具 举报

1

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2017-7-13
在线时间
22 小时
发表于 2017-8-24 15:32:27 | 显示全部楼层
嵌入式学习 发表于 2016-8-20 21:07
经过测试,根本不能用

你好  不知道 wav输出做出来了没  现在有个问题    用串口发送文件  但是ADC  输出的波形不对  声音也就不对了  跟速率有关吗  是怎么回事呢  
回复 支持 反对

使用道具 举报

1

主题

18

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2017-6-9
在线时间
10 小时
发表于 2017-8-26 02:28:09 来自手机 | 显示全部楼层
你的代码我看过了,会有杂音,我也写了一个,堪比手机音质,比原子外置解码芯片效果都好
回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2018-6-7
在线时间
1 小时
发表于 2018-6-7 17:01:14 | 显示全部楼层
真是大神级的分享啊,受益匪浅,有没有MP3软解用自带DAC输出的参考啊?
回复 支持 反对

使用道具 举报

2

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2018-7-17
在线时间
25 小时
发表于 2018-10-26 16:31:10 | 显示全部楼层
老哥,谢谢啊。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 05:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表