我在尝试利用DMA传输ADC的双通道连续转换结果到一个二维数组中,ADC的配置如下:
REFCTL0 &= ~REFMSTR; // 复位REFMSTR控制位以控制ADC12参考电压控制寄存器
ADC12CTL0 = ADC12SHT0_3 + ADC12MSC + ADC12ON + // 采样周期为32个ADC时钟,自动转换
ADC12REFON + ADC12REF2_5V; // 打开参考电压产生器,设置参考电压2.5V
ADC12CTL1 = ADC12CSTARTADD_0 + ADC12SHP + // 首地址为ADC12MEM0 ,软件启动
ADC12SSEL_3 + ADC12DIV_1 + ADC12CONSEQ_3; // ADC时钟频率为SMCLK 2分频,序列通道重复转换
ADC12CTL2 = ADC12RES_2; // ADC 转换分辨率是12位
ADC12MCTL0 = ADC12SREF_1 + ADC12INCH_0;
ADC12MCTL1 = ADC12SREF_1 + ADC12INCH_1 + ADC12EOS;
DMA的配置如下:
DMACTL0 |= DMA0TSEL_24; // ADC作为DMA触发源
DMACTL4 |= DMARMWDIS; // DMA传输期间禁止CPU读写
DMA0CTL &= ~DMAIFG; // 禁止DMA中断
DMA0CTL |= DMADT_5 + DMADSTINCR_3 + DMASRCINCR_0 + // 重复快传输,目标地址递增,源地址不变
DMAEN; // 使能DMA,基本传输单位为字
DMA0SZ |= 0x02; // 传输大小为2字
// 设置源地址
__data16_write_addr((unsigned short) &DMA0SA, (unsigned long) &ADC12MEM0);
// 设置目标地址
// __data16_write_addr((unsigned short) &DMA0DA, (unsigned long) Act_Ref_Volts); // Act_Ref_Volts[1000][2]
调试时,观察 Act_Ref_Volts[1000][2]这个数组,Act_Ref_Volts[i]的值都是其地址,展开Act_Ref_Volts[i][j],报错“unknown Error: Could not read 0x02402: Execution state prevented access”。希望熟悉ADC和DMA的朋友或TI员工能够帮我解决这个问题,不胜感激!
ps:DMA设置源地址和目标地址时,我试过直接对DMA0SA寄存器赋值的方式,同样不起作用