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

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                >[success] **技術支持說明** > 1.**客服**提供簡單的技術支持,一般自主學習為主 > 2.可到官方問答社區中提問:[**去提問**](https://bbs.csdn.net/forums/nb-iot) > 3.工程師**會盡快**解答社區問題,但他們是一線開發,【**難以保證**】解答時效,解答辛苦,感謝理解! <br/> ## **定時器簡介** 顧名思義,定時器的作用是用來計算一段時間,其應用非常廣泛,例如: * 30min后關閉音樂 * 每隔1s閃爍一次LED燈 * 每隔1個小時上報一次數據 STM32F030F4P6內置了一個TIM3定時器,可提供定時服務。 <br/> ## **定時器 HAL API 設計** 為定時器設計HAL API前,需要先思考一下應用開發者需要對定時器進行什么操作。一般地,應用開發者需要設置定時時長、開啟定時器和關閉定時器,因此HAL可以提供以下API供應用層調用: * 初始化定時器并設定定時時長 * 開啟定時器 * 關閉定時器 與按鍵類似,如果定時時間到了可以產生中斷,利用中斷處理函數來處理。相關架構設計如圖所示。 ![](https://img.kancloud.cn/b2/4e/b24e46ab309ef9bd46c3dfc14dfa01da_470x471.png =300x) <br/> **編寫代碼** 筆者在本節課配套的源代碼中新建了 hal\_timer.h 和 hal\_timer.c文件,如圖所示。 ![](https://img.kancloud.cn/c8/7d/c87debbb628aad03c46d2e406e6e1a0a_246x495.png =250x) ### 打開本節課配套的工程,筆者把hal\_timer.c以及必要的標準庫文件添加進工程了,如圖所示。 ![](https://img.kancloud.cn/4a/63/4a63c7cb1af4fddce720ce5d692c13d2_375x594.png =250x) <br/> hal_timer.h文件的代碼如下: ### ``` #ifndef __HAL_TIMER_H__ #define __HAL_TIMER_H__ /* * 初始化定時器 * period: 定時時長(毫秒),取值范圍是1 ~ 65534 * onTick: 回調函數,定時結束后自動調用此函數 */ void halTimerInit(unsigned int period, void (*onTimerIRQ)(void)); /* * 開啟定時器 */ void halTimerStart(void); /* * 關閉定時器 */ void halTimerStop(void); #endif /* #ifndef __HAL_TIMER_H__ */ ``` <br/> hal_timer.c文件代碼如下: ### ``` #include "hal_timer.h" #include "stm32f0xx_tim.h" /* 回調函數,定時結束后自動執行此函數 */ static void (*halTimerOnIRQ)(void) = 0; /* * 初始化定時器 * period: 定時時長(毫秒),取值范圍是1 ~ 65534 * onTick: 回調函數,定時結束后自動調用此函數 */ void halTimerInit(unsigned int period, void (*onTimerIRQ)(void)) { TIM_TimeBaseInitTypeDef timer3; NVIC_InitTypeDef timer3NVIC; /* 保存回調函數 */ halTimerOnIRQ = onTimerIRQ; /* * ((TIM_Period + 1) / Clock)*(TIM_Prescaler + 1) = N ms / 1000 * * So, when TIM_Prescaler is 47999, ((TIM_Period + 1) / 48MHz) * 48000 = N ms / 1000 * * TIM_Period + 1 = (N ms / 1000) / 48000 * 48MHz = (N ms * 48000000Hz) / (1000 * 48000) * * TIM_Prescaler = N ms - 1 * * Another solution: * Clock is 48MHz, * when TIM_Prescaler is 47999, number of pulses generated in 1 second: 48000000Hz / (47999 + 1) = 1000 * So, 10 pulses can be generated in 1 millisecond. */ timer3.TIM_Period = (period > 1) ? (period - 1) : 1;//設置定時器的計數次數,即定時時長(毫秒) timer3.TIM_Prescaler = 47999;//分頻系數 timer3.TIM_ClockDivision = TIM_CKD_DIV1; timer3.TIM_CounterMode = TIM_CounterMode_Up; /* TIM3 NVIC */ timer3NVIC.NVIC_IRQChannel = TIM3_IRQn; timer3NVIC.NVIC_IRQChannelPriority = 1; timer3NVIC.NVIC_IRQChannelCmd = ENABLE; /* Enable TIM3 clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); /* Initial TIM3 */ TIM_TimeBaseInit(TIM3, &timer3); /* Enable IRQ */ TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); /* Initial TIM3 NVIC */ NVIC_Init(&timer3NVIC); } /* * 開啟定時器 */ void halTimerStart() { TIM_Cmd(TIM3, ENABLE); } /* * 開啟定時器 */ void halTimerStop() { TIM_Cmd(TIM3, DISABLE); } /* * TIM3定時器中斷處理函數 */ void TIM3_IRQHandler() { if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET && halTimerOnIRQ != 0) halTimerOnIRQ();//回調函數 TIM_ClearITPendingBit(TIM3, TIM_IT_Update);//清空中斷標志位 } ``` ### 上述代碼涉及到定時器的計數原理,這里簡單地講解一下。 * **系統時鐘頻率** CPU的時鐘發生器會以恒定的時間間隔產生脈沖,這個間歇性的脈沖可以形象理解為芯片的心跳,時鐘頻率則是用來描述這個心跳的速率。大家通常用1s內時鐘發生器產生的脈沖數量來描述時鐘頻率,例如“時鐘頻率10 MHz”表示1s內的心跳次數為10 000 000次。 ### * **分頻系數** 分頻是指將時鐘頻率降低為原來的1/N,也稱為N分頻。比如當時鐘頻率是48MHz的時候,那么2分頻是24MHz。 ### * **計數器** 是定時器的核心,用于記錄時鐘發生器產生的脈沖數量。通過這個脈沖數量,便可計算出時間 查閱STM32F030F4P6的技術參數可得知其系統時鐘頻率為48MHz,即每秒可產生48 000 000次脈沖。如果定時器的分頻系統為48000(47999+1),那么定時器的時鐘頻率是48 000 000Hz / 48 000=1000Hz,即每秒鐘產生1000次脈沖,也就是說每秒鐘計數器計數1000次。于是可以得出,計數器每計算1次就是1毫秒了。 <br/> ## **使用 定時器 HAL API** 編寫好按鍵 HAL API后,定時器的使用非常簡單。在配套工程的main.c文件中添加如下代碼: ``` /* * 按鍵回調函數,當按鍵被按下后即執行此函數 */ static void buttonOnClick() { halLedToggle();//反轉LED燈的亮滅狀態 } /* * 定時器回調函數,當定時結束后即執行此函數 */ static void timerOnIRQ() { halLedToggle();//反轉LED燈的亮滅狀態 } int main(void) { halSystemInit();//系統初始化 halLedInit();//LED初始化 halButtonInit(buttonOnClick);//按鍵初始化 halTimerInit(1000, timerOnIRQ);//定時器初始化,同時設定定時時間為1000ms halTimerStart();//啟動定時器 while (1){} } ``` 上述代碼實現了每隔1秒閃爍一次LED。 <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>

                              哎呀哎呀视频在线观看