日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > > 充電吧
[導(dǎo)讀]? Zigbee的HAL層提供了開(kāi)發(fā)板所有硬件設(shè)備(例如LED、LCD、KEY、UART等)的驅(qū)動(dòng)函數(shù)和接口。HAL文件夾為硬件平臺(tái)的抽象層,包含common、include和target三個(gè)文件夾。

? Zigbee的HAL層提供了開(kāi)發(fā)板所有硬件設(shè)備(例如LED、LCD、KEY、UART等)的驅(qū)動(dòng)函數(shù)和接口。HAL文件夾為硬件平臺(tái)的抽象層,包含common、include和target三個(gè)文件夾。

1 Common文件夾

? common文件夾下包含有hal_assert.c和hal_drivers.c兩個(gè)文件。其中hal_assert.c是聲明文件,用于調(diào)試,hal_drivers.c是驅(qū)動(dòng)文件

1.1 hal_assert.c

? 在hal_assert.c文件中包含兩個(gè)重要的函數(shù):halAssertHandler()和halAssertHazardLights()。

1.1.1 halAssertHandle()函數(shù)

? halAssertHandler()函數(shù)為硬件系統(tǒng)檢測(cè)函數(shù)。如果定義了ASSERT_RESET宏,系統(tǒng)將調(diào)用HAL_SYSTEM_RESET復(fù)位,否則將調(diào)用halAssertHazardLights()執(zhí)行閃爍LED命令。

void halAssertHandler(void)
{
  /* execute code that handles asserts */
  
//如果定義了ASSERT_RESET宏定義
#ifdef ASSERT_RESET
  //系統(tǒng)復(fù)位
  HAL_SYSTEM_RESET();
#elif !defined ASSERT_WHILE
//當(dāng)檢測(cè)到錯(cuò)誤,LED燈閃爍命令函數(shù)
  halAssertHazardLights();
#else
  while(1);
#endif
}

1.1.2 halAssertHazardLights()函數(shù)

? halAssertHazardLights()函數(shù)控制LED燈閃爍,根據(jù)不同的硬件平臺(tái)定義的LED的個(gè)數(shù)來(lái)決定閃爍的LED的不同。其控制LED燈閃爍代碼如下:

//如果硬件平臺(tái)定義的LED燈的個(gè)數(shù)是1
#if (HAL_NUM_LEDS >= 1)
      //LED1閃爍
      HAL_TOGGLE_LED1();
#if (HAL_NUM_LEDS >= 2)
      HAL_TOGGLE_LED2();
#if (HAL_NUM_LEDS >= 3)
      HAL_TOGGLE_LED3();
#if (HAL_NUM_LEDS >= 4)
      HAL_TOGGLE_LED4();
#endif
#endif
#endif
#endif
其完整定義可自行查看。 1.2 hal_drivers.c

? hal_drivers.c文件中包含了與硬件相關(guān)的初始化和事件處理函數(shù)。此文件中有4個(gè)比較重要的函數(shù):硬件初始化函數(shù)Hal_Init()、硬件驅(qū)動(dòng)初始化函數(shù)HalDriverInit()、硬件事件處理函數(shù)Hal_ProcessEvent()和詢檢函數(shù)Hal_ProcessPoll()。

1.2.1Hal_Init()函數(shù)

? Hal_Init()函數(shù)是硬件初始化函數(shù),其功能是通過(guò)“注冊(cè)任務(wù)ID號(hào)”以實(shí)現(xiàn)在OSAL層注冊(cè),從而允許硬件驅(qū)動(dòng)的消息和事件由OSAL處理。其函數(shù)內(nèi)容為:

void Hal_Init( uint8 task_id )
{
  /* Register task ID */
  Hal_TaskID = task_id;
  
#ifdef CC2591_COMPRESSION_WORKAROUND  
  osal_start_reload_timer( Hal_TaskID, PERIOD_RSSI_RESET_EVT, PERIOD_RSSI_RESET_TIMEOUT );
#endif  
}
1.2.2 HalDriverInit()函數(shù)

? HalDriverInit()函數(shù)被main()函數(shù)調(diào)用,用于初始化與硬件設(shè)備有關(guān)的驅(qū)動(dòng)。HalDriverInit()函數(shù)的具體功能如下:

