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.

[参考译文] CCS/TM4C129ENCPDT:使用两个 ADC 的 DMA 配置存在问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/602263/ccs-tm4c129encpdt-problem-with-dma-configuration-for-using-both-adc

器件型号:TM4C129ENCPDT

工具/软件:Code Composer Studio

你(们)好

我不知道为什么在使用此代码时程序滞留在启动文件的 IntDefaultHandler (void)中、我知道这是因为调用了意外中断、我想知道的是此代码的错误:

void ADCconfigure (uint32_t sysclock)

{
SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);
SysCtlPeripheralSlepEnable (SYSCTL_Periph_ADC0);
ADCClockConfigSet (ADC0_BASE、ADC_CClock_SRC_PIOSC | ADC_CClock_RATE_FULL、1); //时钟源(精确内部时钟)

ADCSequenceConfigure (ADC0_BASE、1、ADC_TRIGGER_TIMER、0);// SS0-SS3优先级必须始终不同
ADCSequenceStepConfigure (ADC0_BASE、1、0、ADC_CTL_CH0);
ADCSequenceStepConfigure (ADC0_BASE、1、1、ADC_CTL_CH1);
ADCSequenceStepConfigure (ADC0_BASE、1、2、ADC_CTL_CH2);
ADCSequenceStepConfigure (ADC0_BASE、1、3、ADC_CTL_CH3 | ADC_CTL_END | ADC_CTL_IE);
ADCSequenceDMAEnable (ADC0_BASE、1);

uDMAChannelAttributeDisable (UDMA_CHANGE_ADC1、
UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST |
UDMA_ATTR_HIGH_PRIOR|
UDMA_ATTR_REQMASK);

uDMAChannelControlSet (UDMA_CHANGE_ADC1 | UDMA_PRI_SELECT、
UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 |
UDMA_ARB_1);

uDMAChannelControlSet (UDMA_CHANGE_ADC1 | UDMA_ALT_SELECT、
UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 |
UDMA_ARB_1);
/**/
uDMAChannelTransferSet (UDMA_CHANGE_ADC1 | UDMA_PRI_SELECT、
UDMA_MODE_PINGONG、
(void *)(ADC0_BASE + ADC_O_SSFIFO1)、
G_ui8RxBufA[0]、MEM_buffer_size);

uDMAChannelTransferSet (UDMA_CHANGE_ADC1 | UDMA_ALT_SELECT、
UDMA_MODE_PINGONG、
(void *)(ADC0_BASE + ADC_O_SSFIFO1)、
G_ui8RxBufB[0]、MEM_buffer_size);

uDMAChannelEnable (UDMA_CHANGE_ADC1);
ADCIntEnableEx (ADC0_BASE、ADC_INT_DMA_SS1);
IntEnable (INT_ADC0SS1);

SysCtlPeripheralEnable (SYSCTL_Periph_ADC1);
SysCtlPeripheralSlepEnable (SYSCTL_Periph_ADC1);
ADCClockConfigSet (ADC1_base、ADC_CClock_SRC_PIOSC | ADC_CClock_RATE_FULL、1);

ADCSequenceConfigure (ADC1_base、1、ADC_TRIGGER_TIMER、1);
ADCSequenceStepConfigure (ADC1_base、1、0、ADC_CTL_CH16);
ADCSequenceStepConfigure (ADC1_base、1、1、ADC_CTL_CH17);
ADCSequenceStepConfigure (ADC1_base、1、2、ADC_CTL_CH18);
ADCSequenceStepConfigure (ADC1_base、1、3、ADC_CTL_CH19 | ADC_CTL_END | ADC_CTL_IE);// ADC_CTL_IE 每8个样本触发一次
ADCPhaseDelaySet (ADC1_base、ADC_PHASE_0);
ADCSequenceDMAEnable (ADC1_BASE、1);

uDMAChannelAttributeDisable (UDMA_CH25_ADC1_1、
UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST |
UDMA_ATTR_HIGH_PRIOR|
UDMA_ATTR_REQMASK);

uDMAChannelControlSet (UDMA_CH25_ADC1_1 | UDMA_PRI_SELECT、
UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 |
UDMA_ARB_8);

