This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/MSP430F5525:ADC 触发器 DMA 的问题

Guru**** 674950 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/605387/ccs-msp430f5525-trouble-with-adc-triggerd-dma

器件型号:MSP430F5525
主题中讨论的其他器件: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

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    赫勒拿、  

    浏览完您的代码后、我有一些意见:

    CLK_Configure 函数:

    • 为什么要设置 HFXT 和 LFXT 引脚?
    • 我计算出您的 DCO 和 MCLK 为~4MHz、而不是您的注释指定的2MHz
      • Fdcoclkdiv =(N+1)*(Fref/n)=(243+1)*(32768/2)=~4MHz

    TA0_Configure:

    • 为什么要从 TA0CTL 清除 TACLR?
      • 要清除 TimerA 计数寄存器、您需要设置该位、它将自动清零
      • 我建议像这样设置: TA0CTL = tassel_2|ID_0|MC_1|TAIE|TACLR;

    ADC_配置:

    • 您未正确设置转换序列的内容
    • ADC12MCTL0控制 ADC12MEM0的设置、而不是 ADC12MEM1和 ADC12MEM0的设置
      • 如果要使用该寄存器(ADC12MCTL1)、则需要设置 ADC12MEM1设置
    • 请查看 MSP430Ware 中的示例 、了解设置转换序列的正确方法

    DMA_Configure:

    • 以这种方式设置源地址:
      • __data16_write_addr ((unsigned short)&DMA0SA、(unsigned long)&ADC12MEM0);  

    TimerA ISR:

    • 在设置 SC 位之前、无需将其清零。 但是、在开始新的转换之前、您应该检查 ADC12CTL1中的 ADC 忙位

    您似乎已经对代码进行了大量更改。 我建议查看 MSP430Ware 示例并每次获取一个模块。 如果您在此过程中有任何问题、请告诉我。

    此致、  

    Caleb Overbay

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    您是否能够进行必要的更改并测试您的代码?

    此致、
    Caleb Overbay