void HalDriverInit (void)
{
  /* TIMER */
  //如果定義了定時(shí)器則初始化定時(shí)器
#if (defined HAL_TIMER) && (HAL_TIMER == TRUE)
  //在Zstack-CC2530-2.5.1a版本中移除了定時(shí)器的初始化,但不影響Zstack的運(yùn)行。
  #error "The hal timer driver module is removed."
#endif

  /* ADC */
  //如果定義了ADC,初始化ADC
#if (defined HAL_ADC) && (HAL_ADC == TRUE)
  HalAdcInit();
#endif

  /* DMA */
  //如果定義了DMA,初始化DMA
#if (defined HAL_DMA) && (HAL_DMA == TRUE)
  // Must be called before the init call to any module that uses DMA.
  HalDmaInit();
#endif

  /* AES */
  //如果定義了AES,初始化AES
#if (defined HAL_AES) && (HAL_AES == TRUE)
  HalAesInit();
#endif

  /* LCD */
  //如果定義了LCD,初始化LCD
#if (defined HAL_LCD) && (HAL_LCD == TRUE)
  HalLcdInit();
#endif

  /* LED */
  //如果定義了LED,初始化LED
#if (defined HAL_LED) && (HAL_LED == TRUE)
  HalLedInit();
#endif

  /* UART */
  //如果定義了UART,初始化UART
#if (defined HAL_UART) && (HAL_UART == TRUE)
  HalUARTInit();
#endif

  /* KEY */
  //如果定義了按鍵,初始化KEY
#if (defined HAL_KEY) && (HAL_KEY == TRUE)
  HalKeyInit();
#endif

  /* SPI */
  //如果定義了SPI,初始化SPI
#if (defined HAL_SPI) && (HAL_SPI == TRUE)
  HalSpiInit();
#endif

  /* HID */
  //如果定義了USB,初始化USB,只限CC2531
#if (defined HAL_HID) && (HAL_HID == TRUE)
  usbHidInit();
#endif
}

1.2.3 Hal_ProcessEvent()函數(shù)

? Hal_ProcessEvent()函數(shù)在APP層中的任務(wù)事件處理中被調(diào)用,用于對(duì)相應(yīng)的硬件事件作出處理,具體包括系統(tǒng)消息事件、LED閃爍事件、按鍵處理事件和睡眠模式等。

uint16 Hal_ProcessEvent( uint8 task_id, uint16 events )
{
  uint8 *msgPtr;
  
  (void)task_id;  // Intentionally unreferenced parameter

  //系統(tǒng)消息事件
  if ( events & SYS_EVENT_MSG )
  {
    msgPtr = osal_msg_receive(Hal_TaskID);

    while (msgPtr)
    {
      /* Do something here - for now, just deallocate the msg and move on */

      /* De-allocate */
      osal_msg_deallocate( msgPtr );
      /* Next */
      msgPtr = osal_msg_receive( Hal_TaskID );
    }
    return events ^ SYS_EVENT_MSG;
  }

  //LED閃爍事件
  if ( events & HAL_LED_BLINK_EVENT )
  {
#if (defined (BLINK_LEDS)) && (HAL_LED == TRUE)
    HalLedUpdate();
#endif /* BLINK_LEDS && HAL_LED */
    return events ^ HAL_LED_BLINK_EVENT;
  }

  //按鍵處理事件
  if (events & HAL_KEY_EVENT)
  {

#if (defined HAL_KEY) && (HAL_KEY == TRUE)
    /* Check for keys */
    HalKeyPoll();

    /* if interrupt disabled, do next polling */
    if (!Hal_KeyIntEnable)
    {
      osal_start_timerEx( Hal_TaskID, HAL_KEY_EVENT, 100);
    }
#endif // HAL_KEY

    return events ^ HAL_KEY_EVENT;
  }

//睡眠模式
#ifdef POWER_SAVING
  if ( events & HAL_SLEEP_TIMER_EVENT )
  {
    halRestoreSleepLevel();
    return events ^ HAL_SLEEP_TIMER_EVENT;
  }
#endif

#ifdef CC2591_COMPRESSION_WORKAROUND
  if ( events & PERIOD_RSSI_RESET_EVT )
  {
    macRxResetRssi();
    return (events ^ PERIOD_RSSI_RESET_EVT);
  }
#endif  
  
  /* Nothing interested, discard the message */
  return 0;

}

1.2.4 Hal_ProcessPoll()函數(shù)

