基于STM32F103C8T6的FLASH的DAC音频输出

目录

一、知识简述

二、音频准备

生成wav文件

notepad++

录制“您好欢迎光临 ”

三、编写程序

写入FLASH

四、总结


一、知识简述

DAC简介
        DAC 为数字/模拟转换模块,故名思议,它的作用就是把输入的数字编码,转换成对应的模拟电压输出,它的功能与 ADC相反。在常见的数字信号系统中,大部分传感器信号被化成电压信号,而 ADC把电压模拟信号转换成易于计算机存储、处理的数字编码,由计 算机处理完成后,再由 DAC输出电压模拟信号,该电压模拟信号常常用来驱动某些执行器 件,使人类易于感知。如音频信号的采集及还原就是这样一个过程。
        STM32具有片上 DAC外设,它的分辨率可配置为 8位或 12位的数字输入信号,具有两个 DAC 输出通道,这两个通道互不影响,每个通道都可以使用 DMA 功能,都具有出错检测能力,可外部触发。

DAC的特点

2个DAC转换器
8位或12位单调输出
12位模式下数据的左对齐或者右对齐
同步更新功能
噪声波形生成
三角波形生成
双DAC通道同时或者分别转换
每个通道都有DMA功能

二、音频准备

选取一段自己喜欢的音频,首先使用goldwave打开

生成wav文件

打开后一直点着拖动可以选取截取音频范围,然后点击修剪。

### STM32F103C8T6 DAC配置指南 STM32F103C8T6是一款基于ARM Cortex-M3内核的微控制器,广泛应用于嵌入式系统中。其内置了12位DAC(数模转换器),支持单通道或双通道输出,并可通过DMA实现连续波形生成。以下是关于如何配置和使用STM32F103C8T6DAC功能的详细指南。 #### 1. 硬件准备 在开始配置之前,确保以下硬件条件满足: - 使用支持DAC功能的引脚:STM32F103C8T6DAC通道1连接到PA4引脚,通道2连接到PA5引脚。 - 连接外部电路以处理模拟信号输出,例如滤波器或放大器[^1]。 #### 2. 初始化DAC模块 要启用DAC功能,需要对相关寄存器进行配置。以下是基本的初始化步骤: ```c #include "stm32f10x.h" void DAC_Init_Config(void) { // 使能GPIOA和DAC时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE); // 配置PA4为模拟输出 GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN; // 模拟输入模式 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStruct); // 配置DAC通道1 DAC_InitTypeDef DAC_InitStruct; DAC_InitStruct.DAC_Trigger = DAC_Trigger_None; // 不使用触发,软件控制 DAC_InitStruct.DAC_WaveGeneration = DAC_WaveGeneration_None; // 不生成波形 DAC_InitStruct.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0; // 无LFSR或三角波 DAC_InitStruct.DAC_OutputBuffer = DAC_OutputBuffer_Enable; // 启用输出缓冲 DAC_Init(DAC_Channel_1, &DAC_InitStruct); // 启用DAC通道1 DAC_Cmd(DAC_Channel_1, ENABLE); } ``` #### 3. 设置DAC输出值 在完成初始化后,可以通过以下代码设置DAC输出值: ```c void Set_DAC_Value(uint16_t value) { DAC_SetChannel1Data(DAC_Align_12b_R, value); // 12位右对齐 } ``` #### 4. 使用DMA实现连续输出 如果需要生成连续波形(如正弦波),可以结合DMA来实现高效的数据传输。以下是DMA配置的基本步骤: ```c void DAC_DMA_Config(uint16_t *waveform, uint32_t size) { // 使能DMA1时钟 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); // 配置DMA通道 DMA_InitTypeDef DMA_InitStruct; DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)&DAC->DHR12R1; // DAC数据寄存器地址 DMA_InitStruct.DMA_MemoryBaseAddr = (uint32_t)waveform; // 波形数组地址 DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralDST; // 数据传输方向:内存到外设 DMA_InitStruct.DMA_BufferSize = size; // 缓冲区大小 DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // 外设地址不递增 DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable; // 内存地址递增 DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; // 外设数据宽度为半字 DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; // 内存数据宽度为半字 DMA_InitStruct.DMA_Mode = DMA_Mode_Circular; // 循环模式 DMA_InitStruct.DMA_Priority = DMA_Priority_High; // 高优先级 DMA_InitStruct.DMA_M2M = DMA_M2M_Disable; // 禁用内存到内存传输 DMA_Init(DMA1_Channel3, &DMA_InitStruct); // 假设使用DMA1通道3 // 启用DMA通道 DMA_Cmd(DMA1_Channel3, ENABLE); // 启用DAC的DMA请求 DAC_DMACmd(DAC_Channel_1, ENABLE); } ``` #### 5. 示例:生成正弦波 以下是一个简单的示例,展示如何生成正弦波并使用DMA进行传输: ```c #define WAVEFORM_SIZE 100 uint16_t sine_wave[WAVEFORM_SIZE]; void Generate_Sine_Wave(void) { for (int i = 0; i < WAVEFORM_SIZE; i++) { sine_wave[i] = (uint16_t)(2047 + 2047 * sin(2 * M_PI * i / WAVEFORM_SIZE)); // 计算正弦波 } } int main(void) { DAC_Init_Config(); // 初始化DAC Generate_Sine_Wave(); // 生成正弦波 DAC_DMA_Config(sine_wave, WAVEFORM_SIZE); // 配置DMA while (1) { // 主循环 } } ``` #### 6. 注意事项 - **电源稳定性**:确保供电电压稳定,以避免DAC输出波动。 - **参考电压**:DAC的参考电压应尽可能精确,以提高输出精度。 - **滤波处理**:对于生成的波形,建议使用低通滤波器去除高频噪声。 - **调试工具**:使用示波器或逻辑分析仪验证DAC输出是否符合预期。 通过以上步骤,可以成功配置STM32F103C8T6DAC功能,并实现单次或连续波形输出。根据具体需求,可以选择不同的工作模式和配置选项。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值