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.

在CC2541 keyfob board上更改按鈕的pin後,動作錯誤

Other Parts Discussed in Thread: CC2541, CC2540

Hi 

我使用的是CC2541 Keyfob board , 軟體則使用keyfob project

正常行為下,當按下SW_2 (pin為P0_1) 的按鈕,CC2541 會進入advertising.


而我想將keyfob project燒錄到自行開發的CC2541模塊上,而唯一差別在於自行開發的CC2541模塊上按鈕的pin為P1_5。

所以我修改了hal_key.c中的程式,修改如下:

/* SW_2 is at P0.1 */
/* #define HAL_KEY_SW_2_PORT P0
   #define HAL_KEY_SW_2_BIT BV(1)  */
#define HAL_KEY_SW_2_PORT P1
#define HAL_KEY_SW_2_BIT BV(5)


但修改過後,button SW_2無反應,而且在接上電源10秒後,會自動進入advertising

而TI的CC2541 Keyfob也有相同情形

請問是否有其他關於PIN腳的設定需要修改 ??

或是有甚麼需要做的?

  • 先把按键驱动搞定。看了半天没看明白你的问题。你是觉得按键有问题,还是会自动广播?

  • 都有,當把sw_2的pin從P0_1改為P1_5後

    按Button沒有馬上進入廣播也沒有反應,而且接上電源後10妙會自動進入廣播

  • 只改这两项不够,还有涉及中断的也需要修改,看datasheet改吧,就一外部中断的驱动。

    /* SW_2 is at P0.1 */
    #define HAL_KEY_SW_2_PORT   P0
    #define HAL_KEY_SW_2_BIT    BV(1)
    #define HAL_KEY_SW_2_SEL    P0SEL
    #define HAL_KEY_SW_2_DIR    P0DIR

    #define HAL_KEY_SW_2_IEN      IEN1  /* CPU interrupt mask register */
    #define HAL_KEY_SW_2_ICTL     P0IEN /* Port Interrupt Control register */
    #define HAL_KEY_SW_2_ICTLBIT  BV(1) /* P0IEN - P0.1 enable/disable bit */
    #define HAL_KEY_SW_2_IENBIT   BV(5) /* Mask bit for all of Port_0 */
    #define HAL_KEY_SW_2_PXIFG    P0IFG /* Interrupt flag at source */

    #define HAL_KEY_SW_1_EDGEBIT  BV(0)

  • 广播与否取决于GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &initial_advertising_enable );的设置。或者你使能了他,或者你的驱动没写好,按键的程序里有允许广播调用.如函数keyfobapp_HandleKeys( uint8 shift, uint8 keys )中key2开启或者关闭广播。你设断点看是否在没按键时会跳到此处?

    还是那句话,先把按键驱动搞定。

  • datasheet是參考CC253x-4x User Guide. (Rev. D) _swru191d嗎??

    #define HAL_KEY_SW_2_IEN IEN1 /* CPU interrupt mask register */
    #define HAL_KEY_SW_2_ICTL P1IEN /* Port Interrupt Control register */               從P0IEN 改為 P1IEN
    #define HAL_KEY_SW_2_ICTLBIT BV(5) /* P0IEN - P0.1 enable/disable bit */      從BV(1) 改為 BV(5)
    #define HAL_KEY_SW_2_IENBIT BV(5) /* Mask bit for all of Port_0 */
    #define HAL_KEY_SW_2_PXIFG P1IFG /* Interrupt flag at source */                        從P0IFG  改為 P1IFG 

    #define HAL_KEY_SW_1_EDGEBIT BV(0)

    依照程式來看,我如果將Button的PIN改為P1_5,那以上修改的方法的概念是正確的嗎??

    那想請問原本定義此外部中斷的原因為何?

  • Hi wun,

    你可以看一下hal_key.c,

    首先看一下 HalKeyInit(), 配置一下你需要的IO口的输入输出.

    再看一下HAL_ISR_FUNCTION(), 这是中断处理函数, 对照修改一下, 注意参数里面 P0INT_VECTOR 对应的是port 0, 换成 P1INT_VECTOR 应该是你需要的.

    前面的修改都参考一下datasheet.

  • Hi , Yan

    謝謝你的回答

    但在HalKeyInit()中的設置

    #if defined ( CC2540_MINIDK )
    HAL_KEY_SW_1_SEL &= ~(HAL_KEY_SW_1_BIT); /* Set pin function to GPIO */
    HAL_KEY_SW_1_DIR &= ~(HAL_KEY_SW_1_BIT); /* Set pin direction to Input */
    HAL_KEY_SW_2_SEL &= ~(HAL_KEY_SW_2_BIT); /* Set pin function to GPIO */
    HAL_KEY_SW_2_DIR &= ~(HAL_KEY_SW_2_BIT); /* Set pin direction to Input */

    看起來是依賴下面的定義,這邊我將PIN改為P1_5,因此P1_5為Input

    /* SW_2 is at P0.1 */
    #define HAL_KEY_SW_2_PORT P1 
    #define HAL_KEY_SW_2_BIT BV(5)

    #define HAL_KEY_SW_2_SEL P1SEL
    #define HAL_KEY_SW_2_DIR P1DIR

    #define HAL_KEY_SW_2_IEN IEN1 // CPU interrupt mask register
    #define HAL_KEY_SW_2_ICTL P1IEN // Port Interrupt Control register
    #define HAL_KEY_SW_2_ICTLBIT BV(5) // P0IEN - P0.1 enable/disable bit
    #define HAL_KEY_SW_2_IENBIT BV(5) // Mask bit for all of Port_0
    #define HAL_KEY_SW_2_PXIFG P1IFG // Interrupt flag at source

    而將P0INT_VECTOR 改為P1INT_VECTOR 後,按Button依舊沒有反應

  • 如果你是用P1_5, 应该是IEN2. HAL_KEY_SW_2_IENBIT应该是 BV(1).

     PICTL |= HAL_KEY_SW_1_EDGEBIT | BV(2);

    再仔细看看手册。

  • 不好意思~因為我不太懂要怎麼看手冊去改

    所以不知道當Pin腳改為P1_5後,其他的應該要怎樣照手冊改才是正確的

    只知道

    P1IFG、P1IEN皆修改為Port1相關

    而其他如BV(5)就不懂這是甚麼意思...

    而為什麼要改為IEN2

    0X9A為1001 1010,所以是對照上圖看哪一個Bits為1就是disabled,為0就enabled嗎?

  • 0X9A是地址不是它的值。没改前用的P0_1则需要IEN1.P0IE=1允许中断。 改为P1_5后要改为IEN2.P1IE=1.应该是BV(4),不是BV(5)

  • TY , 謝謝你的回覆 !!

    我目前的設定如下:

    #define HAL_KEY_SW_2_PORT             P1
    #define HAL_KEY_SW_2_BIT                 BV(5)

    #define HAL_KEY_SW_2_SEL                P1SEL
    #define HAL_KEY_SW_2_DIR                 P1DIR

    #define HAL_KEY_SW_2_IEN                 IEN2                     // CPU interrupt mask register
    #define HAL_KEY_SW_2_ICTL               P1IEN                    // Port Interrupt Control register
    #define HAL_KEY_SW_2_ICTLBIT         BV(5)                     // P0IEN - P0.1 enable/disable bit
    #define HAL_KEY_SW_2_IENBIT           BV(4)                     // Mask bit for all of Port_0 
    #define HAL_KEY_SW_2_PXIFG            P1IFG                   // Interrupt flag at source

    #define HAL_KEY_SW_2_EDGEBIT        BV(2)
    #define HAL_KEY_SW_2_EDGE              HAL_KEY_FALLING_EDGE

    並在HAL_ISR_FUNCTION 中將 P0INT_VECTOR 改為 P1INT_VECTOR

    以及 PICTL |= HAL_KEY_SW_1_EDGEBIT; 改為  PICTL |= HAL_KEY_SW_1_EDGEBIT | BV(2);

    但按鈕還是沒有動作

    請問上面定義有錯誤的嗎?

  • 似乎没有。你按键时调试下程序,看能否进入中断?在中断程序里设断点。另外,IAR可以看寄存器的值,对照看看寄存器是否按照你的设定。

  • 目前板子的情形為接上電10秒後,會自動進入廣播

    這是將斷點設在   if ( keys & HAL_KEY_SW_2 ) 的結果,而10秒後,這行程式的確被觸發

    接著將斷點設在if( current_adv_enabled_status == FALSE )


    只是不太懂這邊所顯示的資訊...

    抱歉...第一次接觸這邊

    麻煩各位幫忙解答一下...謝謝

  • 目前板子的情形為接上電10秒後,會自動進入廣播

    這是將斷點設在   if ( keys & HAL_KEY_SW_2 ) 的結果,而10秒後,這行程式的確被觸發

    接著將斷點設在if( current_adv_enabled_status == FALSE )


    只是不太懂這邊所顯示的資訊...

    抱歉...第一次接觸這邊

    麻煩各位幫忙解答一下...謝謝

    或是Keyfob有其他地方會自動去觸發P1_5這腳位嗎?

  • 继续向前追溯。在halProcessKeyInterrupt()设置中断,看具体是怎么造成的。

  • 成功了 !

    主要在hal_key.c中仿造Port 0增加了下面這段程式

    HAL_ISR_FUNCTION( halKeyPort1Isr, P1INT_VECTOR )
    {
    HAL_ENTER_ISR();

    if ((HAL_KEY_SW_2_PXIFG & HAL_KEY_SW_2_BIT))
    {
    halProcessKeyInterrupt();
    }

    /*
    Clear the CPU interrupt flag for Port_0
    PxIFG has to be cleared before PxIF
    */
    HAL_KEY_SW_2_PXIFG = 0;
    HAL_KEY_CPU_PORT_1_IF = 0;

    CLEAR_SLEEP_MODE();

    HAL_EXIT_ISR();

    return;
    }

    然後將PICTL |= HAL_KEY_SW_1_EDGEBIT;改為PICTL |= HAL_KEY_SW_2_EDGEBIT;


    這樣當我按下Button時,有進入廣播模式

    但不好意思...又有新的問題...

    我有在keyfobdemo.c中判斷當P0_4被拉低時,進入PTM模式時

    而在KeyFobApp_ProcessEvent,判斷當P0_4被拉低時,按下按鈕可讓LED亮

    原本在CC2541 Keyfob上,是判斷當P0_1 == 0,則讓LED亮

    但現在換成P1_5 == 0好像沒有反應 

    if ( P1_5 == 0)
    {
    // turn the Green LED on
    HalLedSet( HAL_LED_1, HAL_LED_MODE_ON );
    i++;
    }

    請問需要另外宣告P1_5才能使用嗎??

    因為在KeyFobApp_ProcessEvent中好像也不能直接使用if(keys & HAL_KEY_SW_2)來判斷

    要怎樣才能在KeyFobApp_ProcessEvent去使用P1_5這隻腳位呢?

  • 我在if ( keys & HAL_KEY_SW_2 )這個部份設斷點,但看到的值都是'.' (0x01)

    而下面這段程式只有紅色LED閃爍動作有運作,P1_5並無動作

    if(P0_4 == 0) {

    HalLedSet( HAL_LED_2, HAL_LED_MODE_FLASH );

      if ( P1_5 == 0)
      {
      // turn the Green LED on 
      HalLedSet( HAL_LED_1, HAL_LED_MODE_ON );
      }

    }