我在使用TIM+ADC+DMA的时候,程序会不断的进入ADC0SS2_IRQHandler。经过检查发现是ADC_INT_DMA_SS2一直无法清除。我在使用keil的DEBUG功能下,强行清除标志位,结果程序还是会自动开启。
这个是我的ADC、DMA、TIM的配置
/**
* @brief 引脚使能E3
*
*/
MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
while (!(MAP_SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOE)))
{
}
/* E3 引脚 */
MAP_GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_3);
/**
* @brief ADC使能
*
*/
/* Enable the clock to ADC-0 and wait for it to be ready */
MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);
while (!(MAP_SysCtlPeripheralReady(SYSCTL_PERIPH_ADC0)))
{
}
/* 使能通道 */
MAP_ADCSequenceStepConfigure(ADC0_BASE, 2, 0, ADC_CTL_CH0 | ADC_CTL_IE | ADC_CTL_SHOLD_4 | ADC_CTL_END);
ADCClockConfigSet(ADC0_BASE, ADC_CLOCK_SRC_PLL | ADC_CLOCK_RATE_FULL, 7);
ADCReferenceSet(ADC0_BASE, ADC_REF_INT); //内部
/* 选择TIM作为触发源*/
MAP_ADCSequenceConfigure(ADC0_BASE, 2, ADC_TRIGGER_TIMER, 0);
/* 开启 DMA 的外部中断请求,并提前确保清空 */
MAP_ADCIntClearEx(ADC0_BASE, ADC_INT_DMA_SS2);
MAP_ADCIntEnableEx(ADC0_BASE, ADC_INT_DMA_SS2); //使能中断源
/* 使能 ADC0 Sequencer 2的 DMA */
MAP_ADCSequenceDMAEnable(ADC0_BASE, 2);
/* 使能 序列2 */
MAP_ADCSequenceEnable(ADC0_BASE, 2);
MAP_ADCIntClear(ADC0_BASE, 2); //清除序列2中断标志
/* 使能中断源 */
MAP_IntEnable(INT_ADC0SS2);
/**
* @brief DMA的配置
*
*/
/* Enable the DMA and Configure Channel for TIMER0A for Ping Pong mode of
* transfer */
MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA);
while (!(SysCtlPeripheralReady(SYSCTL_PERIPH_UDMA)))
{
}
MAP_uDMAEnable();
/* Point at the control table to use for channel control structures. */
MAP_uDMAControlBaseSet(pui8ControlTable);
/* Map the ADC0 Sequencer 2 DMA channel */
MAP_uDMAChannelAssign(UDMA_CH16_ADC0_2);
/* Put the attributes in a known state for the uDMA ADC0 Sequencer 2
* channel. These should already be disabled by default. */
MAP_uDMAChannelAttributeDisable(UDMA_CH16_ADC0_2,
UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST |
UDMA_ATTR_HIGH_PRIORITY |
UDMA_ATTR_REQMASK);
/* Configure the control parameters for the primary control structure for
* the ADC0 Sequencer 2 channel. The primary control structure is used for
* copying the data from ADC0 Sequencer 2 FIFO to srcBuffer. The transfer
* data size is 16 bits and the source address is not incremented while
* the destination address is incremented at 16-bit boundary.
*/
MAP_uDMAChannelControlSet(UDMA_CH16_ADC0_2 | UDMA_PRI_SELECT,
UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 |
UDMA_ARB_4);
/* Set up the transfer parameters for the ADC0 Sequencer 2 primary control
* structure. The mode is Basic mode so it will run to completion. */
MAP_uDMAChannelTransferSet(UDMA_CH16_ADC0_2 | UDMA_PRI_SELECT,
UDMA_MODE_BASIC,
(void *)&ADC0->SSFIFO2, (void *)&buff,
sizeof(buff) / 2);
/* 一旦通道被打开,TIM开始触发ADC,
* ADC将会转换数据,同时发出DMA请求 */
MAP_uDMAChannelEnable(UDMA_CH16_ADC0_2);
/**
* @brief TIM0的配置
*
*/
MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
while (!(MAP_SysCtlPeripheralReady(SYSCTL_PERIPH_TIMER0)))
{
}
MAP_TimerConfigure(TIMER0_BASE, TIMER_CFG_A_PERIODIC);
MAP_TimerLoadSet(TIMER0_BASE, TIMER_A, ((uint32_t)(System_clock / 100)));
MAP_TimerADCEventSet(TIMER0_BASE, TIMER_ADC_TIMEOUT_A); //触发TIM
MAP_TimerControlTrigger(TIMER0_BASE, TIMER_A, true);
MAP_TimerEnable(TIMER0_BASE, TIMER_A);
我在中断中,不断的清除标志位。发现没有作用,于是我又把DMA、ADC各种中断给关了,发现还是没有作用。
void ADC0SS2_IRQHandler(void)
{
uint32_t getIntStatus;
/* Get the interrupt status from the ADC */
getIntStatus = MAP_ADCIntStatusEx(ADC0_BASE, true);
/* 判断是否是 DMA中断请求 */
if ((getIntStatus & ADC_INT_DMA_SS2) == ADC_INT_DMA_SS2)
{
Usart0Printf("DMA done\n");
MAP_IntDisable(INT_ADC0SS2); //关闭中断响应
/* 清楚中断标志位. */
MAP_uDMAChannelDisable(UDMA_CH16_ADC0_2); //关闭DMA
MAP_uDMAChannelAttributeDisable(UDMA_CH16_ADC0_2,
UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST |
UDMA_ATTR_HIGH_PRIORITY |
UDMA_ATTR_REQMASK);
MAP_uDMADisable();
MAP_ADCIntDisableEx(ADC0_BASE, ADC_INT_DMA_SS2);//关闭DMASS2
MAP_ADCIntClearEx(ADC0_BASE, ADC_INT_DMA_SS2); //清除标志位
sample_done = 1;
// MAP_uDMAChannelTransferSet(UDMA_CH16_ADC0_2 | UDMA_PRI_SELECT,
// UDMA_MODE_BASIC,
// (void *)&ADC0->SSFIFO2, (void *)&buff,
// sizeof(buff) / 2);
}
}
因为我设置了IM寄存器不响应DMA_SS2的中断,所以后续不会再进入中断,但是因为RIS标志位一直无法清除,只要我再次打开相应,就还是会立马进入中断。
请问TI工程师这个怎么解决?


