请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:CC2650 主题中讨论的其他器件: CC2630
工具/软件:TI-RTOS
您好!
我的项目需要一年时间、但尚未完成、我从 CC2630更改为 CC2650、但现在还有另一个问题。
我在 DIO 上有一些按钮和上拉电阻器、它控制风扇和接触器、在风扇和接触器改变其状态(从附近的一个中、使用同一条交流线路)时、通过交流/直流转换器的电源运行、
按钮中断调用(按钮未按下)的代码会导致按钮行为错误。 我有二极管来消除继电器线圈的干扰,交流/直流转换器是 PWM 1,二极管电桥,带有全电容器滤波器。
这是按钮代码:
/*创建 MSA 密钥引脚表。 这将覆盖 * BoardGpioInitTable[]中的关键属性。 */ 静态 PIN_Config keyPinTable[]= { Board_key_reset | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_迟滞、// key_reset
Board_key_B1 | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_迟滞、// key_B1
PIN_TERMINATE /*终止列表*/ };
…
/********* *@fn board_key_keyFxn * @按键的简短中断处理程序 * / void board_key_keyFxn (PIN_Handle keyPinHandle、PIN_ID keyPinId) { UINT_t b1Active = 0; UINT_t resetActive = 0; //不使用输入参数 (空) keyPinHandle; if (keyPinId = Board_key_B1) { //获取 PIN 值,它为低电平有效 if (PIN_getInputValue (Board_key_B1)=0) { //按钮1处于活动状态 b1Active = true; } //查找第一次按按钮1 if (b1Active &&(keysPressed & key_B1)=0) { keysPressed |= key_B1; b1Key.tStart = Clock_getTicks(); } //查找按钮1的第一次释放 if (((b1Active == false) &&(keysed 和 key_B1) &&(b1Key.tStop ==0) { b1Key.tStop = Clock_getTicks(); } } 否则、如果(keyPinId = Board_key_reset) { //获取 PIN 值,它为低电平有效 if (PIN_getInputValue (Board_key_reset)=0) { //重置按钮处于活动状态 resetActive = true; } //查找第一次按下重置按钮的情况 if (resetActive &&(keysPresed & key_reset)=0) { keysPressed |= key_reset; resetKey.tStart = Clock_getTicks(); } //查找第一次释放的 RESET 按钮 if ((resetActive == false) &&(keysed 和 key_reset) &&(resetKey.tStop =0) { resetKey.tStop = Clock_getTicks(); } } //触发按键事件 if ((resetActive =false)&&(b1Active=false) &&(keysPresed!= 0)) { //已按下并释放键 //立即触发按键事件 Board_key_changeHandler (0); } 其他 { //启动按住计时器 if (Util_isClockActive (&keyChangeClock)!= true) { Util_stopClock (&keyChangeClock); } Clock_setTimeout (keyClkHandle、 (factory_reset_press_period * timer_MS_adjustment); Util_startClock (&keyChangeClock); } }
我使用 PIN_IRQ_BOTHEDGES、因为我希望对这些按钮执行长按操作。
我从 Ghostyu 购买的 CC2650模块的原理图如下: