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/TM4C123GH6PM:由 GPIO 事件触发 Tiva C ADC

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/835516/ccs-tm4c123gh6pm-tiva-c-triggering-adc-by-gpio-event

器件型号:TM4C123GH6PM

工具/软件:Code Composer Studio

你好。 我有下一个任务。 我接收来自压实器的2个信号、看起来像50% PWM 100Hz、并彼此相移90度。 每次切换信号时、我需要使 ADC 采样(每周期4次或400Hz)。 我为该任务编写了下一个代码。

static void adcInterruptHandler(){

unsigned int state = ADCIntStatus (ADC0_BASE、0、true);
ADCIntClear (ADC0_BASE、0);

int32_t tmp[2];
ADCSequenceDataGet (ADC0_BASE、0、(uint32_t *) tmp);
ADCSequenceDataGet (ADC0_BASE、0、(uint32_t *) tmp+1);
}

静态空 initAdc (){
SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);

while (!SysCtlPeripheralReady (SYSCTL_Periph_ADC0));

ADCSequenceConfigure (ADC0_BASE、0、ADC_TRIGGER_EXTERNAL、0);
//设置序列
ADCSequenceStepConfigure (ADC0_BASE、0、0、ADC_CTL_CH1);
ADCSequenceStepConfigure (ADC0_BASE、0、1、ADC_CTL_CH0 |
ADC_CTL_IE | ADC_CTL_END);
//中断设置
ADCIntRegister (ADC0_BASE、0、adcInterruptHandler);
ADCIntEnable (ADC0_BASE、0);
ADCSequenceEnable (ADC0_BASE、0);
ADCIntClear (ADC0_BASE、0);
}

静态空 initGpioInterrupt (){
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
GPIOPinTypeGPIOInput (GPIO_PORTF_BASE、GPIO_PIN_0);
GPIOPinTypeGPIOInput (GPIO_PORTF_BASE、GPIO_PIN_4);
GPIOPadConfigSet (GPIO_PORTF_BASE、GPIO_PIN_0、GPIO_Strength _2mA、GPIO_PIN_TYPE_STD_WPU);
GPIOPadConfigSet (GPIO_PORTF_BASE、GPIO_PIN_4、GPIO_Strength _2mA、GPIO_PIN_TYPE_STD_WPU);
GPIOIntTypeSet (GPIO_PORTF_BASE、GPIO_PIN_0、GPIO_BLE_ARES);
GPIOIntTypeSet (GPIO_PORTF_BASE、GPIO_PIN_4、GPIO_BLE_ARES);


GPIOADCTriggerEnable (GPIO_PORTF_BASE、GPIO_PIN_0);
GPIOADCTriggerEnable (GPIO_PORTF_BASE、GPIO_PIN_4);
} 

当我使用按钮模拟事件时、此代码运行良好、但在实际环境中、它会转到 FaultISR。 看起来、信号在一个瞬间内会发生几次抖动和触发事件。 我需要通过跳过冗余事件来解决此故障、但如何解决?

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

    您的输入看起来是什么样的? 您如何知道它是毛刺脉冲?

    尝试使用 GPIO_FALLING_EDGE 而不是 GPIO_Bot_Edges 的实验。 您是否仍在运行 FaultISR?

    如果您确定输入存在干扰、则需要对输入进行去抖。  

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

    您好、Charles、

    应该指出的是-此外:

    • 'main'已通过某种方式转义海报的代码列表
    • 'PF0'-当 MCU 为4C123时-需要'解锁'-无证据

    在故障条件下、示波器电容器会极大地"加快、简化、增强"诊断功能。

    减去 PF0的解锁-海报的(几乎)工作报告-似乎"已准备好辩论"。

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

    您好 CB1、

     再次感谢。 你是对的。 必须先解锁 PF0并将其提交、然后才能将其用作 GPIO。  

    GPIOCR 是确认寄存器。 GPIOCR 寄存器的值决定了哪个
    GPIOAFSEL、GPIOPUR、GPIOPDR 和 GPIODEN 寄存器中的位在 A 时被确认
    执行到这些寄存器的写入。 如果 GPIOCR 寄存器中的某位被清零、那么数据将被写入
    GPIOAFSEL、GPIOPUR、GPIOPDR 或 GPIODEN 寄存器中相应的位不能
    并保留其先前的值。 如果 GPIOCR 寄存器中的某位被置位、则数据为
    写入 GPIOAFSEL、GPIOPUR、GPIOPDR 或 GPIODEN 寄存器的相应位
    被提交到寄存器并反映新值。