ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

基于STM32的波形发生器设计:DAC、定时器与DDS技术实践

基于STM32的波形发生器设计:DAC、定时器与DDS技术实践 这次我们来看一个基于STM32的波形发生器项目。对于电子、通信、自动化相关专业的学生和工程师来说一个稳定、可编程、功能丰富的信号源是学习和项目调试的刚需。市面上的专业信号发生器价格不菲而基于STM32自制的波形发生器成本可控、功能灵活是深入理解DAC、定时器、DDS等核心技术的绝佳实践。这个项目的核心在于利用STM32微控制器的片上资源特别是其DAC数模转换器和定时器来生成可编程的模拟电压波形。它最吸引人的几个特点是成本极低一块STM32开发板即可、完全开源可定制、支持多种标准波形正弦波、方波、三角波、锯齿波等并且频率、幅度、相位等参数可通过软件灵活调节。相比于纯模拟电路方案数字方案在精度、稳定性和功能扩展性上优势明显。本文将带你从零开始构建一个功能完整的STM32波形发生器。我们会重点拆解其硬件连接、软件驱动特别是DAC和定时器的配置、波形生成算法如查表法、DDS原理并通过串口或按键进行参数控制。无论你是正在寻找毕业设计课题还是想为你的实验台添置一个实用工具这篇文章都能提供清晰的实现路径和可运行的代码参考。1. 核心能力速览在深入细节之前我们先通过一个表格快速了解这个基于STM32的波形发生器项目能做什么以及它的基本规格。能力项说明与规格核心控制器STM32系列微控制器如STM32F103、STM32F407等需带DAC外设输出波形正弦波、方波、三角波、锯齿波可扩展任意波形频率范围依赖主频和算法查表法通常可达几十kHzDDS方案更高幅度调节通过DAC参考电压或后端运放电路实现通常为0-3.3V对应DAC输出控制方式按键LCD/OLED显示屏、串口指令、旋转编码器可选输出接口单片DAC输出引脚通常需连接运放进行缓冲和放大开发环境Keil MDK-ARM / STM32CubeIDE / VSCode PlatformIO核心外设DAC数模转换器、TIM定时器用于触发DAC更新、DMA可选用于高效数据传输编程语言C语言基于HAL库或标准外设库适合场景电子实验、教学演示、传感器激励、简易测试设备、毕业设计关键点解读DAC是硬件基础并非所有STM32都有DAC选型时务必确认。STM32F103C8T6“蓝桥杯”常用有1个DACSTM32F407等型号通常有2个。定时器是“节拍器”定时器以固定频率触发DAC输出下一个数据点这个频率直接决定了生成波形的频率。DMA是性能利器使用DMA可以将波形数据从内存自动搬运到DAC数据寄存器无需CPU干预能生成更稳定、更高频的波形。算法决定波形质量正弦波常用“查表法”预存一个周期的采样点方波、三角波可通过计算实时生成追求高分辨率和高频则需了解“DDS”直接数字频率合成原理。2. 适用场景与使用边界2.1 这个工具适合谁高校学生电子信息、自动化、通信工程等相关专业的本科生、研究生用于完成课程设计、毕业设计或深入理解嵌入式系统中DAC、定时器、中断、DMA等核心概念。电子爱好者希望自制一个低成本、可玩性高的信号源用于电路调试、测试运放、驱动压电陶瓷等。初创团队/硬件工程师在原型开发阶段需要一个灵活的、可编程的激励信号源用于快速验证传感器或电路模块的功能。2.2 能解决什么问题替代部分低频信号发生器在音频范围20Hz-20kHz乃至数百kHz范围内可以生成质量不错的测试信号。提供可编程的模拟激励可以通过修改代码轻松生成特定频率、特定形状的波形这是许多固定函数发生器做不到的。作为学习平台将枯燥的芯片手册中外设描述转化为一个看得见、测得到的实际输出极大提升学习效率和兴趣。2.3 不适合什么场景超高频率应用STM32的DAC转换速率和系统时钟有限通常无法生成MHz级别的高频信号。这是专用DDS芯片或高速DAC的领域。高精度、低失真要求片上DAC的分辨率通常为12位精度和线性度可能无法满足精密测量仪器的要求。高输出功率驱动DAC引脚输出电流能力有限通常几mA且电压范围受限0-3.3V。驱动低阻抗负载或需要高压摆幅时必须外接运放等驱动电路。复杂的调制信号虽然可以通过软件实现AM、FM等但实时性和性能可能受限。对于复杂通信信号生成建议使用FPGA或专用射频芯片。2.4 安全与合规边界电气安全本项目输出为低压直流信号。严禁将输出直接接入市电或高压设备。若外接放大电路需注意电路隔离与安全设计。知识产权项目中使用的ST官方库如HAL库需遵循其对应的开源协议。自行开发的代码可自由定义版权。用途合规生成的信号应用于合法、合规的测试与实验场景。3. 环境准备与前置条件在开始编码和焊接之前请确保你已准备好以下软硬件环境。3.1 硬件清单组件型号/规格数量备注主控板STM32F103C8T6最小系统板或带DAC的其他型号1核心需确认有DAC引脚如PA4, PA5调试器ST-Link V2 / J-Link / DAP-Link1用于程序下载与调试示波器任意型号数字示波器1必备用于观察和测量输出波形运放模块LM358 / TL082 / OPAMP 等通用运放1用于缓冲和放大DAC输出可选但推荐显示屏0.96寸 OLED (I2C/SPI) 或 LCD16021用于显示波形参数和菜单输入设备按键、旋转编码器若干用于调节频率、幅度、波形类型电源5V/3.3V USB供电或稳压电源1为整个系统供电杜邦线公对公、母对母若干用于连接各模块面包板/洞洞板-1用于搭建电路3.2 软件环境集成开发环境 (IDE)Keil MDK-ARM经典选择需安装对应STM32系列的Device Family Pack。STM32CubeIDEST官方免费IDE基于Eclipse集成CubeMX图形化配置工具强烈推荐新手使用。VSCode PlatformIO轻量级、高可定制化选择适合喜欢现代编辑器的开发者。STM32CubeMX独立的图形化配置工具已集成在STM32CubeIDE中。用于可视化配置时钟、引脚、外设DAC、TIM、DMA等并生成初始化代码框架。串口调试助手如XCOM、SecureCRT、Putty等用于接收串口数据或发送控制指令。驱动确保ST-Link等调试器的USB驱动已正确安装。3.3 知识前置条件基本的C语言编程能力。了解STM32 GPIO、中断的基本概念。对模拟电路有基本认识理解运放的“电压跟随器”、“同相放大”等基本电路。4. 系统设计与原理分析在动手写代码前我们需要从系统层面理解波形发生器是如何工作的。其核心是一个“数字到模拟”的转换链并由一个精确的时钟来驱动。4.1 系统框图[用户输入] -- [STM32主控] -- [DAC] -- [运放缓冲/放大] -- [波形输出] (按键/串口) (运行波形生成算法) (数字-模拟) (提高驱动能力) (至示波器探头) ^ | [定时器触发]用户输入通过按键、编码器或串口设置波形类型、频率、幅度等参数。波形生成算法STM32的CPU或DMA根据参数准备要输出的波形数据点。对于正弦波通常是预先生成好的一个周期采样值数组查表法。定时器触发一个硬件定时器如TIM2, TIM6被配置为以固定的更新频率产生中断或DMA请求。这个频率F_update是关键它等于波形频率(F_wave) * 一个周期的采样点数(N)。DAC转换在每次定时器触发时DAC将当前的数据点一个12位的数字值转换为对应的模拟电压0-3.3V。运放电路DAC输出引脚如PA4驱动能力弱直接接负载可能导致波形失真。连接一个运放构成电压跟随器可以提供低输出阻抗稳定波形。若需要放大可构成同相放大电路。4.2 关键公式频率计算假设我们采用查表法生成正弦波。N: 一个正弦波周期采样的点数例如取N256点。点数越多波形越光滑但最高输出频率越低。F_update: 定时器触发DAC更新的频率Hz。F_wave: 最终想要生成的波形频率Hz。它们的关系是F_wave F_update / N举例我们希望生成 1kHz 的正弦波采用256点查表。那么需要定时器以F_update 1kHz * 256 256kHz的频率来触发DAC。也就是说定时器需要每1 / 256000 ≈ 3.9us触发一次。定时器的触发频率由STM32的系统时钟和定时器的分频系数、重装载值决定。这是配置时的核心计算。4.3 方案对比查询、中断与DMA查询方式在循环中不断写入DAC数据并延时。不推荐频率不准且CPU被完全占用。中断方式定时器溢出产生中断在中断服务函数中更新DAC数据。频率准但高频时中断开销大可能影响其他任务。DMA方式最佳实践。定时器触发DMA请求DMA自动将内存中的波形数据数组搬运到DAC数据寄存器。全程无需CPU参与效率最高波形最稳定。本文后续将以DMA定时器触发DAC为主要方案进行讲解。5. 硬件电路设计与连接5.1 核心连接示意图以STM32F103C8T6和LM358运放为例STM32F103C8T6 PA4 (DAC1_OUT) ---- LM358 同相输入端(3脚) PA5 (DAC2_OUT) ---- (备用可生成双通道信号) GND -------------- LM358 负电源(4脚) 和 电路地 3.3V -------------- LM358 正电源(8脚) LM358 输出端(1脚) ---- 输出接口接示波器探头 反相输入端(2脚) -- 输出端(1脚) [构成电压跟随器] 电压跟随器连接输出接反相输入端同相输入端为信号输入注意LM358不是轨到轨运放其输出电压范围无法达到0-3.3V通常在0-Vcc-1.5V左右。若需要更好的输出范围可选用轨到轨运放如LMV358、SGM358等或采用双电源供电。5.2 增加幅度调节可选如果想调节输出幅度可以在电压跟随器后级增加一个同相放大电路或使用数字电位器控制DAC的参考电压如果MCU支持。更简单的方法是在软件中改变DAC输出数据的最大值。例如12位DAC满量程是4095对应3.3V如果你想输出最大1.65V那么数据最大值就设为2047。但这会降低分辨率。5.3 显示与输入模块连接OLED (I2C)SCL-PB6,SDA-PB7,VCC-3.3V,GND-GND。按键一端接GPIO配置为上拉输入另一端接地。按下时GPIO读到低电平。旋转编码器CLK和DT引脚接GPIO配置为上拉输入SW按键接GPIOVCC和GND接电源。6. 软件实现基于STM32CubeMX与HAL库我们以STM32CubeIDE为例演示如何配置一个以定时器触发DMA方式输出正弦波的工程。6.1 使用STM32CubeMX创建工程新建工程选择你的MCU型号如STM32F103C8。配置时钟树将系统时钟HCLK设置为最高频率例如72MHz这是定时器精度的基础。配置DAC在Analog-DAC1中使能OUT1 Configuration对应PA4。在Parameter Settings中将Trigger选择为Timer 6 Trigger Out event或其他你打算使用的定时器如TIM2, TIM4。勾选DAC1 OUT1 DMA请求并在弹出的DMA设置中选择DMA1 Channel3根据数据手册模式为Circular循环模式数据宽度为Word因为DAC数据寄存器是12位右对齐用16位半字或32位字均可。配置定时器这里使用TIM6基本定时器专用于触发DAC/DMA。在Parameter Settings中Prescaler分频系数PSC设置为71。如果系统时钟72MHz则定时器时钟 72MHz / (711) 1MHzCounter Period自动重装载值ARR设置为3。则定时器更新频率 1MHz / (31) 250kHz这意味着F_update 250kHz。在Trigger Output (TRGO) Parameters中将Master/Slave Mode下的Trigger Event Selection设置为Update Event。配置GPIO用于按键、编码器等根据你的硬件设计设置。配置串口可选用于调试和控制如USART1。生成代码点击GENERATE CODE选择你的IDESTM32CubeIDE。6.2 编写波形生成与主程序代码在CubeMX生成的工程基础上我们需要添加自己的业务逻辑。第一步定义正弦波表在main.c的/* USER CODE BEGIN PV */区域定义/* USER CODE BEGIN PV */ #define SINE_WAVE_POINTS 256 // 一个周期的采样点数 uint32_t sineWaveTable[SINE_WAVE_POINTS]; // DAC数据表 /* USER CODE END PV */在/* USER CODE BEGIN 2 */区域初始化这个表/* USER CODE BEGIN 2 */ // 生成一个12位DAC的正弦波表幅度为满量程的50% for(int i 0; i SINE_WAVE_POINTS; i) { // 计算正弦值范围[-1, 1] float sineValue sinf(2 * 3.1415926f * i / SINE_WAVE_POINTS); // 转换为DAC值偏移到1.65V2047幅度为2047 // DAC输出 1.65V 1.65V * sin(theta) // 对应数值 2047 2047 * sin(theta) sineWaveTable[i] (uint32_t)(2047 2047 * sineValue); // 确保值在0-4095之间 if(sineWaveTable[i] 4095) sineWaveTable[i] 4095; } /* USER CODE END 2 */第二步启动DAC和DMA传输在初始化完正弦波表后启动DAC和DMA/* USER CODE BEGIN 2 */ // ... 生成正弦波表代码 ... // 启动DAC通道1使用定时器6触发 if (HAL_DAC_Start_DMA(hdac, DAC_CHANNEL_1, (uint32_t*)sineWaveTable, SINE_WAVE_POINTS, DAC_ALIGN_12B_R) ! HAL_OK) { Error_Handler(); } // 启动定时器6它将自动以设定频率触发DAC更新 HAL_TIM_Base_Start(htim6); /* USER CODE END 2 */此时DAC应该已经开始在PA4引脚输出一个连续的正弦波了。用示波器探头连接PA4或经过运放后的输出你应该能看到波形。第三步动态改变频率核心要改变输出波形频率我们需要动态调整定时器的触发频率F_update。根据公式F_wave F_update / N改变F_update或N都可以。通常我们固定N波形表点数通过改变定时器的ARR值来改变F_update。添加一个函数来设置频率/* USER CODE BEGIN 4 */ /** * brief 设置波形输出频率 * param freq_hz: 期望的频率Hz * retval 实际设置的频率Hz可能受限于定时器分辨率 */ float SetWaveFrequency(float freq_hz) { // 计算所需的定时器更新频率 F_update float f_update_target freq_hz * SINE_WAVE_POINTS; // 定时器时钟频率我们在CubeMX配置为1MHz (72MHz / (711)) float tim_clock 1000000.0f; // 1MHz // 计算所需的定时器重装载值 ARR // F_update tim_clock / (ARR 1) // ARR tim_clock / F_update - 1 uint32_t arr_value (uint32_t)(tim_clock / f_update_target - 1); // ARR值不能为0且有限制16位定时器最大65535 if(arr_value 1) arr_value 1; if(arr_value 65535) arr_value 65535; // TIM6是16位定时器 // 停止定时器更新ARR重新启动 HAL_TIM_Base_Stop(htim6); __HAL_TIM_SET_AUTORELOAD(htim6, arr_value); HAL_TIM_Base_Start(htim6); // 计算实际能达到的频率 float f_update_actual tim_clock / (arr_value 1); float freq_actual f_update_actual / SINE_WAVE_POINTS; return freq_actual; // 返回实际设置的频率 } /* USER CODE END 4 */在主循环或按键中断中调用SetWaveFrequency(1000.0)即可将频率设置为约1kHz。第四步切换波形类型我们可以定义多个波形表并通过一个全局变量来切换DMA传输的源地址。/* USER CODE BEGIN PV */ #define WAVE_POINTS 256 uint32_t sineTable[WAVE_POINTS]; uint32_t triangleTable[WAVE_POINTS]; uint32_t squareTable[WAVE_POINTS]; uint32_t sawtoothTable[WAVE_POINTS]; typedef enum { WAVE_SINE 0, WAVE_TRIANGLE, WAVE_SQUARE, WAVE_SAWTOOTH } WaveType_t; WaveType_t currentWaveType WAVE_SINE; /* USER CODE END PV */在初始化时生成所有波形表。切换波形时需要停止DMA更改源地址再重新启动void ChangeWaveType(WaveType_t newType) { currentWaveType newType; uint32_t* pData NULL; switch(newType) { case WAVE_SINE: pData sineTable; break; case WAVE_TRIANGLE: pData triangleTable; break; case WAVE_SQUARE: pData squareTable; break; case WAVE_SAWTOOTH: pData sawtoothTable; break; default: pData sineTable; break; } HAL_DAC_Stop_DMA(hdac, DAC_CHANNEL_1); // 需要稍作延时确保DAC DMA停止 HAL_Delay(1); if (HAL_DAC_Start_DMA(hdac, DAC_CHANNEL_1, pData, WAVE_POINTS, DAC_ALIGN_12B_R) ! HAL_OK) { Error_Handler(); } }7. 功能测试与效果验证完成硬件连接和软件编程后将代码编译下载到STM32开始系统测试。7.1 基础波形输出测试连接示波器将示波器探头地线接系统GND信号线接运放输出端或直接接PA4测试但不推荐长期使用。上电启动给STM32开发板上电。观察波形你应该在示波器上看到一个稳定的正弦波。测量其频率是否与代码中初始设置的频率一致根据之前的计算F_update250kHz,N256理论频率应为250000/256 ≈ 976.56Hz。测量其峰峰值是否约为1.65V * 2 3.3V如果DAC数据表是按满幅度生成的则应为3.3V我们之前代码设置为50%幅度应为1.65V * 2 3.3V这里需要核对代码中2047 2047 * sin峰峰值是(20472047) - (2047-2047) 4094接近满量程4095所以电压接近3.3V。若要一半幅度应使用2047 1023 * sin。调整频率通过按键或串口发送指令调用SetWaveFrequency()函数分别设置目标频率为100Hz, 1kHz, 5kHz, 10kHz。用示波器测量实际输出频率记录与目标频率的误差。误差主要来源于定时器分频和ARR取整。7.2 波形切换测试编写一个简单的测试逻辑例如每5秒切换一种波形。在示波器上观察波形是否平滑地从正弦波变为三角波、方波、锯齿波。检查切换瞬间是否有明显的毛刺或中断。如果使用HAL_DAC_Stop_DMA/Start_DMA方式可能会有短暂停顿。更优的方案是使用双缓冲DMA或动态更新波形表内容。7.3 幅度调节测试实现一个幅度调节函数通过缩放波形表中的数据值来实现。void SetWaveAmplitude(uint16_t amplitude) { // amplitude: 0-4095 if(amplitude 4095) amplitude 4095; for(int i0; iWAVE_POINTS; i) { // 以正弦波为例重新生成表 float sineValue sinf(2 * 3.1415926f * i / WAVE_POINTS); sineTable[i] (uint32_t)(2047 (amplitude/2.0f) * sineValue); } // 如果当前是正弦波需要重启DMA以更新数据源 if(currentWaveType WAVE_SINE) { ChangeWaveType(WAVE_SINE); // 这会重启DMA } }分别设置幅度为25%、50%、75%、100%用示波器测量输出电压峰峰值是否按比例变化。7.4 负载能力测试在输出端接入一个1kΩ的电阻到地模拟负载。观察波形形状和幅度是否发生变化。如果变化明显说明运放缓冲电路是必要的。如果使用了运放电压跟随器接上负载后波形应基本保持不变。8. 性能优化与进阶功能8.1 使用DDS技术提高频率分辨率查表法的频率分辨率受限于定时器ARR的整数值。DDS直接数字频率合成通过一个相位累加器来实现更精细的频率控制。相位累加器一个32位的变量每个时钟周期累加一个频率控制字FTW。波形表寻址取相位累加器的高位例如高24位作为波形表的索引。频率计算输出频率 (FTW * F_update) / 2^N其中N是相位累加器的位数如32。通过改变FTW这个整数可以实现极细的频率步进。 实现DDS后你的SetWaveFrequency函数将改为计算并设置FTW而不是修改定时器的ARR。8.2 实现双通道输出如果MCU有第二个DAC如STM32F103的PA5可以配置第二个DAC通道使用同一个定时器触发但指向不同的波形数据表和DMA流。这样可以输出两路同步或不同波形的信号用于需要相位差或调制信号的场景。8.3 添加调制功能AM/FM幅度调制AM用另一个低频波形如正弦波的数据实时乘以载波波形表的数据结果再送给DAC。这需要较高的CPU计算能力或在DMA传输完成中断中处理。频率调制FM动态改变定时器的ARR值或DDS的FTW值。可以建立一个调制信号表在每个载波周期或每N个周期微调一次频率。8.4 连接上位机软件通过串口或USB CDC虚拟串口与PC通信开发一个简单的上位机软件可以用Python的Tkinter或Qt编写实现图形化设置波形、频率、幅度、调制参数等并实时显示状态。9. 常见问题与排查方法在开发过程中你可能会遇到以下问题。这里提供排查思路。问题现象可能原因排查方式解决方案无波形输出引脚为固定电压1. DAC未使能或配置错误。2. 定时器未启动。3. DMA未配置或未启动。4. 波形表数据全为0或固定值。1. 检查CubeMX中DAC配置Output Buffer是否使能2. 调试模式查看DAC、TIM、DMA相关寄存器是否已使能。3. 检查HAL_DAC_Start_DMA返回值。4. 查看内存中波形表数据是否正确。1. 重新检查CubeMX配置确保触发源选择正确。2. 按顺序启动生成波形表 - 启动DAC DMA - 启动定时器。3. 使用简单数据如递增数列测试DAC是否正常工作。波形频率严重不准1. 系统时钟HCLK配置错误。2. 定时器预分频PSC和重载值ARR计算错误。3. 波形表点数N定义错误。1. 使用示波器测量一个已知的GPIO翻转频率验证系统时钟。2. 重新核对F_update F_tim_clock / (PSC1) / (ARR1)公式。3. 检查代码中SINE_WAVE_POINTS宏的值。1. 使用STM32CubeMX的时钟图功能确保配置正确。2. 编写一个简单的GPIO翻转程序验证定时器中断频率。波形有台阶、不光滑1. 一个周期的采样点数N太少。2. DAC输出未经过滤波。1. 增加SINE_WAVE_POINTS如从256增加到512。注意这会降低最大输出频率。2. 用示波器放大观察看台阶是否是离散的DAC电平。1. 在输出端添加一个简单的RC低通滤波器截止频率略高于你需要的最高信号频率可以平滑台阶。高频时波形失真1. DAC的建立时间或压摆率限制。2. 定时器触发频率超过DAC最大转换速率。3. 运放带宽不足。1. 查阅芯片数据手册中DAC的TSETTLING和SLEW RATE参数。2. STM32F103的DAC转换时间约1us1MSPS理论最大F_update为1MHz。3. 检查运放型号的增益带宽积GBP。1. 降低输出频率或减少波形点数。2. 选择更高性能的MCU如STM32F4系列或专用DAC芯片。3. 选择高带宽的运放。切换波形时有爆音或间断1. DMA传输被停止再启动中间有间隔。2. 新旧波形表数据不连续。1. 在切换时用示波器观察看间断时间有多长。2. 检查切换波形函数中停止和启动DMA之间是否有延时。1. 考虑使用双缓冲DMA准备新数据到第二个缓冲区然后通过HAL_DAC_Start_DMA指定新缓冲区或使用HAL_DAC_Stop_DMA/Start_DMA时确保时序紧凑。2. 尝试动态更新当前DMA传输的缓冲区内容需注意内存一致性。输出幅度无法达到3.3V1. DAC输出缓冲器使能但其驱动能力有限。2. 运放不是轨到轨型输出电压达不到电源轨。3. 负载过重。1. 断开后续电路直接测量DAC引脚电压。2. 测量运放供电电压和输出极限。1. 在CubeMX中尝试禁用DAC输出缓冲Output Buffer选择Disable但要注意驱动能力更弱必须接运放。2. 更换为轨到轨运放或适当提高运放供电电压如5V。3. 确保负载阻抗足够大10kΩ。10. 项目总结与扩展方向基于STM32的波形发生器是一个综合性强、实践价值高的项目。它成功地将嵌入式系统的数字世界与模拟信号输出连接起来。通过本项目你不仅实现了一个实用工具更深入掌握了STM32的DAC、定时器、DMA这三个核心外设的协同工作方式。最值得尝试的下一步实现DDS这是提升项目技术含量的关键一步能让你对数字频率合成有深刻理解。设计PCB将STM32最小系统、运放电路、电源模块、编码器、显示屏集成到一块PCB上制作一个便携的独立设备。开发上位机用Python或LabVIEW编写一个带图形界面的控制软件通过USB或蓝牙与设备通信实现参数可视化设置和波形预览。添加存储功能利用STM32的Flash或外接SD卡存储多组自定义的任意波形数据实现任意波形发生器AWG的功能。最容易踩的坑忽略硬件连接DAC输出直接驱动负载是常见错误务必使用运放进行缓冲。时钟配置错误系统时钟和定时器时钟是频率精度的基石务必在CubeMX中仔细配置并验证。DMA配置不当数据宽度Word/Half Word、存储器/外设地址递增模式、循环模式等设置错误会导致数据传输混乱。这个项目的代码和思路具有很好的可移植性可以轻松迁移到其他带DAC的STM32型号如F4、H7系列上以获得更高的性能。建议你将核心的DACTIMDMA驱动模块化方便在未来的其他项目中复用。
返回列表