uDMAChannelControlSet (UDMA_CH25_ADC1_1 | UDMA_ALT_SELECT、
UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 |
UDMA_ARB_8);

uDMAChannelTransferSet (UDMA_CH25_ADC1_1 | UDMA_PRI_SELECT、
UDMA_MODE_PINGONG、
(void *)(ADC1_base + ADC_O_SSFIFO1)、
G_ui8RxBufA[1]、MEM_buffer_size);

uDMAChannelTransferSet (UDMA_CH25_ADC1_1 | UDMA_ALT_SELECT、
UDMA_MODE_PINGONG、
(void *)(ADC1_base + ADC_O_SSFIFO1)、
G_ui8RxBufB[1]、MEM_buffer_size);

uDMAChannelAssign (UDMA_CH25_ADC1_1);
uDMAChannelEnable (UDMA_CH25_ADC1_1);
ADCIntEnableEx (ADC1_base、ADC_INT_DMA_SS1);
IntEnable (INT_ADC1SS1);
//---------------
SysCtlPeripheralEnable (SYSCTL_Periph_TIMER0);
TimerConfigure (TIMER0_BASE、TIMER_CFG_A_PERIODICASE);
TimerLoadSet (TIMER0_BASE、TIMER_A、sysclock/(125000)/*(48000*8*2)*/);
TimerControlTrigger (TIMER0_BASE、TIMER_A、TRUE);
TimerEnable (TIMER0_BASE、TIMER_A);
ADCSequenceEnable (ADC0_BASE、1);
ADCSequenceEnable (ADC1_base、1);
} 

使用 IntEnable (INT_ADC0SS1)后、问题出现、在此代码之前、我使用的是 Seq 0、一切正常:

void ADCconfigure (uint32_t sysclock)

{
SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);
SysCtlPeripheralSlepEnable (SYSCTL_Periph_ADC0);
ADCClockConfigSet (ADC0_BASE、ADC_CClock_SRC_PIOSC | ADC_CClock_RATE_FULL、1); //时钟源(精确内部时钟)

ADCSequenceConfigure (ADC0_BASE、0、ADC_TRIGGER_TIMER、0);// SS0-SS3优先级必须始终不同
ADCSequenceStepConfigure (ADC0_BASE、0、0、ADC_CTL_CH0); // PE3
ADCSequenceStepConfigure (ADC0_BASE、0、1、ADC_CTL_CH1); // PE2
ADCSequenceStepConfigure (ADC0_BASE、0、2、ADC_CTL_CH2); // PE1
ADCSequenceStepConfigure (ADC0_BASE、0、3、ADC_CTL_CH3); // PE0
ADCSequenceStepConfigure (ADC0_BASE、0、4、ADC_CTL_CH0);
ADCSequenceStepConfigure (ADC0_BASE、0、5、ADC_CTL_CH1);
ADCSequenceStepConfigure (ADC0_BASE、0、6、ADC_CTL_CH2);
ADCSequenceStepConfigure (ADC0_BASE、0、7、ADC_CTL_CH3 | ADC_CTL_END | ADC_CTL_IE);
ADCSequenceDMAEnable (ADC0_BASE、0);

uDMAChannelAttributeDisable (UDMA_CHANGE_ADC0、
UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST |
UDMA_ATTR_HIGH_PRIOR|
UDMA_ATTR_REQMASK);

uDMAChannelControlSet (UDMA_CHANGE_ADC0 | UDMA_PRI_SELECT、
UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 |
UDMA_ARB_1);

uDMAChannelControlSet (UDMA_CHANGE_ADC0 | UDMA_ALT_SELECT、
UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 |
UDMA_ARB_1);
/**/
uDMAChannelTransferSet (UDMA_CHANGE_ADC0 | UDMA_PRI_SELECT、
UDMA_MODE_PINGONG、
(void *)(ADC0_BASE + ADC_O_SSFIFO0)、
G_ui8RxBufA[0]、MEM_buffer_size);

uDMAChannelTransferSet (UDMA_CHANGE_ADC0 | UDMA_ALT_SELECT、
UDMA_MODE_PINGONG、
(void *)(ADC0_BASE + ADC_O_SSFIFO0)、
G_ui8RxBufB[0]、MEM_buffer_size);

