ME05 ADC_STS标志清除时序问题与规避方案
-
1. 问题总结
1.1 核心结论
ADC 的 STS 寄存器中 EOS、SQ、SEQ 等标志位为写 1 清零。写 1 只发起清除请求,标志位需要 6 个 ADC 功能时钟(fADC) 才真正变为 0。
1.2 问题表现
若清标志与下一次启动转换的间隔不足 6 个 fADC 周期,标志尚未清除即进入下一流程,FIFO 返回的仍是上一通道的采样结果,表现为通道错位。
2. 问题机理
2.1 清除窗口为 6 个功能时钟
STS 标志的复位由 ADC 功能时钟域完成,软件写 1 与位真正翻转之间固定相差 6 个 fADC 周期。窗口期内回读 STS 仍返回 1,FIFO 也未按新一次转换刷新。两种时序的差异如下。

2.2 故障特征
该问题不带随机性,但极易被误判为通道配置错误,可按表 1 的三条特征交叉判断。

(清标志时序不足的典型表现。三条同时出现,基本可判定为时序问题。)3. 测试记录
- 一开始调试时没有在第10行加EOSEQ等待标志清零,测试发现ADC切换了通道后总是会错位;
- 之后在该处加了等待标志清零或加延时后,问题消失。
static uint16 BootCheck_ReadChannel(uint8 channel) { volatile ADC_Type *adc = ADC0; uint16 raw; adc->CHSEL[0] = channel; /* 清序列结束标志 */ adc->STS = ADC_STS_EOSEQ_MASK; /* 确认旧完成标志已清零,避免将其误判为本次转换完成。 */ while (0U != (adc->STS & ADC_STS_EOSEQ_MASK)) { } /* 启动转换 */ adc->CTRL |= ADC_CTRL_ADSTART_MASK; /* 等待序列转换完成 */ while (0U == (adc->STS & ADC_STS_EOSEQ_MASK)) { /* 等待转换完成 */ } raw = (uint16)(adc->FIFO & ADC_FIFO_DATA_MASK); return raw; }
-
X xianghan 从 Blogs 移动了该主题
快速上手云途开发生态
发帖前请查看
帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...