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.

MSPM0G1507: dma+ADC 转换,debug第一次运行正常,复位或者非debug状态dma输出全为0

Part Number: MSPM0G1507

使用芯片:MSPM0G1507
目的:DAC输出指定信号,ADC根据定时器采样数据通过串口发出来
基于定时器触发dma进行adc采样,第一次debug运行都正常,脱离调试也正常,但是在调试中rest芯片,DMA输出数组值全为0,硬件脱离调试重新启动,DMA输出值也全为0,系统主时钟80M
与此同时DAC+DMA输出永远正常,部分时候会出现systick中断不触发的情况
具体配置如下:

syscfg:

/**
 * These arguments were used when this file was generated. They will be automatically applied on subsequent loads
 * via the GUI or CLI. Run CLI with '--help' for additional information on how to override these arguments.
 * @cliArgs --device "MSPM0G150X" --part "Default" --package "LQFP-48(PT)" --product "mspm0_sdk@2.02.00.05"
 * @v2CliArgs --device "MSPM0G1507" --package "LQFP-48(PT)" --product "mspm0_sdk@2.02.00.05"
 * @versions {"tool":"1.21.2+3837"}
 */

/**
 * Import the modules used in this configuration.
 */
const ADC12         = scripting.addModule("/ti/driverlib/ADC12", {}, false);
const ADC121        = ADC12.addInstance();
const ADC122        = ADC12.addInstance();
const DAC12         = scripting.addModule("/ti/driverlib/DAC12");
const DMA           = scripting.addModule("/ti/driverlib/DMA");
const GPIO          = scripting.addModule("/ti/driverlib/GPIO", {}, false);
const GPIO1         = GPIO.addInstance();
const SYSCTL        = scripting.addModule("/ti/driverlib/SYSCTL");
const SYSTICK       = scripting.addModule("/ti/driverlib/SYSTICK");
const TIMER         = scripting.addModule("/ti/driverlib/TIMER", {}, false);
const TIMER1        = TIMER.addInstance();
const TIMER2        = TIMER.addInstance();
const UART          = scripting.addModule("/ti/driverlib/UART", {}, false);
const UART1         = UART.addInstance();
const VREF          = scripting.addModule("/ti/driverlib/VREF");
const ProjectConfig = scripting.addModule("/ti/project_config/ProjectConfig");

/**
 * Write custom configuration values to the imported modules.
 */
ADC121.endAdd                            = 1;
ADC121.trigSrc                           = "DL_ADC12_TRIG_SRC_EVENT";
ADC121.adcMem1chansel                    = "DL_ADC12_INPUT_CHAN_1";
ADC121.adcMem0chansel                    = "DL_ADC12_INPUT_CHAN_1";
ADC121.adcMem0_name                      = "ADC0_CH1";
ADC121.adcMem0vref                       = "VREF";
ADC121.configureDMA                      = true;
ADC121.$name                             = "ADC1";
ADC121.enabledInterrupts                 = ["DL_ADC12_INTERRUPT_DMA_DONE"];
ADC121.enableFIFO                        = true;
ADC121.hwNumerator                       = "DL_ADC12_HW_AVG_NUM_ACC_2";
ADC121.startAdd                          = 1;
ADC121.enabledDMATriggers                = ["DL_ADC12_DMA_MEM1_RESULT_LOADED"];
ADC121.interruptPriority                 = "0";
ADC121.sampCnt                           = 10;
ADC121.repeatMode                        = true;
ADC121.sampleTime1                       = "0";
ADC121.sampleTime0                       = "100ns";
ADC121.subChanID                         = 12;
ADC121.peripheral.$assign                = "ADC1";
ADC121.adcPin1Config.$name               = "ti_driverlib_gpio_GPIOPinGeneric0";
ADC121.adcPin1Config.hideOutputInversion = scripting.forceWrite(false);
ADC121.DMA_CHANNEL.$name                 = "DMA_CH3";
ADC121.DMA_CHANNEL.srcLength             = "HALF_WORD";
ADC121.DMA_CHANNEL.dstLength             = "HALF_WORD";
ADC121.DMA_CHANNEL.configureTransferSize = true;
ADC121.DMA_CHANNEL.transferSize          = 1000;
ADC121.DMA_CHANNEL.enableInterrupt       = true;
ADC121.DMA_CHANNEL.addressMode           = "f2b";
ADC121.DMA_CHANNEL.enabledEvents         = ["EVENT_CHANNEL"];
ADC121.DMA_CHANNEL.interruptPriority     = "0";
ADC121.DMA_CHANNEL.peripheral.$assign    = "DMA_CH3";

