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.

[参考译文] MSPM0G3507:DMA 写入 GPIO 故障

Guru**** 2826685 points

Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1603835/mspm0g3507-dma-write-gpio-failure

器件型号: MSPM0G3507
主题: SysConfig 中讨论的其他器件

您好:

当我尝试通过 DMA 写入 GPIO 时、在正式初始化 sysconfig_weak void SYSCFG_DL_DMA_init () 后、我还可以:

  DL_GPIO_enableDMAAccess (GPIOA、DL_GPIO_PIN_3);    
  DL_DMA_setSrcAddr (DMA、DMA_CH0_CHAN_ID、(uint32_t)&gPA3_CLR);
  DL_DMA_setDestAddr (DMA、DMA_CH0_CHAN_ID、(uint32_t)&GPIOA->DOUTCLR31_0);

高级中已确认 DMA0 可正常进行数据传输、将 DMA0/Dest src 地址替换为预设的固定地址。 固定地址 至少发生了 DMA 触发并且静态 src 数据 (0x12345678) 已成功传输到 DEST(要检查的打印输出)、只是不确定 DMA 的“repeat single“设置是否正确或不会导致用于验证数据传输的静态数据、也许它仅传输一次。  如果我使用填充数据扩展模式或块到块模式、或者还有其他遗漏选项、请提供帮助。

谢谢

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

    据我所知、DMA 只能写入 DOUT31_0、而无法从任何 GPIO 寄存器中进行读取。 TRM (SLAU846C) 显示“GPIO 外设允许对 DOUT31_0 寄存器进行 DMA 写入访问。“ 论坛上的其他人指出、这正意味着这一点。

    另请参阅:  MSPM0L1306:DMA GPIO 输入源地址错误 

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

    这个答案毫无帮助。

    在提出问题之前、我们对 E2E 中提到和未提及 DMA 线程的 TRM 进行了审查。

    、软件可以在 DMA 代码片段运行之前正确写入 PA3 高电平/低电平“没有说 GPIO 已读取“。

    还有人能帮忙吗? 这个一般问题。 谢谢。

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

    您好、

    如果您只是想使用 DMA 将 32 位数据传输到另一个位置、则使用 Fixed 实现信号模式。 添加至固定。 ADD 就足够了、因为它只会执行一次传输。 这取决于您的具体需求。

    回到使用 DMA 的 GPIO、正如 Bruce 提到的、DMA 只能写入、不允许“Read"(“(读取(读取)、DMA 访问 GPIO、这在 E2E Bruce Shared 中进行了介绍。

    Zoey。

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

    TRM 中说您可以写入 DOUT31_0 [Ref TRM (SLAU846C) 第 9.2.5 节]。 您发布的代码正在写入 DOUTCLR31_0。

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

    是的、尝试了不同的寻址模式、得到了相同的结果。  

    此致

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

    如果考虑更多因素、您可能知道使用 DOUT31_0 寄存器通过 DMA 传输“清除一个引脚“的不可行的方法、按位运算只能通过代码行实现、不是吗?  这就是为什么此处代码要用在 DOUTCLR31_0 上。

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

    您可以使用 DMA 控制 GPIO、但无法通过 DMA 读取 GPIO 状态。 希望这澄清了一些事情。  

    对于单个引脚、无法传输单个位。 因此、为了控制单个引脚、您可以使用 DMA 写入 32 位数据、但连续传输之间的数据会有所不同。

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

    DMAMASK 在这里为您提供帮助--由于您只启用了一个位 (PIN3) 以使用 DMA 写入、因此只需将&ALLEZERS (=0x00000000) 写入 DOUT31_0、就可以清除这一位。

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

    好的、它有效。 奇怪的是、传输到 DOUTCLR31_0 的 DMAMASK gPA3_CLR = 0x8 无法 正常工作。

    谢谢。

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

    这是因为没有到 DOUTCLR31_0 的 DMA 路径。 TRM 说(虽然措辞有点神秘)和它已经被观察(没有)发生。 [我昨晚回去向自己演示,以确保没有任何变化。]