欧美三级国产三级日韩三级_亚洲熟妇丰满大屁股熟妇_欧美亚洲成人一区二区三区_国产精品久久久久久模特

TICC2530組網演練(BasicRF——無線控制燈的亮滅) - 新聞資訊 - 云南小程序開發(fā)|云南軟件開發(fā)|云南網站建設-昆明葵宇信息科技有限公司

159-8711-8523

云南網建設/小程序開發(fā)/軟件開發(fā)

知識

不管是網站,軟件還是小程序,都要直接或間接能為您產生價值,我們在追求其視覺表現(xiàn)的同時,更側重于功能的便捷,營銷的便利,運營的高效,讓網站成為營銷工具,讓軟件能切實提升企業(yè)內部管理水平和效率。優(yōu)秀的程序為后期升級提供便捷的支持!

您當前位置>首頁 » 新聞資訊 » 技術分享 >

TICC2530組網演練(BasicRF——無線控制燈的亮滅)

發(fā)表時間:2020-10-19

發(fā)布人:葵宇科技

瀏覽次數(shù):113


本文將大年夜兩個方面著手,一方面分析TI官網下載的CC2530 BasicRF源碼中的無線發(fā)送,另一方面根據本身的板子來修改實現(xiàn)無線發(fā)送控制燈的亮滅。
一、CC2530 BasicRF
Basic RF由TI公司供給,它包含了IEEE 802.15.4標準的數(shù)據包的收發(fā)功能但并沒有應用到協(xié)定棧,它僅僅是讓兩個節(jié)點進內行單的通信,也就是說Basic RF僅僅是包含著IEEE 802.15.4標準的一小部分罷了。其重要特點有:
1、不會主動參加協(xié)定、也不會主動掃描其他節(jié)點、同時也沒有組網指導燈(LED3)
2、沒有協(xié)定?,樉c擎所說的調和器、路由器或者終端的區(qū)分,節(jié)點的地位都是相等的
3、沒有主動重發(fā)的功能
Basic RF layer為雙向無線通信供給了一個簡單的協(xié)定,經由過程這個協(xié)定可以或許進行數(shù)據的發(fā)送和接收。Basic RF還供給了安然所應用的CCM-64身份驗證和數(shù)據加密,它的安然性在工程文件里定義SECURITY_CCM了。在Project->Option->C/C++ Compiler->Preprocess瑯綾擎就選擇,本次實驗并不是什么高度機密,所有在SECURITY_CCM前面帶X了。
[img]http://img.blog.csdn.net/20150104112822529
Basic RF的工作過程:啟動、發(fā)射、接收
工程文件分析

MCU_IO_DIR_OUTPUT(port, pin);
/***********************************************************************
 * MCU_IO_DIR_OUTPUT(port, pin);將端口port對應的pin位設置為輸出(高電平)
 * ##為連接符,如port=0,pin=1,即P0DIR |= BM(1);
 **********************************************************************/
#define MCU_IO_DIR_OUTPUT(port, pin)   MCU_IO_DIR_OUTPUT_PREP(port, pin)
#define MCU_IO_DIR_OUTPUT_PREP(port, pin)   st( P##port##DIR |= BM(pin); )
#define st(x)      do { x } while (__LINE__ == -1)
#define BM(n)      (1 << (n))

MCU_IO_DIR_INPUT(port, pin);
/***********************************************************************
 * MCU_IO_DIR_INPUT(port, pin);將端口port對應的pin位設置為輸入(低電平)
 **********************************************************************/
#define MCU_IO_DIR_INPUT(port, pin)   MCU_IO_DIR_INPUT_PREP(port, pin)
#define MCU_IO_DIR_INPUT_PREP(port, pin)   st( P##port##DIR |= ~BM(pin); )
#define st(x)      do { x } while (__LINE__ == -1)
#define BM(n)      (1 << (n))
MCU_IO_GET(port, pin);
/***********************************************************************
 * MCU_IO_GET(port, pin);獲取端口port的對應位pin的電平值
 **********************************************************************/
