当前位置: 首页 > article >正文

STM32F103标准库下,DAC的三种触发方式(软件、自动、定时器+DMA)到底该怎么选?

STM32F103标准库下DAC触发方式深度解析从单次输出到精密波形生成在嵌入式系统开发中数字模拟转换器DAC是实现数字信号到模拟信号转换的关键模块。STM32F103系列微控制器内置的12位DAC模块提供了三种不同的触发方式软件触发、自动转换和定时器DMA触发。这三种方式各具特点适用于不同的应用场景。本文将深入剖析每种触发方式的工作原理、配置要点和性能特点帮助开发者根据实际需求做出最优选择。1. DAC基础配置与三种触发方式概览1.1 DAC模块初始化基础在STM32F103标准库中配置DAC模块首先需要完成基本的硬件初始化// GPIO初始化配置 GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin GPIO_Pin_4; // DAC_OUT1对应PA4 GPIO_InitStructure.GPIO_Mode GPIO_Mode_AIN; // 模拟输入模式 GPIO_Init(GPIOA, GPIO_InitStructure); // DAC模块初始化 DAC_InitTypeDef DAC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE); 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_Cmd(DAC_Channel_1, ENABLE);1.2 三种触发方式对比触发方式配置复杂度CPU占用率输出精度典型应用场景软件触发低高中单次输出、调试自动转换中中低低速连续信号定时器DMA触发高低高精密波形、音频输出提示选择触发方式时需综合考虑输出信号的频率稳定性、CPU资源占用以及系统实时性要求。2. 软件触发简单直接的单次输出方案2.1 工作原理与配置软件触发是最基础的DAC工作方式通过软件命令显式触发转换过程DAC_InitStructure.DAC_Trigger DAC_Trigger_Software; DAC_Init(DAC_Channel_1, DAC_InitStructure); // 设置输出值并触发转换 DAC_SetChannel1Data(DAC_Align_12b_R, 2048); // 设置12位右对齐值 DAC_SoftwareTriggerCmd(DAC_Channel_1, ENABLE); // 软件触发2.2 适用场景与限制软件触发方式特别适合以下场景需要输出固定电压值的应用如参考电压生成调试阶段验证DAC基本功能对输出时序要求不严格的单次转换然而这种方式存在明显局限性每次转换都需要CPU介入资源占用高难以保证输出信号的精确时序不适合生成连续变化的波形3. 自动转换低复杂度的连续输出方案3.1 工作原理与配置自动转换模式下DAC会持续进行转换而无需外部触发DAC_InitStructure.DAC_Trigger DAC_Trigger_None; // 无外部触发 DAC_Init(DAC_Channel_1, DAC_InitStructure); // 设置初始值 DAC_SetChannel1Data(DAC_Align_12b_R, initialValue);3.2 性能特点与优化自动转换模式的主要特点包括转换速率由DAC模块自身决定约1MHz带宽输出更新不受CPU负载影响可通过中断或DMA实现数据自动更新典型应用场景低速数据采集系统的参考电压生成需要持续但不需要精确时序的模拟输出资源受限系统中的简单波形生成注意自动转换模式下输出更新速率不可控不适合需要精确频率控制的场景。4. 定时器DMA触发高精度波形生成方案4.1 系统架构与工作原理定时器DMA触发组合提供了最灵活、精确的DAC控制方式定时器产生精确的触发信号DMA自动搬运波形数据到DACDAC响应触发信号进行转换这种架构实现了完全硬件自动化的波形生成精确可控的输出频率极低的CPU开销4.2 完整配置实例以下代码展示了生成1kHz正弦波的完整配置// 定时器配置TIM4产生1kHz触发 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); TIM_TimeBaseStructure.TIM_Period 72 - 1; // 72MHz/72 1MHz TIM_TimeBaseStructure.TIM_Prescaler 1000 - 1; // 1MHz/1000 1kHz TIM_TimeBaseStructure.TIM_ClockDivision TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode TIM_CounterMode_Up; TIM_TimeBaseInit(TIM4, TIM_TimeBaseStructure); TIM_SelectOutputTrigger(TIM4, TIM_TRGOSource_Update); TIM_Cmd(TIM4, ENABLE); // DMA配置循环模式 DMA_InitTypeDef DMA_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE); DMA_InitStructure.DMA_PeripheralBaseAddr (uint32_t)DAC-DHR12R1; DMA_InitStructure.DMA_MemoryBaseAddr (uint32_t)waveformData; DMA_InitStructure.DMA_BufferSize WAVEFORM_POINTS; DMA_InitStructure.DMA_DIR DMA_DIR_PeripheralDST; DMA_InitStructure.DMA_Mode DMA_Mode_Circular; DMA_Init(DMA2_Channel3, DMA_InitStructure); DMA_Cmd(DMA2_Channel3, ENABLE); // DAC配置 DAC_InitStructure.DAC_Trigger DAC_Trigger_T4_TRGO; DAC_DMACmd(DAC_Channel_1, ENABLE);4.3 高级应用技巧波形表优化预计算波形数据并存储在Flash中使用查表法减少实时计算负担合理选择波形点数平衡内存占用和输出质量动态频率调整void setWaveformFrequency(uint32_t freq) { TIM_Cmd(TIM4, DISABLE); uint32_t period SystemCoreClock / (freq * WAVEFORM_POINTS) - 1; TIM4-ARR period; TIM_Cmd(TIM4, ENABLE); }多通道同步使用同一个定时器触发多个DAC通道确保DMA缓冲区数据排列匹配硬件通道顺序考虑使用双缓冲技术减少输出延迟5. 实战场景选择指南5.1 决策流程图开始 │ ├─ 需要单次输出 → 选择软件触发 │ ├─ 需要持续但低速输出 → 选择自动转换 │ └─ 需要精确波形 → 选择定时器DMA触发5.2 典型应用场景推荐工业控制4-20mA电流环定时器DMA确保输出稳定性阀门控制信号软件触发满足单次设定需求音频应用语音提示自动转换模式简化设计音乐播放定时器DMA保证44.1kHz采样率测试测量信号发生器定时器DMA实现任意波形传感器模拟软件触发提供精确单次输出5.3 性能优化建议降低CPU占用优先使用DMA传输合理设置DMA缓冲区大小使用硬件定时器而非软件延时提高输出质量启用DAC输出缓冲增强驱动能力添加RC滤波电路平滑输出确保电源稳定减少噪声在实际项目中我曾遇到一个需要同时输出多路不同频率正弦波的需求。通过精心设计DMA缓冲区结构和定时器配置最终实现了4路独立可控的波形输出CPU占用率保持在5%以下。关键点在于为每路波形分配独立的DMA缓冲区使用定时器主从模式同步不同频率采用查表法预计算波形数据

