1. AC7801 ADC与DMA技术背景解析
第一次接触杰发科技AC7801的ADC模块时,我对着数据手册发了半小时呆——这满屏的寄存器描述和时序图,简直像在看天书。后来才发现,只要抓住规则组单寄存器这个核心痛点,配合DMA这个"搬运工",就能轻松实现多通道数据采集。AC7801的ADC是12位逐次逼近型模数转换器,最高支持1Msps采样率,内置14路通道(12外+2内)。但最特别的是它的规则组数据寄存器设计:无论配置多少个规则组通道,转换结果都挤在同一个ADC_RDR寄存器里。这就好比超市收银台只有一个购物篮,顾客(数据)来得太快就会把前一位的商品挤掉。
实际项目中遇到过这样的场景:需要同时监测电机控制板的3路模拟信号(电流、电压、温度)。如果不用DMA,就得在每次转换完成后立即读取ADC_RDR,稍有延迟就会丢数据。更麻烦的是,ADC转换完成中断本身也有响应延迟,在72MHz主频下实测中断响应时间约1.2μs,对于高速采样根本来不及。这时候DMA的优势就凸显出来了——它就像个不知疲倦的搬运工,只要ADC转换完成触发DMA请求,就能在零CPU干预的情况下把数据搬到指定内存区域。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 软件触发+DMA的黄金组合配置
2.1 ADC初始化关键步骤
配置ADC模块时,最容易踩坑的就是模式选择。以我的血泪史为例:第一次尝试时把scanModeEn和continousModeEn都设为ENABLE,结果DMA收到的全是乱码。后来才明白,连续模式会让ADC不停转换,而我们需要的是软件触发单次扫描。正确的配置应该像这样:
c复制ADC_ConfigType adcConfig = {
.clkPsc = ADC_CLK_PRESCALER_1, // ADC时钟=APB时钟/1=24MHz
.scanModeEn = ENABLE, // 启用扫描模式
.continousModeEn = DISABLE, // 禁用连续转换
.regularTriggerMode = ADC_TRIGGER_INTERNAL, // 内部触发
.regularSequenceLength = 3,
