www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

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

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

1 Common文件夾

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

1.1 hal_assert.c

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

1.1.1 halAssertHandle()函數(shù)

? halAssertHandler()函數(shù)為硬件系統(tǒng)檢測函數(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)檢測到錯誤,LED燈閃爍命令函數(shù)
  halAssertHazardLights();
#else
  while(1);
#endif
}

1.1.2 halAssertHazardLights()函數(shù)

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

//如果硬件平臺定義的LED燈的個數(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個比較重要的函數(shù):硬件初始化函數(shù)Hal_Init()、硬件驅(qū)動初始化函數(shù)HalDriverInit()、硬件事件處理函數(shù)Hal_ProcessEvent()和詢檢函數(shù)Hal_ProcessPoll()。

1.2.1Hal_Init()函數(shù)

? Hal_Init()函數(shù)是硬件初始化函數(shù),其功能是通過“注冊任務(wù)ID號”以實現(xiàn)在OSAL層注冊,從而允許硬件驅(qū)動的消息和事件由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ū)動。HalDriverInit()函數(shù)的具體功能如下:

void HalDriverInit (void)
{
  /* TIMER */
  //如果定義了定時器則初始化定時器
#if (defined HAL_TIMER) && (HAL_TIMER == TRUE)
  //在Zstack-CC2530-2.5.1a版本中移除了定時器的初始化,但不影響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)用,用于對相應(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)用,用來對可能產(chǎn)生的硬件事件進(jìn)行詢檢。函數(shù)原型為:

void Hal_ProcessPoll ()
{

  /* Timer Poll */
  //定時器詢檢
#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 */
  //允許在下一個事件到來之前進(jìn)入休眠模式
  ALLOW_SLEEP_MODE();
#endif

}

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

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

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

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

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

3.1 Config文件夾

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

? 在hal_board_cfg.h文件中可以定義開發(fā)版的硬件資源。以LED為例,TI官方的CC2530EB版本定義了兩個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的打開和關(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ū)動文件 文件 說明 文件 說明 hal_adc.c ADC驅(qū)動 hal_uart.c 串口驅(qū)動 hal_key.c 按鍵驅(qū)動 hal_dma.c DMA驅(qū)動 hal_lcd.c LCD驅(qū)動 hal_startup.c 啟動代碼初始化 hal_led.c LED驅(qū)動 hal_sleep.c 睡眠/電源管理 hal_timer.c 定時器驅(qū)動 hal_flash.c 閃存驅(qū)動
? 以最常用的LED為例,在hal_led.c文件中提供了兩個封裝好的函數(shù),在應(yīng)用層可以直接調(diào)用,以控制LED。這兩個函數(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的名稱,取值可以是: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ù)period:LED閃爍一個周期所需要的時間,以毫秒為單位。


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

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

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

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

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

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

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

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

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

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

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

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

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

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

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

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

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

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

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

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

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