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/MSP430F5529:在 msp430f5529lp 上使用 cc3100sdk 实现按钮中断、在将 SDK 示例导入 CCS 时询问现有代码的正确使用

Guru**** 2393395 points
Other Parts Discussed in Thread: CC3100SDK, CC3100BOOST, CC3100

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/568149/ccs-msp430f5529-implementing-button-interrupt-with-cc3100sdk-on-msp430f5529lp-question-on-correct-use-of-existing-code-when-sdk-example-is-imported-into-ccs

器件型号:MSP430F5529
主题中讨论的其他器件:CC3100SDKCC3100BOOSTMSPWARECC3100

工具/软件:Code Composer Studio

你(们)好 从 cc3100sdk 导入项目时、我无法理解使用 CCS 提供的代码的最佳实践。 我想设置一个中断来处理按钮按压操作(在 P1.4上)、并看到 board.c 中有我认为应该添加或修改的现有代码(例如 Port1_ISR 和 registerButtonIrqHandler)。 很遗憾、我找不到任何有关如何正确添加到此代码的文档。 Board.c/h 具有 s1的现有代码(ccp3100boost 涵盖的 msp430f5529lp 上的开关、因此我无法使用该现有代码、但希望复制或修改它)。


我已经尝试在 board.c 中添加一个函数、我可以将 button_press_handler 指向该函数、并且可以在此函数中设置一个标志、我可以在主函数中引用该标志。 这在编译时创建的 obj 文件中创建了重新定义符号的错误。 例如、错误符号"btnP1_4Flag"首先在"./main.obj"中定义;在"./board/board.obj 中重新定义 是否应在 user.h 和 main.c 文件中写入此代码、同时保持 board.c/h 不变? 感谢您指引我正确的方向来解决这个问题。


我使用的是 CCS7、编译器 MSP430_4.3.1、cc3100sdk_1.2.0以及 msp430f5529lp 和 cc3100BOOST。


我已从下面的 board.c 中选择了我要引用的代码...

button_press_handler buttonIrqHandler = 0;
static void enable_button_s1_IRQ ()
{
PADIR &=~0x1080;
P2OUT |= BIT1;
P2DIR &=~(BIT1);
P2REN |= BIT1;
P2IES &=~(BIT1);
P2IFG = 0;
P2IE |= BIT1;
}
void enableButtonIrq (void)
{
enable_button_s1_IRQ ();
}

int registerButtonIrqHandler (button_press_handler InterruptHdl、void* pValue)
{
buttonIrqHandler = InterruptHdl;

/*启用开关中断*/
enableButtonIrq();

返回0;
}
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector=Port1_vector
__interrupt
#elif defined (__GNU__)
__attribute__(interrupt (Port1_vector)))
#endif
void Port1_ISR (void
){void}
在调用中断矢量之前、//上下文保存中断标志。 *
/*读取中断矢量发生器将自动清除 IFG 标志*/

