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.

TM4 配置好ADC后 一直无法进入中断。



/*
 * main.c
 */
#include <stdint.h>
#include <stdbool.h>
#include <stdio.h>
#include <driverlib/sysctl.h>
#include <driverlib/gpio.h>
#include <driverlib/adc.h>
#include <inc/hw_adc.h>
#include <inc/hw_sysctl.h>
#include "inc/hw_memmap.h"
#include "driverlib/interrupt.h"
#include <inc/hw_ints.h>
uint32_t adc_value;
void ADC3_Hanlder(void)
{
	ADCIntClear(ADC0_BASE,3);

    ADCSequenceDataGet(ADC0_BASE, 3, &adc_value);

}
int main(void) {
    SysCtlClockSet(SYSCTL_SYSDIV_4|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHZ);   //配置系统时钟
    SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);      //使能adc0
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);   //使能gpio E
    ADCClockConfigSet(ADC0_BASE,ADC_CLOCK_SRC_PLL|ADC_CLOCK_RATE_FULL,8);  //配置ADC时钟
    GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_3);   //配置引脚adc功能
    ADCSequenceConfigure(ADC0_BASE,3,ADC_TRIGGER_ALWAYS,0);   //序列设置,选择序列3 ,始终触发,优先级0
    ADCSequenceStepConfigure(ADC0_BASE, 3, 0,ADC_CTL_END | ADC_CTL_CH0);  //采样通道0
    ADCSequenceEnable(ADC0_BASE, 3);   //序列3使能
    ADCIntClear(ADC0_BASE,3);   // 清除序列3中断
   // ADCIntEnable(ADC0_BASE,3); // 序列3 中断使能
    ADCIntRegister(ADC0_BASE,3,ADC3_Hanlder);  // 注册序列3中断 函数
    ADCIntEnable(ADC0_BASE,3);  //   开启adc中断 
    IntMasterEnable();   //开启总中断
    while(1)
    {
        
    }


}

 我想每次ADC0触发的时候都能进入中断,但是一次都进不去, 试了好久了 , 实在想不出来哪儿还有问题了, 希望大家帮帮我。谢谢呢

  • 使能中断主要是如下几步

    ADCSequenceStepConfigure(ADC0_BASE, 0, 7, ADC_CTL_CH7 | ADC_CTL_IE |ADC_CTL_END);

    这个指的是CH7作为最后一个采样,结束后产生中断

    ADCIntEnable(ADC0_BASE, 0);
    IntEnable(INT_ADC0SS0);
    IntMasterEnable();

    这三句就不解释了嘛。

    还有就是中断向量表中注册相应的中断服务程序的名字。

  • 工程师  ,根据你改的我能正常进入中断了  好开心, 但是出现了新问题,我进入中断之后,读取数据不行了,  一直读不出来。

    代码如下

    /*
     * main.c
     */
    #include <stdint.h>
    #include <stdbool.h>
    #include <stdio.h>
    #include <driverlib/sysctl.h>
    #include <driverlib/gpio.h>
    #include <driverlib/adc.h>
    #include <inc/hw_adc.h>
    #include <inc/hw_sysctl.h>
    #include "inc/hw_memmap.h"
    #include "driverlib/interrupt.h"
    #include <inc/hw_ints.h>
    uint32_t adc_value[2];
    void ADC3_Hanlder(void)
    {
    	ADCSequenceDataGet(ADC0_BASE, 0, adc_value);
    	ADCIntClear(ADC0_BASE,0);
    }
    int main(void) {
        SysCtlClockSet(SYSCTL_SYSDIV_4|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHZ);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
        ADCClockConfigSet(ADC0_BASE,ADC_CLOCK_SRC_PLL|ADC_CLOCK_RATE_FULL,8);
        GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_3);
        GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_2);
        ADCSequenceConfigure(ADC0_BASE,0,ADC_TRIGGER_PROCESSOR,0);
        ADCSequenceStepConfigure(ADC0_BASE, 0, 0, ADC_CTL_CH0);
        ADCSequenceStepConfigure(ADC0_BASE, 0, 1,ADC_CTL_END | ADC_CTL_CH1|ADC_CTL_IE|ADC_CTL_TS);
        ADCSequenceEnable(ADC0_BASE, 0);
        ADCIntRegister(ADC0_BASE,0,ADC3_Hanlder);
        ADCIntEnable(ADC0_BASE,0);
        IntEnable(INT_ADC0SS0);
        IntMasterEnable();
        while(1)
        {
         IntTrigger(INT_ADC0SS0_TM4C123);
        }
    
    
    }
    
  • 看文档说M4进入中断要首先清除中断标志,

    所以中断里面我先清了中断标志,然后读取data不行 所以我就换成先读 data  在清 中断  还是不行。。    

    希望工程师能帮我解答下  。

  • ADCSequenceStepConfigure(ADC0_BASE, 0, 1,ADC_CTL_END | ADC_CTL_CH1|ADC_CTL_IE|ADC_CTL_TS);

    这里怎么又配置为CH1通道又配置了温度传感器?

     while(1)
        {
         IntTrigger(INT_ADC0SS0_TM4C123);
        }
    主循环里一直这样不行呀,看看这句话啥意思吧。

    //
    // Trigger the ADC conversion.
    //
    ADCProcessorTrigger(ADC0_BASE, 0);

    用这个触发。

    如果放在主循环里不能一直触发,得间隔一段时间,否则不停的进中断



  • 谢谢呢, 你说的那些错误我后来都纠正了。  确实是暂时正常了。 

    但是后面调试的时候我发现, 有的时候debug把程序下载到开发板,ADC0的SS0序列的中断标志始终是1,就是程序一开始它就是1,我试过清除中断标志 ,但是没法清楚掉。 然后我就换了一块板子继续debug,就正常了。    

    问题就是,为什么M4重新下载的时候,中断标志位会是1呢,  还没法清除。复位之后就是1,我用寄存器那个窗口看到的。

    下面的图就是debug进去的状态,程序没有运行。  SS0的中断标志位是1.    纠结好久

  • 在调用ADCSequenceEnable这句话之前,先执行ADCIntClear清掉中断就可以了。