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.

[参考译文] RTOS/MSP-EXP430F5529LP:P2_0的GPIO中断设置

Guru**** 2595805 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/640959/rtos-msp-exp430f5529lp-gpio-interrupt-setup-for-p2_0

部件号:MSP-EXP430F5529LP

工具/软件:TI-RTOS

我希望配置GPIO引脚以中断来自DS3231 RTC芯片的低波方波信号。

我从gpiointerrupt示例开始,并进行了以下更改。 目的是使用TI-RTOS为每个端口中断设置1个回调,然后使用索引值切换到相应的pin操作。 我在MSP_EXP430F5529LP.c中为gpioPinConfigs添加了GPIO引脚设置,在 MSP_EXP430F5529LP.h中为额外引脚添加了GPIO引脚名称

/*
========= MSP_EXP430F5529LP.c =========
*此文件负责为
* MSP_EXP430F5529LP主板设置特定于主板的项目。
*/
gPIO_PinConfig gpioPinConfig[]={
/*输入引脚*/
具有下降边缘中断的/* MSP_EXP430F5529LP_RTC P2_0输入*/
GPIOMSP430_P2_0 | GPIO _CFG_IN_PU | GPIO _CFG_IN_INT_ST_Falling,
/* MSP_EXP430F5529LP_S1 */
GPIOMSP430_P2_1 | GPIO _CFG_IN_PU | GPIO _CFG_IN_INT_INT_Rising,
/* MSP_EXP430F5529LP_S2 */
GPIOMSP430_P1_1 | GPIO _CFG_IN_PU | GPIO _CFG_IN_INT_INT_Rising,

/*输出引脚*/
/* MSP_EXP430F5529LP_LED1 */
GPIOMSP430_P1_0 | GPIO _CFG_OUT _STD | GPIO _CFG_OUT _STR_HIGH | GPIO _CFG_OUT低,
/* MSP_EXP430F5529LP_LED2 */
GPIOMSP430_P4_7 | GPIO _CFG_OUT _STD | GPIO _CFG_OUT _STR_HIGH | GPIO _CFG_OUT低,
};
。
。
。
/**===========================================================================================
*@文件 MSP_EXP430F5529LP.h
*
*@简介 MSP_EXP430F5529LP特定于板的API
*
* MSP_EXP430F5529LP头文件应包含在应用程序中
,如下所示:
*@code
*#include <MSP_EXP430F5529LP.h>
*@endcode
*
*===================================================================================
*//*
!
*@def MSP_EXP430F5529LP_GPIOName
*@MSP_EXP430F5529LP开发板上GPIO名称的简要枚举
*以PinConfigs的顺序排列[]
*/
typedef MSP_EXP430F5529LP_GPIOName {
	MSP_EXP430F5529LP_RTC =0,/*端口2 PMST_P430P551/
	端口1
MSP_EXP430F5529LP_S2,/*端口1引脚1 */

MSP_EXP430F5529LP_LED1,
MSP_EXP430F5529LP_LED2,

MSP_EXP430F5529LP_GPIOCOUNT
} MSP_EXP430F5529LP_GPIOName;

/* main */*

要由GUI Composer读取的变量*/
int count1 = 0;
int count2 = 0;
/*要由GUI读取的变量*/
// int rComposer count = 0;




/*==tc=
gpioPortFxn2 =========
端口2的* Callback函数
*如果索引位于gpioPinConfigs[]中,则应该得到0或1*/