开关(__evo_in_range (P1IV、P1IV_P1IFG7))
{
/*矢量 P1IV_NONE:无中断挂起*/
案例 P1IV_NONE:
中断;

/*向量 P1IV_P1IFG0:P1IV P1IFG.0 *
案例 P1IV_P1IFG0:
中断;
...
案例 P1IV_P1IFG7:
中断;

/*默认情况*/
默认值:
中断;
}
}

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

    您好、Nick、

    您将在 Resource Explorer / MSPWare 中找到有关为 MSP 产品设置中断和创建 ISR 的更多示例。

    board.h/.c 文件是作为代码示例创建的、可用于在应用中执行特定于电路板的设置。 在这种情况 下、button_press_handler 只是一种允许在按下 MSP430F5529LP 上的 Button P2.1时从实际 GPIO 端口 ISR 间接调用应用程序函数(在 main.c 中定义)的方法。 这样做是为了简化 IntSpiGPIOHandler()中的代码,因为调用它是为了处理两个不同的中断源:CC3100接口的主机中断和连接到 P2.1的按钮。  SDK 中的 MQTT 示例演示了如何实现这一点、因为它使用按钮。

    在编写代码以处理不同引脚上的中断时、不必使用相同的方案。 相反,在 PORT1_ISR()函数的适当情况下,您可以将要执行的代码放置在 P1.4的中断上。

    同样、我建议查看 Resource Explorer 中的 MSP430F552x 示例、以获取为其编写应用代码的其他参考。

    此致、

    本·M

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

    谢谢 Ben。 MQTT 示例正是我要找的。 我将在记录中的 msp430f5529lp 的 http_client 示例中包含对 board.c/h 和 main.c 的更改。 我有一个关于 ENABLE_Button 函数中 PADIR &=~0x1080分配的后续问题。 由于 PADIR 同时处理高位和低位字段(端口1和2)、0x1080的十六进制值是否会清除引脚1.7和2.4 (Launchpad 上 S1不需要1.4)?

    不管怎样、这现在对我来说是可行的。 再次感谢您的快速回复!

    /***** 来自 board.h ***** /*
    
    P1.4的事件处理程序不是原始 cc3100sdk 代码的一部分
    */
    void button_p1_4_eventhandler (void);
    
    /***** 从 board.c **** /*
    !
    \brief 启用 P1.4上按钮的 IRQ
    复制自 board.c 中的示例
    enable_button_s1_IRQ ()
    */
    static void enable_button_p1_4_IRQ ()
    {
    //PADIR &=~0x1080;
    P1OUT |= BIT4; //将引脚设置为高电平
    P1DIR &=~(BIT4);//设置引脚输入
    P1REN |= BIT4; //启用上拉
    P1IES &=~(BIT1);//从高电平到低电平的转换
    P1IFG = 0; //取消中断
    P1IE |= BIT4; //启用
    }
    /*
    \brief 禁用 P1.4
    */
    静态空 disable_button_p1_4_IRQ ()
    {
    P1IE &=~BIT4;
    }
    void enableButtonIrq (void)
    {
    //enable_button_s1_IRQ ();
    ENABLE_button_P1_4_IRQ ();
    }
    
    void disableButtonIrq (void)
    {
    //disable_button_s1_IRQ ();
    disable_button_p1_4_IRQ ();
    }
    #if defined (__TI_Compiler_version__)|| defined (__IAR_systems_icc_)
    #pragma vector=Port1_vector
    __interrupt
    #elif defined (__GNU__)
    __attribute__((interrupt (port1_vector)))#endif_port1_isr (
    
    void
    
    在调用中断矢量之前、//上下文保存中断标志。 *
    /*读取中断矢量发生器将自动清除 IFG 标志*/
    
    开关(__evo_in_range (P1IV、P1IV_P1IFG7))
    {
    /*向量 P1IV_P1IFG4:P1IV P1IFG.4 *
    案例 P1IV_P1IFG4:
    if (buttonIrqHandler)
    {
    disableButtonIrq();
    buttonIrqHandler();
    }
    中断;
    /*默认情况*/
    默认值:
    中断;
    }
    }/****
    从 main.c **** /*
    在全局变量部分中*
    ////*处理 msp430f5529lp 板上的按钮事件*/
    enum IO_Events{no_action =-1、push_button_pressed = 0};
    enum IO_Events g_IO_Events;
    //*!
    * P1.4上的按钮事件处理程序
    */
    void button_p1_4_eventhandler (void)
    {
    G_IO_Events = push_button_pressed;
    }
    int mainb (int argc、char** argv)
    {
    //仅显示对 RE 按钮(P1.4)处理程序的更改*
    registerButtonIrqHandler (button_P1_4_eventandler、NULL);
    /*按下测试按钮*/
    for (;;)
    {
    if (push_button_pressed = g_io_events)
    {
    cli_Write ("按键\n");
    G_IO_Events = NO_ACTION;
    enableButtonIrq();
    }
    }
    返回0;
    } 

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

    您好、Nick、

    我很高兴您能使用它!

    是的、我相信您指出的引脚是将被清除为输出的引脚。 之后的线路应该用于在 LP 上设置 P2.1以使用 SW1。 按您的方式移除直线应该可以正常操作。


    此致、
    本·M

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

    很抱歉没有清楚说明我的后续问题。 在 board.c 的 ENABLE_button_s1_IRQ 函数中设置 PADIR &=~1080的用途是什么? 我的理解是、这将使 P2.4和 P1.3输入和所有其他引脚输出。 P2.1 (连接到 MSP430F5529LP 上 S1的引脚)在稍后的功能中通过 P2DIR &=~(BIT1)清零。 出于我的目的、我刚才在函数中注释了 PADIR 行、我用于启用连接到 P1.4的非板载开关、但这可能不是正确的方法。 我将复制此处 board.c 中的原始代码。 再次感谢!

    /*!
    \brief 为 Launchpad 上的按钮 S1启用 IRQ
    
    \param[in] 无
    
    返回 无
    
    注意
    
    \warning
    */
    static void enable_button_s1_IRQ ()
    {
    PADIR &=~0x1080;
    P2OUT |= BIT1;
    P2DIR &=~(BIT1);
    P2REN |= BIT1;
    P2IES &=~(BIT1);
    P2IFG = 0;
    P2IE |= BIT1;
    } 

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

    由于使用了"~"、因此它似乎是按位执行、并使用 PADIR 和二进制值1110 1111 0111 1111。 这应清除2.4和1.7的 DIR 位。 这意味着它会将这两个引脚设置为输入、但仅保留其余引脚(输入或输出)的状态。

    如果在应用程序的早期调用、PADIR 可能是0x0000、这意味着调用将不起作用。

    此致、
    本·M
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、我将0x1080与0x1008混用、正如您所说的、PADIR 的"&d "一词是1110 1111 0111 1111清除与 P2.4和 P1.7相关的位。 由于原始函数启用了 P2.1、我仍然感到困惑、不确定这是否会随着我的应用程序变得更加复杂而逐渐增加。 但我现在将按照您的建议、将此语句从 ENABLE_button_P1_4_IRQ 函数中删除。
    谢谢、
    N