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.

[参考译文] MSP430FR2433:ADC 中断

Guru**** 2538950 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1084662/msp430fr2433-adc-interrupt

部件号:MSP430FR2433

您好,
下面是我的 ADC 代码,我们集成了 UART 以在控制台上打印 ADC 值。为 单通道配置的 ADC 会反复转换。如果 它处于调试模式,我可以在 ISR 中连续打印。
如果我刷新了代码,那么我无法连续打印。请您说出问题所在。


无符号 int ADC_Result;

Int main (无效)

WDTCTL = WDTPW | WDTHOLD;//停止 WDT

initClockTo16MHz();
//配置 GPIO
P1DIR |= BIT0;//将 P1.0/LED 设置为输出方向
P1OUT 和=~BIT0;// P1.0 LED 关闭

#ifdef UART 打印启用
UART 配置();//配置 UART
#endif
//配置 ADC A1引脚
SYSCFG2 |= ADCPCTL1;

//禁用 GPIO 通电默认高阻抗模式以激活
//以前配置的端口设置
PM5CTL0和=~LOCKLPM5;

//配置 ADC10
ADCCTL0 |= ADCSHT_2 | ADCON;// ADCON,S&H = 16 ADC CLKS
ADCCTL1 |= ADCSHP;// ADCCLK = MODOSC;采样计时器
ADCCTL2 |= ADCRES;// 10位转换结果
ADCMTL0 |= ADCINCH_3;// A1 ADC 输入选择;Vref=AVCC
ADCIE |= ADCIE0;//启用 ADC 转换完成中断

MSP_UART_LOG_INFO (“MSP:ADC 已配置...”) \n\r");
While (1)(同时)

ADCCTL0 |= ADCENC | ADCSC;//采样和转换开始
__bis_SR_register (LPM0_bits | GIE);// LPM0,ADC_ISR 将强制退出
__no_operation();//仅用于调试
IF (ADC_Result < 0x1FF)
P1OUT 和=~BIT0;//清除 P1.0 LED 关闭
否则
P1OUT |= BIT0;//将 P1.0 LED 打开
__delay_cycles (5000);
}
}

// ADC 中断服务例程
#IF 定义(__TI_Compiler_version__)||定义(__IAR_SYSTEMS _ICC__)
#pragma vector=ADC_vector
中断 void ADC_ISR (void)
#Elif Defined (__GNUC _)
void __attribute__(中断(ADC_Vector)) ADC_ISR (无效)
#else
错误编译器不受支持!
#endif

开关(__evo_in_range (ADCIV,ADCIV_ADCIFG))

案例 ADCIV_NONE:
休息;
案例 ADCIV_ADCOVIFG:
休息;
案例 ADCIV_ADCTOVIFG:
休息;
案件 ADCIV_ADCHIIFG:
休息;
案例 ADCIV_ADCLOIFG:
休息;
案例 ADCIV_ADCINIFG:
休息;
案例 ADCIV_ADCIFG:
ADC_Result = ADCMEMM0;
MSP_UART_LOG_INFO (“MSP:ADC 内部%d\n\r\n",ADC_Result);

__BIC SR 寄存器_ON_EXIT (LPM0_bits);//从 LPM0清除 CPUOFF 位
休息;
默认值:
休息;
}
}

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

    现在我连续打印,我只做了更改   

    ADC_Result = ADCMEMM0;

     至  

    ADC_result =(ADCMEMM0和0x3FF);//iam 结构化至10位 ADC

    因此,我不知道它是如何工作的

    此外,我还通过输出 P1.1的任何输入获得了类似的值

    MSP:ADC 内部1023
    MSP:ADC 内部1023
    MSP:ADC 内部1020
    MSP:ADC 内部1023
    MSP:ADC 内部1023
    MSP:ADC 内部1023
    MSP:ADC 内部1023
    MSP:ADC 内部1023
    MSP:ADC 内部1021
    MSP:ADC 内部1023
    MSP:ADC 内部1022
    MSP:ADC 内部1023

    使用  ADCMTL0 |= ADCINCH_3;//mode//

    即使 iam 向 P1.1提供 LDR,也会获得相同的结果。

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

    您能否解释 ADCMEMM0的值如何取决于  ADCMTL0 |= ADCINCH_*

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

    1.您是否还可以在调试模式下自由运行代码?

    2.是否可以尝试将 ADC 结果直接放入 UART TX 寄存器? 我认为它可能会对 printf 函数产生一些问题。

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

    我也在调试模式下运行代码
    我认为 UART 日志没有问题

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

    ADCMTL0 |= ADCINCH_3;// A1 ADC 输入选择;Vref=AVCC
    这将从通道 A3 (P1.3)进行转换。 如果要从通道 A1 (P1.1)转换,则应该是

    ADCMTL0 |= ADCINCH_1;// A1 ADC 输入选择;Vref=AVCC

    如果您使用的是启动板,请不要忘记从 J11上拔下跳线,这样 LED2就不会出现问题。

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

    谢谢布鲁斯,

    你能看到第一个回复,告诉我 ISR 在这一变化后如何连续触发 ISR --> ADC_RESE=(ADCMM0 & 0x3FF);

    如果我认为自己有问题,请告诉我,我们在哪里配置(指定寄存器)以进行连续 ISR 触发, 单个信道的配置将被反复转换

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

    当输出不连续时,它的样子是什么? (a)什么都没有(b)几条消息,什么都没有(c)刺

    调试器可能导致(后通道) UART 出现烧坏(c)。 对于(a)-(b),我会暂停调试器以查看其挂起后的执行位置。