void gpioPortFxn2 (无符号int索引)
{
/*清除GPIO中断并切换LED */
GPIO切换(Board_LED1);

如果(count2++== 100){
count2 = 0;
}
system_printf ("Port2 Int %d,%d\n",count2,index);
SYSTEM_FLUSE();
}/*


==== gpioPortFxn1 =========
*用于BOARD_BUTTON0上GPIO中断的回调函数。
***如果索引在gpioPinConfig[]中的位置,则我们应该得到2
*/
void gpioPortFxn1 (无符号int索引)
{
/*清除GPIO中断并切换LED */
GPIO切换(Board_LED0);

如果(count1++== 100){
Count1 = 0;
}
system_printf ("Port1 Int %d,%d\n",count1,index);
SYSTEM_FLUSE();
}/*
*/
/*
=== 主====
*/
int main (void)
{
/*呼叫板初始化函数*/
Board_initGeneral ();
Board_initGPIO ();
Board_initUART();

/*打开用户LED */
GPIO写入(Board_LED0,Board_LED_ON);

system_printf ("启动GPIO中断示例\n系统提供程序已设置"
"到SYSMIN。 停止目标以查看任何SYSMIN内容"
" ROV。\n");
/*只有在调用flush或exit */时,SYSMIN才会打印到控制台
system_flush();
//
/*安装回调*/
GPIO_setCallback(MSP_EXP430F5529LP_RTC,gpioPortFxn2);
GPIO_setCallback (Board_BUTTON0,gpioPortFxn1);
GPIO _setCallback (Board_Button1,gpioPortFxn2);
/*启用中断*/
GPIO_enableInt (MSP_EXP430F5529LP_RTC);
gPIO_enableInt (BOD_BUTTON0);
gPIO_enableInt (Board_Button1);


/*启动BIOS */
BIOS_START();

返回(0);
}

使用此代码,原始按钮操作会触发中断,并且我从2个回调函数获得到控制台的输出。

但是,附加GPIO中断不响应。 我还注意到P2_0显示0v,因此我想知道在针脚设置中是否遗漏了一些内容?

启动GPIO中断示例
系统提供程序设置为SYSMIN。 停止目标以查看ROV中的任何SYSMIN内容。
端口2内置1,2
端口2内置2,2
端口1内置1,1
端口1内置2,1
端口1内置3,1
端口1内置4,1 

