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
目的: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同样现象
DL_DMA_setDestAddr( DMA, ADC0_DMA, (uint32_t) (&adcBuf[5])); DL_DMA_setSrcAddr(DMA, ADC0_DMA, (uint32_t) DL_ADC12_getFIFOAddress( ADC0_INST)); DL_DMA_setTransferSize( DMA, ADC0_DMA, ADC_BUFFER_SIZE);