查看: 4993|回复: 6

[讨论] 发于 PDB 同时触发2路DMA通道的设想 可不可行?

[复制链接]
  • TA的每日心情
    郁闷
    2021-9-6 10:31
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    8

    主题

    57

    帖子

    0

    注册会员

    Rank: 2

    积分
    128
    最后登录
    2021-10-9
    发表于 2016-9-13 12:03:56 | 显示全部楼层 |阅读模式
    发于 PDB 同时触发2路DMA通道的设想 可不可行?
    我目前用PDB 触发DMA通道,再由DMA去处理其它事务(比如在DMA里面切换ADC通道):

        //PDB初始化,并开启DMA功能
        SIM_SCGC6 |= SIM_SCGC6_PDB_MASK;

        PDB_SC_REG(PDB0_BASE_PTR) |= PDB_SC_PDBEN_MASK ;
        PDB_SC_REG(PDB0_BASE_PTR) |= PDB_SC_TRGSEL(0xf) | PDB_SC_CONT_MASK;
        PDB_MOD_REG(PDB0_BASE_PTR) = BSP_BUS_CLOCK / 50 / ADC_SAMPLE_FREQ;
        PDB_IDLY_REG(PDB0_BASE_PTR) = 0;
        PDB_SC_REG(PDB0_BASE_PTR) |= PDB_SC_LDOK_MASK;
        PDB_SC_REG(PDB0_BASE_PTR) |= PDB_SC_DMAEN_MASK;
        PDB_SC_REG(PDB0_BASE_PTR) |= PDB_SC_SWTRIG_MASK;


    //////////////////////////////////以下是DMA 2个通道的初始化//////////////////////////////////////////
    以下代码采用了 DMA通道0 和DMA通道1 而触发源都同时使用DMAMUX_SRC_CHANNEL_PDB
    这样用的设想行不行?PDB触发DMA,DMA是是靠PDBIF标志位的吗?是什么时候清零?

        DMA_StructInit(&ux_Dma_Parameter);
        ux_Dma_Parameter.xDmaSrcChannel = DMAMUX_SRC_CHANNEL_PDB;
        ux_Dma_Parameter.u32SourceAddress = (uint32_t)&(u32_p_adc1_channel_table[0]);
        ux_Dma_Parameter.u32DestinationAddress = (uint32_t)&(ADC1_SC1A);
        ux_Dma_Parameter.u16SourceNextValueOffset = sizeof(uint32_t);
        ux_Dma_Parameter.u16DestinationNextValueOffset = 0;
        ux_Dma_Parameter.u8SourceAddressModulo = 0;
        ux_Dma_Parameter.u8DestinationAddressModulo = 0;
        ux_Dma_Parameter.xSourceDataSize = DMA_TRANSFER_SIZE_32_BIT;
        ux_Dma_Parameter.xDestinationDataSize = DMA_TRANSFER_SIZE_32_BIT;
        ux_Dma_Parameter.u32ByteTransferCount = sizeof(uint32_t);
        ux_Dma_Parameter.u32LastSourceAddressAdjustment = -(ADC1_TABLE_LEN * ux_Dma_Parameter.u16SourceNextValueOffset);
        ux_Dma_Parameter.u32LastDestinationAddressAdjustment = 0;
        ux_Dma_Parameter.u16BufferSize = ADC1_TABLE_LEN;
        DMA_Init(DMA_CHANNEL_0, DMAMUX, &ux_Dma_Parameter);
        DMA_Cmd(DMA_CHANNEL_0, DMAMUX, ENABLE);

        DMA_StructInit(&ux_Dma_Parameter);
        ux_Dma_Parameter.xDmaSrcChannel = DMAMUX_SRC_CHANNEL_PDB;
        ux_Dma_Parameter.u32SourceAddress = (uint32_t)&(u32_p_adc0_channel_table[0]);
        ux_Dma_Parameter.u32DestinationAddress = (uint32_t)&(ADC0_SC1A);
        ux_Dma_Parameter.u16SourceNextValueOffset = sizeof(uint32_t);
        ux_Dma_Parameter.u16DestinationNextValueOffset = 0;
        ux_Dma_Parameter.u8SourceAddressModulo = 0;
        ux_Dma_Parameter.u8DestinationAddressModulo = 0;
        ux_Dma_Parameter.xSourceDataSize = DMA_TRANSFER_SIZE_32_BIT;
        ux_Dma_Parameter.xDestinationDataSize = DMA_TRANSFER_SIZE_32_BIT;
        ux_Dma_Parameter.u32ByteTransferCount = sizeof(uint32_t);
        ux_Dma_Parameter.u32LastSourceAddressAdjustment = -(ADC0_TABLE_LEN * ux_Dma_Parameter.u16SourceNextValueOffset);
        ux_Dma_Parameter.u32LastDestinationAddressAdjustment = 0;
        ux_Dma_Parameter.u16BufferSize = ADC0_TABLE_LEN;
        DMA_Init(DMA_CHANNEL_1 DMAMUX, &ux_Dma_Parameter);
        DMA_Cmd(DMA_CHANNEL_1, DMAMUX, ENABLE);
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

        ////////////////////////////////////////////////使能DMA
        DMA_EnableRequest(DMAMUX, DMA_CHANNEL_0);
        DMA_EnableRequest(DMAMUX, DMA_CHANNEL_1);



    /////////////////////////////经果:这个设想我在硬件上测试过,结果貌似是可以,我的多路ADC采样的结果 都正常

    ////////////疑问:这样子操作 可靠吗












    郁闷的一个上午
    回复

    使用道具 举报

    该用户从未签到

    715

    主题

    6374

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    25133
    最后登录
    2025-8-8
    发表于 2016-9-13 15:45:00 | 显示全部楼层
    请问楼主使用的是什么芯片?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    2021-9-6 10:31
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    8

    主题

    57

    帖子

    0

    注册会员

    Rank: 2

    积分
    128
    最后登录
    2021-10-9
     楼主| 发表于 2016-9-17 09:04:09 | 显示全部楼层
    小恩GG 发表于 2016-9-13 15:45
    请问楼主使用的是什么芯片?

    你好!我用的芯片是MK64FN1M0VLQ12,中秋节 这几天 回老家了 ,不好意思! 谢谢!
    郁闷的一个上午
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    715

    主题

    6374

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    25133
    最后登录
    2025-8-8
    发表于 2016-9-20 09:11:25 | 显示全部楼层
    DMA任务完成后,PDBIF标志位会自动清除的,你的想法是可以实现的。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    2021-9-6 10:31
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    8

    主题

    57

    帖子

    0

    注册会员

    Rank: 2

    积分
    128
    最后登录
    2021-10-9
     楼主| 发表于 2016-9-20 18:06:34 | 显示全部楼层
    小恩GG 发表于 2016-9-20 09:11
    DMA任务完成后,PDBIF标志位会自动清除的,你的想法是可以实现的。

    但是 ,现在是一个PDB ,同时触发2路DMA通道,2路DMA通道都可以同时能响应PDB事件吗?
    我的意思是 会不会一路DMA响应了PDB事件之后 PDBIF 自动清零了 ,然后另外一路DMA通道得不到PDB事件?
    但是 我在实际的硬件上 做了一个简单的测试,感觉结果 是可行的。就是想从理论上面 再确认。
    郁闷的一个上午
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    715

    主题

    6374

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    25133
    最后登录
    2025-8-8
    发表于 2016-9-21 09:52:49 | 显示全部楼层
    gdgn526345 发表于 2016-9-20 18:06
    但是 ,现在是一个PDB ,同时触发2路DMA通道,2路DMA通道都可以同时能响应PDB事件吗?
    我的意思是 会不会 ...

    DMA是有DMA Channel优先级管理功能的,你可以通过查询DMA_TCD_CSR[DONE]或者设置DMA完成中断判断哪个Channel先完成并确认是否符合DMA Channel优先级管理原则
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    2021-9-6 10:31
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    8

    主题

    57

    帖子

    0

    注册会员

    Rank: 2

    积分
    128
    最后登录
    2021-10-9
     楼主| 发表于 2016-9-21 23:08:25 | 显示全部楼层
    嗯 嗯 ,现在在外面出差 回去看看 谢谢!
    郁闷的一个上午
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-8-10 14:55 , Processed in 0.120127 second(s), 25 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表