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/CC2640:按下按钮时中断。

Guru**** 2589280 points


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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/604992/rtos-cc2640-interrupt-upon-button-pressed

器件型号:CC2640

工具/软件:TI-RTOS

大家好、

我正在使用定制板、其中有一个按钮、如下所示、

SW2通常处于开路状态、因此信号 PWR_DWN 被 R1拉低。

按下 SW2 (闭合)时、VCC_3V 直接连接到 PWR_DWN、这会将 PWR_DWN 信号拉至高电平。  

我想生成一个中断来检测何时按下按钮。 我的代码是 ass Follow、

静态 PIN_Handle 按钮 PinHandle;
静态 PIN_STATE 按钮 PinState;
PIN_Config buttonPinTable[]={
ioID_19 | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_NEGEDGE、
PIN_TERMINATE
};

void buttonCallbackFxn (PIN_Handle handle、PIN_ID pinId){
System_printf ("按下按钮。\n"); System_flush ();
/*去抖逻辑,仅在按钮仍被按下(低电平)时切换*/
//CPUdelay (8000*50);
if (PIN_getInputValue (pinId)){
开关(pinId){
案例 IOID_19:
System_printf ("按钮1被按下。\n");System_flush ();
中断;
默认值:
/*不执行任何操作*/
中断;
}
}


int main(){

//调用电路板初始化函数
Board_initGeneral();
I2C_init();
Board_initSPI();
Board_initUART();
// Board_initWatchdog();

PIN_setOutputValue (buttonPinHandle、IOID_19、0);
buttonPinHandle = PIN_OPEN (buttonPinState、buttonPinTable);
if (!buttonPinHandle){
System_abort ("初始化按钮针脚时出错");
}

/*设置按钮引脚的回调*/
if (PIN_registerIntCb (buttonPinHandle、&buttonCallbackFxn)!= 0){
System_abort ("注册按钮回调函数时出错");
}

//PIN_setInterrupt (buttonPinHandle、IOID_19 | PIN_IRQ_NEGEDGE);
PIN_setConfig (buttonPinHandle、PIN_BM_IRQ、IOID_19   | PIN_IRQ_BOTHEDGES); 

/*启动 BIOS */ BIOS_start(); 返回0; }
但是、当我尝试按下按钮时、不会打印输出。 我可能出了什么问题?
谢谢、
Henry
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Henry、

    您是否将其配置为启用中断、例如:
    PIN_setConfig (buttonPinHandle、PIN_BM_IRQ、Board_BTN | PIN_IRQ_BOTHEDGES);

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

    非常感谢您对 Zahid 的快速响应、

    我已将此行添加到我的代码中(也修改了我的主帖子)。

    PIN_setConfig (buttonPinHandle、PIN_BM_IRQ、IOID_19 | PIN_IRQ_BOTHEDGES); 

    我仍然无法获取中断。 能否检查 buttonPinTable 是否正确? 大多数代码是从 pinInterrupt 项目继承的、但我不确定是否需要为按钮修改任何内容。

    如果我将 buttonPinTable 修改为、

    ioID_19 | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_迟滞、 

    我从回调函数中打印了一次 print 语句、但我在该函数之后多次按下按钮、没有响应。 我是否需要  用于按钮中断的 PIN_IRQ_NEGEDGE 或 PIN_IRQ_POedge?

    谢谢、

    Henry

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    能否从 buttonPinTable 中删除 PIN_PULLUP 以查看其是否起作用?

    祝你一切顺利
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢 Zahid 的帮助。

    我将在回到板后尝试它、我将告诉您它是否解决了问题。

    此致、
    Henry
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    哇,它很有效!!! 非常感谢 Zahid。

    您是否介意解释您为什么认为这是解决它的方法?

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

    您好!

    根据您的原理图、如果您有一个上拉电阻器、并且 SW2为开路、则上拉电阻器可能会阻止它变为低电平、因此它始终保持高电平。 您可能可以使用逻辑分析仪/示波器检查信号以进行验证。

    祝你一切顺利  

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

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

    您好 Zahid、

    我还有一些与该主题相关的问题、我认为如果我将问题直接发布到该主题、而不是创建新问题、我可能会从中受益、

    • 与单个按钮相比、如何检测长按按钮(例如5秒)中断?
    • API HAL_SYSTEM_RESET()允许软件复位,如果我希望 API 关闭系统(直到执行另一个长按按钮),我可以使用什么?

    非常感谢、

    Henry

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您可以将上升沿和下降沿都注册为中断触发器、并计算上升沿和下降沿之间的持续时间、以了解是否按下按钮5秒钟。 或者、您也可以参考 sensortag_keys.c 中 sensortag 示例的 reset_press_period 实现。
    请尝试参考 e2e.ti.com/.../2142827中的讨论