<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                * 導師視頻講解:[**去聽課**](https://www.bilibili.com/video/BV1k34y1D7Vz?p=30) >[success] **技術支持說明:** >**1**.一般以自主學習為主 > **2**.可到官方問答社區中提問:[**去提問**](https://bbs.csdn.net/forums/zigbee) > **3**.工程師**會盡快**解答社區問題,但他們是一線開發,【**難以保證**】解答時效,解答辛苦,感謝理解! <br/> 本節課繼續以SampleSwitch例程為例來講解HAL的架構。類似地,讀者只需要跟隨筆者的講解思路大致了解一下本節課的內容就可以了。 <br/> ## **HAL的架構簡介** ### **初始化** HAL的初始化函數Hal_Init()在hal_drivers.c文件中,代碼如下: ``` /************************************************************************************************** * @fn Hal_Init * * @brief Hal Initialization function. * * @param task_id - Hal TaskId * * @return None **************************************************************************************************/ 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 } ``` <br/> **驅動程序初始化** 在hal_drivers.c文件中,可以找到驅動初始化函數HalDriverInit(),這個函數的主要作用是針對各種硬件外設進行初始化,代碼如下: ``` /************************************************************************************************** * @fn Hal_DriverInit * * @brief Initialize HW - These need to be initialized before anyone. * * @return None **************************************************************************************************/ void HalDriverInit (void) { //定時器,通過設置宏定義HAL_TIMER為TRUE來使能該功能 #if (defined HAL_TIMER) && (HAL_TIMER == TRUE) #endif //模數轉換功能,通過設置宏定義HAL_ADC為TRUE來使能該功能 #if (defined HAL_ADC) && (HAL_ADC == TRUE) HalAdcInit(); #endif //DMA(直接存儲器訪問),通過設置宏定義HAL_DMA為TRUE來使能該功能 #if (defined HAL_DMA) && (HAL_DMA == TRUE) HalDmaInit(); #endif //AES(高級加密標準),通過設置宏定義HAL_AES為TRUE來使能該功能 #if (defined HAL_AES) && (HAL_AES == TRUE) HalAesInit(); #endif //顯示器,通過設置宏定義HAL_LCD為TRUE來使能該功能 #if (defined HAL_LCD) && (HAL_LCD == TRUE) HalLcdInit(); #endif //LED,通過設置宏定義HAL_LED為TRUE來使能該功能 #if (defined HAL_LED) && (HAL_LED == TRUE) HalLedInit(); #endif //串口,通過設置宏定義HAL_UART為TRUE來使能該功能 #if (defined HAL_UART) && (HAL_UART == TRUE) HalUARTInit(); #endif //按鍵,通過設置宏定義HAL_KEY為TRUE來使能該功能 #if (defined HAL_KEY) && (HAL_KEY == TRUE) HalKeyInit(); #endif //SPI,通過設置宏定義HAL_SPI為TRUE來使能該功能 #if (defined HAL_SPI) && (HAL_SPI == TRUE) HalSpiInit(); #endif //HID(Human Interface Device),通過設置宏定義HAL_HID為TRUE來使能該功能 #if (defined HAL_HID) && (HAL_HID == TRUE) usbHidInit(); #endif } ``` ### 在實際的開發過程中,開發者可以根據需求來使用指定的外設。在這段代碼中可以看出,需要用指定的外設就定義對應宏就可以了,例如如果要用LED,那么就去定義HAL_LED這個宏為TRUE,如果不用用到,那么就不用定義。在定義了對應的宏后就會執行對應的初始化,例如這個LED初始化函數HalLedInit()。后續的章節將會講述具體的宏定義方法。 ### 開發者如果需要新增其他的外設,那么可以按照協議棧的這個架構新增外設 <br/> **事件處理** HAL的事件處理函數Hal\_ProcessEvent()在hal\_drivers.c文件中,它的主要作用是處理HAL層的事件,代碼如下: ``` /************************************************************************************************** * @fn Hal_ProcessEvent * * @brief Hal Process Event * * @param task_id - Hal TaskId * events - events * * @return None **************************************************************************************************/ uint16 Hal_ProcessEvent( uint8 task_id, uint16 events ) { uint8 *msgPtr; (void)task_id; // Intentionally unreferenced parameter if ( events & SYS_EVENT_MSG ) { //省略系統事件的處理代碼 ......... return events ^ SYS_EVENT_MSG; } //蜂鳴器事件,需要宏定義HAL_BUZZER為TRUE才使能該事件 #if (defined HAL_BUZZER) && (HAL_BUZZER == TRUE) if (events & HAL_BUZZER_EVENT) { HalBuzzerStop(); return events ^ HAL_BUZZER_EVENT; } #endif //RSSI重置事件,需要宏定義PERIOD_RSSI_RESET_EVT為TRUE才使能該事件 #ifdef CC2591_COMPRESSION_WORKAROUND if ( events & PERIOD_RSSI_RESET_EVT ) { macRxResetRssi(); return (events ^ PERIOD_RSSI_RESET_EVT); } #endif //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 return events ^ HAL_KEY_EVENT; } //低功耗事件,需要宏定義HAL_SLEEP_TIMER_EVENT為TRUE才使能該事件 #if defined POWER_SAVING if ( events & HAL_SLEEP_TIMER_EVENT ) { halRestoreSleepLevel(); return events ^ HAL_SLEEP_TIMER_EVENT; } if ( events & HAL_PWRMGR_HOLD_EVENT ) { (void)osal_pwrmgr_task_state(Hal_TaskID, PWRMGR_HOLD); (void)osal_stop_timerEx(Hal_TaskID, HAL_PWRMGR_CONSERVE_EVENT); (void)osal_clear_event(Hal_TaskID, HAL_PWRMGR_CONSERVE_EVENT); return (events & ~(HAL_PWRMGR_HOLD_EVENT | HAL_PWRMGR_CONSERVE_EVENT)); } if ( events & HAL_PWRMGR_CONSERVE_EVENT ) { (void)osal_pwrmgr_task_state(Hal_TaskID, PWRMGR_CONSERVE); return events ^ HAL_PWRMGR_CONSERVE_EVENT; } #endif return 0; } ``` <br/> #### **HAL輪詢** 在hal\_drivers.c文件中,可以找到Hal\_ProcessPoll()函數,這個函數的主要作用是輪詢那些需要快速處理的功能模塊,代碼如下: ``` /************************************************************************************************** * @fn Hal_ProcessPoll * * @brief This routine will be called by OSAL to poll UART, TIMER... * * @return None **************************************************************************************************/ void Hal_ProcessPoll () { //是否進入低功耗模式 #if defined( POWER_SAVING ) ALLOW_SLEEP_MODE(); #endif //串口 #if (defined HAL_UART) && (HAL_UART == TRUE) HalUARTPoll(); #endif //SPI #if (defined HAL_SPI) && (HAL_SPI == TRUE) HalSpiPoll(); #endif //HID #if (defined HAL_HID) && (HAL_HID == TRUE) usbHidProcessEvents(); #endif } ``` 到這里,已經為讀者簡單地介紹了HAL的整體結構,接下來將會講解如何利用HAL來使用LED、按鍵、串口、顯示器和ADC等基本硬件資源。 <br/> <br/> ## **項目定制** * 如需項目定制開發,可掃碼添加項目經理好友(注明“**項目定制**”) * 定制范圍:**NB-IoT**、**CATn(4G)**、**WiFi**、**ZigBee**、**BLE Mesh**以及**STM32**、**嵌入式Linux**等IoT技術方案 * 善學坊官網:[www.sxf-iot.com](https://www.sxf-iot.com/) ![](https://img.kancloud.cn/ca/73/ca739f92cab220a3059378642e3bd502_430x430.png =200x) * 非項目定制**勿擾**,此處**非**技術支持
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看