#define MCU_IO_GET(port, pin)   MCU_IO_GET_PREP(port, pin)
#define MCU_IO_GET_PREP(port, pin)   (P##port## & BM(pin))
#define BM(n)      (1 << (n))
MCU_IO_TGL(port, pin);
/***********************************************************************
 * MCU_IO_TGL(port, pin);將端口port的對應位pin的電平值設置為相反電平
 **********************************************************************/
#define MCU_IO_TGL(port, pin)   MCU_IO_TGL_PREP(port, pin)
#define MCU_IO_TGL_PREP(port, pin)   st( P##port##_##pin## ^= 1; )
#define st(x)      do { x } while (__LINE__ == -1)
MCU_IO_SET_LOW(port, pin);
/***********************************************************************
 * MCU_IO_SET_LOW(port, pin);將端口port的對應位pin設置為低電平
 **********************************************************************/
#define MCU_IO_SET_LOW(port, pin)      MCU_IO_SET_LOW_PREP(port, pin)
#define MCU_IO_SET_LOW_PREP(port, pin)      st( P##port##_##pin## = 0; )
#define st(x)      do { x } while (__LINE__ == -1)
MCU_IO_SET_HIGH(port, pin);
/***********************************************************************
 * MCU_IO_SET_HIGH(port, pin);將端口port的對應位pin設置為高電平
 **********************************************************************/
#define MCU_IO_SET_HIGH(port, pin)      MCU_IO_SET_HIGH_PREP(port, pin)
#define MCU_IO_SET_HIGH_PREP(port, pin)      st( P##port##_##pin## = 1; )
#define st(x)      do { x } while (__LINE__ == -1)
MCU_IO_SET(port, pin, val);
/***********************************************************************
 * MCU_IO_SET(port, pin, val);將端口port的對應位pin的電平值設置為val
 **********************************************************************/
#define MCU_IO_SET(port, pin, val)     MCU_IO_SET_PREP(port, pin, val)
#define MCU_IO_SET_PREP(port, pin, val)     st( P##port##_##pin## = val; )
#define st(x)      do { x } while (__LINE__ == -1)
MCU_IO_OUTPUT(port, pin, val);
/***********************************************************************
 * MCU_IO_OUTPUT(port, pin, val);將端口port的對應位pin的電平值設置為val
 *                              并且將此IO設置為通用IO,以及設置為輸出
 **********************************************************************/
#define MCU_IO_OUTPUT(port, pin, val)  MCU_IO_OUTPUT_PREP(port, pin, val)
#define MCU_IO_OUTPUT_PREP(port, pin, val)  st( P##port##SEL &= ~BM(pin);                                                 P##port##_##pin## = val;                                                 P##port##DIR |= BM(pin); )
#define st(x)      do { x } while (__LINE__ == -1)
MCU_IO_OUTPUT(port, pin, func);
/***********************************************************************
 * MCU_IO_INPUT(port, pin, func);將端口port的對應位pin的設置為通用IO
 * 并將此IO口設置為func輸入模式:上拉、下拉、默認模式(三態(tài))
 * func指的是IO口的輸入模式:MCU_IO_PULLUP、MCU_IO_PULLDOWN、默認模式                             
 **********************************************************************/
#define MCU_IO_INPUT(port, pin, func)  MCU_IO_INPUT_PREP(port, pin, func)
#define MCU_IO_INPUT_PREP(port, pin, func)  st( P##port##SEL &= ~BM(pin);                                                 P##port##DIR &= ~BM(pin);                                                 switch (func) {                                                 case MCU_IO_PULLUP:                                                     P##port##INP &= ~BM(pin);                                                     P2INP &= ~BM(port + 5);                                                     break;                                                 case MCU_IO_PULLDOWN:                                                     P##port##INP &= ~BM(pin);                                                     P2INP |= BM(port + 5);                                                     break;                                                 default:                                                     P##port##INP |= BM(pin);                                                     break; } )
#define st(x)      do { x } while (__LINE__ == -1)
MCU_IO_PERIPHERAL(port, pin);
/***********************************************************************
 * MCU_IO_PERIPHERAL(port, pin);將端口port的對應位pin的設置為外設功能                            
 **********************************************************************/
#define MCU_IO_PERIPHERAL(port, pin)   MCU_IO_PERIPHERAL_PREP(port, pin)
#define MCU_IO_PERIPHERAL_PREP(port, pin)   st( P##port##SEL |= BM(pin); )
#define BM(n)      (1 << (n))