? Hal_ProcessPoll()函數(shù)在main()函數(shù)中被osal_start_system()調(diào)用,用來(lái)對(duì)可能產(chǎn)生的硬件事件進(jìn)行詢檢。函數(shù)原型為:

void Hal_ProcessPoll ()
{

  /* Timer Poll */
  //定時(shí)器詢檢
#if (defined HAL_TIMER) && (HAL_TIMER == TRUE)
  #error "The hal timer driver module is removed."
#endif

  /* UART Poll */
  //UART詢檢,即串口詢檢
#if (defined HAL_UART) && (HAL_UART == TRUE)
  HalUARTPoll();
#endif  

  /* SPI Poll */
#if (defined HAL_SPI) && (HAL_SPI == TRUE)
  HalSpiPoll();
#endif

  /* HID poll */
  //USB詢檢(僅限CC2530)
#if (defined HAL_HID) && (HAL_HID == TRUE)
  usbHidProcessEvents();
#endif
  
  //如果定義了休眠模式
#if defined( POWER_SAVING )
  /* Allow sleep before the next OSAL event loop */
  //允許在下一個(gè)事件到來(lái)之前進(jìn)入休眠模式
  ALLOW_SLEEP_MODE();
#endif

}

? 硬件驅(qū)動(dòng)初始化函數(shù)HalDriverInit()和硬件事件處理函數(shù)Hal_ProcessEvent()是Zigbee協(xié)議棧固有的,一般不需要作出較大范圍的修改,只需直接使用即可。 2. Include文件夾

Include目錄頭文件類(lèi)型 頭文件 說(shuō)明 頭文件 說(shuō)明 hal_adc.h ADC驅(qū)動(dòng)頭文件 hal_driver.h 驅(qū)動(dòng)通用頭文件 hal_key.h 按鍵驅(qū)動(dòng)頭文件 hal_sleep.h 休眠/省電模式頭文件 hal_lcd.h LCD驅(qū)動(dòng)頭文件 hal_assert.h 調(diào)試頭文件 hal_led.h LED驅(qū)動(dòng)頭文件 hal_board.h 板級(jí)配置頭文件 hal_timer.h 定時(shí)器驅(qū)動(dòng)頭文件 hal_flash.h Flash接口文件 hal_uart.h 串口驅(qū)動(dòng)頭文件 hal_ccm.h 安全接口頭文件 hal_defs.h 宏定義 ? ?
3. Target文件夾

? Target目錄下包含了某個(gè)設(shè)備類(lèi)型下的硬件驅(qū)動(dòng)文件、硬件開(kāi)發(fā)板上的配置文件、MCU信息和數(shù)據(jù)類(lèi)型。

? CC2530EB中的字符EB是TI公司的Zstack在某個(gè)硬件上實(shí)現(xiàn)的版本號(hào)。例如:BB是電池版(Battery Board);DB是開(kāi)發(fā)版(Development Board),EB是評(píng)估版(Evaluate Board)

? 在CC2530EB文件夾下包含了三個(gè)子文件夾,分別是Config、Derive、Includes

3.1 Config文件夾

? Config文件夾中包含了hal_board_cfg.h,在hal_board_cfg.h中定義了硬件CC2530硬件資源的配置,比如GPIO、DMA、ADC等。

? 在hal_board_cfg.h文件中可以定義開(kāi)發(fā)版的硬件資源。以LED為例,TI官方的CC2530EB版本定義了兩個(gè)LED:LED1和LED2,其在hal_board_cfg.h中定義如下:

/* 1 - Green */
//有關(guān)LED1的宏定義
#define LED1_BV           BV(0)
#define LED1_SBIT         P1_0
#define LED1_DDR          P1DIR
#define LED1_POLARITY     ACTIVE_HIGH

//如果定義了HAL_BOARD_CC2530EB_REC17,則定了LED2和LED3
#if defined (HAL_BOARD_CC2530EB_REV17)
  /* 2 - Red */
  //有關(guān)LED2的宏定義
  #define LED2_BV           BV(1)
  #define LED2_SBIT         P1_1
  #define LED2_DDR          P1DIR
  #define LED2_POLARITY     ACTIVE_HIGH

  /* 3 - Yellow */
  //有關(guān)LED3的宏定義
  #define LED3_BV           BV(4)
  #define LED3_SBIT         P1_4
  #define LED3_DDR          P1DIR
  #define LED3_POLARITY     ACTIVE_HIGH
#endif

