stm32f10x_dac

STM32F10x DAC 数字模拟转换器外设标准库函数参考文档

数据类型定义

DAC_InitTypeDef - DAC初始化结构体

typedef struct
{
  uint32_t DAC_Trigger;                      /* 指定DAC通道的外部触发源 */
  uint32_t DAC_WaveGeneration;               /* 指定DAC通道是否生成噪声波或三角波 */
  uint32_t DAC_LFSRUnmask_TriangleAmplitude; /* 指定噪声波生成的LFSR掩码或三角波的最大幅值 */
  uint32_t DAC_OutputBuffer;                 /* 指定DAC通道输出缓冲器的启用状态 */
} DAC_InitTypeDef;

成员说明:

  • DAC_Trigger:配置DAC通道的触发源,可选值参见 @ref DAC_trigger_selection
  • DAC_WaveGeneration:配置波形生成模式,可选值参见 @ref DAC_wave_generation
  • DAC_LFSRUnmask_TriangleAmplitude:配置LFSR掩码或三角波幅值,可选值参见 @ref DAC_lfsrunmask_triangleamplitude
  • DAC_OutputBuffer:配置输出缓冲器状态,可选值参见 @ref DAC_output_buffer

DAC常量定义

触发源选择

#define DAC_Trigger_None         ((uint32_t)0x00000000)  /* 无外部触发,加载数据后自动转换 */
#define DAC_Trigger_T6_TRGO      ((uint32_t)0x00000004)  /* 定时器6 TRGO触发 */
#define DAC_Trigger_T8_TRGO      ((uint32_t)0x0000000C)  /* 定时器8 TRGO触发(高密度器件) */
#define DAC_Trigger_T3_TRGO      ((uint32_t)0x0000000C)  /* 定时器3 TRGO触发(连接线、中低密度、低密度Value Line器件) */
#define DAC_Trigger_T7_TRGO      ((uint32_t)0x00000014)  /* 定时器7 TRGO触发 */
#define DAC_Trigger_T5_TRGO      ((uint32_t)0x0000001C)  /* 定时器5 TRGO触发 */
#define DAC_Trigger_T15_TRGO     ((uint32_t)0x0000001C)  /* 定时器15 TRGO触发(中低密度Value Line器件) */
#define DAC_Trigger_T2_TRGO      ((uint32_t)0x00000024)  /* 定时器2 TRGO触发 */
#define DAC_Trigger_T4_TRGO      ((uint32_t)0x0000002C)  /* 定时器4 TRGO触发 */
#define DAC_Trigger_Ext_IT9      ((uint32_t)0x00000034)  /* 外部中断线9事件触发 */
#define DAC_Trigger_Software     ((uint32_t)0x0000003C)  /* 软件触发 */

波形生成模式

#define DAC_WaveGeneration_None      ((uint32_t)0x00000000)  /* 不生成波形 */
#define DAC_WaveGeneration_Noise     ((uint32_t)0x00000040)  /* 生成噪声波 */
#define DAC_WaveGeneration_Triangle  ((uint32_t)0x00000080)  /* 生成三角波 */

LFSR掩码和三角波幅值

/* 噪声波LFSR掩码 */
#define DAC_LFSRUnmask_Bit0      ((uint32_t)0x00000000)  /* 解除LFSR第0位掩码 */
#define DAC_LFSRUnmask_Bits1_0   ((uint32_t)0x00000100)  /* 解除LFSR第[1:0]位掩码 */
#define DAC_LFSRUnmask_Bits2_0   ((uint32_t)0x00000200)  /* 解除LFSR第[2:0]位掩码 */
#define DAC_LFSRUnmask_Bits3_0   ((uint32_t)0x00000300)  /* 解除LFSR第[3:0]位掩码 */
#define DAC_LFSRUnmask_Bits4_0   ((uint32_t)0x00000400)  /* 解除LFSR第[4:0]位掩码 */
#define DAC_LFSRUnmask_Bits5_0   ((uint32_t)0x00000500)  /* 解除LFSR第[5:0]位掩码 */
#define DAC_LFSRUnmask_Bits6_0   ((uint32_t)0x00000600)  /* 解除LFSR第[6:0]位掩码 */
#define DAC_LFSRUnmask_Bits7_0   ((uint32_t)0x00000700)  /* 解除LFSR第[7:0]位掩码 */
#define DAC_LFSRUnmask_Bits8_0   ((uint32_t)0x00000800)  /* 解除LFSR第[8:0]位掩码 */
#define DAC_LFSRUnmask_Bits9_0   ((uint32_t)0x00000900)  /* 解除LFSR第[9:0]位掩码 */
#define DAC_LFSRUnmask_Bits10_0  ((uint32_t)0x00000A00)  /* 解除LFSR第[10:0]位掩码 */
#define DAC_LFSRUnmask_Bits11_0  ((uint32_t)0x00000B00)  /* 解除LFSR第[11:0]位掩码 */

