跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C

STM32F407 DAC 外设配置与波形生成详解

STM32F407 微控制器中 DAC(数模转换器)外设的原理与应用。内容涵盖 DAC 的基本概念、12 位分辨率及双通道特性、软件/定时器/外部触发方式以及噪声与三角波波形生成功能。文章提供了基于标准库的完整配置步骤与 C 语言代码示例,包括时钟使能、GPIO 模拟模式配置、DAC 初始化及电压转换函数实现,帮助开发者快速掌握 DAC 在音频、电机控制等场景中的使用方法。

安卓系统发布于 2026/3/22更新于 2026/10/20117 浏览
简介

DAC(Digital-to-Analog Converter,数模转换器)是将数字信号转换为模拟信号的外设,广泛应用于音频输出、波形生成、电机控制等场景。STM32F407 系列芯片配备了 2 个 DAC 通道(DAC1 和 DAC2),支持 12 位分辨率,支持多种触发方式,可输出稳定的模拟电压。本文从 DAC 的基本原理出发,详细讲解 STM32F407 DAC 的配置方法、代码实现、波形生成以及实际应用案例。

一、DAC 核心概念与分类
1.1 基本概念

DAC 是将数字信号转换为模拟信号的外设,其主要特点包括:

  • 双通道:支持 2 个独立的 DAC 通道
  • 12 位分辨率:可输出 0-4095 级模拟电压
  • 多种触发方式:支持软件触发、定时器触发、外部触发等
  • 波形生成:支持噪声波形、三角波波形生成
  • DMA 支持:支持 DMA 传输,实现连续输出

关键参数:

  • 分辨率:12 位,输出范围 0-4095
  • 输出电压范围:0-VREF+(通常为 0-3.3V)
  • 更新速率:最高可达 1MSPS
  • 触发方式:软件触发、定时器触发、外部触发
1.2 STM32F407 的 DAC 资源

STM32F407 系列芯片配备了 2 个 DAC 通道:

DAC 通道引脚触发源适用场景
DAC1PA4软件触发、TIM2、TIM4、TIM5、TIM6、TIM7、TIM8、EXTI9主要 DAC 通道
DAC2PA5软件触发、TIM2、TIM4、TIM5、TIM6、TIM7、TIM8、EXTI9辅助 DAC 通道

关键特性:

  • 支持 12 位分辨率
  • 支持左右对齐
  • 支持多种触发方式
  • 支持噪声波形生成
  • 支持三角波波形生成
  • 支持 DMA 传输
  • 支持双 DAC 同步转换
二、DAC 工作原理
2.1 基本工作原理

DAC 的基本工作原理是将数字信号转换为模拟信号。

工作流程:

  1. CPU 或 DMA 将数字数据写入 DAC 数据保持寄存器
  2. DAC 数据保持寄存器将数据传输到 DAC 数据寄存器
  3. DAC 数据寄存器将数字数据转换为模拟电压
  4. 模拟电压通过 DAC 输出引脚输出
2.2 触发方式

DAC 支持多种触发方式:

软件触发:

  • 通过软件写入 DAC 数据寄存器触发转换
  • 适用于手动控制输出电压的场景

定时器触发:

  • 通过定时器事件触发转换
  • 适用于周期性输出模拟电压的场景

外部触发:

  • 通过外部中断触发转换
  • 适用于外部事件触发输出模拟电压的场景
2.3 波形生成

DAC 支持两种波形生成:

噪声波形生成:

  • 生成伪随机噪声波形
  • 可用于音频效果、信号测试等场景

三角波波形生成:

  • 生成三角波波形
  • 可用于信号测试、电机控制等场景
三、DAC 配置与代码实现
3.1 标准库配置步骤

以 DAC1 为例,使用标准库配置 DAC 的基本步骤:

  1. 使能 DAC 时钟和 GPIO 时钟
  2. 配置 GPIO 为模拟模式
  3. 配置 DAC 基本参数
  4. 使能 DAC
  5. 配置 DMA(可选)
3.2 代码实现(DAC1,软件触发)
#include "stm32f4xx.h"

/**
 * @brief 初始化 DAC1
 * @param 无
 * @retval 无
 */
void DAC1_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    DAC_InitTypeDef DAC_InitStructure;

    // 1. 使能时钟
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);

    // 2. 配置 GPIO
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;      // 模拟模式
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // 3. 配置 DAC1
    DAC_InitStructure.DAC_Trigger = DAC_Trigger_None;         // 软件触发
    DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; // 无波形生成
    DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0;
    DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable; // 使能输出缓冲
    DAC_Init(DAC_Channel_1, &DAC_InitStructure);

    // 4. 使能 DAC1
    DAC_Cmd(DAC_Channel_1, ENABLE);
}

/**
 * @brief 设置 DAC1 输出电压
 * @param value: 数字值(0-4095)
 * @retval 无
 */
void DAC1_SetVoltage(uint16_t value)
{
    // 设置 DAC1 数据寄存器
    DAC_SetChannel1Data(DAC_Align_12b_R, value);
}

/**
 * @brief 获取 DAC1 输出电压
 * @param 无
 * @retval 数字值(0-4095)
 */
uint16_t DAC1_GetVoltage(void)
{
    // 获取 DAC1 数据寄存器
    return DAC_GetDataOutputValue(DAC_Channel_1);
}

/**
 * @brief 将电压值转换为 DAC 数字值
 * @param voltage: 电压值(0-3300mV)
 * @retval 数字值(0-4095)
 */
uint16_t Voltage_To_DAC(uint16_t voltage)
{
    if (voltage > 3300) voltage = 3300;
    return (uint16_t)(voltage * 4095.0f / 3300.0f);
}
四、总结

通过上述配置,STM32F407 的 DAC 模块可以灵活地输出模拟电压。结合定时器触发可实现周期波形,配合 DMA 可实现大数据量连续输出。开发者可根据具体应用场景选择合适的触发方式和波形生成模式。

目录

  1. 简介
  2. 一、DAC 核心概念与分类
  3. 1.1 基本概念
  4. 1.2 STM32F407 的 DAC 资源
  5. 二、DAC 工作原理
  6. 2.1 基本工作原理
  7. 2.2 触发方式
  8. 2.3 波形生成
  9. 三、DAC 配置与代码实现
  10. 3.1 标准库配置步骤
  11. 3.2 代码实现(DAC1,软件触发)
  12. 四、总结

更多推荐文章

查看全部
  • Gitee 版本控制新手入门指南
  • 主流大模型介绍(GPT、Llama、ChatGLM、Qwen、deepseek)
  • 基于 Nexent 打造 AI 烹饪顾问:知识库与 MCP 生态实战
  • AIGC 时代的网络安全威胁与应急响应机制构建
  • 2026 年主流 AI 工具对比:豆包、DeepSeek、ChatGPT 及 Cursor
  • C++ AVL 树底层原理与实现
  • Clawdbot 通用部署与配置教程:Ubuntu Server / Copilot / Telegram
  • 多种页面动画效果实现:星空、时钟与粒子特效
  • Python 零基础入门教程:从基础到精通
  • Git 2.53.0 Windows 版安装及 SSH 配置详解
  • 低成本运行 Claude Code:通过 LiteLLM 接入 GitHub Copilot API 指南
  • 海光 DCU K100-AI 环境部署 Ollama 与 DeepSeek
  • Qoder AI 编程工具从部署到深度使用实战详解
  • Spring Boot 4.0 新特性详解:基线升级、Web 生态与 API 治理
  • PyCharm 编写 Python 程序完整教程
  • MySQL 表操作实战:创建、修改与删除的核心语法与注意事项
  • MES 生产制造执行系统:SpringBoot 后端与 Vue 前端实现
  • Python 开源 AI 模型引入及测试全流程实战
  • Flood Fill 算法详解:DFS/BFS 实现与经典应用
  • Go 语言实现回文字符串检测算法详解

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online