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.

[参考译文] TM4C123GH6PM:无法使 ADC0 SS3在中断模式下工作

Guru**** 2478765 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/692073/tm4c123gh6pm-cannot-make-adc0-ss3-work-at-interrupt-mode

器件型号:TM4C123GH6PM

您好!

我尝试将 TivaC 配置为在中断模式下与 ADC 配合使用、但它不起作用

ADCIM 中 ADC0的位3被置位、ADC0 ADCSSCTL3中的位2被置位、EN0中的位17被置位。

此外、所有需要的寄存器都被设置为使 ADC0正常工作、然后我通过基于轮询的工作进行了测试、我工作正常。

我还应该做些什么来使它发挥作用?

谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您的问题描述太模糊、我无法提供具体帮助。 通常,您必须使用函数 IntRegister()注册中断服务例程,或者编辑 startup_ccs.c 文件使 ADC Sequence 3矢量(line107)指向您的中断例程,而不是"IntDefaultHandler"。 您需要通过调用 IntMasterEnable()来启用主中断,并且需要通过调用 IntEnable (INT_ADC0SS3)来启用 ADC0序列3中断。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    第107行是//计时器1子计时器 A 您是指第103行(// ADC 序列3)?
    我没有更改 IntDefaultHandler、我等待系统进入 while (1)、以确保它正常工作、然后我将更改它
    哪个头文件包含此函数 IntMasterEnable()?
    哪个函数是 IntEnable (INT_ADC0SS3)?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的、抱歉。 我是说 ADC 序列3的行。 行号将发生变化、因为您还需要为 中断例程行添加函数原型 、如下所示:

    extern void MyADC0Seq3IntRoutine (void); 

    添加以下两个头文件:

    #include "inc/hw_ints.h"
    #include "driverlib/interrupt.h"
    

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

    [引用 user="Bob Crosby"]

    #include "inc/hw_ints.h"
    #include "driverlib/interrupt.h" 

    [/报价]

    我正在使用 code composer,但找不到这两个头文件,所以我应该下载它们,还是下载什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这些头文件是 TivaWare 的一部分。 最新版本的 TivaWare 的默认安装位置为:
    C:\ti\TivaWare_C_Series-2.1.4.178

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

    我下载并安装了 TivaWare、并从互联网上使用了此代码

    #include 
    #include 
    #include "inc/hw_memmap.h"
    #include "inc/hw_types.h"
    #include "inc/tm4c123ghp6.h"
    #include "driverlib/pin_map.h"
    #include "driverlib/sysctl.h"
    #include "driverlib/simple.h"
    
    
    
    
    #include "driverlib/driver1.000";包含"driverlib_dive.t/driver32.utrl"#include "driverlib_dive.t/driveript"#include "driver1.t.idt.idt.idt.ultr.ultr.ultr.ultrintry"#include "driver32.t.ultrintru.id.ultru.id.ultrintru.id.id.id.id.id.id.id.id.id.ultru.id.id.id.id.id.id.id.
    
    
    
    
    
    
    
    
    
    //***时钟
    ROM_SysCtlClockSet (SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHz|SYSCTL_OSC_MAIN);
    
    //***外设启用
    ROM_SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);
    ROM_SysCtlPeripheralEnable (SYSCTL_Periph_TIMER0);
    ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);
    
    //*** ADC0
    ROM_ADCHardwareOversampleConfigure (ADC0_BASE、4);
    ROM_ADCReferenceSet (ADC0_BASE、ADC_REF_INT);
    ROM_ADCSequenceConfigure (ADC0_BASE、3、ADC_TRIGGER_TIMER、0);
    ROM_ADCSequenceStepConfigure (ADC0_BASE、3、0、ADC_CTL_CH7|ADC_CTL_IE|ADC_CTL_END);
    ROM_ADCSequenceEnable (ADC0_BASE、3);
    
    //***时间器0
    ROM_TimerConfigure (TIMER0_BASE、TIMER_CFG_PERIODICASE);
    SamplePeriod = ROM_SysCtlClockGet ()/sampleFreq;
    ROM_TimerLoadSet (TIMER0_BASE、TIMER_A、SamplePeriod - 1);
    ROM_TimerControlTrigger (TIMER0_BASE、TIMER_A、TRUE);
    
    //*** GPIO
    ROM_GPIOPinTypeADC (GPIO_PORTD_base、GPIO_PIN_0);
    
    //***中断
    ROM_IntEnable (INT_TIMER0A);
    ROM_TimerIntEnable (TIMER0_BASE、TIMER_TINA_TIMEOUT);
    ROM_IntEnable (INT_ADC0SS3);
    ROM_ADCIntEnable (ADC0_BASE、3);
    
    ROM_IntMasterEnable();
    ROM_TimerEnable (TIMER0_BASE、TIMER_A);
    }
    
    int main (void)
    {
    
    systemsetup();
    
    while (1)
    {
    
    }
    
    返回0;
    }
    
    void Timer0IntHandler (void){
    ROM_TimerIntClear (TIMER0_BASE、TIMER_TINA_TIMEOUT);
    
    
    }
    
    void ADC0SS3IntHandler (void){
    X++;
    ROM_ADCIntClear (ADC0_BASE、3);
    
    ROM_ADCSequenceDataGet (ADC0_BASE、3、ADC0Value);//从 ADC 获取数据并将其存储在 ADC0Value
    中}
    

    我在运行代码 x 时期望随着时间的推移而增加、但为什么它保持为0?

    我在计时器0子计时器 A 上添加了 Timer0IntHandler、在 ADC 序列3上添加了 ADC0SS3IntHandler

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

    您好 Mohamed、

    您需要将变量"x"声明为易失性、以便在 ISR 中更新它。 可通过以下方式完成此操作:

    volatile uint8_t x = 0; 

    请参阅此 E2E 博文了解背景信息、了解在 ISR 中使用全局变量时为什么这很重要: e2e.ti.com/.../2550611

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

    啊哈、我忘记这么做、但在我使它变得易失性之后、我希望运行芯片、通过在调试时跟踪 x、我应该看到它增加了计时器的速率、但 x 没有从0变为0  
    问题是什么?

    此致。

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