尊敬的 TI 团队:
我正在使用 DMA 从 ADC10模块提取转换结果。 我们观察到、有时 DMA 中断会丢失、或者 ADC10模块可能会卡住。 请检查随附的快照和以下代码初始化。
void initAdc10 (void){
//设置 P1.2 A0、1.1 A1、1.0 A2
P1SEL |= BIT0 | BIT1 | BIT2;//将 P1.0、.1、.2设置为非 IO
_disable_interrupt ();//禁用中断;端口映射配置
PMAPKEYID = PMAPKEY;//启用访问端口映射寄存器
P1MAP2 = PM_ANALOG;//启用 A0
P1MAP1 = PM_ANALOG;//使能 A1
P1MAP0 = PM_ANALOG;//启用 A2
PMAPKEYID = 0;//禁用访问端口映射寄存器
_ENABLE_INTERRUPT ();//重新启用所有中断
//设置 ADC10
ADC10CTL0 = ADC10SHT_2 | ADC10MSC | ADC10ON;// 16ADCclks、MSC、ADC 打开
ADC10CTL1 = ADC10SHP | ADC10CONSEQ_3;//脉冲采样模式、重复序列
ADC10CTL2 = ADC10RES;// 10位分辨率
ADC10MCTL0 = ADC10INCH_2;// A0、A1、A2 (EOS)、AVCC 基准
//设置 DMA0 (ADC10IFG 触发)
DMACTL0 = DMA0TSEL_24;// ADC10IFG 触发器
DMA0SZ = 192;
__data20_write_long ((uintptr_t)&DMA0SA、(uintptr_t)&ADC10MEM0);
//源单个地址
__data20_write_long (((uintptr_t)&DMA0DA、(uintptr_t)&ADC_Result[0]);
//目标数组地址
DMA0CTL = DMADT_4 | DMADSTINCR_3 | DMASWDW | DMAEN | DMAIE;
}
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector=dma_vector
_interrupt void DMA0_ISR (void)
#Elif defined (_GNU_)
void __attribute__((中断(DMA_vector)) DMA0_ISR (void)
其他
错误编译器不受支持!
#endif
{
开关(__evo_in_range (DMAIV、16))
{
案例 DMAIV_NONE:break;//无中断
案例 DMAIV_DMA0IFG:// DMA0IFG = DMA 通道0
ADC10CTL0 &=~ADC10ENC;// 64次转换完成
DMA_flag = 1;
中断;
案例 DMAIV_DMA1IFG:中断;// DMA1IFG = DMA 通道1
案例 DMAIV_DMA2IFG:中断;// DMA2IFG = DMA 通道2
案例8:中断;//保留
案例10:中断;//保留
案例12:中断;//保留
案例14:中断;//保留
案例16:中断;//保留
默认值:break;
}
}
// ADC 主任务
void adc_main (void){
if (dma_FLAG){
ADC10CTL0 |= ADC10ENC | ADC10SC;
DMA_flag = 0;
}
}
