AT32F403A高精度数据采集实战:TMR触发+DMA传输全解析
在工业传感器监测、环境数据记录等场景中,周期性精准采集是保证数据有效性的关键。AT32F403A系列MCU凭借其丰富的外设资源,能够实现硬件级定时触发与零CPU占用的数据传输,这正是许多物联网开发者梦寐以求的方案组合。
1. 硬件架构设计要点
1.1 外设协同工作原理
AT32F403A的TMR+ADC+DMA黄金三角组合实现了从定时触发到数据传输的完整硬件自动化:
- 定时器(TMR3):作为系统节拍器,通过TRGOUT输出精确的触发信号
- ADC模块:响应硬件触发执行模数转换,支持多通道扫描
- DMA控制器:自动搬运转换结果到内存,完全解放CPU
// 外设时钟使能示例 crm_periph_clock_enable(CRM_TMR3_PERIPH_CLOCK, TRUE); crm_periph_clock_enable(CRM_ADC1_PERIPH_CLOCK, TRUE); crm_periph_clock_enable(CRM_DMA1_PERIPH_CLOCK, TRUE);1.2 关键硬件参数配置
| 参数项 | 推荐值 | 说明 |
|---|---|---|
| ADC时钟分频 | 6分频 | 保证采样精度与速度的平衡 |
| DMA数据宽度 | 16位(HALFWORD) | 匹配ADC数据寄存器格式 |
| 内存地址对齐 | 32位对齐 | 提升DMA传输效率 |
| 触发边沿 | 上升沿触发 | 与TMR_TRGOUT输出特性匹配 |
硬件设计提示:ADC输入引脚建议配置为模拟输入模式(GPIO_MODE_ANALOG),同时关闭内部上下拉电阻以减少信号干扰。
2. 定时器精准触发配置
2.1 定时器基础参数计算
TMR3的溢出时间决定了采样频率,其计算公式为:
溢出时间 = (ARR + 1) * (PSC + 1) / TMR时钟频率以生成1秒触发信号为例(系统时钟120MHz):
// 1秒周期配置示例 tmr_base_init(TMR3, 10000-1, (120000000/10000 - 1));2.2 主模式触发输出配置
关键配置步骤:
- 设置计数方向为向上计数
- 选择主模式触发源为溢出事件
- 使能计数器但不开启中断
tmr_cnt_dir_set(TMR3, TMR_COUNT_UP); tmr_primary_mode_select(TMR3,TMR_PRIMARY_SEL_OVERFLOW); tmr_counter_enable(TMR3, TRUE); // 不使能中断3. ADC与DMA联动配置
3.1 多通道ADC序列配置
ADC需要特别关注以下参数:
- 序列模式:使能多通道扫描
- 触发选择:设置为TMR3_TRGOUT
- 采样时间:根据信号源阻抗调整
adc_base_struct.sequence_mode = TRUE; // 多通道序列 adc_ordinary_conversion_trigger_set(ADC1, ADC12_ORDINARY_TRIG_TMR3TRGOUT, TRUE); adc_ordinary_channel_set(ADC1, ADC_CHANNEL_10, 1, ADC_SAMPLETIME_239_5);3.2 DMA高效传输配置
DMA1通道1的典型配置参数:
| 参数 | 配置值 |
|---|---|
| 传输方向 | 外设→内存 |
| 内存地址递增 | 使能 |
| 循环模式 | 使能 |
| 数据宽度 | 半字(16位) |
| 外设地址固定 | &ADC1->odt |
dma_init_struct.direction = DMA_DIR_PERIPHERAL_TO_MEMORY; dma_init_struct.memory_inc_enable = TRUE; dma_init_struct.loop_mode_enable = TRUE; // 循环传输4. 实战调试技巧
4.1 常见问题排查指南
无触发信号:
- 检查TMR3时钟是否使能
- 验证主模式配置是否正确
- 用示波器观察TRGOUT输出
DMA传输异常:
- 确认内存缓冲区地址对齐
- 检查DMA通道使能顺序
- 验证外设地址是否正确
4.2 性能优化建议
- 降低ADC时钟分频:在允许范围内提高采样率
- 使用双缓冲技术:避免处理数据时的内存冲突
- 开启ADC硬件过采样:提升有效分辨率
// 硬件过采样配置示例 adc_oversample_mode_enable(ADC1, TRUE); adc_oversample_ratio_set(ADC1, ADC_OVERSAMPLE_RATIO_8);在完成上述配置后,系统将自动按照设定的时间间隔采集传感器数据,并通过DMA将结果存入指定内存区域。开发者只需定期读取内存中的转换值即可,这种方案特别适合需要长期稳定运行的监测系统。