light_switch.c——main函數(shù)
<pre name="code" class="cpp">void main(void)
{
    uint8 appMode = LIGHT;

    // Config basicRF
    basicRfConfig.panId = PAN_ID;         //收集地址,0x2007
    basicRfConfig.channel = RF_CHANNEL;   //通道,25  // 2.4 GHz RF channel
    basicRfConfig.ackRequest = TRUE;      //是否應當,  1
#ifdef SECURITY_CCM
    basicRfConfig.securityKey = key;
#endif

    // Initalise board peripherals
    /*
     * 一些GPIO口初始化,包含以下LEDs和Buttons初始化
     * 將LEDs(P0_0、P1_1、P1_4、P0_1)設置為輸出、Buttons(P0_1)設置為輸入模式且為三態(tài)輸入模式
     */
    halBoardInit();
    /*
     * 多偏向按鍵初始化,不消管
     */
    halJoystickInit();

    // Initalise hal_rf  硬件抽象層rf初始化
    if(halRfInit()==FAILED) {
      HAL_ASSERT(FALSE);
    }

    // Indicate that device is powered  將按鍵1設置為高電平,并將狀況設置為1
    /*
    switch (id)
    {
    case 1: HAL_LED_SET_1(); break;
    case 2: HAL_LED_SET_2(); break;
    case 3: HAL_LED_SET_3(); break;
    case 4: HAL_LED_SET_4(); led4State=1; break;

    default: break;
    }
    
    #define HAL_LED_SET_1()                 MCU_IO_SET_HIGH(HAL_BOARD_IO_LED_1_PORT, HAL_BOARD_IO_LED_1_PIN)
    #define HAL_LED_SET_2()                 MCU_IO_SET_HIGH(HAL_BOARD_IO_LED_2_PORT, HAL_BOARD_IO_LED_2_PIN)
    #define HAL_LED_SET_3()                 MCU_IO_SET_HIGH(HAL_BOARD_IO_LED_3_PORT, HAL_BOARD_IO_LED_3_PIN)
    #define HAL_LED_SET_4()                 MCU_IO_SET_HIGH(HAL_BOARD_IO_LED_4_PORT, HAL_BOARD_IO_LED_4_PIN)
    
    #define HAL_BOARD_IO_LED_1_PORT        1   // Green
    #define HAL_BOARD_IO_LED_1_PIN         0
    #define HAL_BOARD_IO_LED_2_PORT        1   // Red
    #define HAL_BOARD_IO_LED_2_PIN         1
    #define HAL_BOARD_IO_LED_3_PORT        1   // Yellow
    #define HAL_BOARD_IO_LED_3_PIN         4
    #define HAL_BOARD_IO_LED_4_PORT        0   // Orange
    #define HAL_BOARD_IO_LED_4_PIN         1
    */
    halLedSet(1);

    // Print Logo and splash screen on LCD
    utilPrintLogo("Light Switch");  //有關LCD的函數(shù)不管

    // Wait for user to press S1 to enter menu
    while (halButtonPushed()!=HAL_BUTTON_1);
    halMcuWaitMs(350);
    halLcdClear();    //lcd清屏,不消管

    // Set application role
    appMode = appSelectMode();    //模式選擇
    halLcdClear();

    // Transmitter application
    if(appMode == SWITCH) {
        // No return from here
        appSwitch();
    }
    // Receiver application
    else if(appMode == LIGHT) {
        // No return from here
        appLight();
    }
    // Role is undefined. This code should not be reached
    HAL_ASSERT(FALSE);
}





