本篇系统梳理 小华 HC32A4A0 芯片的 ADC模块常用寄存器,讲解每个寄存器的功能、配置方式及注意事项,适合:
想要跳过 HAL 库直接访问寄存器的开发者;
想调试 ADC 异常问题(如采样不准、中断不触发);
想在 Bootloader、RTOS 或裸机场景灵活使用 ADC 的工程师。
ADC 常用寄存器总览
寄存器名称 地址偏移 功能简述
ADC_STR(采样时间配置) 0x00 每通道采样周期设置
ADC_CR0(控制寄存器0) 0x04 工作模式、触发选择
ADC_CR1(控制寄存器1) 0x08 数据对齐、转换开始等
ADC_CHSEL0/1(通道选择) 0x10/0x14 选择参与转换的通道
ADC_RESULTx(结果寄存器) 0x30~0x5C 每通道采样结果
ADC_SSTR0/1(序列采样时间) 0x20/0x24 各序列通道采样时间设置
ADC_ICLR(中断清除) 0x0C 清除 EOC/EOS 等标志位
ADC_ISR(中断状态) 0x28 判断转换是否完成
ADC_THx(上下限阈值) 0x60~0x6C 用于比较器判断/报警
常见寄存器用途详解
1.ADC_CR0:ADC 控制寄存器 0
c
复制
编辑
ADCx->CR0 =
(1 << 0) // ADEN:使能ADC模块
| (1 << 1) // CONT:连续转换模式
| (0 << 2) // ADST:软件触发
| (3 << 8); // TRGSEL:触发源选择(如定时器)
2.ADC_CR1:ADC 控制寄存器 1
c
复制
编辑
ADCx->CR1 =
(0 << 0) // ALIGN:数据对齐(0: 右对齐)
| (1 << 1); // SEQSTA:启动序列转换
3.ADC_STR:采样时间寄存器
c
复制
编辑
ADCx->STR = (0x30 << 0); // 设置采样周期,越大越稳定,推荐 ≥0x30
4.ADC_CHSEL0/1:通道选择
c
复制
编辑
ADCx->CHSEL0 = (1 << 0) | (1 << 1); // 开启通道0和通道1
5.ADC_RESULTx:转换结果寄存器
c
复制
编辑
uint16_t result = ADCx->RESULT0 & 0x0FFF; // 读取通道0的12位采样结果
6.ADC_ICLR / ADC_ISR:中断管理
c
复制
编辑
if (ADCx->ISR & (1 << 0)) { // 检查EOC标志
ADCx->ICLR = (1 << 0); // 清除EOC
}
7.ADC_SSTR0/1:每个通道的采样时间细化设置
c
复制
编辑
ADCx->SSTR0 = (0x30 << 0) | (0x30 << 8); // 通道0/1的采样时间
ADC初始化裸机模板代码(不依赖库)
c
复制
编辑
void ADC_Init_Bare(void) {
// 1. 打开ADC时钟
RCU->APB2EN |= (1 << 9); // 假设ADC挂在APB2
// 2. 配置采样时间
ADCx->STR = 0x30303030; // 简化设置所有通道采样时间为0x30
// 3. 启用通道
ADCx->CHSEL0 = (1 << 0); // 使能通道0
// 4. 设置数据对齐和触发模式
ADCx->CR1 = 0x00000000; // 右对齐,软件触发
// 5. 设置触发源、工作模式
ADCx->CR0 = (1 << 0); // 使能ADC模块
// 6. 启动转换
ADCx->CR1 |= (1 << 1); // 设置SEQSTA启动序列
}
寄存器配置调试技巧
场景 检查点
无转换结果 ADC_CR0 是否启用、通道是否使能
值为0xFFF 模拟引脚是否浮空、VREF 是否配置
EOC 不触发 中断未开、ICLR 未清零
多通道交叉干扰 采样时间过短、通道配置过密
总结建议
理解 ADC_CR0/CR1 是配置核心;
所有通道采样时间建议 ≥ 0x30;
中断/标志位需手动清除(ICLR);
多通道建议使用序列采样 + DMA;
|