? LED宏定義完成之后,設(shè)置LED的打開(kāi)和關(guān)閉,其代碼在hal_board_cfg.h文件中,代碼如下:

#if defined (HAL_BOARD_CC2530EB_REV17) && !defined (HAL_PA_LNA) && !defined (HAL_PA_LNA_CC2590)

  #define HAL_TURN_OFF_LED1()       st( LED1_SBIT = LED1_POLARITY (0); )
  #define HAL_TURN_OFF_LED2()       st( LED2_SBIT = LED2_POLARITY (0); )
  #define HAL_TURN_OFF_LED3()       st( LED3_SBIT = LED3_POLARITY (0); )
  #define HAL_TURN_OFF_LED4()       HAL_TURN_OFF_LED1()

  #define HAL_TURN_ON_LED1()        st( LED1_SBIT = LED1_POLARITY (1); )
  #define HAL_TURN_ON_LED2()        st( LED2_SBIT = LED2_POLARITY (1); )
  #define HAL_TURN_ON_LED3()        st( LED3_SBIT = LED3_POLARITY (1); )
  #define HAL_TURN_ON_LED4()        HAL_TURN_ON_LED1()

  #define HAL_TOGGLE_LED1()         st( if (LED1_SBIT) { LED1_SBIT = 0; } else { LED1_SBIT = 1;} )
  #define HAL_TOGGLE_LED2()         st( if (LED2_SBIT) { LED2_SBIT = 0; } else { LED2_SBIT = 1;} )
  #define HAL_TOGGLE_LED3()         st( if (LED3_SBIT) { LED3_SBIT = 0; } else { LED3_SBIT = 1;} )
  #define HAL_TOGGLE_LED4()         HAL_TOGGLE_LED1()

  #define HAL_STATE_LED1()          (LED1_POLARITY (LED1_SBIT))
  #define HAL_STATE_LED2()          (LED2_POLARITY (LED2_SBIT))
  #define HAL_STATE_LED3()          (LED3_POLARITY (LED3_SBIT))
  #define HAL_STATE_LED4()          HAL_STATE_LED1()

3.2 Derivers文件夾

硬件資源驅(qū)動(dòng)文件 文件 說(shuō)明 文件 說(shuō)明 hal_adc.c ADC驅(qū)動(dòng) hal_uart.c 串口驅(qū)動(dòng) hal_key.c 按鍵驅(qū)動(dòng) hal_dma.c DMA驅(qū)動(dòng) hal_lcd.c LCD驅(qū)動(dòng) hal_startup.c 啟動(dòng)代碼初始化 hal_led.c LED驅(qū)動(dòng) hal_sleep.c 睡眠/電源管理 hal_timer.c 定時(shí)器驅(qū)動(dòng) hal_flash.c 閃存驅(qū)動(dòng)
? 以最常用的LED為例,在hal_led.c文件中提供了兩個(gè)封裝好的函數(shù),在應(yīng)用層可以直接調(diào)用,以控制LED。這兩個(gè)函數(shù)是:

uint8 HalLedSet (uint8 leds, uint8 mode);
void HalLedBlink (uint8 leds, uint8 numBlinks, uint8 percent, uint16 period);

3.2.1 HalLedSet()函數(shù)

? HalLedSet()函數(shù)控制LED的亮滅:

參數(shù)leds,指LED的名稱(chēng),取值可以是:HAL_LED_1、HAL_LED_2、HAL_LED_3和HAL_LED_4;

參數(shù)mode,指LED的狀態(tài),取值可以是:HAL_LED_MODE_ON、HAL_LED_MODE_OFF和HAL_LED_MODE_TOGGLE。

3.2.2 HalLedBlink()函數(shù)

? HalLedBlink()函數(shù)控制LED燈閃爍:

???????????? 參數(shù)numBlinks:閃爍次數(shù)。

???????????? 參數(shù)percent:LED亮和滅的所用時(shí)間占空比。

???????????? 參數(shù)period:LED閃爍一個(gè)周期所需要的時(shí)間,以毫秒為單位。


本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過(guò)流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問(wèn)題卻十分常見(jiàn),不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問(wèn)題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(chē)(EV)作為新能源汽車(chē)的重要代表,正逐漸成為全球汽車(chē)產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車(chē)的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車(chē)的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車(chē) 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車(chē)場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問(wèn)題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周?chē)娮釉O(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來(lái)解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開(kāi)關(guān)電源具有效率高的特性,而且開(kāi)關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開(kāi)關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