知識
不管是網站,軟件還是小程序,都要直接或間接能為您產生價值,我們在追求其視覺表現(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