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.

[参考译文] 编译器/MSP432P401R:MSP432 DMA 软件触发器仅在通道1上工作

Guru**** 2555630 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/596881/compiler-msp432p401r-msp432-dma-software-trigger-only-working-on-channel-one

器件型号:MSP432P401R

工具/软件:TI C/C++编译器

您好!

我´m MSP432 Simple Link Libary 来使用 DMA 进行缓冲区传输。 n`t 示例在通道0上工作正常、但如果我将代码更改为通道1、则会调用中断矢量 DO μ s。

只能将通道0用于软件传输吗?

工作代码:(来自示例库):

int main (空)

/*停止看门狗*/
MAP_WDT_A_HOLDTimer();

/*零填充目标*/
memset (destinationArray、0x00、1024);
isfinished= false;

/*配置 DMA 模块*/
map_dma_enableModule();
MAP_DMA_setControlBase (controlTable);

/*设置控制索引。 在本例中、我们将设置的源
* DMA 传输到我们的随机数据数组、目标传输到
*目的数据数组。 设置为自动模式、无需再触发
*在每次仲裁之后*/
MAP_DMA_setChannelControl (UDMA_PRI_SELECT、
UDMA_SIZE_8 | UDMA_SRC_INC_8 | UDMA_DST_INC_8 | UDMA_ARC_1024);
MAP_DMA_setChannelTransfer (UDMA_PRI_SELECT、UDMA_MODE_AUTO、DATA_ARRAY、
destinationArray,1024);

/*分配/启用中断*/
MAP_DMA_赋 值中断(DMA_INT1、0);
MAP_Interrupt_enableInterrupt (INT_DMA_INT1);
MAP_Interrupt_disableSlepOnIsrExit();

//启用 DMA 通道0 */
MAP_DMA_enableChannel (0);

/*强制在 DMA 通道0上进行软件传输*/
MAP_DMA_requestSoftwareTransfer (0);


while (1)

MAP_PCM_gotoLPM0InterruptSafe ();

if (已完成)
while (1);

针对 DMA 的/*完成中断*/
空 DMA_INT1_IRQHandler (空)

MAP_DMA_disableChannel (0);
isfinished= true;

不起作用的代码:

int main (空)


/*停止看门狗*/
MAP_WDT_A_HOLDTimer();

/*零填充目标*/
memset (destinationArray、0x00、1024);
isfinished= false;

/*配置 DMA 模块*/
map_dma_enableModule();
MAP_DMA_setControlBase (controlTable);

/*设置控制索引。 在本例中、我们将设置的源
* DMA 传输到我们的随机数据数组、目标传输到
*目的数据数组。 设置为自动模式、无需再触发
*在每次仲裁之后*/
MAP_DMA_setChannelControl (UDMA_PRI_SELECT、
UDMA_SIZE_8 | UDMA_SRC_INC_8 | UDMA_DST_INC_8 | UDMA_ARC_1024);
MAP_DMA_setChannelTransfer (UDMA_PRI_SELECT、UDMA_MODE_AUTO、DATA_ARRAY、
destinationArray,1024);

/*分配/启用中断*/
MAP_DMA_赋 值中断(DMA_INT1、1);
MAP_Interrupt_enableInterrupt (INT_DMA_INT1);
MAP_Interrupt_disableSlepOnIsrExit();

//启用 DMA 通道0 */
MAP_DMA_enableChannel (1);

/*强制在 DMA 通道0上进行软件传输*/
MAP_DMA_requestSoftwareTransfer (1);


while (1)

MAP_PCM_gotoLPM0InterruptSafe ();

if (已完成)
while (1);

针对 DMA 的/*完成中断*/
空 DMA_INT1_IRQHandler (空)

MAP_DMA_disableChannel (1);
isfinished= true;

 

 

此致

Steffen

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

    让我回顾一下您的代码并运行一些测试。 我将在我让它工作后尽快返回给您。

    谢谢、

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

    尊敬的 David:

    谢谢!

    工作代码片段来自 TI Simple Link 库 DMA 示例。

    Steffen

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Steffen、
    我认为您在定义信道时缺少一个附加参数。 特别是在 API setChannelControl 和 setChannel 传输中。

    channelStructIndex 参数应为通道编号的逻辑或、其中包含 UDMA_PRI_SELECT 或 UDMA_ALT_SELECT、用于选择使用主数据结构还是备用数据结构。"

    dev.ti.com/.../group__dma__api.html

    例如

    通道0将为:

    MAP_DMA_setChannelControl (DMA_CH0_RESERVED0|UDMA_PRI_SELECT、
    UDMA_SIZE_8 | UDMA_SRC_INC_8 | UDMA_DST_INC_8 | UDMA_ARC_1024);
    MAP_DMA_setChannelTransfer (DMA_CH0_RESERVED0|UDMA_PRI_SELECT、UDMA_MODE_AUTO、DATA_ARRAY、
    destinationArray,1024);

    而通道1为:

    MAP_DMA_setChannelControl (DMA_CH1_RESERVED0|UDMA_PRI_SELECT、
    UDMA_SIZE_8 | UDMA_SRC_INC_8 | UDMA_DST_INC_8 | UDMA_ARC_1024);
    MAP_DMA_setChannelTransfer (DMA_CH1_RESERVED0|UDMA_PRI_SELECT、UDMA_MODE_AUTO、DATA_ARRAY、
    destinationArray,1024);

    希望这会有所帮助。 我将要求该示例更加明确。

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

    尊敬的 Chris:

    这解决了问题。 谢谢!

    我本该`ve doxygen 注释、但您可能可以使用映射掩码 DMA_CH0_RESERVED0更新示例、以便其他用户更清楚地了解。

    另一种方法可能是通道 ->( 1 <<(ulChannel-1))的位移 ,而不  是 DMA_CHX_RESERVED0。  这可以在 DMA 缓冲区副本的函数包装程序中使用、因此只需将通道作为函数参数传递。

    此致、

    Steffen