关于DAC+TIM+DMA连续输出音频的双缓冲代码

关于接线就特别简单了

注意如果是stm32f407将vF+和vF-接到3.3和Gnd

关于喇叭的话一个喇叭就没有正负

关于cubemx的配置,使用的是8khz

关于使用stm32f407使用DAC直接输出音频的.c代码

本质就是不断的用DMA加载新的数据进去,DMA是有内存限制的可能是65535,显然一次性加载所有的音频数据进去是不会被全部播放的,所以需要进行双缓冲使其连续播放,那么这里就体现出了传输过半中断回调函数的作用了


extern const uint8_t data[159571] = {.............};//特别大省略
//初次定义放在main中定义

volatile uint8_t activeBuffer = 0; // 0 表示 Buffer A,1 表示 Buffer B  volatile 保护容易被编译器优化的变量
volatile uint32_t audioDataIndex = 0; // 当前音频数据的索引
extern uint8_t isplay;
uint8_t isPlaybackComplete = 1;

uint8_t bufferA[BUFFER_SIZE];
uint8_t bufferB[BUFFER_SIZE];

void load_audio_data(uint8_t* buffer, size_t size) {
    for (size_t i = 0; i < size; i++) {
        buffer[i] = data[audioDataIndex];
        audioDataIndex++; // 更新音频数据索引
        if (audioDataIndex >= AUDIO_DATA_SIZE) {
			isPlaybackComplete =1;
           audioDataIndex = 0; // 如果到达音频数据末尾,重新从头开始
        }
    }
}

void HAL_DAC_ConvCpltCallbackCh1(DAC_HandleTypeDef* fhdac) {
    if (activeBuffer == 0) {
        // 当前完成 Buffer A 的传输,切换到 Buffer B
        load_audio_data(bufferB, BUFFER_SIZE); // 加载新的音频数据
				if(isPlaybackComplete == 0)
        HAL_DAC_Start_DMA(fhdac, DAC_CHANNEL_1, (uint32_t*)bufferB, BUFFER_SIZE, DAC_ALIGN_8B_R);
				
        activeBuffer = 1;
    } else {
        // 当前完成 Buffer B 的传输,切换到 Buffer A
        load_audio_data(bufferA, BUFFER_SIZE); // 加载新的音频数据
				if(isPlaybackComplete == 0)
        HAL_DAC_Start_DMA(fhdac, DAC_CHANNEL_1, (uint32_t*)bufferA, BUFFER_SIZE, DAC_ALIGN_8B_R);
				
        activeBuffer = 0;
    }
}


void play_start()
{			
				activeBuffer = 0;
				isPlaybackComplete = 0;
				audioDataIndex = 0;
				load_audio_data(bufferA, BUFFER_SIZE);
				HAL_TIM_Base_Start(&htim2);
				HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t *)bufferA, BUFFER_SIZE,         DAC_ALIGN_8B_R);

}

void play_suspend()
{
	isPlaybackComplete = 0;
}
	
void play_resume()
{
	if (activeBuffer == 0) {
        HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t*)bufferA, BUFFER_SIZE, DAC_ALIGN_8B_R);
        activeBuffer = 1;
    } else {
        HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t*)bufferB, BUFFER_SIZE, DAC_ALIGN_8B_R);
        activeBuffer = 0;
    }
}

关于使用stm32f407使用DAC直接输出音频的.h代码

#ifndef __OTHER_H__
#define __OTHER_H__
#include "main.h"
#include "tim.h"
#include "dac.h"

#define BUFFER_SIZE 1024
#define AUDIO_DATA_SIZE 159571

void load_audio_data(uint8_t* buffer, size_t size);
void HAL_DAC_ConvCpltCallbackCh1(DAC_HandleTypeDef* fhdac);
void play_start();
void play_suspend();
void play_resume();
#endif

关于date如何获取,使用adobe audition输出合适采样率的wave文件

再用winhex取取出源文件选择C source然后改成
extern const uint8_t data[159571]格式

最后调用一个play_start函数就可以运行了

送一个data测试一下

