在CC2541 keyfob board上更改按鈕的pin後,動作錯誤
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 );
}
}