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:有关 DMA 和低功耗模式的问题

Guru**** 2553450 points
Other Parts Discussed in Thread: CC1200

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/597983/msp432p401r-question-about-dma-and-low-power-modes

器件型号:MSP432P401R
主题中讨论的其他器件:CC1200

我已经阅读了该手册、我已经看到 DMA 在 LP3/4中不起作用、但仍然需要提出一些问题。

我将 MSP432通过 EUSCIB0连接到具有用于接收字节的 FIFO 的芯片 CC1200。  
您可以通过降低芯片选择、然后发送命令指示 CC1200从 FIFO 中突发读取、从而从 FIFO 中读取数据。 传输完成后、我将芯片选择向上拉。

现在、我需要作为对某些中断的反应来执行所有这些活动。 当我需要从 CC1200读取数据时、我会得到一个 GPIO 中断、该中断会准备并启动 DMA、然后从 CC1200读取数据、最后、当传输完成时、我会收到一个中断。

直到我进入低功耗模式3或4、一切都很好。 在工作模式和低功耗模式0中、一切都正常、但在低功耗模式3和4中、会发生一个奇怪的情况。

例如、我发送此数据包"12345"。 当我使用 lp0时、我接收 的一切都正常、但在 LP3和 LP4中、我接收到"22345"。  
无论数据包大小如何或我发送了什么数据、发送的第二个字节始终在第一个和第二个位置复制。 问题始终相同。  

现在、在经过如此多的解释之后、我需要问、当我的 DMA 在手册中声明外设在这些模式下不工作时、为什么它甚至在 LP3和 LP4中工作?
当我的 DMA 中断在手册中指出不可能实现时、为什么将 MCU 唤醒?
我不理解手册、还是 DMA 的功能在这些模式下未定义、这就是为什么它说不在这些模式下工作的原因?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    您能否提供有关 GPIO 中断以及系统如何从 GPIO 中断转换到 DMA 操作的更多详细信息? GPIO 中断将器件从 LPM3唤醒。 现在、根据您是否启用了休眠中断或粗鲁模式、在 GPIO ISR 中启动 DMA 时可能会发生许多事情、但当 ISR 退出时、器件会尝试返回低功耗模式3。 我建议在 GPIO ISR 内清除深度睡眠位、以便在 ISR 退出时返回 LPM0而不是 LPM3。 然后、您可以在 DMA 完成后返回到 LPM3。

    /*
    *禁用 DeepSleep、lpm3->lpm0
    *
    SCB->SCR &=~(SCB_SCR_SLEEPDEEP_MSK);
    /*

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

    尊敬的 Chris:

    我将提供我在中断中使用的代码。 在该代码中、我不对睡眠状态执行任何操作、我只是退出中断、这意味着 MCU 返回到 LP3或 LP4。

    请您回答我提出的问题、 因为问题的解决方案只是退出深度睡眠、我知道这一点、但为什么 DMA 在 LP3和 LP4中甚至可以正常工作、以及为什么在文档说明时 DMA 中断会将 LP3和 LP4中的 MCU 唤醒 它无法做到这一点?

    void Port1_IRQHandler (void)
    {
    uint32_t status;
    
    STATUS = MAP_GPIO_getEnabledInterruptStatus (GPIO_PORT_P1);
    MAP_GPIO_clearInterruptFlag (GPIO_PORT_P1、状态);
    
    IF (STATUS & GPIO_PIN2)
    {
    CC1200_InterruptFIFO();
    }
    }
    
    void CC1200_InterruptFIFO()
    {
    MAP_GPIO_DisableInterrupt (GPIO_PORT_P1、GPIO_PIN2);
    
    CC1200_StartDMA (cc1200_state);
    }
    
    void CC1200_StartDMA (state_e state)
    {
    CC1200_SelectModule();/*下拉芯片选择并设置一些变量*/
    
    /*启用 DMA 中断*/
    MAP_Interrupt_enableInterrupt (CC1200_DMA_INTERRUPT);
    MAP_DMA_enableInterrupt (CC1200_DMA_INTERRUPT);
    
    
    /*设置 TX 传输特性和缓冲器*/
    MAP_DMA_setChannelControl (CC1200_DMA_TX | UDMA_PRI_SELECT、
    UDMA_SIZE_8 | UDMA_SRC_INC_NONE | UDMA_DST_INC_NONE | UDMA_ARB_1);
    MAP_DMA_setChannelTransfer (CC1200_DMA_TX | UDMA_PRI_SELECT、
    UDMA_MODE_BASIC、
    &CC1200_dummyByte、
    (void *) SPI_getTransmitBufferAddressForDMA (CC1200_SPI)、
    长度);
    
    /*设置 RX 传输特性和缓冲器*/
    MAP_DMA_setChannelControl (CC1200_DMA_RX | UDMA_PRI_SELECT、
    UDMA_SIZE_8 | UDMA_SRC_INC_NONE | UDMA_DST_INC_8 | UDMA_ARB_1);
    MAP_DMA_setChannelTransfer (CC1200_DMA_RX | UDMA_PRI_SELECT、
    UDMA_MODE_BASIC、
    (void *) SPI_getReceiveBufferAddressForDMA (CC1200_SPI)、
    缓冲器、
    长度);
    
    /*分配和禁用 DMA 中断*/
    MAP_DMA_赋 值中断(CC1200_DMA_INTERRUPT、CC1200_DMA_RX 和0x0F);
    MAP_DMA_disableInterrupt (CC1200_DMA_INTERRUPT);
    MAP_DMA_clearInterruptFlag (CC1200_DMA_RX 和0x0F);
    
    CC1200_TransmitByte (CC1200_ADDRESS_FIFO | CC1200_READ_BURST);
    CC1200_ReceiveByte ();
    
    MAP_DMA_enableChannel (CC1200_DMA_RX 和0x0F);
    MAP_DMA_enableChannel (CC1200_DMA_TX 和0x0F);
    }
    
    

     

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

    您好!

      感谢您分享您的代码。  默认情况下、SLEEPONEXIT 设置为"0"、并返回线程模式而不是睡眠模式。

    此外、请注意、如果 DMA 处于活动状态并请求时钟、则器件将不会在请求时进入 LPM3/4、除非您强制进入 LPM。

    "为什么 DMA 在 LP3和 LP4中甚至可以正常工作、为什么在文档显示无法唤醒 LP3和 LP4中的 DMA 中断会唤醒 MCU "


    您的器件不在 LPM3中、而是在 LPM0中。  由于来自 DMA 的时钟请求、不允许器件进入 LPM3。  您应该能够通过测量电流和/或检查 LPM_INVALID_CLK_IFG 来确认这一点。

    此致、
    Chris