hal_board.c——halBoardInit()函數(shù)實現(xiàn)
void halBoardInit(void)
{
    //mcu初始化,設置體系時鐘
    halMcuInit();

    // LEDs
#ifdef SRF05EB_VERSION_1_3
    // SmartRF05EB rev 1.3 has only one accessible LED
    MCU_IO_DIR_OUTPUT(HAL_BOARD_IO_LED_1_PORT, HAL_BOARD_IO_LED_1_PIN);
    HAL_LED_CLR_1();
#else
    /*
     * LEDs(P0_0、P1_1、P1_4、P0_1)設置為輸出
     */
    MCU_IO_DIR_OUTPUT(HAL_BOARD_IO_LED_1_PORT, HAL_BOARD_IO_LED_1_PIN);
    HAL_LED_CLR_1();
    MCU_IO_DIR_OUTPUT(HAL_BOARD_IO_LED_2_PORT, HAL_BOARD_IO_LED_2_PIN);
    HAL_LED_CLR_2();
    MCU_IO_DIR_OUTPUT(HAL_BOARD_IO_LED_3_PORT, HAL_BOARD_IO_LED_3_PIN);
    HAL_LED_CLR_3();
    MCU_IO_DIR_OUTPUT(HAL_BOARD_IO_LED_4_PORT, HAL_BOARD_IO_LED_4_PIN);
    HAL_LED_CLR_4();
#endif

    // Buttons
    /*
     * Buttons(P0_1)設置為輸入模式且為三態(tài)輸入模式
     */
    MCU_IO_INPUT(HAL_BOARD_IO_BTN_1_PORT, HAL_BOARD_IO_BTN_1_PIN, MCU_IO_TRISTATE);

    // Joystick push input  多偏向按鍵 三態(tài)輸入模式
    MCU_IO_INPUT(HAL_BOARD_IO_JOY_MOVE_PORT, HAL_BOARD_IO_JOY_MOVE_PIN,     MCU_IO_TRISTATE);

    // Analog input    adc模仿,設置對應引腳為外部功能
    MCU_IO_PERIPHERAL(HAL_BOARD_IO_JOYSTICK_ADC_PORT, HAL_BOARD_IO_JOYSTICK_ADC_PIN);

    //lcd初始化
    halLcdSpiInit();
    halLcdInit();

    /*
     * halIntOn:開啟全局中斷-->HAL_INT_ON-->st( EA = 1; )   
     */
    halIntOn();
}
hal_rf.c——halRfInit()函數(shù)實現(xiàn)
uint8 halRfInit(void)
{
    // Enable auto ack and auto crc   
    /*
     * #define FRMCTRL0        XREG( 0x6189 )
     * #define XREG(addr)       ((unsigned char volatile __xdata *) 0)[addr]
     * 即往存放器FRMCTRL0(0x6189)寫數(shù)據
     * #define AUTO_ACK     0x20
     * #define AUTO_CRC     0x40
     */
    FRMCTRL0 |= (AUTO_ACK | AUTO_CRC);

    // Recommended RX settings
    /*
     * #define TXFILTCFG       XREG( 0x61FA )
     * #define AGCCTRL1        XREG( 0x61B2 )
     * #define FSCAL1          XREG( 0x61AE )
     */
    TXFILTCFG = 0x09;       //調劑AGC目標值
    AGCCTRL1 = 0x15;        //設置 TX 抗混疊過濾器以獲得合適的貸款
    FSCAL1 = 0x00;          //和默認設置比較,降低VCO泄漏大年夜約3dB。推薦默認設置以獲得最佳 EVM

    // Enable random generator -> Not implemented yet

    // Enable CC2591 with High Gain Mode
    halPaLnaInit();//在CC2530中此函數(shù)沒有做任何操作

    // Enable RX interrupt  使能接收中斷
    /*
     * RFIRQM0 |= BV(6);
     * IEN2 |= BV(0);
     * #define BV(n)      (1 << (n))
     */
    halRfEnableRxInterrupt();

    return SUCCESS;
}
[img]http://img.blog.csdn.net/20150105104048353
[img]http://img.blog.csdn.net/20150105104138570
[img]http://img.blog.csdn.net/20150105104239051
[img]http://img.blog.csdn.net/20150105104225437
[img]http://img.blog.csdn.net/20150105104310422
light_switch.c——appSwitch()、appLight()函數(shù)實現(xiàn)
static void appSwitch()
{
    //lcd有關操作不消管
    halLcdWriteLine(HAL_LCD_LINE_1, "Switch");
    halLcdWriteLine(HAL_LCD_LINE_2, "Joystick Push");
    halLcdWriteLine(HAL_LCD_LINE_3, "Send Command");
#ifdef ASSY_EXP4618_CC2420         //沒有定義
    halLcdClearLine(1);
    halLcdWriteSymbol(HAL_LCD_SYMBOL_TX, 1);
#endif

    pTxData[0] = LIGHT_TOGGLE_CMD;    // #define LIGHT_TOGGLE_CMD  0 //被傳輸?shù)拈_關敕令   

    // Initialize BasicRF
    basicRfConfig.myAddr = SWITCH_ADDR;   //#define SWITCH_ADDR 0x2520 //開關節(jié)點的地址
    if(basicRfInit(&basicRfConfig)==FAILED) {
      HAL_ASSERT(FALSE);
    }

    // Keep Receiver off when not needed to save power  封閉接收
    basicRfReceiveOff();

    // Main loop
    while (TRUE) {
        if( halJoystickPushed() ) { //斷定多偏向按鍵是否按下

            basicRfSendPacket(LIGHT_ADDR, pTxData, APP_PAYLOAD_LENGTH);//發(fā)送敕令

            // Put MCU to sleep. It will wake up on joystick interrupt
            halIntOff();
            halMcuSetLowPowerMode(HAL_MCU_LPM_3); // Will turn on global
            // interrupt enable
            halIntOn();

        }
    }
}
static void appLight()
{
    halLcdWriteLine(HAL_LCD_LINE_1, "Light");
    halLcdWriteLine(HAL_LCD_LINE_2, "Ready");
    
#ifdef ASSY_EXP4618_CC2420
    halLcdClearLine(1);
    halLcdWriteSymbol(HAL_LCD_SYMBOL_RX, 1);
#endif

    // Initialize BasicRF
    basicRfConfig.myAddr = LIGHT_ADDR;    //#define LIGHT_ADDR 0xBEEF  //電燈節(jié)點的地址
    if(basicRfInit(&basicRfConfig)==FAILED) {
      HAL_ASSERT(FALSE);
    }
    //使能接收
    basicRfReceiveOn();

    // Main loop
    while (TRUE) {
        while(!basicRfPacketIsReady());//檢查是否收到一個新數(shù)據包

        if(basicRfReceive(pRxData, APP_PAYLOAD_LENGTH, NULL)>0) {  //收到的數(shù)據復制到pRxData中
            if(pRxData[0] == LIGHT_TOGGLE_CMD) {
                halLedToggle(1); //將其對應的LED1設置相反電平
            }
        }
    }
}

