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.

[参考译文] CC2530:使用密钥的 CC2530端口

Guru**** 2590250 points


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

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/610901/cc2530-cc2530-ports-working-with-keys

器件型号:CC2530

大家好、我正在使用我的器件、在 ZStack 2.4.0上运行、并且我将 Project Reference 用作 SampleLight。

我的板已连接两个关键开关、SW1作为 P0_4、SW2作为 P0_5。  

主要思路是根据按下的 SW1或 SW2键打开或关闭照明开关。  

最初、我更改了一些代码行、以支持这些文件中的新端口(P0_4和 P0_5)、从而为我的板提供与代码交互的功能:

hal_borad_cfg.h

/*------------------------------------------------
*按钮配置
************-------------------------------------------------------------------------------------------------------------------
*

#define ACTIVE_LOW!
#define ACTIVE_HIGH!! /*双重否定强制结果为'1'*/

/* S1 */
#define PUSH1_BV BV (4)//由 ASA 编写原始值为1
#define PUSH1_SBIT P0_4 //由 ASA 写入原始值为 P0_1

#IF 定义(HAL_Board_CC2530EB_REV17)
#define PUSH1_POLARITY ACTIVE_HIGH
定义了#Elif (HAL_Board_CC2530EB_REV13)
#define PUSH1_POLARITY ACTIVE_LOW
其他
#ERROR 未知电路板标识符
#endif

/* S2 */
#define PUSH2_BV BV (5)//由 ASA 写入原始值为0
#define PUSH2_SBIT P0_5 //由 ASA 写入原始值为 P2_0
#define PUSH2_POLARITY ACTIVE_HIGH

在 onboard.c 上:

空 InitBoard( uint8级)

如果(级别== OB_COLD)

// IAR 不会将 XSTACK 下面的这个字节归零。
*(uint8 *) 0x0 = 0;
//中断关闭
OSAL_INT_DISABLE (ints_all);
//检查掉电复位
ChkReset();

else //!OB_COLD

/*初始化关键内容*/
//HalKeyConfig (HAL_KEY_interrupt_disable、ONBOARD_KeyCallback);由 ASA 编写
HalKeyConfig (HAL_KEY_interrupt_enable、ONBOARD_KeyCallback);

zcl_sampleLight.c (HandleKeys)上:

静态空 zclSampleLight_HandleKeys (字节移位、字节键)

//zAddrType_t dstAddr;
(void) shift;//有意未引用参数
IF (移位)
IF (键和 HAL_KEY_SW_1)

HalLedSet (HAL_LED_3、HAL_LED_MODE_OFF);//由 ASA 编写
P1_4 = 0;

if (keys & HAL_key_sw_2)

HalLedSet (HAL_LED_3、HAL_LED_MODE_OFF);//由 ASA 编写
P1_4 = 0;

if (键& HAL_KEY_SW_3)

HalLedSet (HAL_LED_3、HAL_LED_MODE_OFF);//由 ASA 编写

if (keys & HAL_key_sw_4)

HalLedSet (HAL_LED_4、HAL_LED_MODE_OFF);//由 ASA 编写

我在输入消息环路内用基本测试用鱼端口(P0_4)进行了双次检查、以验证我的硬件是否正常工作、我检查了是否正常。  

如果(!P0_4)
{P1_4 = 0;
}  

但是、当我在 zcl_samplelight.c 中使用 handlekeys 时、不会发生任何情况 有人可以帮助我、如何开始工作?

BR

Alex

 

BR