/* 三角波最大幅值 */
#define DAC_TriangleAmplitude_1     ((uint32_t)0x00000000)  /* 三角波最大幅值为1 */
#define DAC_TriangleAmplitude_3     ((uint32_t)0x00000100)  /* 三角波最大幅值为3 */
#define DAC_TriangleAmplitude_7     ((uint32_t)0x00000200)  /* 三角波最大幅值为7 */
#define DAC_TriangleAmplitude_15    ((uint32_t)0x00000300)  /* 三角波最大幅值为15 */
#define DAC_TriangleAmplitude_31    ((uint32_t)0x00000400)  /* 三角波最大幅值为31 */
#define DAC_TriangleAmplitude_63    ((uint32_t)0x00000500)  /* 三角波最大幅值为63 */
#define DAC_TriangleAmplitude_127   ((uint32_t)0x00000600)  /* 三角波最大幅值为127 */
#define DAC_TriangleAmplitude_255   ((uint32_t)0x00000700)  /* 三角波最大幅值为255 */
#define DAC_TriangleAmplitude_511   ((uint32_t)0x00000800)  /* 三角波最大幅值为511 */
#define DAC_TriangleAmplitude_1023  ((uint32_t)0x00000900)  /* 三角波最大幅值为1023 */
#define DAC_TriangleAmplitude_2047  ((uint32_t)0x00000A00)  /* 三角波最大幅值为2047 */
#define DAC_TriangleAmplitude_4095  ((uint32_t)0x00000B00)  /* 三角波最大幅值为4095 */

输出缓冲器配置

#define DAC_OutputBuffer_Enable   ((uint32_t)0x00000000)  /* 启用输出缓冲器 */
#define DAC_OutputBuffer_Disable  ((uint32_t)0x00000002)  /* 禁用输出缓冲器 */

通道选择

#define DAC_Channel_1  ((uint32_t)0x00000000)  /* DAC通道1 */
#define DAC_Channel_2  ((uint32_t)0x00000010)  /* DAC通道2 */

数据对齐方式

#define DAC_Align_12b_R  ((uint32_t)0x00000000)  /* 12位右对齐 */
#define DAC_Align_12b_L  ((uint32_t)0x00000004)  /* 12位左对齐 */
#define DAC_Align_8b_R   ((uint32_t)0x00000008)  /* 8位右对齐 */

波形生成类型

#define DAC_Wave_Noise     ((uint32_t)0x00000040)  /* 噪声波 */
#define DAC_Wave_Triangle  ((uint32_t)0x00000080)  /* 三角波 */

中断标志定义

仅在STM32F10X Value Line器件中可用:

#define DAC_IT_DMAUDR    ((uint32_t)0x00002000)  /* DMA下溢中断 */
#define DAC_FLAG_DMAUDR  ((uint32_t)0x00002000)  /* DMA下溢标志 */

标准库函数详解

1. DAC_DeInit

/**
 * @brief  将 DAC 所有寄存器恢复为复位默认值,用于重新配置前清空旧状态
 * @param
 * @retval
 * @example
 *     DAC_DeInit();  // 复位DAC外设
 */
void DAC_DeInit(void);

功能说明:

  • 调用后 DAC 回到上电默认配置,两通道均停止输出
  • 切换 DAC 用途(如从静态输出改为波形生成)前可先 DeInit

2. DAC_Init