相关文章:

STM32F103标准库下,DAC的三种触发方式(软件、自动、定时器+DMA)到底该怎么选?

STM32F103标准库下DAC触发方式深度解析:从单次输出到精密波形生成 在嵌入式系统开发中,数字模拟转换器(DAC)是实现数字信号到模拟信号转换的关键模块。STM32F103系列微控制器内置的12位DAC模块提供了三种不同的触发方式&#xff1…...

美团春招笔试“小美的朋友关系”全网无AC?我用逆向并查集搞定它(附完整代码)

逆向并查集:破解美团笔试"小美的朋友关系"难题 大厂算法笔试中,总有一两道题能卡住绝大多数求职者。今年美团春招的"小美的朋友关系"就是这样一道"拦路虎"——全网找不到AC代码,无数人在超时和错误答案中挣扎。…...

2026年大模型内容精准收录实操,企业长效流量布局核心方法论

引言:大模型正在成为企业品牌认知的新前置入口。当越来越多用户绕过搜索引擎、直接向AI提问"哪家公司更适合""某个方案值不值得选"时,企业在AI回答中的位置、语气和引用来源,已经构成真实的竞争格局。本文将从大模型内容…...

给AI模型选‘口粮’:MIT-BIH、CPSC、PTB-XL,哪个ECG数据集更适合你的项目?

给AI模型选‘口粮’:三大ECG数据集深度评测与实战指南 当心电图(ECG)分析遇上人工智能,数据质量直接决定模型性能天花板。PhysioNet作为全球最大的生物医学信号开放平台,其收录的MIT-BIH、CPSC-2018和PTB-XL三大经典EC…...

《微服务被吹上天了?我劝你别盲目跟风,这 5 种情况千万别用》

《微服务被吹上天了?我劝你别盲目跟风,这 5 种情况千万别用》 一、开头(钩子)“微服务不是银弹,而是毒药。很多团队用了微服务之后,开发效率反而下降了,系统复杂度反而上升了。”这句话不是我说…...

用K210开发板驱动HUB75E点阵屏:从SPI时序到S型排列的完整避坑指南

用K210开发板驱动HUB75E点阵屏:从SPI时序到S型排列的完整避坑指南 在嵌入式开发领域,驱动LED点阵屏一直是兼具挑战性和实用性的课题。当K210这款高性能RISC-V开发板遇上HUB75E接口的大尺寸点阵屏,开发者往往会在SPI时序优化、内存管理和独特的…...

手把手教你用STM32F103C8T6驱动NRF24L01模块(附完整代码与避坑指南)

STM32F103C8T6与NRF24L01无线通信实战:从硬件对接到代码调试全解析 在物联网和智能硬件快速发展的今天,无线通信技术已成为嵌入式系统设计中不可或缺的一环。NRF24L01作为一款性价比极高的2.4GHz无线收发模块,配合STM32F103C8T6这类主流微控制…...