Alex

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您应该修改 hal_key.c、而不是 hal_borad_cfg.h 和 board.c
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Yikai 先生、您能帮我吗、我不了解这些发布的文件与 hal_key.c 代码之间的关系:

    * SW_6位于 P0.1 */
    #define HAL_KEY_SW_6_PORT P0
    #define HAL_KEY_SW_6_BIT BV (1)
    #define HAL_KEY_SW_6_SEL P0SEL
    #define HAL_KEY_SW_6_DIR P0DIR

    /*边沿中断*/
    #define HAL_KEY_SW_6_EDGEBIT BV (0)
    #define HAL_KEY_SW_6_EDGE HAL_KEY_FALLING_EDGE


    /* SW_6中断*/
    #define HAL_KEY_SW_6_IEN IEN1 /* CPU 中断屏蔽寄存器*/
    #define HAL_KEY_SW_6_IENBIT BV (5)/*所有 Port_0的掩码位*/
    #define HAL_KEY_SW_6_ICTL P0IEN /*端口中断控制寄存器*/
    #define HAL_KEY_SW_6_ICTLBIT BV (1)/* P0IEN - P0.1启用/禁用位*
    #define HAL_KEY_SW_6_PXIFG P0IFG //源中断标志*

    /* Joy Stick 在 P2.0上移动*/
    #define HAL_KEY_JOY_MOVE_PORT P2
    #define HAL_KEY_JOY_MOVE_BIT BV (0)
    #define HAL_KEY_JOY_MOVE_SEL P2SEL
    #define HAL_KEY_JOY_MOVE_DIR P2DIR

    /*边沿中断*/
    #define HAL_KEY_JOY_MOVE_EDGEBIT BV (3)
    #define HAL_KEY_JOY_MOVE_EDGE HAL_KEY_FALLING_EDGE

    /* Joy Move 中断*/
    #define HAL_KEY_JOY_MOVE_IEN IEN2 /* CPU 中断屏蔽寄存器*/
    #define HAL_KEY_JOY_MOVE_IENBIT BV (1)/*所有 Port_2的掩码位*/
    #define HAL_KEY_JOY_MOVE_ICTL P2IEN /*端口中断控制寄存器*/
    #define HAL_KEY_JOY_MOVE_ICTLBIT BV (0)/* P2IENL - P2.0<->P2.3启用/禁用位*/
    #define HAL_KEY_JOY_MOVE_PXIFG P2IFG //源中断标志*

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

    您可以将"#define HAL_KEY_SW_6_BIT BV (1)"替换为"#define HAL_KEY_SW_6_BIT BV (4)"和"#define HAL_KEY_SW_6_ICTLBIT BV (1)"、以使 PSW6成为 GPSW6的源触发器。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    叶凯先生
    它在 SW1的 P0_4上运行得很好、我尝试对 SW2 (P0_5)执行同样的操作、但它不工作。 我´ll 解释如下:

    /* Joy Stick 在 P2.0上移动*/
    #define HAL_KEY_JOY_MOVE_PORT P0
    #define HAL_KEY_JOY_MOVE_BIT BV (5)
    #define HAL_KEY_JOY_MOVE_SEL P0SEL
    #define HAL_KEY_JOY_MOVE_DIR P0DIR

    /*边沿中断*/
    #define HAL_KEY_JOY_MOVE_EDGEBIT BV (0)
    #define HAL_KEY_JOY_MOVE_EDGE HAL_KEY_FALLING_EDGE

    /* Joy Move 中断*/
    #define HAL_KEY_JOY_MOVE_IEN IEN1 /* CPU 中断屏蔽寄存器*/
    #define HAL_KEY_JOY_MOVE_IENBIT BV (5)/*所有 Port_2的掩码位*/
    #define HAL_KEY_JOY_MOVE_ICTL P0IEN /*端口中断控制寄存器*/
    #define HAL_KEY_JOY_MOVE_ICTLBIT BV (5)/* P2IENL - P2.0<->P2.3启用/禁用位*/
    #define HAL_KEY_JOY_MOVE_PXIFG P0IFG //源中断标志*

    如果我出了问题、您会检查一下吗?

    BR
    Alex
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    游戏手柄使用 P2.0和 ADC 读数、因此不适合更改。 我建议您克隆 SW6并针对 P0.5对其进行修订
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Yikai 先生。 非常感谢您的帮助。
    在我进行更改和按键 S1后、您建议我开始工作时、我观察到以下行为:

    当我按下按钮 S1打开(P0_4>1 ON)时,它有时是可以的,有时是不可以的。 我认为问题可能在于关键抖动。

    我将 hal_key.c 中的去抖值从25更改为35、但我没有注意到差异。

    您能为我提供解决此问题的建议吗?

    BR
    Alex
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尝试在 HAL_ISR_function (halKeyPort0Isr、P0INT_vector)中设置断点,然后按 Button 以查看 IAR 中是否每次都出现该断点。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Yikai 先生、
    在按照您的建议调试 halKeyPort0Isr 后、我检查了是否始终是调试中断、并验证中断是否运行良好。 我看到我的实际电路板使用的是不带陶瓷电容器的电气组件。 我´ll 一个具有不同电气结构的新电路板。 ´ll 后、我将其发布在这里。

    定义:
    #define HAL_KEY_SW_6_PORT P0
    #define HAL_KEY_SW_6_ICTLBIT BV (5)/* P0IEN - P0.5启用/禁用位*

    关于第二个密钥(SW2 -> P0_5)、正如我之前发布的、您能更详细地解释一下该机制吗? 您´ll 我克隆 SW6、但如果我这样做、IAR 编译器就会出现问题、因为 SW1的巧合会导致这些行的解释错误。

    * SW_6位于 P0.5 -用于 SW2 P0.5。
    #define HAL_KEY_SW_6_PORT P0
    #define HAL_KEY_SW_6_SEL P0SEL
    #define HAL_KEY_SW_6_DIR P0DIR

    /*边沿中断*/
    #define HAL_KEY_SW_6_EDGEBIT BV (0)
    #define HAL_KEY_SW_6_EDGE HAL_KEY_FALLING_EDGE

    /* SW_6中断*/
    #define HAL_KEY_SW_6_IEN IEN1 /* CPU 中断屏蔽寄存器*
    #define HAL_KEY_SW_6_IENBIT BV (5)/*所有 Port_0的掩码位*/
    #define HAL_KEY_SW_6_ICTL P0IEN //端口中断控制寄存器*/
    #define HAL_KEY_SW_6_PXIFG P0IFG //源中断标志*

    我对开关的主要工作有一些疑问、
    如何定义标签(或标签)以使两个密钥之间存在代码差异、例如、我需要构建 SW_7 (定义 HAL_KEY_SW_7_PORT P0)?

    如何处理密钥和代码(#define HAL_KEY_SW_6_PORT P0 /#define HAL_KEY_SW_6_ICTLBIT BV (5和其他)(hal_keys.c 内)和 zclSampleLight_HandleKeys (zcl_sampleLight.c 内)之间的关系? 购买如何将 SW6与 SW1关联的方法?

    BR
    Alex
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的。 如果中断运行良好、您应该检查硬件。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢 Yikai 先生。 我´ll 一个新硬件。

    如何更好地了解 SW2的驱动机制和相关编程代码。

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

    这方面没有具体的文档。 您只能跟踪源代码并习惯它。

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

    您好、Yikai 先生、

    您是否会告知我、我需要更改每个参数以启用 P0_5的中断?

    我更改了以下内容中的这些行:

    HAL_KEY_SW_6_BIT 至 BV (5)

    HAL_KEY_SW_6_PORT 至 P0

    HAL_KEY_SW_6_ICTLBIT 至 BV (5)

    但在调试过程中,当我在 HAL_ISR 中进行推理(断点)时,我没有看到任何影响....

    如果我将上面的代码行更改为 P0_4、则截获过程运行良好。

    BR

    Alex

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您可以将"#define HAL_KEY_SW_6_BIT BV (1)"替换为"#define HAL_KEY_SW_6_BIT BV (5)"和"#define HAL_KEY_SW_6_ICTLBIT BV (1)"、以使 PSW6成为 GPSW6的源触发器。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Yikai 先生、
    我成功地解决了 SW1的间歇性问题。 我构建了一个新的硬件、并使用了一个上拉电阻器和一个二极管、以在开关钥匙(S1)打开且反向电流时保证高逻辑电平。

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