/**
 * @brief  初始化 DAC 通道(触发源、波形、输出缓冲),决定数模转换工作方式
 * @param  DAC_Channel: 要配置的DAC通道,可选值:
 *         - DAC_Channel_1: DAC通道1
 *         - DAC_Channel_2: DAC通道2
 * @param  DAC_InitStruct: 指向DAC_InitTypeDef结构的指针,包含DAC的配置信息
 * @retval
 * @example
 *     DAC_InitTypeDef DAC_InitStructure;
 *     DAC_InitStructure.DAC_Trigger = DAC_Trigger_None;
 *     DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
 *     DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable;
 *     DAC_Init(DAC_Channel_1, &DAC_InitStructure);
 */
void DAC_Init(uint32_t DAC_Channel, DAC_InitTypeDef* DAC_InitStruct);

功能说明:

  • 一次性配置触发源、波形生成、LFSR/三角波幅值、输出缓冲器
  • 输出电压 ≈ VREF+ × Data / 4096(12 位右对齐)
  • 需在 DAC_Cmd 之前调用

3. DAC_StructInit

/**
 * @brief  将 DAC_InitTypeDef 成员填为安全默认值,避免未赋值字段导致随机配置
 * @param  DAC_InitStruct: 指向DAC_InitTypeDef结构的指针,将被初始化
 * @retval
 * @example
 *     DAC_InitTypeDef DAC_InitStructure;
 *     DAC_StructInit(&DAC_InitStructure);  // 填入默认值
 */
void DAC_StructInit(DAC_InitTypeDef* DAC_InitStruct);

功能说明:

  • 默认无触发、无波形生成、输出缓冲器启用
  • 填充后再按需修改个别成员即可

4. DAC_Cmd

/**
 * @brief  启动或停止指定 DAC 通道;ENABLE 后开始输出,DISABLE 后关闭
 * @param  DAC_Channel: 要控制的DAC通道,可选值:
 *         - DAC_Channel_1: DAC通道1
 *         - DAC_Channel_2: DAC通道2
 * @param  NewState: DAC通道的新状态,可选值:
 *         - ENABLE: 启用DAC通道
 *         - DISABLE: 禁用DAC通道
 * @retval
 * @example
 *     DAC_Cmd(DAC_Channel_1, ENABLE);   // 启用DAC通道1
 *     DAC_Cmd(DAC_Channel_2, DISABLE);  // 禁用DAC通道2
 */
void DAC_Cmd(uint32_t DAC_Channel, FunctionalState NewState);

功能说明:

  • ENABLE 后通道开始将数据寄存器值转换为模拟电压
  • 需先完成 DAC_Init 和 SetChannel 数据写入

5. DAC_ITConfig

/**
 * @brief  使能/屏蔽 DAC DMA 下溢中断(仅 Value Line),配合 NVIC 处理 DMA 异常
 * @param  DAC_Channel: 要配置的DAC通道,可选值:
 *         - DAC_Channel_1: DAC通道1
 *         - DAC_Channel_2: DAC通道2
 * @param  DAC_IT: 要配置的DAC中断,可选值:
 *         - DAC_IT_DMAUDR: DMA下溢中断
 * @param  NewState: 中断的新状态,可选值:
 *         - ENABLE: 启用中断
 *         - DISABLE: 禁用中断
 * @retval
 * @example
 *     DAC_ITConfig(DAC_Channel_1, DAC_IT_DMAUDR, ENABLE);
 */
void DAC_ITConfig(uint32_t DAC_Channel, uint32_t DAC_IT, FunctionalState NewState);

功能说明:

  • DMA 传输速度跟不上触发频率时会置 DMAUDR 标志
  • 需配合 NVIC 使能对应中断通道

6. DAC_DMACmd

/**
 * @brief  使能/关闭指定 DAC 通道的 DMA 请求,用于 DMA 连续更新输出数据
 * @param  DAC_Channel: 要配置的DAC通道,可选值:
 *         - DAC_Channel_1: DAC通道1
 *         - DAC_Channel_2: DAC通道2
 * @param  NewState: DMA请求的新状态,可选值:
 *         - ENABLE: 启用DMA请求
 *         - DISABLE: 禁用DMA请求
 * @retval
 * @example
 *     DAC_DMACmd(DAC_Channel_1, ENABLE);  // 启用通道1的DMA请求
 */
void DAC_DMACmd(uint32_t DAC_Channel, FunctionalState NewState);

功能说明:

  • 触发源需配置为定时器或软件触发模式
  • 适合波形输出、音频播放等连续更新场景

7. DAC_SoftwareTriggerCmd

