微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI蓝牙设计交流 > 在CC2541 keyfob board上更改按鈕的pin後,動作錯誤

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

时间:10-02 整理:3721RD 点击:

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 );
  }

}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top