我意识到我在这里错过了一些东西。 我欢迎任何建议。

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

    首先,您是否有理由需要使用TIRTOS? 如果不是这样,只需配置适当的寄存器(或使用driverlib)就可以更容易地完成此操作,因为您似乎实际上并没有使用任何RTOS特定的功能。


    至于您当前的代码,您似乎有一个回调应用于2个PIN:MSP_EXP430F5529LP_RTC和Board_Button1。 因此,我不确定您的中断标志是否被正确清除,在这种情况下,您将无法看到中断正确生成。 如果我理解您尝试正确执行的操作,我不知道为什么您会有1个与多个输入引脚中断关联的回调。

    此致,
    Nathan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我想我可能已经解决了这个问题。 P2_0未生成中断。 它链接到1.1。 可能正在使用此计时器并抓住了该引脚-也许TI-RTOS专家可以确认或解释这一点。

    所以我把输入移到了WFP 2.2 ,并配置了配置,比如为P2_2添加一个条目

    gPIO_PinConfig gpioPinConfig[]={
    /*输入引脚*/
    /* MSP_EXP430F5529LP_P2_2 */
    GPIOMSP430_P2_2 | GPIO_CFG_IN_PU | GPIO _CFG_IN_INT_Falling,
    /* MSP_EXP430F5529LP_S1 */
    GPIOMSP430_P2_1 | GPIO _CFG_IN_PU | GPIO _CFG_IN_INT_INT_Rising,
    /* MSP_EXP430F5529LP_S2 */
    GPIOMSP430_P1_1 | GPIO _CFG_IN_PU | GPIO _CFG_IN_INT_INT_Rising,


    /*输出引脚*/
    /* MSP_EXP430F5529LP_LED1 */
    GPIOMSP430_P1_0 | GPIO _CFG_OUT _STD | GPIO _CFG_OUT _STR_HIGH | GPIO _CFG_OUT低,
    /* MSP_EXP430F5529LP_LED2 */
    GPIOMSP430_P4_7 | GPIO _CFG_OUT _STD | GPIO _CFG_OUT _STR_HIGH | GPIO _CFG_OUT低,
    };



    /*!
    *@def MSP_EXP430F5529LP_GPIOName
    *@MSP_EXP430F5529LP开发板上GPIO名称的简要枚举
    */
    typedef enum MSP_EXP430F5529LP_GPIOName {
    MSP_EXP430F5529LP_P2_2 = 0,
    MSP_EXP430F5529LP_S1,
    MSP_EXP430F5529LP_S2,

    MSP_EXP430F5529LP_LED1,
    MSP_EXP430F5529LP_LED2,

    MSP_EXP430F5529LP_GPIOCOUNT
    } MSP_EXP430F5529LP_GPIOName;

    我在main中有3个回调函数,它们与每个中断链接在一起,通过快速测试可以得出以下输出:

    端口2 Int 1,索引2
    端口2 Int 2,索引2 /*-板载按钮2.
    端口1 Int 1,索引1
    端口1 Int 2,索引1
    端口1 Int 3,索引1
    端口1内置4,索引1/*-板载按钮1
    PRT 2 Int 1,索引0
    PRT 2 Int 2,索引0
    PRT 2 Int 3,INDEX 0 /*测试引脚,用于RTC SQW

    根据我的理解,索引值是GPIOName枚举中的位置,因此可以标识触发中断的引脚。 因此,相关回调应该能够为任务呼叫SWI或信号量。

    我欢迎在我进一步说之前,确认我的假设是正确的--谢谢。
    TED
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Nathan感谢您的评论。
    这是一个测试设置,用于查看某个特定要求是否在RTOS中有效。 整个项目将在适当时候使用RTOS。
    我认为每个引脚有一个回调是可行的,但我怀疑有一个回调作为基于索引值的解压程序可能是可行的。 我只是想测试一下可以做些什么。 但是,在发布时,这不是问题。 我在P2_0上没有中断。 请参阅上面或下面的,了解如何使用P2 - 2。
    TED
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已经用3个单独的引脚中断的一个共享回调进行了测试:

    GPIO_setCallback(MSP_EXP430F5529LP_P2_0, gpioPortSharred );
    GPIO_setCallback (Board_BUTTON0,gpioPortShorred);
    GPIO _setCallback (Board_Button1, gpioPortShared);
    GPIO_enableInt (MSP_EXP430F5529LP_P2_0);
    gPIO_enableInt (BOD_BUTTON0);
    gPIO_enableInt (Board_Button1);

    /*
    *========= gpioPortSharp=========
    * GPIOs的共享回叫功能
    *如果索引在gpioPinConfig[]中的位置,则应该得到0或1或2
    */
    void gpioPortShared(无符号int索引)

    /*清除GPIO中断并切换LED */
    GPIO切换(Board_LED1);

    如果(count3++=100){
    计数3 = 0;
    }
    system_printf (“回调索引%d,计数:%d\n”,索引,计数3);
    system_flush();
    }

    这给出了如下输出-全部来自同一个函数'gpioPortShared'

    回叫索引2,计数:1
    回叫索引1,计数:2
    回叫索引1,计数:3
    回叫索引2,计数:4
    回叫索引2,计数:5
    回叫索引0,计数:6
    回叫索引0,计数:7
    回叫索引0,计数:8
    回叫索引0,计数:9
    回叫索引0,计数:10

    索引0之前是PIN2_2,索引1在P2_1上是Button0,索引2在P1_1上是Button1

    这样就可以做到。 是否应该这样做是另一个问题。
    TED
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Ted,

    我确实认为PIN mutxing是您无法获得PIN2_0的原因。 您可以通过检查TIRTOS中的计时器配置来验证这一点。

    至于使用索引,我看不出有什么理由不起作用,也看不出为什么不这样做。 但是,需要考虑的一点是,是否有可能同时(或几乎同时)生成这些中断。 根据您将尝试对中断执行的确切操作,如果在仍对上一个中断执行回调时需要再次调用回调,则可能会出现问题。 这是您可能考虑使用单独回调函数的唯一原因。

    此致,
    Nathan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Nathan
    谢谢-我得出了相同的结论-尽管我不确定5529LP上TI-RTOS中的哪个功能使用1.1。 这个阶段部分是探险。 什么是可行的,什么是可取的。 我的目的是每秒输入一个键盘而不是按钮,因此共享回叫的问题在任何情况下都不是问题。 也许共享回缩的概念可能对其他人有用。
    谢谢
    TED