/**
 * @brief  软件触发指定通道转换,适用于软件定时更新输出
 * @param  DAC_Channel: 要配置的DAC通道,可选值:
 *         - DAC_Channel_1: DAC通道1
 *         - DAC_Channel_2: DAC通道2
 * @param  NewState: 软件触发的新状态,可选值:
 *         - ENABLE: 启用软件触发
 *         - DISABLE: 禁用软件触发
 * @retval
 * @example
 *     DAC_SoftwareTriggerCmd(DAC_Channel_1, ENABLE);  // 触发通道1转换
 */
void DAC_SoftwareTriggerCmd(uint32_t DAC_Channel, FunctionalState NewState);

功能说明:

  • 触发源须设为 DAC_Trigger_Software
  • 写入数据后调用 ENABLE 即可启动一次转换

8. DAC_DualSoftwareTriggerCmd

/**
 * @brief  同时软件触发双通道转换,实现两路同步输出
 * @param  NewState: 双通道软件触发的新状态,可选值:
 *         - ENABLE: 启用双通道软件触发
 *         - DISABLE: 禁用双通道软件触发
 * @retval
 * @example
 *     DAC_DualSoftwareTriggerCmd(ENABLE);  // 同时触发两个通道
 */
void DAC_DualSoftwareTriggerCmd(FunctionalState NewState);

功能说明:

  • 两通道在同一时刻启动转换,相位一致
  • 配合 DAC_SetDualChannelData 使用效果更佳

9. DAC_WaveGenerationCmd

/**
 * @brief  启用/关闭噪声波或三角波生成,用于内置波形输出
 * @param  DAC_Channel: 要配置的DAC通道,可选值:
 *         - DAC_Channel_1: DAC通道1
 *         - DAC_Channel_2: DAC通道2
 * @param  DAC_Wave: 要配置的波形类型,可选值:
 *         - DAC_Wave_Noise: 噪声波
 *         - DAC_Wave_Triangle: 三角波
 * @param  NewState: 波形生成的新状态,可选值:
 *         - ENABLE: 启用波形生成
 *         - DISABLE: 禁用波形生成
 * @retval
 * @example
 *     DAC_WaveGenerationCmd(DAC_Channel_1, DAC_Wave_Triangle, ENABLE);
 */
void DAC_WaveGenerationCmd(uint32_t DAC_Channel, uint32_t DAC_Wave, FunctionalState NewState);

功能说明:

  • 波形叠加在数据寄存器基准值之上
  • 需配合定时器触发源以固定波形频率

10. DAC_SetChannel1Data

/**
 * @brief  写入通道 1 数据保持寄存器,设定待转换的数字量
 * @param  DAC_Align: 数据对齐方式,可选值:
 *         - DAC_Align_12b_R: 12位右对齐
 *         - DAC_Align_12b_L: 12位左对齐
 *         - DAC_Align_8b_R: 8位右对齐
 * @param  Data: 要写入数据保持寄存器的数据值
 * @retval
 * @example
 *     DAC_SetChannel1Data(DAC_Align_12b_R, 2048);  // 设置通道1输出约1.65V
 */
void DAC_SetChannel1Data(uint32_t DAC_Align, uint16_t Data);

功能说明:

  • 12 位右对齐时有效范围 0–4095,对应 PA4 输出电压
  • 无触发模式下写入后自动转换

11. DAC_SetChannel2Data

/**
 * @brief  写入通道 2 数据保持寄存器,设定待转换的数字量
 * @param  DAC_Align: 数据对齐方式,可选值:
 *         - DAC_Align_12b_R: 12位右对齐
 *         - DAC_Align_12b_L: 12位左对齐
 *         - DAC_Align_8b_R: 8位右对齐
 * @param  Data: 要写入数据保持寄存器的数据值
 * @retval
 * @example
 *     DAC_SetChannel2Data(DAC_Align_12b_R, 1024);  // 设置通道2输出约0.82V
 */
void DAC_SetChannel2Data(uint32_t DAC_Align, uint16_t Data);

功能说明:

  • 功能同 SetChannel1Data,输出引脚为 PA5
  • 双通道应用时分别调用或改用 SetDualChannelData

12. DAC_SetDualChannelData

