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.

求MSP43的ADC设置方法。



楼主是个新手,最近在学msp432时遇到了一个问题,按照官网上下的ADC的程序设置,但是程序运行时总是进不了中断,这个问题已经困扰我很久了,希望大神能看一眼帮我解决一下,不胜感激。

             ADC14CTL0 |= ADC14SHT0_2 | ADC14SHP | ADC14ON;// Sampling time, S&H=16, ADC14 on

            ADC14CTL1 |= ADC14RES_2 ;   // Use sampling timer, 12-bit conversion results

           ADC14MCTL0 |= ADC14INCH_1; // A1 ADC input select; Vref=AVCC

            ADC14IER0 |= ADC14IE0;

               __enable_interrupt();//全局中断
               NVIC_ISER0 = 1 << ((INT_ADC14 - 16) & 31); // Enable ADC interrupt in NVIC module
               SCB_SCR &= ~SCB_SCR_SLEEPONEXIT; // Wake up on exit from ISR

我已经对照用户手册检验过其设置,都没有问题,求大神帮我看看是不是漏掉了什么没有设置。程序编译没有问题,仿真时在中断程序中设置断点,发现程序不进入中断而是进入一个无尽的循环不产生中断。下面是完整程序。

#include "msp.h"
void main(void)
{
volatile unsigned int i;
WDTCTL = WDTPW | WDTHOLD; // Stop WDT
// GPIO Setup
P1OUT &= ~BIT0; // Clear LED to start
P1DIR |= BIT0; // Set P1.0/LED to output
P5SEL1 |= BIT4; // Configure P5.4 for ADC
P5SEL0 |= BIT4;
__enable_interrupt();//全局中断
NVIC_ISER0 = 1 << ((INT_ADC14 - 16) & 31); // Enable ADC interrupt in NVIC module
SCB_SCR &= ~SCB_SCR_SLEEPONEXIT; // Wake up on exit from ISR
// Configure ADC14
ADC14CTL0 |= ADC14SHT0_2 | ADC14SHP | ADC14ON;
// Sampling time, S&H=16, ADC14 on,ADC14SHT0_2 =0x00000200,ADC14SHP=0x04000000;ADC14ON=0x
ADC14CTL1 |= ADC14RES_2 ;
// Use sampling timer, 12-bit conversion results,ADC14RES_2=0x00000020
ADC14MCTL0 |= ADC14INCH_1; // A1 ADC input select; Vref=AVCC
ADC14IER0 |= ADC14IE0;
// Enable ADC conv complete interrupt
while (1)
{
for (i = 20000; i > 0; i--); // Delay
ADC14CTL0 |= ADC14ENC | ADC14SC; // Start sampling/conversion
__sleep();
// __bis_SR_register(LPM0_bits | GIE); // LPM0, ADC14_ISR will force exit
__no_operation(); // For debugger
}
}
// ADC14 interrupt service routine

void ADC14IsrHandler(void) {
__no_operation();
if (ADC14MEM0 >= 0x7FF) // ADC12MEM0 = A1 > 0.5AVcc?
P1OUT |= BIT0; // P1.0 = 1
else
P1OUT &= ~BIT0; // P1.0 = 0
}

  • Yuan,

    你是在Launchpad上直接跑官方例程的实验结果吗?

  • 是我们自动生成的历程有bug。

    我试了即使是用 我们的历程也会出现和你一样的问题。

    你说的进入一个无尽的循环应该是defaultISR,默认情况下我们在所有的中断服务子程序入口都填的这个服务子程序的名字。

    如我上图所修改的,你需要把ADC14 ISR对应的名字改成你的中断服务子程序名字。

    然后在startup_ccs.c中用extern void ADC14IsrHandler(void); 做下声明,表示这个函数是在别的地方定义了。

    这样改完就可以了,我试过了。

  • 学习了,看这个文件,难道好多中断服务程序都要这样改才能用?