basic_rf.h——basicRfCfg_t構造體定義
typedef struct {
    uint16 myAddr;                //16位短地址(就是節(jié)點地址)
    uint16 panId;                 //節(jié)點的PAN(小我局域網) ID
    uint8 channel;                //RF通道(必須在11-26之間)
    uint8 ackRequest;             //目標肯定就置true
    #ifdef SECURITY_CCM           //是否加密
    uint8* securityKey;
    uint8* securityNonce;
    #endif
} <strong>basicRfCfg_t</strong>;
basic_rf.c——basicRfPacketIsReady()、basicRfReceive()、basicRfSendPacket()函數(shù)實現(xiàn)
uint8 basicRfPacketIsReady(void)
{
   /*
    * static basicRfRxInfo_t  rxi=  { 0xFF }; // Make sure sequence numbers are
    * 確保數(shù)據序列號為0xFF
    */  
    return rxi.isReady;
}
uint8 basicRfReceive(uint8* pRxData, uint8 len, int16* pRssi)
{
    // Accessing shared variables -> this is a critical region
    // Critical region start
    halIntOff();
    memcpy(pRxData, rxi.pPayload, min(rxi.length, len));
    if(pRssi != NULL) {
        if(rxi.rssi < 128){
            *pRssi = rxi.rssi - halRfGetRssiOffset();
        }
        else{
            *pRssi = (rxi.rssi - 256) - halRfGetRssiOffset();
        }
    }
    rxi.isReady = FALSE;
    halIntOn();

    // Critical region end

    return min(rxi.length, len);
}
uint8 basicRfSendPacket(uint16 destAddr, uint8* pPayload, uint8 length)
{
    uint8 mpduLength;
    uint8 status;

    // Turn on receiver if its not on
    if(!txState.receiveOn) {
        halRfReceiveOn();
    }

    // Check packet length
    length = min(length, BASIC_RF_MAX_PAYLOAD_SIZE);

    // Wait until the transceiver is idle
    halRfWaitTransceiverReady();

    // Turn off RX frame done interrupt to avoid interference on the SPI interface
    halRfDisableRxInterrupt();

    mpduLength = basicRfBuildMpdu(destAddr, pPayload, length);

    #ifdef SECURITY_CCM
    halRfWriteTxBufSecure(txMpdu, mpduLength, length, BASIC_RF_LEN_AUTH, BASIC_RF_SECURITY_M);
    txState.frameCounter++;     // Increment frame counter field
    #else
    halRfWriteTxBuf(txMpdu, mpduLength);
    #endif

    // Turn on RX frame done interrupt for ACK reception
    halRfEnableRxInterrupt();

    // Send frame with CCA. return FAILED if not successful
    if(halRfTransmit() != SUCCESS) {
        status = FAILED;
    }

    // Wait for the acknowledge to be received, if any
    if (pConfig->ackRequest) {
        txState.ackReceived = FALSE;

        // We'll enter RX automatically, so just wait until we can be sure that the ack reception should have finished
        // The timeout consists of a 12-symbol turnaround time, the ack packet duration, and a small margin
        halMcuWaitUs((12 * BASIC_RF_SYMBOL_DURATION) + (BASIC_RF_ACK_DURATION) + (2 * BASIC_RF_SYMBOL_DURATION) + 10);

        // If an acknowledgment has been received (by RxFrmDoneIsr), the ackReceived flag should be set
        status = txState.ackReceived ? SUCCESS : FAILED;

    } else {
        status = SUCCESS;
    }

    // Turn off the receiver if it should not continue to be enabled
    if (!txState.receiveOn) {
        halRfReceiveOff();
    }

    if(status == SUCCESS) {
        txState.txSeqNumber++;
    }

#ifdef SECURITY_CCM
    halRfIncNonceTx();          // Increment nonce value
#endif

    return status;

}
二、無線控制燈的亮滅
實現(xiàn):經由過程按S1鍵來控制另一個板子上的LED1燈的亮滅
1、電路道理圖
[img]http://img.blog.csdn.net/20150105112305651
2、分析
既然要實現(xiàn)經由過程按S1鍵來控制另一個板子上的LED1燈的亮滅,那么起首須要將被控制版上的LED1對應的P1_0設置為輸出模式,且當P1_為低電日常平凡LED1等亮,為高電日常平凡LED1等滅。以及將控制板上的S1對應的P0_4設置為輸入模式,當檢測到P0_4引腳為低電平表示按鍵S1被按下,反之為高電日常平凡表示按鍵S1沒有被按下。因為CC2530中的無線發(fā)送功能是內置的,不是外設,即TI官網下載的CC2530 BasicRF中的無線發(fā)送代碼仍然合適我的板子,不須要怎么修改。如許,將按鍵S1端作為無線發(fā)送的發(fā)送端,而LED1端作為無線發(fā)送的接收端。
根據膳綾擎的代碼分析,來實現(xiàn)本身的無線點燈,代碼修改如下:
(1)、起首根據膳綾擎的分析,可以知道TI官網的CC2530 BasicRF中有4個LED,其分別是P0_0、P1_1、P1_4、P0_1,而我的板子中有個兩個LED燈,分別是LED1(P1_0)、LED2(P1_1)。所有須要修改LED1的引腳定義,修改hal_board.h對應LEDs的引腳定義處。
修改前
// LEDs
#define HAL_BOARD_IO_LED_1_PORT        0   // Green
#define HAL_BOARD_IO_LED_1_PIN         0
#define HAL_BOARD_IO_LED_2_PORT        1   // Red
#define HAL_BOARD_IO_LED_2_PIN         1
#define HAL_BOARD_IO_LED_3_PORT        1   // Yellow
#define HAL_BOARD_IO_LED_3_PIN         4
#define HAL_BOARD_IO_LED_4_PORT        0   // Orange
#define HAL_BOARD_IO_LED_4_PIN         1
修改后
// LEDs
#define HAL_BOARD_IO_LED_1_PORT        1   // Green******************LED1
#define HAL_BOARD_IO_LED_1_PIN         0
#define HAL_BOARD_IO_LED_2_PORT        1   // Red********************LED2
#define HAL_BOARD_IO_LED_2_PIN         1
#define HAL_BOARD_IO_LED_3_PORT        1   // Yellow
#define HAL_BOARD_IO_LED_3_PIN         4
#define HAL_BOARD_IO_LED_4_PORT        0   // Orange
#define HAL_BOARD_IO_LED_4_PIN         1
(2)、起首根據膳綾擎的分析,可以知道TI官網的CC2530 BasicRF中有1個按鍵S1,對應的引腳為P0_1,而我板子上的按鍵S1引腳為P0_4。所有須要修改LED1的引腳定義,修改hal_board.h對應Buttons的引腳定義處。
修改前
// Buttons
#define HAL_BOARD_IO_BTN_1_PORT        0   // Button S1
#define HAL_BOARD_IO_BTN_1_PIN         1
修改后
// Buttons
#define HAL_BOARD_IO_BTN_1_PORT        0   // Button S1
#define HAL_BOARD_IO_BTN_1_PIN         4
(3)、將板子的LED1和LED2燈,設置為封閉狀況,修改light_switch.c的main函數(shù),在halLedSet(1)膳綾擎添加一行代碼:halLesSet(2);
halLedSet(2);      //封閉LED2
halLedSet(1);      //封閉LED1
(4)、根據膳綾擎的light_switch.c中的appSwitch()函數(shù)分析,在其函數(shù)內逝世輪回中,它是去斷定多偏向按鍵是否按下,而實際須要斷定本身板子的單偏向按鍵是否按下。
修改前
while (TRUE) {
        if( halJoystickPushed() ) { //斷定多偏向按鍵是否按下

            basicRfSendPacket(LIGHT_ADDR, pTxData, APP_PAYLOAD_LENGTH);//發(fā)送敕令

            // Put MCU to sleep. It will wake up on joystick interrupt
            halIntOff();
            halMcuSetLowPowerMode(HAL_MCU_LPM_3); // Will turn on global
            // interrupt enable
            halIntOn();

        }
    }