别再乱配了!H3C交换机上给不同VLAN打QoS标签和限速,这篇保姆级教程讲透了

H3C交换机QoS实战:精准标记与智能限速配置指南 在企业网络环境中,不同业务部门对网络质量的需求差异显著——研发部门需要稳定的文件传输带宽,高管团队依赖流畅的视频会议,而访客网络则要限制其对核心资源的占用。这种场景下&…...

PCB设计避坑指南:用ANSYS Designer快速评估耦合长度,别再盲目布线了

PCB设计避坑指南:用ANSYS Designer快速评估耦合长度,别再盲目布线了 高速PCB设计中,平行走线的耦合效应一直是工程师们头疼的问题。那些看似整齐的并行布线,往往在信号完整性测试时暴露出意想不到的串扰问题。我曾亲眼见过一个千兆…...

Ubuntu20.04安装Mapviz避坑指南:解决Qt与OpenCV冲突,手把手配置天地图

Ubuntu20.04安装Mapviz避坑指南:解决Qt与OpenCV冲突,手把手配置天地图 在ROS开发中,地图可视化工具Mapviz因其强大的插件系统和高度可定制性备受青睐。然而,Ubuntu20.04环境下安装Mapviz时,Qt版本冲突和OpenCV链接错误…...

别再让容器‘断网’了!Docker DNS配置保姆级教程(从全局到单容器,含8.8.8.8等常用DNS)

Docker容器网络疑难排查:全方位DNS配置指南与实战技巧 当你正在赶一个紧急项目,突然发现Docker容器无法连接外部API服务,控制台不断抛出"Name or service not known"错误——这种场景对开发者来说再熟悉不过了。容器网络问题&#…...

阿里云ECS新手避坑指南:搞定校园网、安全组和SSH端口映射(附XShell连接测试)

阿里云ECS新手全流程配置手册:从安全组到SSH连接的深度实践 第一次接触云服务器时,那种既兴奋又忐忑的心情我至今记忆犹新。看着控制台里各种陌生的术语和选项,明明按照教程一步步操作却总是卡在连接阶段,这种经历想必不少技术爱好…...

保姆级教程:红米K70澎湃OS解锁BL后,如何用Delta面具(德尔塔面具)一键Root

红米K70澎湃OS深度Root指南:Delta面具全流程实战解析 在安卓玩机圈里,Root始终是释放设备潜力的终极钥匙。对于手持红米K70并已解锁Bootloader的进阶用户而言,Delta面具(Magisk Delta)无疑是当前最安全、最稳定的Root解…...

精密运放ADA4091-2驱动能力不够?试试‘复合放大器’这招,带宽和带载能力都翻倍

精密运放驱动能力不足的终极解决方案:复合放大器架构深度解析 在精密信号链设计中,工程师们常常面临一个两难选择:要么选择ADA4091-2这类具有超低噪声和卓越直流性能的精密运放,但牺牲驱动能力;要么选用大电流运放&…...

P15906 [TOPC 2024] Business Magic 题解

P15906 [TOPC 2024] Business Magic Link: https://www.luogu.com.cn/problem/P15906 题目描述 沿街有 nnn 家商店,按从近到远的顺序编号为 111 到 nnn。上个月,商店 kkk 的净利润为 rkr_krk​。如果 rkr_krk​ 为正,表示盈利 rkr_krk​ 美…...

用逻辑分析仪实测STC15W408AS驱动BLDC电机:PWM波形与换相时序全解析

用逻辑分析仪实测STC15W408AS驱动BLDC电机:PWM波形与换相时序全解析 当硬件电路搭建完成,代码烧录进单片机后,真正的挑战才刚刚开始——如何验证那些看不见的电信号是否按预期工作?本文将以STC15W408AS驱动无感BLDC电机为例&#…...

模型越来越强,为什么真正拉开差距的却是向量引擎

模型越来越强,为什么真正拉开差距的却是向量引擎2026年的 AI 圈很吵。 但吵来吵去,核心其实只有一个问题。 模型更会说了。 为什么很多系统还是不好用。 答案往往不在模型参数里。 答案在入口、记忆、工具连接和上下文治理里。 你会发现一个很有意思的现…...

ARMv8-A A64内存拷贝指令优化原理与实践

1. A64内存拷贝指令概述在ARMv8-A架构的A64指令集中,内存拷贝操作被设计为一组高度优化的硬件指令,包括CPYPN、CPYMN和CPYEN三个关键指令。这些指令构成了一个完整的内存拷贝流水线,通过硬件级并行化和非临时(non-temporal)访问模式&#xff…...

从SE到Dual-Attention:手把手教你为YOLOv8或ResNet模型‘加装’注意力模块提升指标

