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.

[参考译文] TM4C129ENCPDT:添加定义以展开 μ µDMA 通道分配

Guru**** 2464780 points
Other Parts Discussed in Thread: EK-TM4C129EXL, TM4C129ENCPDT

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/661534/tm4c129encpdt-adding-definitions-to-expand-dma-channel-assignments

器件型号:TM4C129ENCPDT
主题中讨论的其他器件:EK-TM4C129EXL

我们正在尝试对 UART 6和7执行 UDMA。

我们采用了示例程序 C:\ti\TivaWare_C_Series-2.1.4.178\examples\boards\ek-tm4c129exl\UDMA_demo\UDMA_demo.c、并将其修改为使用 UART 6和7。

但它不会编译、因为 UDMA_CHANGE_UART6RX 和 UDMA_CHANGE_UART6TX 不存在。 UART7也是如此。

driverlib/udma.h 为 UART 提供以下 uDMA 通道定义:

#define UDMA_CHANGE_UART0RX 8
#define UDMA_CHANGE_UART0TX 9
#define UDMA_CHANGE_UART1RX 22
#define UDMA_CHANGE_UART1TX 23

为什么只有 UART 0和1定义、而不是其他 UART 定义? 数据表显示了 UDMA 可访问的所有 UART、勘误表未指明其他情况。

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

    有31个 uDMA 通道、但每个通道可以有九个"外设"分配中的一个。 为了支持传统软件、使用 uDMA 通道的"外设0"的外设只需按照上面显示的定义进行寻址。 UART6和 UART7使用"外设2"。 要在这些外设上使用 uDMA,必须调用 uDMAChannelAssign()。 例如:

    uDMAChannelAssign (UDMA_CH10_UART6RX); 

    但我没有真正回答你的问题。 我只能猜测为何不包括这样的定义:

    #define UDMA_CHANGE_UART6RX 10. 

    我怀疑这样做不会突出表明、如果不首先将通道10分配给 UART6RX、就无法正确使用该通道定义。 您当然可以将此类定义添加到代码中以提高可读性。

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

    Bob、

    您在这里的帖子肯定会证明对他人有价值-寻求这样(特殊)µDMA 的见解。    申请海报是熟练的-他/她-或我的小技术公司的任何人-都没有这种知识。

    至    "µDMA、易用和增强"-您的建议的所有未来"搜索和查找"- 更具描述性的 "论坛标签"是否有用?

    "自动连接"所指定的"标签"、 "仅一个 MCU 器件型号" 、 证明"太大限制" (许多/大多数 TM4C 可能采用您的方法)、难道它们不能吗?)  更重要   的是-"仅限器件型号标签"提供了"无/零"对帖子中心意图的深思熟虑的描述"。    (因此、很可能会对一些无电 TI 造成不必要的时间/精力 "标签组织者"和/或他/她的"机器人")

     在这种 µDMA 情况下、"添加定义以扩展 μ m 通道分配"可能  会为论坛用户提供更好的服务?

    请注意、(部分)这里 (部分)(朋友 Robert 和我、部分其他人) 经常努力创建"更有意义的帖子标签"、以便(甚至是帖子作者)增加 "发现此类帖子-降低..."的可能性   (在他们从"首页"""传递"之后很久-就会漂移到论坛中...)

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

    让记录显示、该主题的"标题"已更改为更好地反映该主题的内容。    此外-至少(上述帖子)使用正确描述的"Tag"、而 不是"MCU 器件型号-单独"-这不适当地限制了线程的主题/主要内容并提供了很少(即没有)的见解...

    感谢供应商的 Bob (可能是可疑的)或无名的其他人-接受针对的建议-为 "许多人"谋福利。

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

    事实上、您不需要添加定义。 它们已经存在、但并不明显。

    这些定义:

    //
    //
    //要传递给需要通道编号
    // ID 的 API 函数的通道编号。 这些用于辅助外设分配。
    ////
    *****************
    #define UDMA_SEC_CHANGE_UART2RX_0 \
    0
    #define UDMA_SEC_CHANGE_UART2TX_1 \
    1
    #define UDMA_SEC_CHANGE_TMR3A 2
    #define UDMA_SEC_CHANGE_TMR3B 3
    #define UDMA_SEC_CHANGE_TMR2A_4 \
    4
    #define UDMA_SEC_CHANGE_TMR2B_5 \
    5
    #define UDMA_SEC_CHANGE_TMR2A_6 \
    6
    #define UDMA_SEC_CHANGE_TMR2B_7 \
    7
    #define UDMA_SEC_CHANGE_UART1RX \
    8
    #define UDMA_SEC_CHANGE_UART1TX \
    9
    #define UDMA_SEC_CHANGE_SSI1RX 10
    #define UDMA_SEC_CHANGE_SSI1TX 11
    #define UDMA_SEC_CHANGE_UART2RX_12 \
    12
    #define UDMA_SEC_CHANGE_UART2TX_13 \
    13
    #define UDMA_SEC_CHANGE_TMR2A_14 \
    14
    #define UDMA_SEC_CHANGE_TMR2B_15 \
    15
    #define UDMA_SEC_CHANGE_TMR1A 18
    #define UDMA_SEC_CHANGE_TMR1B 19
    #define UDMA_SEC_CHANGE_EPI0RX 20
    #define UDMA_SEC_CHANGE_EPI0TX 21
    #define UDMA_SEC_CHANGE_ADC10 24
    #define UDMA_SEC_CHANGE_ADC11 25
    #define UDMA_SEC_SEC_SEC_ADC26 #define UDMA_CHANGEL_ADC26 #define UDMA_SEC_ADC26
    
    30
    

    向后兼容性。 下面是如下定义:

    //
    //
    //可以传递给 uDMAChannelAssign()以选择外设
    //每个通道的映射的值。 被命名为 RESERVED 的通道可被分配
    //到未来器件中的一个外设。
    ////
    *****************
    //
    //通道0
    //
    #define UDMA_CH0_USB0EP1RX 0x00000000
    #define UDMA_CH0_UART2RX 0x00010000
    #define UDMA_CH0_RESERVED2 0x00020000
    #define UDMA_CH0_TIMER4A 0x00030000
    #define UDMA_CH0_RESERVED4 0x00040000
    #define UDMA_CH0_RESERVED5 0x00050000
    #define UDMA_CH0_I2C0RX 0x00060000
    #define UDMA_CH0_RESERVED7 0x00070000
    #define UDMA_CH0_RESERVED8 0x00080000
    
    //
    //通道1
    //
    #define UDMA_CH1_USB0EP1TX 0x00000001
    #define UDMA_CH1_UART2TX 0x00010001
    #define UDMA_CH1_RESERVED2 0x00020001
    #define UDMA_CH1_TIMER4B 0x00030001
    #define UDMA_CH1_RESERVED4 0x00040001
    #define UDMA_CH1_RESERVED5 0x00050001
    #define UDMA_CH1_I2C0TX 0x00060001
    #define UDMA_CH1_RESERVED7 0x0007701
    #define UDMA_CH1_RESERVED8 0x00080001
    
    //
    //通道2
    //
    

    通过通道31进行此类操作。

    这些定义中嵌入了"row"和"column"两种定义,可以传递到各种 UDMA API,但 在使用这些定义时,需要先进行额外的 uDMAChannelAssign()调用。

    每个 API 都包含如下代码:

    //
    //如果通道选择器宏(如 UDMA_CH0_USB0EP1RX)是
    //作为 ui32ChannelNum 参数传递,仅提取通道编号
    //来自此参数。
    //
    ui32ChannelNum &= 0x1f;
    

    将该单个定义拆分为行和列组件。 (说到 TM4C129ENCPDT 器件数据表中表9-1的行和列。)

    因此、无需再添加任何定义。 但是、如果文档能够更明确地说明上述内容、那将是一件很好的事情。

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

    感谢12点12分、

    这是一个很好的建议。 我在 TivaWare 库源代码中看到通道编号的高位被清零、从而允许使用 uDMAChannelAssign 定义。

    ui32ChannelNum &= 0x1f;