unsigned AnsiChar data[1408] = {
	0x52, 0x49, 0x46, 0x46, 0xF8, 0x44, 0x0E, 0x00, 0x57, 0x41, 0x56, 0x45, 0x66, 0x6D, 0x74, 0x20, 
	0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x40, 0x1F, 0x00, 0x00, 0x40, 0x1F, 0x00, 0x00, 
	0x01, 0x00, 0x08, 0x00, 0x64, 0x61, 0x74, 0x61, 0x28, 0x2D, 0x0E, 0x00, 0x81, 0x80, 0x81, 0x7F, 
	0x80, 0x80, 0x80, 0x80, 0x81, 0x80, 0x80, 0x80, 0x80, 0x81, 0x80, 0x81, 0x80, 0x7F, 0x7F, 0x80, 
	0x80, 0x81, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x81, 
	0x80, 0x80, 0x80, 0x80, 0x7F, 0x81, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x81, 0x80, 0x81, 
	0x80, 0x80, 0x80, 0x7F, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x7F, 
	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x80, 0x80, 0x80, 0x81, 0x80, 0x80, 0x80, 
	0x80, 0x7F, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 
	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x7F, 0x81, 0x80, 0x80, 0x80, 
	0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x7F, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, 0x81, 0x7F, 
	0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 
	0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x81, 0x80, 0x80, 
	0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x81, 0x80, 0x80, 0x80, 0x80, 0x81, 0x7F, 0x7F, 0x80, 0x80, 
	0x80, 0x81, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x7F, 0x80, 0x80, 
	0x80, 0x7F, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 
	0x80, 0x80, 0x7F, 0x80, 0x81, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 
	0x80, 0x80, 0x80, 0x81, 0x80, 0x7F, 0x80, 0x80, 0x81, 0x80, 0x80, 0x80, 0x80, 0x81, 0x80, 0x80, 
	0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 
	0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 
	0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x81, 
	0x80, 0x81, 0x80, 0x80, 0x80, 0x80, 0x81, 0x80, 0x80, 0x80, 0x80, 0x81, 0x80, 0x81, 0x7F, 0x7F, 
	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 
	0x81, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 
	0x81, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 
	0x80, 0x80, 0x81, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 
	0x80, 0x80, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 
	0x80, 0x80, 0x80, 0x80, 0x81, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x81, 0x80, 0x7F, 0x80, 0x7F, 0x80, 
	0x7F, 0x80, 0x81, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 
	0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 
	0x80, 0x80, 0x80, 0x7F, 0x80, 0x81, 0x7F, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 
	0x80, 0x80, 0x81, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 
	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x80, 0x7F, 0x80, 0x80, 
	0x80, 0x80, 0x80, 0x81, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x7F, 0x7F, 0x80, 
	0x80, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x81, 0x80, 0x80, 0x80, 0x7F, 0x80, 
	0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 
	0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x7F, 0x80, 0x7F, 
	0x80, 0x80, 0x80, 0x7F, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x81, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 
	0x80, 0x80, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x81, 0x80, 0x80, 0x80, 0x80, 0x81, 0x7F, 0x80, 
	0x80, 0x80, 0x80, 0x7F, 0x80, 0x81, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 
	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 
	0x80, 0x80, 0x81, 0x80, 0x81, 0x80, 0x80, 0x80, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 
	0x80, 0x7F, 0x81, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 
	0x81, 0x7F, 0x80, 0x7F, 0x81, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x80, 
	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x81, 0x80, 0x80, 0x81, 0x80, 
	0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x7F, 0x80, 0x80, 0x80, 0x81, 
	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x80, 0x7F, 0x80, 0x80, 
	0x80, 0x7F, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x7F, 
	0x80, 0x80, 0x81, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 
	0x81, 0x80, 0x81, 0x80, 0x81, 0x80, 0x80, 0x80, 0x80, 0x81, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 
	0x80, 0x80, 0x80, 0x81, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 
	0x80, 0x80, 0x81, 0x80, 0x80, 0x80, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 
	0x7F, 0x80, 0x80, 0x80, 0x80, 0x81, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 
	0x80, 0x80, 0x81, 0x80, 0x80, 0x80, 0x81, 0x81, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80, 
	0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x7F, 0x80, 0x80, 0x80, 0x81, 0x80, 0x7F, 0x80, 0x81, 
	0x80, 0x81, 0x80, 0x80, 0x81, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 
	0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x80, 
	0x7F, 0x80, 0x80, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x80, 0x80, 0x81, 0x80, 0x81, 0x80, 0x80, 0x80, 
	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x7F, 0x80, 0x80, 0x7F, 0x80, 0x80, 
	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 
	0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x81, 0x80, 
	0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x81, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x81, 
	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x81, 
	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x7F, 
	0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x80, 0x81, 0x80, 0x80, 
	0x80, 0x80, 0x80, 0x80, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x81, 0x80, 0x80, 0x80, 
	0x81, 0x80, 0x80, 0x81, 0x7F, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x80, 0x80, 0x80, 
	0x7F, 0x81, 0x80, 0x7F, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 
	0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 
	0x80, 0x81, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x7F, 
	0x80, 0x81, 0x80, 0x80, 0x80, 0x81, 0x80, 0x81, 0x80, 0x7F, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x81, 
	0x81, 0x81, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 
	0x80, 0x81, 0x80, 0x80, 0x80, 0x81, 0x7F, 0x80, 0x81, 0x80, 0x80, 0x80, 0x80, 0x81, 0x7F, 0x7F, 
	0x80, 0x80, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x7F, 0x81, 0x80, 0x80, 0x80, 
	0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x81, 0x80, 0x81, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 
	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x7F, 0x80, 0x80, 0x7F, 0x7F, 0x80, 0x81, 0x80, 0x80, 
	0x80, 0x80, 0x80, 0x7F, 0x80, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x7F, 0x80, 0x80, 0x80, 
	0x7F, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x81, 0x80, 0x80, 0x80, 
	0x80, 0x80, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 
	0x80, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x80, 0x81, 0x80, 0x80, 0x80, 0x81, 0x80, 0x80, 
	0x7F, 0x80, 0x80, 0x80, 0x81, 0x80, 0x81, 0x80, 0x81, 0x80, 0x80, 0x80, 0x80, 0x81, 0x80, 0x80, 
	0x7F, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x7F, 0x80, 0x80, 0x81, 0x80, 0x80, 
	0x81, 0x81, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x80, 
	0x80, 0x80, 0x80, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 
	0x80, 0x80, 0x81, 0x7F, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x80, 0x81, 0x80, 0x7F, 
	0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x80, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x80, 0x80, 
	0x80, 0x80, 0x80, 0x7F, 0x80, 0x7F, 0x81, 0x7F, 0x80, 0x80, 0x81, 0x80, 0x7F, 0x80, 0x80, 0x80, 
	0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值