/**
 * @brief  原子写入双通道数据,保证两路同步更新
 * @param  DAC_Align: 数据对齐方式,可选值:
 *         - DAC_Align_12b_R: 12位右对齐
 *         - DAC_Align_12b_L: 12位左对齐
 *         - DAC_Align_8b_R: 8位右对齐
 * @param  Data2: 通道2的数据值
 * @param  Data1: 通道1的数据值
 * @retval
 * @example
 *     DAC_SetDualChannelData(DAC_Align_12b_R, 1024, 2048);
 */
void DAC_SetDualChannelData(uint32_t DAC_Align, uint16_t Data2, uint16_t Data1);

功能说明:

  • 一次写入避免两通道更新时刻不一致
  • 参数顺序为 Data2(通道 2)、Data1(通道 1)

13. DAC_GetDataOutputValue

/**
 * @brief  读取指定通道当前输出数据寄存器值,用于回读确认
 * @param  DAC_Channel: 要读取的DAC通道,可选值:
 *         - DAC_Channel_1: DAC通道1
 *         - DAC_Channel_2: DAC通道2
 * @retval 指定DAC通道的数据输出寄存器值
 * @example
 *     uint16_t dac_value = DAC_GetDataOutputValue(DAC_Channel_1);
 */
uint16_t DAC_GetDataOutputValue(uint32_t DAC_Channel);

功能说明:

  • 返回最近一次成功转换后的数字量
  • 可用于校验写入是否生效

14. DAC_GetFlagStatus

/**
 * @brief  查询 DAC 标志位(如 DMA 下溢),用于轮询检测异常
 * @param  DAC_Channel: 要检查的DAC通道,可选值:
 *         - DAC_Channel_1: DAC通道1
 *         - DAC_Channel_2: DAC通道2
 * @param  DAC_FLAG: 要检查的DAC标志,可选值:
 *         - DAC_FLAG_DMAUDR: DMA下溢标志
 * @retval 标志状态(SET或RESET)
 * @example
 *     if(DAC_GetFlagStatus(DAC_Channel_1, DAC_FLAG_DMAUDR) == SET)
 *     {
 *         // 处理DMA下溢
 *     }
 */
FlagStatus DAC_GetFlagStatus(uint32_t DAC_Channel, uint32_t DAC_FLAG);

功能说明:

  • 常用标志为 DAC_FLAG_DMAUDR(DMA 下溢)
  • 仅 Value Line 器件支持

15. DAC_ClearFlag

/**
 * @brief  清除指定 DAC 标志位,处理异常后需调用
 * @param  DAC_Channel: 要清除标志的DAC通道,可选值:
 *         - DAC_Channel_1: DAC通道1
 *         - DAC_Channel_2: DAC通道2
 * @param  DAC_FLAG: 要清除的DAC标志,可选值:
 *         - DAC_FLAG_DMAUDR: DMA下溢标志
 * @retval
 * @example
 *     DAC_ClearFlag(DAC_Channel_1, DAC_FLAG_DMAUDR);
 */
void DAC_ClearFlag(uint32_t DAC_Channel, uint32_t DAC_FLAG);

功能说明:

  • 清除后标志位恢复 RESET
  • 轮询或中断处理中检测到异常后调用

16. DAC_GetITStatus

/**
 * @brief  查询 DAC 中断是否挂起,用于 ISR 中判断中断源
 * @param  DAC_Channel: 要检查的DAC通道,可选值:
 *         - DAC_Channel_1: DAC通道1
 *         - DAC_Channel_2: DAC通道2
 * @param  DAC_IT: 要检查的DAC中断,可选值:
 *         - DAC_IT_DMAUDR: DMA下溢中断
 * @retval 中断状态(SET或RESET)
 * @example
 *     if(DAC_GetITStatus(DAC_Channel_1, DAC_IT_DMAUDR) == SET)
 *     {
 *         // 处理中断
 *     }
 */
ITStatus DAC_GetITStatus(uint32_t DAC_Channel, uint32_t DAC_IT);

功能说明:

  • 同时检查中断使能位和标志位
  • 返回 SET 表示对应中断已挂起

17. DAC_ClearITPendingBit

/**
 * @brief  清除 DAC 中断挂起位,ISR 结束前必须调用
 * @param  DAC_Channel: 要清除中断的DAC通道,可选值:
 *         - DAC_Channel_1: DAC通道1
 *         - DAC_Channel_2: DAC通道2
 * @param  DAC_IT: 要清除的DAC中断,可选值:
 *         - DAC_IT_DMAUDR: DMA下溢中断
 * @retval
 * @example
 *     DAC_ClearITPendingBit(DAC_Channel_1, DAC_IT_DMAUDR);
 */
