今天继续鼓捣 HC32A4A0 的 ADC,原本只想采个电压,结果被坑得一塌糊涂……来,记一记,给后来人避避雷。
1.ADC没开时钟,折腾半小时
一开始初始化 ADC 死活没反应,结果是忘了开时钟:
c
复制
编辑
PWC_Fcg0PeriphClockCmd(PWC_FCG0_ADC, Enable);
不加这句,后面配置通通白搭……我调了半天寄存器,全是无效操作,血压上来了。
2.通道不使能,结果***是0
加了时钟后,数据还是全是 0,甚至是 0xFFF。后来才发现:
c
复制
编辑
ADC_ChCmd(M4_ADC1, ADC_CH0, Enable);
原来通道还要单独 enable,这不说真的不注意……
3.采样时间太短,电压值跳来跳去
测个高阻电压源,值总是不稳定,跳得离谱。最后把采样时间从默认改成:
c
复制
编辑
stcChCfg.u8SamplingTime = 0x30;
世界终于安静了……记住,时间太短,ADC还没准备好你就叫它干活,结果只能乱搞。
4.中断不进,差点以为芯片坏了
进不了 ADC 中断,以为 NVIC 配置错了。实际上只是没清前一次的标志位:
c
复制
编辑
ADC_ClearIrqFlag(M4_ADC1, ADC_FLAG_EOSEQ);
小华 ADC 的中断标志是手动清除的,不像别的一触发就自动重置,记牢!
触发源用错,定时器白配置了
我用 TIM1 想做定时触发,但 ADC 一动不动。后来才注意:
c
复制
编辑
ADC_SetTriggerSrc(M4_ADC1, ADC_TRIG_SRC_TIM1_TRGO);
触发源要和定时器一一对应,否则你触发了半天 ADC压根不理你……
记住通道顺序和 DMA 缓冲区顺序必须一致;
配置的采样数量必须等于通道数量;
启动前 DMA 要 clear flags。
一环错,全盘错。
ADC 不难,但它很“细”。时钟、通道、对齐、采样时间、触发源,每一步都能藏坑。
|