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.
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腳的設定需要修改 ??
或是有甚麼需要做的?
只改这两项不够,还有涉及中断的也需要修改,看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);
再仔细看看手册。
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);
但按鈕還是沒有動作
請問上面定義有錯誤的嗎?
成功了 !
主要在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 );
}
}