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.

[参考译文] MSP430FR5994:使用基于寄存器的指令对 MSP430FR5994上的 BOOST-XL 音频回放项目进行 DMA 初始化

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1056562/msp430fr5994-dma-initialization-using-register-based-instructions-for-boost-xl-audio-playback-project-on-msp430fr5994

器件型号:MSP430FR5994
主题中讨论的其他器件: MSPWARE

大家好、  

我尝试通过 MSP430FR5994 Launchpad 将 BOOST-XL 音频演示用于声学信号检测应用。 同样、我对  MSPWare 示例中提供的'audio_collect.c'示例文件进行了一些修改。 其背后的想法是减小代码大小、并尝试查找是否有其他方法对音频录制和回放的行为进行编码。 为了初始化 DMA 通道以录制和回放音频、原始代码的结构如下:

    static DMA_initParam dma0Config;
    static DMA_initParam dma1Config;

    dma0Config.channelSelect = DMA_CHANNEL_1;
    dma0Config.transferModeSelect = DMA_TRANSFER_SINGLE;
    dma0Config.transferSize = SAMPLES_LENGTH;
    dma0Config.triggerSourceSelect = DMA_TRIGGERSOURCE_26;
    dma0Config.transferUnitSelect = DMA_SIZE_SRCWORD_DSTWORD;
    dma0Config.triggerTypeSelect = DMA_TRIGGER_RISINGEDGE;
    
    dma1Config.channelSelect = DMA_CHANNEL_2;
    dma1Config.transferModeSelect = DMA_TRANSFER_SINGLE;
    dma1Config.transferSize = SAMPLES_LENGTH;
    dma1Config.triggerSourceSelect = DMA_TRIGGERSOURCE_26;
    dma1Config.transferUnitSelect = DMA_SIZE_SRCWORD_DSTWORD;
    dma1Config.triggerTypeSelect = DMA_TRIGGER_RISINGEDGE;
    
    DMA_init(&dma0Config);
    DMA_init(&dma1Config);

我的想法不是以上陈述、而是尝试以下几点:

    #define ADC12_DMA_TRIGGER_SOURCE 0X1A   // (TRIGGER_SOURCE_26)
    #define SAMPLES_LENGTH 0x7FFF
    
    DMA1CTL = (DMADT_0 + DMADSTBYTE_0 + DMASRCBYTE_0 + DMALEVEL_0);
    DMA1SZ = SAMPLES_LENGTH;

    // Reset and then trigger the DMA Channel 1
    DMACTL1 &= 0X00FF;
    DMACTL1 |= (ADC12_DMA_TRIGGER_SOURCE << 8);
    
    DMA2CTL = (DMADT_0 + DMADSTBYTE_0 + DMASRCBYTE_0 + DMALEVEL_0);
    DMA2SZ = SAMPLES_LENGTH;
    
    // Reset and then trigger the DMA Channel 2
    DMACTL2 &= 0X00FF;
    DMACTL2 |= (ADC12_DMA_TRIGGER_SOURCE<<8);

虽然我还在寄存器的帮助下使用了类似的方法来编码行为、但当我根据'DA_initParam'使用初始化时、整个代码会正常工作 、但当我尝试使用基于修改后的寄存器的方法时、演示只会继续录音 (红色 LED 保持亮起)、从不启动回放。 我几乎可以肯定的是、当我使用 DMA 的默认初始化、同时根据基于寄存器的方法修改其余代码时、代码片段中会出现问题- BOOST-XL 演示非常完美。 我曾向论坛提出类似的问题、但没有看到适用于我的案例的问题。 如果有人可以查看代码并让我知道我可能会出错的地方、那将会非常有帮助。 我还将附加'audio_collect.c'的修改后代码文件 和 MSPWare 中提供的默认示例供您参考。  

e2e.ti.com/.../audio_5F00_collect.c   e2e.ti.com/.../audio_5F00_collect_5F00_default.c  

请告诉我是否需要其他详细信息。 谢谢!

此致、

Siddhant  

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

    我对该板不是很熟悉、但我注意到以下几点:

    --------

    DMA1TSEL 位于 DMACTL0中、而非 DMACTL1 [参考用户指南(SLAU367P)表11-5]

    --------

    >DMACTL2 &= 0X00FF;
    >DMACTL2 |=(ADC12_DMA_TRIGGER_SOURCE<<8);

    DMA2TSEL 是 DMACTL1的低字节[参考用户指南 表11-6]

    >DMACTL1 &= 0XFF00;
    >DMACTL1 |=(ADC12_DMA_TRIGGER_SOURCE<0);

    --------

    >__data16_write_addr ((无符号短整型)&DMA2SA、(uint32_t)&ADC12MEM0);

    DMA2SA (和 DA)为20位宽(实际上是32位)、因此我建议更像:

    >__data20_write_long ((uintptr_t)&DMA2SA、(uintptr_t)&ADC12MEM0);  

    --------

    暂停原始程序、然后在"Registers"视图中记下感兴趣的 DMA 寄存器、并将它们与代码中得到的值进行比较可能会很有用。 无论如何、它可能比检查更快。

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

    Bruce、您好!  

    谢谢! 我将查看并相应地更新此处的问题。