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

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

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

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

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. 四、总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • OpenClaw 文献检索、数据整理与论文排版自动化实战
  • Rust 全栈开发框架深度对比:Leptos、Yew、Axum 与 Tauri
  • Web3.0 开发实践
  • OpenClaw + cpolar:将本地 AI 变为随身工具,支持远程访问与 NAS 管理
  • Sora 模型技术报告:世界模拟器与视频生成能力解析
  • MidJourney 提示词(Prompt)编写指南与技巧详解
  • 如何在 VS Code 中关闭 GitHub Copilot 功能
  • Stable Diffusion 系列演进、技术特点与应用影响
  • Python 零基础入门:从环境搭建到编写第一个程序
  • Python Tkinter GUI 开发基础入门
  • 各无人机厂家 RemoteID 支持情况汇总
  • C++ 多态的核心概念与实现原理
  • AI 提示词技术:人设设定(Character Prompt)让模型“扮演”角色
  • MiGPT GUI 部署小爱音箱接入大模型配置
  • Claude Code 高级编程技巧实战项目详解
  • OpenClaw 大龙虾机器人本地部署与配置实战
  • Python 办公自动化实战:文档处理、图像合成与文件管理
  • Redis Sentinel 高可用集群的 Java 客户端实践
  • 机器人轨迹规划详解:概念、空间与常用算法
  • C++ STL 基础:迭代器、auto 与范围循环

相关免费在线工具

  • 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