修改后
while (TRUE) {
        //if( halJoystickPushed() ) { //斷定多偏向按鍵是否按下
          if (halButtonPushed()){
            basicRfSendPacket(LIGHT_ADDR, pTxData, APP_PAYLOAD_LENGTH);//發(fā)送敕令

            // Put MCU to sleep. It will wake up on joystick interrupt
            halIntOff();
            halMcuSetLowPowerMode(HAL_MCU_LPM_3); // Will turn on global
            // interrupt enable
            halIntOn();

        }
    }
(5)、將light_switch.c中的main函數(shù)一一些有關lcd屏的操作、模式選擇、等待用戶按鍵等代碼注釋掉落,注釋如下:
#if 0
    // Print Logo and splash screen on LCD
    utilPrintLogo("Light Switch");  //有關LCD的函數(shù)不管

    // Wait for user to press S1 to enter menu
    while (halButtonPushed()!=HAL_BUTTON_1);
    halMcuWaitMs(350);
    halLcdClear();    //lcd清屏,不消管

    // Set application role
    appMode = appSelectMode();    //模式選擇
    halLcdClear();

    // Transmitter application
    if(appMode == SWITCH) {
        // No return from here
        appSwitch();
    }
    // Receiver application
    else if(appMode == LIGHT) {
        // No return from here
        appLight();
    }
#endif
(7)、根據是控制端(按鍵端)照樣終端(LED燈端),在main函數(shù)添加不合函數(shù)。如不雅是將法度榜樣下載到控制端板子上,在main函數(shù)HAL_ASSERT(FLASE)上方添加appSwitch()函數(shù),而如不雅是將法度榜樣下載到終端板子上,在main函數(shù)HAL_ASSERT(FLASE)上方添加appLight()函數(shù)。
控制端
appSwitch();
    
// Role is undefined. This code should not be reached
HAL_ASSERT(FALSE);
終端
appLight();
    
// Role is undefined. This code should not be reached
HAL_ASSERT(FALSE);



預備就緒
[img]http://img.blog.csdn.net/20150105130555562

按下S1
[img]http://img.blog.csdn.net/20150105130843583

相關案例查看更多