uDMAChannelEnable (UDMA_CHANGE_ADC0);
ADCIntEnableEx (ADC0_BASE、ADC_INT_DMA_SS0);
IntEnable (INT_ADC0SS0);

SysCtlPeripheralEnable (SYSCTL_Periph_ADC1);
SysCtlPeripheralSlepEnable (SYSCTL_Periph_ADC1);
ADCClockConfigSet (ADC1_base、ADC_CClock_SRC_PIOSC | ADC_CClock_RATE_FULL、1);

ADCSequenceConfigure (ADC1_base、0、ADC_TRIGGER_TIMER、1);
ADCSequenceStepConfigure (ADC1_base、0、0、ADC_CTL_CH16); //PK1
ADCSequenceStepConfigure (ADC1_base、0、1、ADC_CTL_CH17); //PK2
ADCSequenceStepConfigure (ADC1_base、0、2、ADC_CTL_CH18); //PK3
ADCSequenceStepConfigure (ADC1_base、0、3、ADC_CTL_CH19); //PK0
ADCSequenceStepConfigure (ADC1_base、0、4、ADC_CTL_CH16);
ADCSequenceStepConfigure (ADC1_base、0、5、ADC_CTL_CH17);
ADCSequenceStepConfigure (ADC1_base、0、6、ADC_CTL_CH18);
ADCSequenceStepConfigure (ADC1_base、0、7、ADC_CTL_CH19 | ADC_CTL_END | ADC_CTL_IE);// ADC_CTL_IE 每8个样本触发一次
ADCPhaseDelaySet (ADC1_base、ADC_PHASE_0);
ADCSequenceDMAEnable (ADC1_BASE、0);

uDMAChannelAttributeDisable (UDMA_CH24_ADC1_0、
UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST |
UDMA_ATTR_HIGH_PRIOR|
UDMA_ATTR_REQMASK);

uDMAChannelControlSet (UDMA_CH24_ADC1_0 | UDMA_PRI_SELECT、
UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 |
UDMA_ARB_8);

uDMAChannelControlSet (UDMA_CH24_ADC1_0 | UDMA_ALT_SELECT、
UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 |
UDMA_ARB_8);

uDMAChannelTransferSet (UDMA_CH24_ADC1_0 | UDMA_PRI_SELECT、
UDMA_MODE_PINGONG、
(void *)(ADC1_base + ADC_O_SSFIFO0)、
G_ui8RxBufA[1]、MEM_buffer_size);

uDMAChannelTransferSet (UDMA_CH24_ADC1_0 | UDMA_ALT_SELECT、
UDMA_MODE_PINGONG、
(void *)(ADC1_base + ADC_O_SSFIFO0)、
G_ui8RxBufB[1]、MEM_buffer_size);

uDMAChannelAssign (UDMA_CH24_ADC1_0);
uDMAChannelEnable (UDMA_CH24_ADC1_0);
ADCIntEnableEx (ADC1_base、ADC_INT_DMA_SS0);
IntEnable (INT_ADC1SS0);
//---------------
SysCtlPeripheralEnable (SYSCTL_Periph_TIMER0);
TimerConfigure (TIMER0_BASE、TIMER_CFG_A_PERIODICASE);
TimerLoadSet (TIMER0_BASE、TIMER_A、sysclock/(125000)/*(48000*8*2)*/);
TimerControlTrigger (TIMER0_BASE、TIMER_A、TRUE);
TimerEnable (TIMER0_BASE、TIMER_A);

ADCSequenceEnable (ADC0_BASE、0);
ADCSequenceEnable (ADC1_base、0);
}

我的 ADC Seq1 DMA 配置可能有什么问题????

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

    您好、Sergio、
    您可能已经自己回答了...
    您是否配置了任何 ISR 以响应启动文件中 INT_ADC0SS1上的中断?
    如果您没有这样做、则代码将转移到默认处理程序以处理未配置的中断。
    布鲁诺

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Sergio、
    Bruno 是正确的。 您没有显示您的 ADC ISR。 请确保您使用 ADCIntRegister ()动态创建一个中断注册、或者您在 startup_ccs.c 文件中静态注册 ISR。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我是如此的盲人,你是对的,谢谢布鲁诺和查尔斯!!!!