This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RM57L843:DMA 寄存器问题

Guru**** 2481465 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/691153/rm57l843-dma-register-issue

器件型号:RM57L843

您好!  

在 dmaReqAssign 方法中写入 DREQASI DMA 寄存器时、我会观察到异常行为。


以下操作码可产生正确的行为:

e3a0003f MOV R0、63
e1a01103 MOV R1、R3、LSL 2.
e1a05210 MOV R5、R0、LSL R2
e5110LDR 接口 R0、[R1、-0xFAD]
e1c00005 BIC R0、R0、R5
e5010STR STR R0、[R1、-0xFAD]
e1a01103 MOV R1、R3、LSL 2.
e5110LDR 接口 R0、[R1、-0xFAD]
e1800214 ORR R0、R0、R4 ,LSL R2
e5010STR STR R0、[R1、-0xFAD]

以下操作码会使 DMA 停止:

e1a00103 MOV R0、R3、LSL 2.
e5100LDR R0、[R0、-0x]接口
e3a0503f MOV R5、63
e1a05215 MOV R5、R5、LSL R2
e1c01005 BIC R1、R0、R5
e1a00103 MOV R0、R3、LSL 2.
e5001STR STr 的接口 R1、[R0、-0xFAD]
e1a00103 MOV R0、R3、LSL 2.
e5100LDR R0、[R0、-0x]接口
e1a05214 MOV R5、R4 ,LSL R2
e1851000 ORR R1、R5、R0
e1a00103 MOV R0、R3、LSL 2.
e5001STR STr 的接口 R1、[R0、-0xFAD]

这两组运算代码都将 DREQASI 寄存器保持相同的结束状态:  

0x1e1f0203

 但是、一个会导致 DMA 停止运行、另一个不会。

访问 DREQASI 寄存器是否有什么特别之处? 这种行为非常令人不安。

谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Dmitri、

    您是否使用汇编代码来配置 DMA? 您是否使用 c 代码尝试使用示例代码?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    该代码最初是用 C 语言编写的、为了清晰起见、我只是发布了拆分代码。

    代码如下所示:

    不工作:

    write_register32 (&dmaREG->DREQASI[i]、read_register32 (&dmaREG->DREQASI[i])和~((uint32_t) 0x3FU <<j));
     e1a00103 MOV R0、R3、LSL 2.
     e5100LDR R0、[R0、-0x]接口
     e3a0503f MOV R5、63
     e1a05215 MOV R5、R5、LSL R2
     e1c01005 BIC R1、R0、R5
     e1a00103 MOV R0、R3、LSL 2.
     e5001STR STr 的接口 R1、[R0、-0xFAD]
    write_register32 (&dmaREG->DREQASI[i]、read_register32 (&dmaREG->DREQASI[i])|((uint32_t) reqline << j));
     e1a00103 MOV R0、R3、LSL 2.
     e5100LDR R0、[R0、-0x]接口
     e1a0521c MOV R5、IP ,LSL R2
     e1851000 ORR R1、R5、R0
     e1a00103 MOV R0、R3、LSL 2.
     e5001STR STr 的接口 R1、[R0、-0xFAD]

    工作:

    dmaREG->DREQASI[i]&=~((uint32_t) 0x3FU <<j);
     e3a0003f MOV R0、63
     e1a01103 MOV R1、R3、LSL 2.
     e1a05210 MOV R5、R0、LSL R2
     e5110LDR 接口 R0、[R1、-0xFAD]
     e1c00005 BIC R0、R0、R5
     e5010STR STR R0、[R1、-0xFAD]
    dmaREG->DREQASI[i]|=((uint32_t) reqline << j);
     e1a01103 MOV R1、R3、LSL 2.
     e5110LDR 接口 R0、[R1、-0xFAD]
     e180021c ORR R0、R0、IP ,LSL R2
     e5010STR STR R0、[R1、-0xFAD]

    读取和写入寄存器是辅助器方法:

    /**
    *@简要写入一个32位寄存器
    *
    内联 void write_register32 (volatile uint32_t * target、const uint32_t value)

    *目标=值;


    /**
    *@简要读取一个32位寄存器
    *
    内联 uint32_t read_register32 (volatile uint32_t *目标)

    返回*目标;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Dmitri、

    我在 RM57 launchpad 上使用您的函数进行了测试、我没有发现任何问题:

    uint32_t i、j、reqline=10、channel=6;

    I =通道/4U; /*找到要配置的寄存器*/
    J =通道% 4U; /*找到偏移量 *
    J =(uint8) 3U - j; /*反转字节顺序 *
    J = j * 8U; /*查找位位置 *

    dmaREG->DREQASI[i]&=~((uint32_t) 0x3FU <<j);
    dmaREG->DREQASI[i]|=((uint32_t) reqline << j);

    write_register32 (&dmaREG->DREQASI[i]、read_register32 (&dmaREG->DREQASI[i])和~((uint32_t) 0x3FU <<j));
    write_register32 (&dmaREG->DREQASI[i]、read_register32 (&dmaREG->DREQASI[i])|((uint32_t) reqline << j));
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这可能是编译器问题、我不会将 TI ARM 编译器用于目标。

    谢谢!