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.

[参考译文] EK-TM4C1294XL:如果 GPIO PD0配置为边沿触发模式、如何检测下降沿还是上升沿是否到达 ISR?

Guru**** 2535750 points
Other Parts Discussed in Thread: EK-TM4C1294XL

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/997692/ek-tm4c1294xl-how-to-detect-whether-falling-or-rising-edge-is-arrived-in-the-isr-if-the-gpio-pd0-is-configured-as-an-edge-triggered-mode

器件型号:EK-TM4C1294XL

你好

我正在使用 TM4C1294XL 评估板。 我要将波形发生器连接到电路板的 PD0。 因此、基本而言、我的任务是计算接收到的占空比的开通时间。 为此、PD0配置如下

	void GPIOInit()
	{

		//
		// Enable the GPIOD peripheral
		//
		SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
		
		//
		// Wait for the GPIOD module to be ready.
		//
		while(!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOD))
		{
		}
		
		//
		// Register the port-level interrupt handler. This handler is the first
		// level interrupt handler for all the pin interrupts.
		//
		GPIOIntRegister(GPIO_PORTD_BASE, GPIOD_Handler);
		
		//
		// Initialize the GPIO pin configuration.
		//
		// Set pins 0 as input, SW controlled.
		//
		GPIOPinTypeGPIOInput(GPIO_PORTD_BASE, GPIO_PIN_0);
		
		//
		// Make pins 0 rising edge triggered interrupts.
		//
		GPIOIntTypeSet(GPIO_PORTD_BASE, GPIO_PIN_0, GPIO_BOTH_EDGES);
		GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_0,0);
		
		i32Val = GPIOPinRead(GPIO_PORTD_BASE, GPIO_PIN_0);
		
		UARTprintf("\n\nInitial value of PD0 = '%d'",i32Val);
		
		//
		// Enable the pin interrupts.
		//
		GPIOIntEnable(GPIO_PORTD_BASE, GPIO_INT_PIN_0);
		
	}

现在、重点是、在 ISR 中、我想要检测上升沿或下降沿何时到达、以便能够准确地在下降沿到达时捕获计时器计数器值。 最初、我以为如果在引脚 PD0上接收到零、则接收到下降沿、如果接收到一个下降沿、则应该是上升沿、但我不确定这一点。我所写的内容如下、

void GPIOD_Handler(void)
{
		uint32_t status;
	
		status = GPIOIntStatus(GPIO_PORTD_BASE,true);
    //
    // Clear the interrupt.
    //
    GPIOIntClear(GPIO_PORTD_BASE, status);
	
		check_edge = GPIOPinRead(GPIO_PORTD_BASE, GPIO_PIN_0);
	
		if(check_edge == 0) //positive edge detected
		{	
			UARTprintf("\n\nPositive edge DETECTED!!");
			i32Val = GPIOPinRead(GPIO_PORTD_BASE, GPIO_PIN_0);
		
			UARTprintf("\nPositive Edge value of PD0 = '%d'",i32Val);
		}
		
		else if(check_edge == 1) //negative edge detected
		{
			flag = true;
			UARTprintf("\n\nNegative edge DETECTED!!");
			i32Val = GPIOPinRead(GPIO_PORTD_BASE, GPIO_PIN_0);
		
			UARTprintf("\nNegative Edge value of PD0 = '%d'",i32Val);
		}
			GPIOIntDisable(GPIO_PORTD_BASE, GPIO_INT_PIN_0);
}

此外、我要连接接收随机0 snd 1的输出!

因此、我想在 ISR 中确保接收到下降沿还是上升沿。

我们非常感谢您的任何帮助或建议!

此致、

