主题中讨论的其他器件:MSP430WARE
工具/软件:Code Composer Studio
您好! 我正在尝试对游戏手柄的读数进行 AD 转换、并通过直接存储器访问将游戏手柄每个轴的最后500个值存储在两个不同的矢量中。 出于某种原因、只有 X 轴矢量正在注册任何内容、另一个矢量仍为空。
#include
#define ADC12MEM0ADDR (_SFR_FARPTR) 0x0720
#define ADC12MEM1ADDR (_SFR_FARPTR) 0x0722
void ADC_Configure (void);
void CLK_Configure (void);
void TA0_Configure (void);
void DMA_Configure (void);
int analogX[500];//X 轴
int 类比[500];//Y 轴
int main (void){
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
CLK_Configure();
TA0_Configure();
ADC_Configure();
DMA_Configure();
P6SEL |= BIT0 | BIT1;
_enable_interrupt ();
while (1);
}
#pragma vector= TIMER0_A1_vector
_interrupt void ISR_TA0 (){
int n;
N =_偶数_在范围内(TA0IV、0XE);
switch (n){
情况0xE:
TA0CTL &=~TAIFG;
ADC12CTL0 &=~ADC12SC;//ADC12SC = 0
ADC12CTL0 |= ADC12SC;//ADC12SC = 1.
ADC12CTL0 &=~ADC12SC;//ADC12SC = 0
中断;
默认值:break;
}
}
void DMA_Configure (void){
DMACTL0 = DMA0TSEL_24 | DMA1TSEL_24;//触发 ADC
DMA0CTL = DMAEN |
DMADSTINCR_3 |
DMADT_4;
DMA1CTL = DMAEN |
DMADSTINCR_3 |
DMADT_4;
DMA0SA = ADC12MEM0ADDR;//ADC MEM0
DMA1SA = ADC12MEM1ADDR;//ADC MEM1
__data16_write_addr ((无符号短整型)&DMA0DA、(无符号长整型)&analogX[0]);
__data16_write_addr ((unsigned short)&DMA1DA、(unsigned long)&类 比[0]);
DMA0SZ = 500;
DMA1SZ = 500;
}
void ADC_Configure (void){
ADC12CTL0 &=~ADC12ENC;
ADC12CTL0 |= ADC12SHT0_0 | ADC12ON;//4 ciclos do ADC12CLK ==2us / Ligar ADC
ADC12CTL1 |= ADC12CSTARTADD_0 |//ADC12MEM0
ADC12SH_0 |//计时器= ADC12SC
ADC12SHP |
ADC12DIV_0 |
ADC12SSEL_1 |//时钟= ACLK = 2MHz --> ADC12CLK = 500ns
ADC12CONSEQ_1;
ADC12CTL2 |= ADC12TCOFF |
ADC12RES_2;//12位
ADC12MCTL0 |= ADC12EOS |
ADC12SREF_0 |//VR+= AVcc e VR-= AVss
ADC12INCH_0 |// A0 = P6.0
ADC12INCH_1;// A1 = P6.1
ADC12CTL0|= ADC12ENC;
}
void CLK_Configure (void){
P5SEL |= BIT2|BIT3|BIT4|BIT4;
//SMCLK = 1MHz
//MCLK = 2MHz (tsample > 1、5us)
UCSCTL1|= DCORSEL_1;
UCSCTL2|= FLLD_0;
UCSCTL2|= 243;
UCSCTL3|= SELREF_2;
UCSCTL3|= FLLREFDIV_1;
UCSCTL4 |= SELS _3 |// SMCLK = DCO
SELA_3;// ACLK = DCO
UCSCTL5 |= DIVS_2 |// SMCLK/1 = 1MHz
DIVA_1;// ACLK/2 = 2MHz
}
void TA0_Configure (void){
TA0CTL = tassel_2|ID_0|MC_1|TAIE;
TA0CTL &=~TACLR;
TA0EX0 = TAIDEX_0;
TA0CCR0 = 10000;// SMCLK x 100000 = 10ms
}