跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
折叠
品牌标识

YunTu Forum

YTMicro.com
  1. 主页
  2. Announcements
  3. MCAL Release Notes
  4. MCAL Public Issues
  5. ADC+DMA+硬件触发+Group轮换采集结果异常问题分析

ADC+DMA+硬件触发+Group轮换采集结果异常问题分析

已定时 已固定 已锁定 已移动 MCAL Public Issues
1 帖子 1 发布者 21 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • houjun_xiaoH 离线
    houjun_xiaoH 离线
    houjun_xiao YunTu
    写于 最后由 编辑
    #1
    1. 问题描述
      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的结果缓冲区中。
    1463ffb3-bae1-45be-b5f5-81a6986cfbd3-image.png

    71613f2d-a79e-427e-8957-7fb6b967d383-image.png
    2. 问题原因分析
    据前文现象分析描述可知,Adc0_HwTrgGroup的转换结果被错误传输至Adc0_SwTrgGroup的结果缓冲区中,从而导致Adc0_HwTrgGroup结果不能正常更新。检查ADC模块中DAM TCD配置发现如下问题,在ADC DMA完成中断通知函数中, 存在调整DMA TCD的代码,该处代码是为了连续硬件触发同一Group时调整DMA TCD(回退一个主循环需要的空间)。
    31470bc9-dfaa-4771-81d3-85ec14b3af0f-image.png
    但是本Demo中,在软件Adc0_SwTrgGroup完成后,在其通知函数中即启动Adc0_HwTrgGroup转换,此时导致下图中1511行代码被执行,从而导致代码调整Adc0_HwTrgGroup的DMA TCD目的地址时将其错误调整至0x20020020(该地址为Adc0_SwTrgGroup结果缓冲区起始地址),从而导致Adc0_HwTrgGroup的转换结果被异常传输至Adc0_SwTrgGroup的缓冲区中。
    79eed87c-ec3b-41c2-9cdb-a6d45f64d1d4-image.png
    3. 问题整改
    由上述分析可知,在ADC DMA完成中断通知函数中, 仅需要对连续硬件触发同一个Group调整DMA TCD,当前转换的Group不是连续运行的Group时,即不需要调整TCD。因此可按照如下所示方式修改代码:
    76f2491d-8d91-41eb-b53e-66bc61c22366-image.png
    4. 整改验证
    修改后再次运行前文所示Demo, 软硬件触发Group采集结果均正常。
    2f8e62fd-1123-4f40-a986-327d9c630541-image.png

    1 条回复 最后回复
    0
    • EnweiE Enwei 从 MCAL Private Issues 移动了该主题

  • 云途开发生态介绍

    快速上手云途开发生态

  • 云途论坛规则/Yuntu Forum Rules

    发帖前请查看

  • YT CONFIG TOOL调查问卷

    帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...

  • demo
    19
    can
    18
    uds
    8
    lin stack
    7
    fbl
    5
    yt-link
    5
    md14
    4
    adc模块
    3
    Online Users
    • 登录

    • 登录或注册以进行搜索。
    • 第一个帖子
      最后一个帖子
    0
    • 版块
    • 最新
    • 标签
    • 热门