<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>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                >[success] **技術支持說明** > 1.**客服**提供簡單的技術支持,一般自主學習為主 > 2.可到官方問答社區中提問:[**去提問**](https://bbs.csdn.net/forums/nb-iot) > 3.工程師**會盡快**解答社區問題,但他們是一線開發,【**難以保證**】解答時效,解答辛苦,感謝理解! <br/> ## **概述** &emsp;&emsp;上節課講解了閃爍LED的實現,其中用到了一個for循環來實現延時,這種延遲方式有多種缺點,例如這種延時的時間并不是恒定的,即每次執行完for循環所需的時間不一定相同的。如果需要以恒定的時間間隔來閃爍LED等,那么可以借助SysTick。SysTick(System Tick Timer)是一個24位的系統節拍定時器,具有自動重載和計數溢出中斷的功能。 <br/> ## **系統延時 HAL API 設計** 本節課將講解基于STM32的SysTick來實現一個精確度為us的延時函數。 >[info] 1秒(s) = 1000毫秒(ms) = 1000000微秒(us) 筆者在本節課配套的源代碼中新建了 hal\_system.h 和 hal\_system.c文件,如圖所示。 ![](https://img.kancloud.cn/7b/de/7bde385ae21db2fcd0c76ece009bc518_261x383.png =300x) ### hal\_system將會主要用于存放系統相關的內容,筆者把延時API也歸為此類。 <br/> 打開本節課配套的工程,筆者把hal\_system.c以及標準庫文件stm32f0xx\_syscfg.c、stm32f0xx_misc.c添加進工程了,如圖所示。 ![](https://img.kancloud.cn/de/b5/deb53f7d8a2a34fad12eb5e2368d4eaa_375x494.png =300x) <br/> **編寫代碼** hal_system.h文件的代碼如下: ### ``` #ifndef __HAL_SYSTEM_H__ #define __HAL_SYSTEM_H__ void halSystemInit(void); void halSystemDelayUs(unsigned long n); #endif /* #define __HAL_SYSTEM_H__ */ ``` <br/> hal_system.c文件的代碼如下: ### ``` #include "hal_system.h" #include "stm32f0xx_syscfg.h" /* * 系統初始化函數,這里暫時僅初始化SysTick */ void halSystemInit() { SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); } /* * 系統延時 * * @param time - 延時時間,以微秒(us)為單位 */ void halSystemDelayUs(unsigned long time) { volatile uint32_t value; SysTick->LOAD = time * (SystemCoreClock / 8000000); SysTick->VAL = 0x00; SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; do { value = SysTick->CTRL; }while ((value & 0x01) && !(value & (1<<16))); SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; SysTick->VAL = 0x00; } ``` ### halSystemDelayUs函數的代碼較為復雜,但讀者暫時只需會使用此API即可。 <br/> ## **使用系統延時API** 在配套的工程中,打開main.c文件,可找到如下的系統延時API使用示例代碼: ``` int main(void) { halSystemInit();//系統初始化 halLedInit();//初始化LED燈 /* Infinite loop */ while (1) { halLedToggle();//反轉LED燈的狀態 /* 延時1秒 */ halSystemDelayUs(1000 * 1000); } } ``` 與上節課類似,上述代碼實現了閃爍LED的功能,不同的是,這里恒定以1秒為閃爍間隔。 <br/> <br/> ## **商務合作** 如有以下需求,可掃碼添加管理員好友,注明“**商務合作**” * 項目定制開發,技術范圍:**NB-IoT**、**CATn(4G)**、**WiFi**、**ZigBee**、**BLE Mesh**以及**STM32**、**嵌入式Linux**等; * 入駐平臺,成為講師; * 接項目賺外快; * 善學坊官網:[www.sxf-iot.com](https://www.sxf-iot.com/) ![](https://img.kancloud.cn/ca/73/ca739f92cab220a3059378642e3bd502_430x430.png =150x) (非商務合作**勿擾**,此處**非**技術支持)
                  <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>

                              哎呀哎呀视频在线观看