void DAC_ClearITPendingBit(uint32_t DAC_Channel, uint32_t DAC_IT);

功能说明:

  • 不清除会导致中断反复进入
  • 通常与 GetITStatus 配对使用

使用示例

基本DAC输出

#include "stm32f10x.h"

void DAC_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    DAC_InitTypeDef DAC_InitStructure;
    
    // 使能GPIOA和DAC时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
    
    // 配置PA4为模拟输入(DAC通道1输出)
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    // 配置DAC通道1
    DAC_InitStructure.DAC_Trigger = DAC_Trigger_None;
    DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
    DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable;
    DAC_Init(DAC_Channel_1, &DAC_InitStructure);
    
    // 启用DAC通道1
    DAC_Cmd(DAC_Channel_1, ENABLE);
    
    // 设置输出电压为VDD/2(约1.65V,假设VDD=3.3V)
    DAC_SetChannel1Data(DAC_Align_12b_R, 2048);
}

DAC三角波生成

void DAC_TriangleWave_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    DAC_InitTypeDef DAC_InitStructure;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    
    // 使能时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC | RCC_APB1Periph_TIM6, ENABLE);
    
    // 配置GPIO
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    // 配置TIM6作为DAC触发源
    TIM_TimeBaseStructure.TIM_Period = 100;  // 更新周期
    TIM_TimeBaseStructure.TIM_Prescaler = 720;  // 预分频
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);
    TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update);
    TIM_Cmd(TIM6, ENABLE);
    
    // 配置DAC
    DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO;
    DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_Triangle;
    DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_TriangleAmplitude_1023;
    DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable;
    DAC_Init(DAC_Channel_1, &DAC_InitStructure);
    
    // 启用DAC通道1
    DAC_Cmd(DAC_Channel_1, ENABLE);
    
    // 设置三角波基准值
    DAC_SetChannel1Data(DAC_Align_12b_R, 2048);
}

DAC双通道同步输出

void DAC_DualChannel_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    DAC_InitTypeDef DAC_InitStructure;
    
    // 使能时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
    
    // 配置PA4(DAC_OUT1)和PA5(DAC_OUT2)
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    // 配置DAC通道1和通道2
    DAC_InitStructure.DAC_Trigger = DAC_Trigger_Software;
    DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
    DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable;
    DAC_Init(DAC_Channel_1, &DAC_InitStructure);
    DAC_Init(DAC_Channel_2, &DAC_InitStructure);
    
    // 启用两个通道
    DAC_Cmd(DAC_Channel_1, ENABLE);
    DAC_Cmd(DAC_Channel_2, ENABLE);
    
    // 同时设置两个通道的输出值
    DAC_SetDualChannelData(DAC_Align_12b_R, 1024, 3072);  // 通道2: 1V, 通道1: 2.5V
    
    // 软件触发转换
    DAC_DualSoftwareTriggerCmd(ENABLE);
}

注意事项

  1. 时钟配置:使用DAC前必须先使能APB1上的DAC时钟
  2. GPIO配置:DAC输出引脚(PA4/PA5)必须配置为模拟输入模式
  3. 数据范围:12位DAC的有效数据范围是0-4095,对应输出电压0-VREF+
  4. 输出缓冲器:启用输出缓冲器可以提供更好的驱动能力,但会增加输出阻抗
  5. 触发源选择:根据应用需求选择合适的触发源,软件触发适用于静态输出,定时器触发适用于动态波形
  6. 波形生成:使用波形生成功能时,数据寄存器的值作为基准值,实际输出在此基础上叠加波形
  7. 中断功能:仅在STM32F10X Value Line器件中支持DAC中断功能
  8. 双通道同步:使用双通道时,可以通过双通道软件触发实现精确的同步输出

总结

STM32F10x DAC外设提供了强大的数字模拟转换功能,支持两个独立的12位DAC通道。通过合理配置触发源、波形生成和输出缓冲器等参数,可以实现多种应用场景,包括静态电压输出、动态波形生成和双通道同步输出。该外设特别适用于音频信号生成、传感器偏置电压提供、波形发生器等应用。