Omkar Dixit

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

    您好!

     我认为您选择使用 GPIO 来测量输入时间是错误的。 您应该改为在边沿计时模式下使用计时器模块。 有关详细信息、请参阅计时器模块输入边沿计时模式。  

     C:\ti\TivaWare_C_Series-2.2.0.295\examples\boards\ek-tm4c1294xl\timer_edge_capture 中有一个执行占空比测量的示例。 我建议您参考该示例。 此示例使用两个计时器来测量任何占空比。 但是、如果占空比超过处理器进入中断所需的时间、您可能只能使用一个计时器。 换言之、在您的应用中、如果占空比足够长、您可能只能使用一个计时器。  在我看来、使用 GPIO 来测量时间不是正确的解决方案。

    //!  

    定时器 边沿 捕获 演示 (TIMER_EDGE_CAPTURE)

    //!
    //!  此 示例 演示 了如何  使用 两 个计时器  来确定  持续时间
    //!    高 电平周期的时间    。    相同 的逻辑也   可以应用 于
    //!  还 测量  低 电平周期。    该示例 在    拆分 模式 下使用计时器0、并
    //!   用于   创建 两   个24位宽定时器的8位预分频器。     有一些
    //!  需要      注意 的一些限制。       下限
    //!  结束 是   指由于             时间原因信号过快而无法使用计时器进行采样
    //!  执行 代码。        上限的限制 是   信号 周期  
    //!          超过139.8毫秒、此时24位 计时器 将执行此操作
    //!  溢出。   可以       通过使用 两  个32位计时器来解决该问题  
    //!   可以 测量       长达35.79秒的信号。
    //!
    //!  要 测试 此 示例 、可以         使用 将方波输入到 PL4和 PL5
    //!  信号 发生器 或 利用  另一 个 运行  TivaWare PWM 的 LaunchPad
    //!     例如 PWM_INTERRUPT。
    //!
    //!  此 示例 使用  以下 外设 和 I/O 信号。
    //!   - GPIO 端口 L 外设 (用于 TIMER0 引脚)
    //!  - T0CCP0 - PL4
    //!  - T0CCP1 - PL5
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Charles

    感谢您的快速回复。 好的、我将尝试您建议的方法。

    此致

    Omkar

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

    我已经尝试过您在上面建议的示例。 在我的项目中、我将仅使用一个引脚、该引脚将配置为计时器(PD0)。 那么、我想知道我能否在一个 Timer0AIntHandler ISR 中检测两个边沿、如果是、如何执行同样的操作?

    我已经尝试了很长时间、因此、任何帮助都将不胜感激!!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="457192" URL"~/support/microcontrollers/other/f/other-microcontrollers-forum/997692/ek-tm4c1294xl-how-to-detect-whether-falling-or-rising-edge-is-arrived-in-the-isr-if-the-gpio-pd0-is-configured-as-an-edge-triggered-mode/3687826 #368726"]因此,我想知道我能否检测一个 Timer0AIntHandler ISR 中的两个边沿(如果是),然后如何执行相同操作

    要检测两个边沿、只需指定两个边沿、如下例所示。  

    TimerControlEvent (TIMER0_BASE、TIMER_A、TIMER_EVENT_BULE_edges);

    [引用 userid="457192" URL"~/support/microcontrollers/other/f/other-microcontrollers-forum/997692/ek-tm4c1294xl-how-to-detect-whether-falling-or-rising-edge-is-arrived-in-the-isr-if-the-gpio-pd0-is-configured-as-an-edge-triggered-mode/3687826 #368726"]在我的项目中,我将仅使用一个引脚,该引脚将配置为计时器(PD0)。 [/报价]

    使用两个引脚可以更可靠地测量任何占空比、如果可能、我强烈建议您使用两个引脚。  如果您真的只想使用一个引脚、那么每次检测到边沿时都会生成中断。 在 ISR 中、您需要首先读取引脚状态。 如果引脚为高电平、则表示您具有上升沿。 保存当前的定时器值(通过调用 TimerValueGet ())并保存到一个名为 rise 的变量中。 下次当您收到中断时、它必须是下降沿、并将当前计数器值保存到名为 FRAGE_EDGE 的变量中。 当您获取差异(FRAW_EDGE - RISE_EDGE)时、它将成为您的占空比宽度。  

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

    好的、我将与我的团队讨论使用两个引脚而不是仅使用一个引脚的问题。 非常感谢 Charles 的详细解释。

    此致

    Omkar