您好!
我一直遇到 DMA 和 ADC 与此 uC 相关的问题。 特别是 DMA 触发器。 我已将 模拟通道的后台采样集成到现有项目中、使用计时器触发 ADC 和 DMA 来移动采样。 我终于开始工作了、但遇到了很多问题、因此我决定尝试一个最小的示例、并找到了类似的问题。 也许我 不理解数据表、但这个相当简单的示例无法触发:
#include
void ConfigADC( void )
~ADC12CTL0 &=~ADC12ENC;ADC12CTL0 &= ADC12ON;
ADC12CTL0 = ADC12SHT0_2 | ADC12MSC_0;
ADC12CTL1 |=ADC12SHS_0//采样保持源= ADC12SHT0_2 | ADC12MSC_0信号
来源于 ADC12C12CTL1 | ADC12C12C12C12CH_0。
|!ADC12ISSH//采样输入信号未反相
| ADC12DIV_0// ADC12时钟分频器/1
| ADC12SSEL_2// ADC12时钟源= MCLK
| ADC12CONSEQ_0;//通道序列模式
ADC12CTL2 = ADC12RES__12位;
ADC12CTL3 = ADC12CSTARTADD0;
ADC12MCTL0 = ADC12VRSEL_0;ADC12INCH_0;
ADC12IER0 = ADC12C12R0
= ADC12C12R0;ADC12C12C12R0 = ADC12C12IF0 = ADC12R0 = ADC12R0 = ADC12R0 = ADC12C12C12C12R0 = ADC12C12IF0;ADC12R0 = ADC12R0 = ADC12R0 = ADC12C12R0 = ADC12C12R0 = ADC12C12R0 = ADC12C12C12R0 = ADC12C12C12C ~
ADC12CTL0 |= ADC12ENC | ADC12SC;
while (!ADC12IFGR0){}
unsigned int adcResult = ADC12MEM0;
ADC12CTL0 &=~ADC12ENC;
ADC12CTL0 &=~
~ADC12ON;return adcResult;}= ADC12CTL_ ADD0 =无符号 DM0TDA0EN_ADT0;ADD0 = ADD0 = ADD0 = ADD0 = ADD0 = ADDMA0TDA_ADD0 = ADT0 = ADD0;ADT0 = ADD0 = ADD0 = ADD0 = ADD0 = ADD0 = AD
DMADSTINCR_0|
DMASRCINCR_0|
DMADSTBYTE__WORD |
DMASRCBYTE_WORD |
DMALEVEL__EDGE |
DMAIE__ENABLE;
__data16_write_addr ((unsigned short)&DMA0SA、(unsigned long)&TestVar1);
__data16_write_addr (unsigned short)&DMA0DA、(unsigned long)&TestVar2);
DMA0SZ = 1;
DMA0CTL |= DMAEN_ENABLE;
}
#pragma vector = DMA_vector
__interrupt void DMA_ISR (void)
{
static int int_count = 0;
switch (__even_in_range (DMAIV、0x10)){
case DMAIV_DMA0IFG:static int IN_COUNT = 0;switch (
void
= DTPW+
);void =(DTPW)=(void =);void DTPW+)=(= void =中断(=);(DTPW) //这会中断 DMA 触发
器 ConfigDMA();
Convert();
Convert();
Convert();
Convert();Convert();
__no_operation();
}
我发现、在设置 DMA 之前执行 ADC 转换会中断它、这意味着它永远不会使用 ADC12IFGR0触发。 即使我再次重新配置 DMA 和 ADC (之前清除每个寄存器)。 当我在_no_operation()处使用断点运行上述示例时,我看到 int_count == 0,这意味着从未发生中断,而且 DMA IFG 也未设置,这意味着 DMA 从未触发。 ADC 的工作只是罚款、因为我在结束时到达了__no_operation()(如果没有提升 ADC 标志、则 UC 会一直停留在 while 循环中)。
在对 ConfigDMA()按预期工作之前调用 Convert()的行进行注释时, 在执行结束时 int_count =4。
代码是否有问题?
提前感谢、
费德里科