MK NOTES
电路板与PCBA

STM32F103实战,DAC输出与内部Flash固件存储详解

2026-01-26STM32主控芯片
STM32F103实战,DAC输出与内部Flash固件存储详解

STM32F103实战,DAC输出与内部Flash固件存储详解

STM32F103 DAC外设基础与硬件连接规范

STM32F103系列微控制器内置了解数模转换(DAC)模块,该模块通常包含两个独立通道(DAC_OUT1和DAC_OUT2),能够将数字信号转换为模拟电压输出。在硬件设计阶段,DAC引脚(通常为PA4和PA5)直接连接到MCU的GPIO端口,其输出电压范围严格受限于参考电压VREF+。对于标准的3.3V供电系统,VREF+通常直接连接至VDDA引脚,此时DAC输出最大可达到3.3V。若需获得更宽的动态范围或更高的精度,外部可引入精密基准电压源作为VREF+,但需确保该电压不超过MCU允许的最大输入电压,以避免损坏内部电路结构。

在实际电路布局中,DAC输出引脚往往具有较高的输出阻抗,直接驱动负载会导致信号失真或幅度跌落。因此,通常在DAC引脚与负载之间串联一个低通滤波器或运算放大器构成的缓冲电路。RC低通滤波器的截止频率需根据信号带宽进行计算,公式为 $f_c = \frac{1}{2\pi RC}$,其中R为串联电阻,C为对地电容。对于音频或低频控制信号,通常选取较小的截止频率以滤除高频量化噪声;若信号频率较高,则需减小R或C的值,同时需注意运算放大器的压摆率和带宽限制,确保模拟信号不失真地传输至后续电路。

STM32F103实战,DAC输出与内部Flash固件存储详解

寄存器级DAC配置流程与代码实现逻辑

配置STM32F103的DAC外设主要涉及时钟使能、GPIO复用配置以及DAC控制寄存器操作。初始化过程中,首先通过RCC_APB1PeriphClockCmd开启DAC外设时钟,同时配置PA4或PA5引脚为模拟输入模式(GPIO_Mode_AIN),以消除数字输入电路对模拟输出的干扰。随后,使用DAC_InitTypeDef结构体设定输出触发源、输出缓冲状态以及初始输出值。若使用软件触发,需定期向DAC_DHRx寄存器写入数据;若使用定时器触发,则需配置TIMx的更新事件作为DAC的外部触发源,以实现精确的时序同步输出。

在代码实现层面,向DAC数据保持寄存器(DHRx)写入数据是核心步骤。STM32F103支持右对齐、左对齐等多种数据格式,对于12位分辨率的DAC,有效数据范围为0至4095。当写入值为0时,输出0V;当写入值为4095时,输出VREF+电压。若需生成正弦波或三角波,通常预先在数组中计算好对应电压值对应的数字量,然后通过DMA(直接存储器访问)或定时器中断定期更新DHR寄存器。例如,生成1kHz正弦波时,采样率需至少满足奈奎斯特准则,通常选取20kHz以上的采样率,并在定时器ARR寄存器中设置相应的计数值以匹配采样间隔。

STM32F103实战,DAC输出与内部Flash固件存储详解

内部Flash存储固件参数与掉电保护机制

STM32F103系列芯片内置了不同容量的Flash存储器,主要用于存储程序代码及关键配置参数。在需要保存DAC校准系数、用户自定义配置或运行状态日志时,直接操作Flash存储器是一种常见的方案。Flash存储器的擦除和编程操作受限于其物理特性,即只能按页(Page)擦除,按字(Word,32位)编程。STM32F103的Flash页大小通常为1K字节或2K字节,具体取决于型号。在执行写操作前,必须先解锁Flash控制寄存器(FLASH_CR),并在操作完成后重新锁定,以防止非法写入导致系统崩溃。

为了延长Flash寿命并提高数据可靠性,通常采用等量替换(Erase-Write)策略,即先擦除目标页,再写入新数据。由于Flash在写入前必须处于擦除状态(全1状态),因此无法像EEPROM那样直接修改单个字节。在实际应用中,建议将存储区域划分为多个扇区,并使用标志位标记有效数据。当数据更新时,将新数据写入下一个空闲扇区,并更新主扇区的索引指针。这种冗余设计可以避免因单次写入失败导致的数据丢失,同时通过校验和(Checksum)或CRC(循环冗余校验)验证数据的完整性,确保从Flash读取的配置参数准确无误。

STM32F103实战,DAC输出与内部Flash固件存储详解

系统集成测试与信号完整性验证

在软硬件联调阶段,验证DAC输出性能与Flash数据读取的正确性是关键步骤。使用高精度数字万用表测量DAC输出引脚的直流电压,对比理论计算值与实际值,计算误差率。若误差超过允许范围,需检查参考电压的稳定性及GPIO配置是否正确。对于动态信号测试,使用示波器观察输出波形,重点关注上升沿、下降沿时间及过冲现象。若波形出现严重畸变,需优化PCB布线,缩短模拟信号路径,并在电源引脚附近添加去耦电容,以抑制电源噪声对DAC转换过程的干扰。

Flash存储功能的验证需模拟掉电重启场景。在代码中写入一组测试数据至Flash指定地址,随后断电并重新上电,读取该地址数据并与原始数据比对。同时,需验证在写入过程中系统复位的情况,确保Flash控制器能正确处理中断和异常。此外,还需测试Flash读写操作对CPU执行时间的影响,避免频繁的Flash操作导致实时任务延迟。通过压力测试,连续执行多次读写操作,监测系统稳定性,确保在长期运行中数据不丢失且系统无异常复位,从而构建高可靠性的STM32F103应用系统。