日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

HAL库_定时器更新中断+流水灯

發(fā)布時間:2024/8/26 综合教程 37 生活家
生活随笔 收集整理的這篇文章主要介紹了 HAL库_定时器更新中断+流水灯 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

對比標(biāo)準(zhǔn)庫的流程使用HAL庫編寫定時器更新中斷

標(biāo)準(zhǔn)庫中使用定時器更新中斷的方式:

1.開時鐘,設(shè)置TIM的時鐘

2.初始化定時器石基的結(jié)構(gòu)體

3.調(diào)用Init初始化函數(shù)

4.處理定時器中斷

HAL中使用定時器更新中斷的方式:

1.開時鐘

2.初始化定時器石基的結(jié)構(gòu)體

3.處理定時器中斷

3.1在CubeMx中設(shè)置NVIC的搶占優(yōu)先級和子優(yōu)先級

3.2 編寫TIM3_IRQHandler //重點(diǎn)

先來看標(biāo)準(zhǔn)庫中怎么處理這個中斷,首先從啟動文件中找到定時器中斷的函數(shù)名字,然后再函數(shù)里判斷是定時器的哪種中斷(更新?輸入捕獲?輸出比較?),然后清標(biāo)志位,然后才寫我們在中斷干什么的代碼。HAL中處理的方式有些變化。

stm32fxx_it.c文件中找到了和標(biāo)準(zhǔn)庫中一樣名字的中斷函數(shù)。

 1 void TIM3_IRQHandler(void)
 2 {
 3   /* USER CODE BEGIN TIM3_IRQn 0 */
 4 
 5   /* USER CODE END TIM3_IRQn 0 */
 6   HAL_TIM_IRQHandler(&htim3);
 7   /* USER CODE BEGIN TIM3_IRQn 1 */
 8 
 9   /* USER CODE END TIM3_IRQn 1 */
10 }

這里面什么都沒做只是調(diào)用了一個函數(shù)HAL_TIM_IRQHandler(&htim3);

這個函數(shù)中完成了判斷中斷類型,清中斷標(biāo)志位的操作。我們只要寫真正的處理代碼即可。這也就是回調(diào)函數(shù)。

HAL_TIM_IRQHandler(&htim3);函數(shù)中調(diào)判斷了各種定時器的中斷類型,也調(diào)用了對應(yīng)的中斷處理函數(shù)(回調(diào)函數(shù)),包括:

 1 /* Callback in non blocking modes (Interrupt and DMA) *************************/
 2 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);
 3 void HAL_TIM_PeriodElapsedHalfCpltCallback(TIM_HandleTypeDef *htim);
 4 void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim);
 5 void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim);
 6 void HAL_TIM_IC_CaptureHalfCpltCallback(TIM_HandleTypeDef *htim);
 7 void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim);
 8 void HAL_TIM_PWM_PulseFinishedHalfCpltCallback(TIM_HandleTypeDef *htim);
 9 void HAL_TIM_TriggerCallback(TIM_HandleTypeDef *htim);
10 void HAL_TIM_TriggerHalfCpltCallback(TIM_HandleTypeDef *htim);
11 void HAL_TIM_ErrorCallback(TIM_HandleTypeDef *htim);

總結(jié)一下思路就是:

啟動文件中有定時器中斷的函數(shù)名字:TIM3_IRQHandler 這個名字是不能改的

stm32fxx_it.c中調(diào)用:void TIM3_IRQHandler(void),它又調(diào)用了HAL_TIM_IRQHandler(&htim3)(這個函數(shù)在stm32f1xx_hal_tim.c中由庫實(shí)現(xiàn))

在stm32f1xx_hal_tim.c中HAL_TIM_IRQHandler(&htim3)這個函數(shù)調(diào)用了各種定時器的具體中斷類型的函數(shù)(回調(diào)函數(shù));聲明在stm32f1xx_hal_tim.h中。

具體的回調(diào)函數(shù)在外設(shè)的.c文件中以__weak關(guān)鍵字定義但沒實(shí)現(xiàn),我們需要去處理這些回調(diào)函數(shù)。該回調(diào)函數(shù)和標(biāo)準(zhǔn)庫中的中斷函數(shù)一樣,可在任意文件中實(shí)現(xiàn)

在HAL中,無論是串口的中斷,DMA的中斷,定時器的中斷,都是以這種方法組織的。

下面是定時器更新中的回調(diào)函數(shù)實(shí)現(xiàn):

1 /* USER CODE BEGIN 1 */
2 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
3 {
4     if(htim==&htim3)
5     {
6         HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
7         HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_5);
8     }
9 }

別忘了開啟定時器中斷:&htim3就是一個句柄

HAL_TIM_Base_Start_IT(&htim3);

總結(jié)

以上是生活随笔為你收集整理的HAL库_定时器更新中断+流水灯的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。