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:LP-MSPM0G3507

Guru**** 2391165 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/1408831/mspm0g3507-lp-mspm0g3507

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

工具与软件:

您好、根据该表、当使用具有4个通道、1个 DMA 和1个 FIFO 的 ADC 并在每次DL_ADC12_IIDX_DMA_DONE设置标志时切换 LED 时、这是否意味着在采样值加载到MEMRES11而不是加载到时将设置该标志MEMRES3

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

    尊敬的 Ali:

    DMA 完成在 DMA 配置中设置的传输次数后、将触发 DMA 完成标志。 如果您有4次传输、则 DMA Done 将在第4次 DMA 传输后触发、并与加载无关。

    我建议查看另一个 DMA ADC 示例的 dma_ping_pong 示例(此示例位于子系统文件夹中、与示例的文件级别相同)

    此致、
    Luke

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

    但这里它指出、一旦 ADC 填满了其所有存储器寄存器、DMA 就会开始传输

    此致

    Ali

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

    尊敬的 Ali:

    在 DMA 乒乓自述文件中、由于 DMA 触发条件的设置已设置为最后一个寄存器、因此突出显示的语句是正确的。  

    您可以将 DMA 设置为在最后一个寄存器之前触发、因为 ADC 和 DMA 将同时运行、因此您可以在 DMA 传输 MEM10和 MEM11之前安排 ADC 完成时间。 您可以选择的 DMA 触发值取决于 ADC 的采样速度。

    或者(或其他)您可以设置 DMA 的早期通道中断位、以便在 DMA 完全完成之前触发其 DMA 完成。 这对于总体应用程序速度很有帮助、因为 DMA 将最终完成其所有传输、但您可以允许 CPU 处理 IRQ。 请参阅技术参考手册中的第4.2.11节。

    此致、
    Luke

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

    尊敬的 Luke:

    我的问题是我有4个 ADC 通道、并且我已经启用了 DMA 和 FIFO。 我能否配置 ADC 以便 ADC 在结果加载到 MEM3时触发 DMA、或者我是否由于 FIFO 而被迫等待、直到 MEM11加载完毕、然后 ADC 触发 DMA 工作? 我注意到、如果我每次设置 DL_ADC12_IIDX_DMA_DONE 时切换 LED、那么(启用 DMA 触发) MEM5重载中断、MEM11重载中断或 MEM3重载中断没有区别、为什么?

    此致、
    Ali

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

    尊敬的 Ali:

    您能否大幅降低采样率并告诉我您是否仍然可以获得相同的结果?

    此致。
    Luke

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

    尊敬的 Luke:

    我将采样率从10 µs 减慢到31.25ns、但我仍然获得相同的结果。

    此致、

    Ali  

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

    尊敬的 Ali:

    我在"所需采样时间= 2ms"时进行了测试、每次 GPIO 切换得到2.3416ms、在"所需采样时间= 1ms"时得到每次切换1.18ms。 在较快的 ADC 采样中、您可能会得到相同的结果、因为 ADC 到 DMA 不是该过程中的瓶颈。

    此致、
    Luke

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

    尊敬的 Luke:

    您是否会将 FIFO 和 DMA 与 ADC 一起使用? 计时器会触发 ADC 吗? 在您的示例中要使用多少个通道?

    最好的区域  

    Ali  

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

    尊敬的 Luke:

    当按 DMA 和 ADC 顺序使用多个通道但不使用 FIFO 时、代码会是什么样的。 尤其是对于 DL_DMA_setSrcAddr  函数。 对于 DMA、地址模式以及传输模式、我应该使用什么模式?  

    SYSCFG_DL_init ();

    DL_DMA_setSrcAddr (DMA、DMA_CH0_CHAN_ID
    (uint32_t) DL_ADC12_getMemResultAddress (ADC12_0_INST、DL_ADC12_MEM_IDX_0);

    DL_DMA_setDestAddr (DMA、DMA_CH0_CHAN_ID、(uint32_t)&gADCResult[0]);
    DL_DMA_setTransferSize (DMA、DMA_CH0_CHAN_ID、2);

    DL_DMA_enableChannel (DMA、DMA_CH0_CHAN_ID);

    NVIC_EnableIRQ (ADC12_0_INST_INT_IRQN);

    此致、
    Ali  

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

    尊敬的 Ali:

    我正在使用 FIFO 和 DMA。 我采用了 DMA 乒乓示例代码、切换到了序列、并添加了另外两个通道、我还添加了一个 GPIO、用于从 DMA 完成中断进行切换。

    未使用计时器且重复模式开启、因此我没有得到 DMA 开始到结束之间但每个 DMA 完成事务之间的时间差。

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

    如果不使用 FIFO、我会将 DMA 与您拥有的通道数对齐。 请记住、DMA 将会拉取  2.  一次 MEMRES (如果您有4个通道、那么您需要2个 DMA 事务)。

    可以使用 DMA 乒乓或 ADC12_max_freq_dma 中使用的相同设置。 Address 模式是固定地址到块地址(ADC 寄存器到您的缓冲区/阵列)。 传输模式取决于您的处理流程、块传输只需通过一次触发即可传输整个传输大小。 单个触发将要求每次传输有一个触发。

    我不知道您的完整应用以及发生该 ADC 过程的频率、但听起来您好像是在每 X 个时间后定期采样。 如果您计划一次准备好所有数据、则可以使用块传输、通过单个 DMA 触发将所有数据从 MEMRES 寄存器传输到缓冲区。

    此致
    Luke

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

    尊敬的 Luke:  

    如果我想使用多个 ADC 通道、 src DMA 的功能应该是什么样的?

    DL_DMA_setSrcAddr(DMA, DMA_CH0_CHAN_ID, (uint32_t) DL_ADC12_getMemResultAddress(ADC12_0_INST, DL_ADC12_MEM_IDX_0));
    

    我不想使用 FIFO、我想使用多个通道。 这是可行的吗?

    此致  

    Ali

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

    尊敬的 Ali:

    您可以使用不带 FIFO 的 DMA、DMA 设置可以相同、但将 DMA 采样数更改为已除以2的通道数除外。

    此致、
    Luke

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

    尊敬的 Luke:

    我曾尝试在没有 FIFO 的情况下仅使用两个通道、但没能正常工作。 我只从  DL_ADC12_MEM_IDX_0获得结果、尽管我将 DMA 配置为递增源。

    这是我的代码:

    #include "ti_msp_dl_config.h"

    bool gCheckADC;
    uint16_t gADCResult[2];

    uint32_t 地址;
    uint32_t 地址 WO;

    int main (void)

    SYSCFG_DL_init ();

    DL_DMA_setSrcAddr (DMA、DMA_CH0_CHAN_ID
    (uint32_t) DL_ADC12_getMemResultAddress (ADC12_0_INST、DL_ADC12_MEM_IDX_0);

    DL_DMA_setDestAddr (DMA、DMA_CH0_CHAN_ID、(uint32_t)&gADCResult[0]);
    DL_DMA_setTransferSize (DMA、DMA_CH0_CHAN_ID、2);

    DL_DMA_enableChannel (DMA、DMA_CH0_CHAN_ID);

    NVIC_EnableIRQ (ADC12_0_INST_INT_IRQN);

    DL_TimerG_startCounter (TIMER_0_INST);

    gCheckADC = false;

    while (gCheckADC = false)

    __ WFE ();

    }


    __BKPT (0);

    地址1 = DL_ADC12_getMemResultAddress (ADC12_0_INST、DL_ADC12_MEM_IDX_0);
    addresswo = DL_ADC12_getMemResultAddress (ADC12_0_INST、DL_ADC12_MEM_IDX_1);

    while (1){
    }
    }


    void ADC12_0_INST_IRQHandler (void)

    开关(DL_ADC12_getPendingInterrupt (ADC12_0_INST)){
    案例 DL_ADC12_IIDX_DMA_DONE:
    gCheckADC = true;
    //gADCResult[0]= DL_ADC12_getMemResult (ADC12_0_INST、DL_ADC12_MEM_IDX_0);
    // gADCResult[1]= DL_ADC12_getMemResult (ADC12_0_INST、DL_ADC12_MEM_IDX_1);
    // DL_ADC12_enableConversions (ADC12_0_INST);
    // DL_GPIO_togglePins (GPIO_LEDS_PORT、GPIO_LEDS_USER_LED_1_PIN);
    休息;
    默认值:
    休息;
    }
    }

    /*
    *====== ti_msp_dl_config.c ===
    *已配置的 MSPM0 DriverLib 模块定义
    *
    *请勿编辑-此文件是为 MSPM0G350X 生成的
    *由 SysConfig 工具提供。
    */

    #include "ti_msp_dl_config.h"

    /*
    *==== SYSCFG_DL_init ===
    *在使用任何板级 API 之前执行所需的任何初始化
    */
    sysconfig_weak void SYSCFG_DL_init (void)

    SYSCFG_DL_initPower();
    SYSCFG_DL_GPIO_init ();
    /*特定于模块的初始化*/
    SYSCFG_DL_SYSCTL_init ();
    SYSCFG_DL_TIMER_0_init ();
    SYSCFG_DL_ADC12_0_init ();
    SYSCFG_DL_DMA_init ();
    }

    SysConfig_weak void SYSCFG_DL_initPower (void)

    DL_GPIO_RESET (GPIOA);
    DL_GPIO_RESET (GPIOB);
    DL_TimerG_RESET (TIMER_0_INST)
    DL_ADC12_RESET (ADC12_0_INST);


    DL_GPIO_enablePower (GPIOA);
    DL_GPIO_enablePower (GPIOB);
    DL_TimerG_enablePower (TIMER_0_INST);
    DL_ADC12_enablePower (ADC12_0_INST);

    delay_cycles (power_startup_delay);
    }

    SysConfig_weak void SYSCFG_DL_GPIO_init (void)

    DL_GPIO_initDigitalOutput (GPIO_LEDS_USER_LED_1_IOMUX);

    DL_GPIO_clearPins (GPIO_LEDS_PORT、GPIO_LEDS_USER_LED_1_PIN);
    DL_GPIO_enableOutput (GPIO_LEDS_PORT、GPIO_LEDS_USER_LED_1_PIN);

    }


    SysConfig_weak void SYSCFG_DL_SYSCTL_init (void)

    //低功耗模式配置为 SLEEP0
    DL_SYSCTL_setBORThreshold (DL_SYSCTL_BOR_THR_LEVEL_0);

    DL_SYSCTL_setSYSOSCFreq (DL_SYSCTL_SYSOSC_FREQ_BASE);
    /*设置默认配置*/
    DL_SYSCTL_disableHFXT ();
    DL_SYSCTL_disableSYSPLL ();
    DL_SYSCTL_setULPCLKDivider (DL_SYSCTL_ULPCLK_DIV_1);
    DL_SYSCTL_setMCLKDivider (DL_SYSCTL_MCLK_DIVIDER_DISABLE);

    }

    /*
    *计时器时钟配置、以 BUSCLK 为源/(32000000 Hz)
    * timerClkFreq =(timerClkSrc/(timerClkDivRatio *(timerClkPrescale + 1)))
    * 32000000 Hz = 32000000 Hz /(1 *(0 + 1))
    */
    静态 const DL_TimerG_ClockConfig gTIMER_0ClockConfig ={
    clockSel = DL_TIMER_CLOCK_BUSCLK
    divideRatio = DL_TIMER_CLOCK_Divid_1
    .prescale = 0u、
    };

    /*
    *计时器加载值(计数器从此处开始)的计算公式为(timerPeriod * timerClockFreq)- 1
    * TIMER_0_INST_LOAD_VALUE =(2ms * 32000000 Hz)- 1
    */
    静态常量 DL_TimerG_TimerConfig gTIMER_0TimerConfig ={
    .period = TIMER_0_INST_LOAD_VALUE
    timerMode = DL_TIMER_MODE_PERIODICENT
    .startTimer = DL_TIMER_STOP、
    };

    sysconfig_weak void SYSCFG_DL_TIMER_0_init (void){

    DL_TimerG_setClockConfig (TIMER_0_INST、
    (DL_TimerG_ClockConfig *)&gTIME_0ClockConfig);

    DL_TimerG_initTimerMode (TIMER_0_INST、
    (DL_TimerG_TimerConfig *)&gTIMER_0TimerConfig);
    DL_TimerG_enableClock (TIMER_0_INST);


    DL_TimerG_enableEvent (TIMER_0_INST、DL_TIMERG_EVENT_ROY_1、(DL_TIMERG_EVENT_ZERO_EVENT));

    DL_TimerG_setPublisherChanID (TIMER_0_INST、DL_TIMERG_Publisher _INDEX_0、TIMER_0_INST_PUB_0_CH);

    }


    /* ADC12_0初始化*/
    静态 const DL_ADC12_ClockConfig gADC12_0ClockConfig ={
    clockSel = DL_ADC12_CLOCK_SYSOSC、
    divideRatio = DL_ADC12_clock_divide_1
    .freqRange = DL_ADC12_CLOCK_FREQ_RANGE_24_TO_32、
    };
    SysConfig_weak void SYSCFG_DL_ADC12_0_init (void)

    DL_ADC12_setClockConfig (ADC12_0_INST、(DL_ADC12_ClockConfig *)&gADC12_0ClockConfig);

    DL_ADC12_initSeqSample (ADC12_0_INST、
    DL_ADC12_REPEAT_MODE_DISABLED、DL_ADC12_SAMPLING_SOURCE_AUTO、DL_ADC12_TRIG_SRC_EVENT
    DL_ADC12_SEQ_START_ADDR_00、DL_ADC12_SEQ_END_ADDR_01、DL_ADC12_SAMP_CONV_RES_12_BIT、
    DL_ADC12_SAMP_CONV_DATA_FORMAT_UNsigned);
    DL_ADC12_configConversionMem (ADC12_0_INST、ADC12_0_ADCMEM_0、
    DL_ADC12_INPUT_CHAN_0、DL_ADC12_REFERY_VOLTAGE_VDDA、DL_ADC12_SAMPLE_TIMER_SOURCE_SCOMP0、DL_ADC12_AVERAGE_MODE_DISABLED
    DL_ADC12_BURN_OUT_SOURCE_DISABLED、DL_ADC12_TRIGGER_MODE_AUTO_NEXT、DL_ADC12_WINDOWS_COMP_MODE_DISABLED);
    DL_ADC12_configConversionMem (ADC12_0_INST、ADC12_0_ADCMEM_1、
    DL_ADC12_INPUT_CHAN_1、DL_ADC12_REFERY_VOLTAGE_VDDA、DL_ADC12_SAMPLE_TIMER_SOURCE_SCOMP0、DL_ADC12_AVERAGE_MODE_DISABLED
    DL_ADC12_BURN_OUT_SOURCE_DISABLED、DL_ADC12_TRIGGER_MODE_TRIGGER_NEXT、DL_ADC12_WINDOWS_COMP_MODE_DISABLED);
    DL_ADC12_enableFIFO (ADC12_0_INST);
    DL_ADC12_setPowerDownMode (ADC12_0_INST、DL_ADC12_POWER_DOWN_MODE_MANUAL);
    DL_ADC12_setSampleTime0 (ADC12_0_INST、480);
    DL_ADC12_enableDMA (ADC12_0_INST);
    DL_ADC12_setDMASamplesCnt (ADC12_0_INST、2);
    DL_ADC12_enableDMATrigger (ADC12_0_INST、(DL_ADC12_DMA_MEM1_RESULT_LOADED));
    DL_ADC12_setSubscribeChanID (ADC12_0_INST、ADC12_0_INST_SUB_CH);
    /*启用 ADC12中断*/
    DL_ADC12_clearInterruptStatus (ADC12_0_INST、(DL_ADC12_INTERRUPT_MEM1_RESULT_LOADED));
    DL_ADC12_enableInterrupt (ADC12_0_INST、(DL_ADC12_INTERRUPT_MEM1_RESULT_LOADED));
    DL_ADC12_enableConversions (ADC12_0_INST);
    }

    静态 const DL_DMA_Config gDMA_CH0Config ={
    .transferMode = DL_DMA_SINGLE_BLOCK_TRANSFER_MODE、
    .extendedMode = DL_DMA_NORMAL_MODE
    .destIncrement = DL_DMA_ADDR_INCREMENT、
    .srcIncrement = DL_DMA_ADDR_INCREMENT、
    .destWidth = DL_DMA_WIDTH_WORD
    .srcWidth = DL_DMA_WIDTH_WORD、
    .trigger = ADC12_0_INST_DMA_TRIGGER、
    triggerType = DL_DMA_TRIGGER_TYPE_EXTERNAL
    };

    sysconfig_weak void SYSCFG_DL_DMA_CH0_init (void)

    DL_DMA_initChannel (DMA、DMA_CH0_CHAN_ID、(DL_DMA_Config *)&gDMA_CH0Config);
    }
    SysConfig_weak void SYSCFG_DL_DMA_init (void){
    SYSCFG_DL_DMA_CH0_init ();
    }

    此致、

    Ali