从SE到Dual-Attention:手把手教你为YOLOv8或ResNet模型‘加装’注意力模块提升指标 在计算机视觉领域,注意力机制已成为提升模型性能的"秘密武器"。不同于完全重构网络架构,注意力模块的魅力在于其即插即用的特性——就像为汽车加装…...

ADF4350频点锁定与电源滤波实战:为什么你的VCO输出有噪声?加个钽电容试试!

ADF4350频点锁定与电源滤波实战:为什么你的VCO输出有噪声?加个钽电容试试! 在射频电路设计中,ADF4350作为一款集成VCO的宽带频率合成器,因其出色的性能和灵活性广受工程师青睐。然而,许多开发者在实际应用中…...

IT工程/项目计划概要~项目结束表(模版)

项目计划概要Ⅰ)项目启动(PROJECT INITIATION)1.EXCO(Executive Committee)审批2.已确认的意向书(Consent Letter)3.预风险评估4.合同(Contract)签署确认5.行业合规(Compliance)文档6.项目启动表7.项目章程签署确认Ⅱ)项目计划8.业…...

Swift底层多线程:POSIX线程封装与安全并发实践

1. 项目概述:当Swift遇见POSIX线程如果你在Swift里用过DispatchQueue或者Thread,有没有想过它们背后到底是怎么运作的?特别是当你的应用需要处理高并发、低延迟的任务,或者需要在Linux服务器上跑一个Swift后端服务时,仅…...

别再手动拖拽了!Unity运行时动态生成材质球,实现AR涂鸦功能的完整流程(附代码)

Unity运行时动态材质生成:打造高性能AR涂鸦系统的核心技术解析 在移动AR应用开发中,实时材质生成技术正成为提升用户体验的关键突破点。想象这样一个场景:儿童教育应用中,孩子随手绘制的涂鸦瞬间变成3D恐龙皮肤的纹理;…...

别再只会用RC了!手把手教你用运放搭建一个75Hz低通滤波器(附Multisim仿真文件)

从RC到运放:实战75Hz低通滤波器设计与Multisim验证 在电子信号处理领域,滤波器设计是每个工程师必须掌握的硬核技能。当你需要从嘈杂的传感器信号中提取有效信息,或者在音频系统中消除恼人的高频噪声时,一个性能优异的低通滤波器往…...

从“玄学”到科学:手把手教你用Python/SciPy设计有源巴特沃斯滤波器(告别手动解方程)

从“玄学”到科学:手把手教你用Python/SciPy设计有源巴特沃斯滤波器(告别手动解方程) 在电子工程领域,滤波器设计一直被视为兼具艺术与科学的复杂技艺。传统设计流程中,工程师需要反复查阅归一化表格、手动解算多项式方…...

Windows 11/10下VMware Workstation 17开机自启虚拟机完整配置流程(含权限修复与延迟启动设置)

Windows 11/10下VMware Workstation 17虚拟机开机自启全攻略 每次重启开发机都要手动启动一堆虚拟机?数据库服务、测试环境、持续集成节点需要724小时待命?VMware Workstation 17的自动启动功能能让你彻底告别重复劳动。作为在本地搭建服务环境的开发者&…...

不止于仿真:用MATLAB分析OFDM-QPSK系统抗噪声性能,这张误码率曲线图能告诉你什么?

从误码率曲线到系统优化:MATLAB深度解析OFDM-QPSK抗噪性能 在无线通信系统的设计与评估中,仿真分析是不可或缺的一环。当我们完成基础OFDM-QPSK系统的搭建后,如何从仿真结果中提取有价值的信息,进而指导系统优化?本文…...

NoFences桌面整理工具:5步打造高效整洁的Windows桌面

NoFences桌面整理工具:5步打造高效整洁的Windows桌面 【免费下载链接】NoFences 🚧 Open Source Stardock Fences alternative 项目地址: https://gitcode.com/gh_mirrors/no/NoFences 还在为Windows桌面上杂乱无章的图标而烦恼吗?NoF…...

AI插件深度对比 | Copilot、Tabnine、Codeium谁是王者

Copilot 的代码补全能力确实厉害,我试过在写 Python 函数的时候,只要输入注释,它就能自动生成函数体。比如写 “# 计算斐波那契数列”,它能直接给出递归和迭代两种实现方式。不过有时候生成的代码有点冗长,需要手动精简…...

Android BroadcastReceiver 深度解析:原理、实践与面试指南

引言 在 Android 开发中,BroadcastReceiver 是一个核心组件,用于处理系统级事件或应用内通信。它允许应用程序响应来自系统或其他应用的广播消息,如设备开机、网络状态变化或自定义事件。BroadcastReceiver 基于事件驱动的模型,帮助开发者实现松耦合的架构,提升应用的响应…...