ADC+DMA+硬件触发+Group轮换采集结果异常问题分析
-
- 问题描述
ADC模块配置为:DMA传输数据结果,Group数量超过1且至少一个Group采用硬件触发,且Group轮换转换时,ADC硬件触发Group的采集结果异常。
如Demo所示,ADC0配置为DMA传输模式,Adc0_HwTrgGroup采用MPWM硬件触发,Adc0_SwTrgGroup软件触发模式。两个Group轮换采集,在main函数中启动两个Group后,在Adc0_SwTrgGroup的通知函数中disable 硬件Group(交由Adc0_SwTrgGroup转换),然后再软件Group的通知函数中启动硬件Group转换。
Adc_PwmTrig_Demo.zip
void Adc0_HwTrgGroupNotification(void) { Adc0_HwTrigGroupConCompCnt++; if(Adc_GetGroupStatus(AdcConf_AdcConfigSet_Adc0_HwTrgGroup)==ADC_STREAM_COMPLETED) { Adc_ReadGroup(AdcConf_AdcConfigSet_Adc0_HwTrgGroup, Adc0_HwTrigGroupRseultPhys); for(uint8 LoopCnt = 0; LoopCnt<Adc0_HwTrgGroup_CHANNEL_NUMBER; LoopCnt++) { Adc0_HwTrigGroupRseultPhys[LoopCnt] = (uint32)Adc0_HwTrigGroupRseultPhys[LoopCnt]*5000/4095; } Adc_DisableHardwareTrigger(AdcConf_AdcConfigSet_Adc0_HwTrgGroup); } } void Adc0_SwTrgGroupNotification(void) { Adc_EnableHardwareTrigger(AdcConf_AdcConfigSet_Adc0_HwTrgGroup); Adc0_SwTrigGroupConCompCnt++; if(ADC_STREAM_COMPLETED==Adc_GetGroupStatus(AdcConf_AdcConfigSet_Adc0_SwTrgGroup)) { Adc_ReadGroup(AdcConf_AdcConfigSet_Adc0_SwTrgGroup, Adc0_SwTrigGroupRseultPhys); uint8 i = 0; for(i = 0; i<Adc0_SwTrgGroup_CHANNEL_NUMBER; i++) { Adc0_SwTrigGroupRseultPhys[i] = (uint32)Adc0_SwTrigGroupRseultPhys[i]*5000/4095; } Adc_DataCheckEnable = TRUE; } }
查看转换结果发现,硬件通道组转换结果Adc0_HwTrigGroupRseultPhys完成一次数据更新后即不再发生变化。查看转换结果原始数据以及转换完成后DMA寄存器状态,发现在完成Adc0_HwTrgGroup转换后,DMA目的地址为0x20020030该地址为Adc0_HwTrgGroup数据区起始地址,此时目的地址应为缓冲区结束地址(0x20020040)。同时RAM存储器中Adc0_SwTrgGroup转换结果存储区数据被异常更新,且其值与Adc0_HwTrgGroup的输入值相符。即Adc0_HwTrgGroup的转换结果被异常传输至Adc0_SwTrgGroup的结果缓冲区中。
2. 问题原因分析
据前文现象分析描述可知,Adc0_HwTrgGroup的转换结果被错误传输至Adc0_SwTrgGroup的结果缓冲区中,从而导致Adc0_HwTrgGroup结果不能正常更新。检查ADC模块中DAM TCD配置发现如下问题,在ADC DMA完成中断通知函数中, 存在调整DMA TCD的代码,该处代码是为了连续硬件触发同一Group时调整DMA TCD(回退一个主循环需要的空间)。
但是本Demo中,在软件Adc0_SwTrgGroup完成后,在其通知函数中即启动Adc0_HwTrgGroup转换,此时导致下图中1511行代码被执行,从而导致代码调整Adc0_HwTrgGroup的DMA TCD目的地址时将其错误调整至0x20020020(该地址为Adc0_SwTrgGroup结果缓冲区起始地址),从而导致Adc0_HwTrgGroup的转换结果被异常传输至Adc0_SwTrgGroup的缓冲区中。
3. 问题整改
由上述分析可知,在ADC DMA完成中断通知函数中, 仅需要对连续硬件触发同一个Group调整DMA TCD,当前转换的Group不是连续运行的Group时,即不需要调整TCD。因此可按照如下所示方式修改代码:
4. 整改验证
修改后再次运行前文所示Demo, 软硬件触发Group采集结果均正常。
- 问题描述
-
E Enwei 从 MCAL Private Issues 移动了该主题
快速上手云途开发生态
发帖前请查看
帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...