ADC122.endAdd                            = 1;
ADC122.repeatMode                        = true;
ADC122.trigSrc                           = "DL_ADC12_TRIG_SRC_EVENT";
ADC122.adcMem1chansel                    = "DL_ADC12_INPUT_CHAN_1";
ADC122.enabledInterrupts                 = ["DL_ADC12_INTERRUPT_DMA_DONE"];
ADC122.$name                             = "ADC0";
ADC122.adcMem0chansel                    = "DL_ADC12_INPUT_CHAN_1";
ADC122.enableFIFO                        = true;
ADC122.configureDMA                      = true;
ADC122.startAdd                          = 1;
ADC122.enabledDMATriggers                = ["DL_ADC12_DMA_MEM1_RESULT_LOADED"];
ADC122.interruptPriority                 = "0";
ADC122.sampCnt                           = 10;
ADC122.subChanID                         = 12;
ADC122.sampleTime1                       = "0";
ADC122.sampleTime0                       = "100ns";
ADC122.peripheral.$assign                = "ADC0";
ADC122.adcPin1Config.$name               = "ti_driverlib_gpio_GPIOPinGeneric5";
ADC122.DMA_CHANNEL.srcLength             = "HALF_WORD";
ADC122.DMA_CHANNEL.dstLength             = "HALF_WORD";
ADC122.DMA_CHANNEL.addressMode           = "f2b";
ADC122.DMA_CHANNEL.configureTransferSize = true;
ADC122.DMA_CHANNEL.transferSize          = 1000;
ADC122.DMA_CHANNEL.enabledEvents         = ["EVENT_CHANNEL"];
ADC122.DMA_CHANNEL.enableInterrupt       = true;
ADC122.DMA_CHANNEL.$name                 = "DMA_CH4";
ADC122.DMA_CHANNEL.destIncrement         = "INCREMENT";
ADC122.DMA_CHANNEL.interruptPriority     = "0";

const Board                       = scripting.addModule("/ti/driverlib/Board", {}, false);
Board.peripheral.$assign          = "DEBUGSS";
Board.peripheral.swclkPin.$assign = "PA20";
Board.peripheral.swdioPin.$assign = "PA19";

DAC12.dacConfigureDMA                   = true;
DAC12.dacPosVREF                        = "VEREFP";
DAC12.dacOutputPinEn                    = true;
DAC12.dacAmplifier                      = "ON";
DAC12.sub0ChanID                        = 2;
DAC12.dacSampleTimerRate                = "1M";
DAC12.dacFIFOEn                         = true;
DAC12.dacFIFOTrigger                    = "HWTRIG0";
DAC12.dacFIFOThresh                     = "TWO_QTRS_EMPTY";
DAC12.peripheral.$assign                = "DAC0";
DAC12.peripheral.OutPin.$assign         = "PA15";
DAC12.DMA_CHANNEL.srcLength             = "HALF_WORD";
DAC12.DMA_CHANNEL.dstLength             = "HALF_WORD";
DAC12.DMA_CHANNEL.srcIncrement          = "INCREMENT";
DAC12.DMA_CHANNEL.interruptPriority     = "0";
DAC12.DMA_CHANNEL.addressMode           = "b2f";
DAC12.DMA_CHANNEL.transferMode          = "FULL_CH_REPEAT_SINGLE";
DAC12.DMA_CHANNEL.configureTransferSize = true;
DAC12.DMA_CHANNEL.transferSize          = 40;
DAC12.DMA_CHANNEL.$name                 = "DMA_CH1";
DAC12.DMA_CHANNEL.peripheral.$assign    = "DMA_CH1";
DAC12.OutPinConfig.$name                = "ti_driverlib_gpio_GPIOPinGeneric4";

DMA.pubChanID = 1;

GPIO1.$name                         = "LED_PIN";
GPIO1.port                          = "PORTA";
GPIO1.associatedPins[0].$name       = "PIN_8";
GPIO1.associatedPins[0].assignedPin = "8";
GPIO1.associatedPins[0].ioStructure = "SD";
GPIO1.associatedPins[0].pin.$assign = "PA8";

SYSCTL.useHFCLK_Manual               = true;
SYSCTL.HFCLK_Freq                    = 12000000;
SYSCTL.MFPCLKEn                      = true;
SYSCTL.MFPCLKSource                  = "HFCLK";
SYSCTL.HFCLK4MFPCLKDIV               = "3";
SYSCTL.enableSYSOSCFCL               = true;
SYSCTL.SYSPLL_CLK0En                 = true;
SYSCTL.SYSPLL_Pdiv                   = 4;
SYSCTL.SYSPLL_Qdiv                   = 20;
SYSCTL.MFCLKEn                       = true;
SYSCTL.MCLKSource                    = "HSCLK";
SYSCTL.peripheral.$assign            = "SYSCTL";
SYSCTL.peripheral.hfclkInPin.$assign = "PA6";

SYSTICK.periodEnable      = true;
SYSTICK.interruptEnable   = true;
SYSTICK.interruptPriority = "0";
SYSTICK.systickEnable     = true;
SYSTICK.period            = 80000;

TIMER1.timerClkDiv                 = 8;
TIMER1.interruptPriority           = "1";
TIMER1.timerMode                   = "PERIODIC";
TIMER1.event1PublisherChannel      = 2;
TIMER1.event1ControllerInterruptEn = ["ZERO_EVENT"];
TIMER1.$name                       = "DAC_TIMER";
TIMER1.timerStartTimer             = true;
TIMER1.interrupts                  = ["ZERO"];
TIMER1.timerPeriod                 = "0.01ms";
TIMER1.peripheral.$assign          = "TIMA0";

