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/TM4C1294NCPDT:计时器 ADC 中断

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/641433/ccs-tm4c1294ncpdt-timer-adc-interrupt

器件型号:TM4C1294NCPDT

工具/软件:Code Composer Studio

我正在使用 Tiva C TM4C1294 Connected Launchpad 从 传感器读取 ADC 数据。 我正在 使用计时器中断对 ADC 进行采样。 我的代码如下所示。 在此程序中、 我希望阵列 READ_DATA 的索引在填充完整个数据后变为0、ADC 应持续 向阵列填充新数据 、但如果(i==99)条件不执行并且 READ_DATA 阵列不会持续更新、而是在之后保持不变 前100个填充。 如果有人 能告诉我哪里出错了、请告知我。   

#include 
#include 
#include 
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "driverlib/interrupt.h"
#include "driverlib/adc.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/sysctl.h"



uint32_t pui32ADC0Value[1];
uint32_t read_data[100];
uint16_t I = 0

int
main (void)
{
uint32_t ui32SysClock;

ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
SYSCTL_OSC_MAIN |
SYSCTL_USE_PLL |
SYSCTL_CFG_VCO_480)、120000000);

SysCtlPeripheralEnable (SYSCTL_Periph_TIMER0);

SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);

SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);

GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_3);

ADCSequenceConfigure (ADC0_BASE、3、ADC_TRIGGER_PROCESSOR、0);

TimerConfigure (TIMER0_BASE、TIMER_CFG_SPLIT_PAIR | TIMER_CFG_B_PERIODICASE);

ADCSequenceStepConfigure (ADC0_BASE、3、0、ADC_CTL_CH0 | ADC_CTL_IE |
ADC_CTL_END);

TimerLoadSet (TIMER0_BASE、TIMER_B、ui32SysClock / 1000);

IntMasterEnable();

TimerIntEnable (TIMER0_BASE、TIMER_TIMB_TIMEOUT);

IntEnable (INT_TIMER0B);

ADCSequenceEnable (ADC0_BASE、3);

ADCIntClear (ADC0_BASE、3);

TimerEnable (TIMER0_BASE、TIMER_B);

while (1)
{
if (i=99){
I=0;
}
}



void
Timer0BIntHandler (void)
{

TimerIntClear (TIMER0_BASE、TIMER_TIMB_TIMEOUT);

ADCProcessorTrigger (ADC0_BASE、3);

while (!ADCIntStatus (ADC0_BASE、 3、false)
{
}

ADCIntClear (ADC0_BASE、3);

ADCSequenceDataGet (ADC0_BASE、3、pui32ADC0Value);
read_data[i]=pui32ADC0Value[0];
i++;
}

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

      如果/当 I > 99时会发生什么情况?

    你犯了罪孽

    • 在没有联锁的情况下更新多个位置的共享值
    • 不执行边界检查

    此外、通过在计时器中断内执行 A/D 操作、您可以获得较长的中断响应。 我可以想到两种更好的方法。

    Robert

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

    同意... (这里有水果)

    如果此类行为逃避"边界检查"-海报使用:

    "如果(i=99)

    I=0;


    将通过"if (i>=99)"来提高稳健性、因为这会从"继续进行" if 测试"(永远!")中禁用"噪声干扰/其他 germlin "

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

    除了 CB1/Robert 提到的内容之外、我还建议对在 ISR 中更改的变量使用 volatile 声明。

    此外、在 while (1)中让 i=99签入实际上没有好处... ISR 也可能是:

    if (i <= 99)
    {
    i++;
    }
    否则
    {
    i = 0;
    } 

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

    感谢 Ralph、Robert、CB1_mobile 为您提供的所有帮助。 将 I 声明为易失性类型有助于我解决问题。  

    我将详细了解联锁和边界检查。

    我还想知道您对 Robert 的两种更好的思考方法。

    此致、

    Sourav