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.

[参考译文] 如何正确触发外部中断并从GPIO 0-7读取数据

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/572407/how-to-properly-trigger-external-interrupts-and-read-data-from-gpio-0--7

主题:controlSUITE中讨论的其他部件

您好,TI:

 我是外部中断的初学者,我对如何触发外部中断和从GPIO端口读取数据有点困惑。

下面是我的测试要求:

1:我想使用GPIO10 触发具有下降边缘的外部中断

2:我将两个外部中断设置为GPIO8 (上升边缘)和GPIO9 (上升边缘),一个用于从GPIO0-GPIO7读取数据,另一个用于将数据写入GPIO0-GPIO7

3:下面是我的GPIO设置,请告诉我这里是否有一些错误:

   对于GPIO0至GPIO7,其余部分与GPIO0相同

GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0;//启用GPIO0 GpioCtrlRegs.GPAQSEL1.bit.GPIO0 = 3;//异步输入

  对于GPIO8和GPIO9:(GPIO 9与GPIO8相同)

gpioCtrlRegs.GPAMUX1.bit.GPIO8= 0; // GPIO
GpioCtrlRegs.GPADIR.bit.GPIO8 = 0; //输入
GpioCtrlRegs.GPAQSEL1.bit.GPIO8 = 0; // XINT1 Synch to SYSCLKOUT Only
GpioIntRegs.GPIOXINT1SEL.Bit.GPIOSEL = 8;// XINT1 is GPIO8

//配置XINT1
XIntruptRegs.XINT1CR.Bit.Polarity = 0; //下降边缘中断

//启用XINT1
XIntruptRegs.XINT1CR.bit.enable =1; //启用XINT1 

  对于GPIO10:

GpioCtrlRegs.GPAMUX1.bit.GPIO10 = 0;// GPIO10 = GPIOCtrlRegs.GPAQSEL1.bit.GPIO10
= 3;//异步输入
GpioIntRegs.GPIOLPMSEL.bit.GPIO10=1;// GPIOGPIO10将唤醒设备 

以下是用于读取GPIO端口A的中断代码:

中断void XINT1_ISR(void)
{
	ReadData =(GpioDataRegs.GPADAT.ALL & 0x0万FF);//

	确认此中断以从组1
	PIeCtrlRegs.PIEACK/ALL = PIEACK_Group1;
}获取更多信息 

但我不知道如何编写代码来将触发器GPIO 10连接到这两个中断,请帮助。

谢谢!

(我使用的是F2.8055万,其中controlSUITE中的示例代码为ExternalInterrupts.c)

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

    下图是我正在接收的信号:

    D0-D7是GPIO0-GPIO7

    D8是XINT1,D9是XINT2

    D10是GPIO10

    我想在D10低且D8低时从GPIO0-7读取0.1万

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在XINT ISR内,您可以添加检查以查看GPIO10值是否为'0',然后只从GPIO0-GPIO7引脚读取数据(GPIO10的作用类似于启用)。 这项工作或要求是否不同?

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

    请纠正我的理解。
    GPIO8和GPIO9将是您的读和写触发器。 它们连接到XINT1和XINT2。 您希望使用GPIO10启用读/写功能,但不确定如何操作。 这是否正确?
    您使用的是低功耗模式吗? (您已使用GpioIntRegs.GPIOLPMSEL寄存器)

    如果您只需要一个门来防止在GPIO10未正确"设置"的情况下读取或写入,您有几个选项。
    1.将XINT3配置为由GPIO10触发。 这将使用最后一个可用的外部中断。 基本上,您可以启用或禁用其中的其他XINT。
    2.在触发XINT1或XINT2时轮询GPIO10的状态。 例如,如果GPIO10为低电平,并且触发了XINT1,则允许读取。 如果GPIO10较高且触发了XINT1,则不要允许读取。 这是一个例子,但我认为这个想法是正确的。


    谢谢!
    标记
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    正确! 您的观点是正确的。
    我没有使用低功耗模式,我从外部中断示例代码复制了GPIO设置。
    对我来说最大的问题是100 % ,我不知道如何为不同目的设置GPIO,在哪里可以找到有关此GPIO设置的文档。
    您是否会帮助我验证上述GPIO设置?
    GPIO0-GPIO7作为输入和输出
    GPIO8和GPIO9作为XINT1和XINT2
    GPIO10作为输入或XINT3

    与配置XINT3至GPIO10和在触发XINT1或XINT2时轮询GPIO10的状态相比,哪一项更高效,更易于编码?

    是否有任何示例代码可帮助我连接触发器和中断?
    谢谢Mark!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    浙江

    请通读F2805x的TRM。 这将使您详细了解所有可能进行的配置。 您似乎也很清楚controlSUITE中提供的示例代码。 请继续使用这些参考资料,并亲自尝试。 这些信息应妥善记录,并为您提供设备的完整视图。

    至于哪种实施更好,这取决于您的应用程序。 您可能需要考虑以这种或那种方式进行的权衡。 controlSUITE中的示例代码是我们能够提供的所有代码。 外部中断示例就是您开始此操作所需的全部内容。 听起来您对C2000和编程也很陌生,因此,浏览我横幅中链接的研讨会材料,然后继续进行测试可能是一个好主意。

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

    Mark,您好!

    感谢您的帮助,我终于让它发挥了作用。

    我能够读取08,而D8和D10的读数较低。

    中断void XINT1_ISR(void)
    {
    	IF(GpioDataRegs.GPADAT.bit.GPIO10 ==0)
    	{
    	ReadData =(GpioDataRegs.GPADAT.ALL & 0x0万FF);
    	}//
    	确认此中断以从组1
    	PieCtrlRegs.PIEGroupACK.ALL = PIEACK_1获取更多信息
    ;}
    

    我的代码的缺点是我无法在每次发生中断时读取数据。 因为D10不总是0。

    所以,我想让D10作为我的第三个中断,D8和D9位于我的D10中断内。

    因此我添加了以下代码:

    中断void XCS_ISR(void)
    {
    	void XINT1_ISR(void);
    	xcscount++;//
    	确认此中断以从组1
    	中获取更多信息PieCtrlRegs.PIEACK.ALL = PIEACK_Group1;
    
    } 

    但是我无法进入D10 XCS_ISR的第二个XINT1_ISR,这是什么原因导致了此问题的发生?  

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

    我无法在每次发生中断时读取数据。 因为D10不总是0。
    我希望能够在每次发生外部中断时读取数据