TIMER2.$name                       = "ADC_TIMER";
TIMER2.event1ControllerInterruptEn = ["ZERO_EVENT"];
TIMER2.timerMode                   = "PERIODIC";
TIMER2.timerClkDiv                 = 8;
TIMER2.timerPeriod                 = "0.01 ms";
TIMER2.timerStartTimer             = true;
TIMER2.interrupts                  = ["ZERO"];
TIMER2.interruptPriority           = "0";
TIMER2.event2ControllerInterruptEn = ["ZERO_EVENT"];
TIMER2.event2PublisherChannel      = 12;

UART1.$name                                = "UART0";
UART1.enabledDMARXTriggers                 = "DL_UART_DMA_INTERRUPT_RX";
UART1.targetBaudRate                       = 500000;
UART1.enabledDMATXTriggers                 = "DL_UART_DMA_INTERRUPT_TX";
UART1.enabledInterrupts                    = ["DMA_DONE_TX"];
UART1.interruptPriority                    = "0";
UART1.peripheral.$assign                   = "UART0";
UART1.peripheral.rxPin.$assign             = "PA1";
UART1.peripheral.txPin.$assign             = "PA0";
UART1.txPinConfig.direction                = scripting.forceWrite("OUTPUT");
UART1.txPinConfig.hideOutputInversion      = scripting.forceWrite(false);
UART1.txPinConfig.onlyInternalResistor     = scripting.forceWrite(false);
UART1.txPinConfig.passedPeripheralType     = scripting.forceWrite("Digital");
UART1.txPinConfig.$name                    = "ti_driverlib_gpio_GPIOPinGeneric1";
UART1.rxPinConfig.hideOutputInversion      = scripting.forceWrite(false);
UART1.rxPinConfig.onlyInternalResistor     = scripting.forceWrite(false);
UART1.rxPinConfig.passedPeripheralType     = scripting.forceWrite("Digital");
UART1.rxPinConfig.$name                    = "ti_driverlib_gpio_GPIOPinGeneric2";
UART1.DMA_CHANNEL_RX.$name                 = "DMA_CH0";
UART1.DMA_CHANNEL_RX.srcLength             = "BYTE";
UART1.DMA_CHANNEL_RX.dstLength             = "BYTE";
UART1.DMA_CHANNEL_RX.configureTransferSize = true;
UART1.DMA_CHANNEL_RX.transferSize          = 100;
UART1.DMA_CHANNEL_RX.addressMode           = "f2b";
UART1.DMA_CHANNEL_RX.transferMode          = "FULL_CH_REPEAT_SINGLE";
UART1.DMA_CHANNEL_RX.destIncrement         = "INCREMENT";
UART1.DMA_CHANNEL_RX.peripheral.$assign    = "DMA_CH0";
UART1.DMA_CHANNEL_TX.$name                 = "DMA_CH2";
UART1.DMA_CHANNEL_TX.addressMode           = "b2f";
UART1.DMA_CHANNEL_TX.srcLength             = "BYTE";
UART1.DMA_CHANNEL_TX.dstLength             = "BYTE";
UART1.DMA_CHANNEL_TX.enableInterrupt       = true;
UART1.DMA_CHANNEL_TX.enabledEvents         = ["EVENT_CHANNEL"];
UART1.DMA_CHANNEL_TX.configureTransferSize = true;
UART1.DMA_CHANNEL_TX.transferSize          = 4005;
UART1.DMA_CHANNEL_TX.interruptPriority     = "0";
UART1.DMA_CHANNEL_TX.srcIncrement          = "INCREMENT";

VREF.basicMode                     = "DL_VREF_ENABLE_DISABLE";
VREF.checkVREFReady                = true;
VREF.basicExtVolt                  = 3.3;
VREF.peripheral.$assign            = "VREF";
VREF.peripheral.vrefPosPin.$assign = "PA23";
VREF.vrefPosPinConfig.$name        = "ti_driverlib_gpio_GPIOPinGeneric3";

ProjectConfig.migrationCondition = true;

/**
 * Pinmux solution for unlocked pins/peripherals. This ensures that minor changes to the automatic solver in a future
 * version of the tool will not impact the pinmux you originally saw.  These lines can be completely deleted in order to
 * re-solve from scratch.
 */
ADC121.peripheral.adcPin1.$suggestSolution       = "PA16";
ADC122.peripheral.adcPin1.$suggestSolution       = "PA26";
ADC122.DMA_CHANNEL.peripheral.$suggestSolution   = "DMA_CH4";
TIMER2.peripheral.$suggestSolution               = "TIMA1";
UART1.DMA_CHANNEL_TX.peripheral.$suggestSolution = "DMA_CH2";

运行效果:

    正常:

    

    不正常(调试界面点复位或者硬件上reset引脚给一次低电平脉冲):
    

ccs和keil同样现象