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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32CubeMX与HAL库学习--基本定时器定时中断

發布時間:2024/1/1 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32CubeMX与HAL库学习--基本定时器定时中断 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

STM32CubeMX與HAL庫學習--基本定時器定時中斷

  • 背景
  • STM32CubeMX生成初始化代碼
  • 在MDK-ARM里編輯代碼
  • 其他

背景

本人小白,最近在學著使用STM32CubeMX與HAL庫進行開發,這是學習過程的一些記錄。
STM32CubeMX版本:6.3.0
HAL:STM32CubeF4 Firmware Package V1.26.1
MDK:V5.32.0.0
開發板:野火的霸天虎V2(主控芯片是STM32F407ZG)

STM32CubeMX生成初始化代碼

選擇MCU型號,新建工程

配置時鐘樹,配置之前要在RCC的HSE那里選擇外部諧振器作為時鐘來源


GPIO設置,PA0和PC13是我之前實驗外部中斷的時候定義的。PF6和PF7連的LED燈,低電平燈亮。

TIM7設置

NVIC設置

選擇IDE等選項,然后就可以生成代碼了

在MDK-ARM里編輯代碼

打開工程,打開stm32f4xx_it.c,找到void TIM7_IRQHandler(void),這是TIM7的中斷處理函數,我添加了一行代碼調用HAL_GPIO_TogglePin,用于反轉控制LED的GPIO電平。

/*** @brief This function handles TIM7 global interrupt.*/ void TIM7_IRQHandler(void) {/* USER CODE BEGIN TIM7_IRQn 0 */HAL_GPIO_TogglePin(LED_GREEN_GPIO_Port,LED_GREEN_Pin);/* USER CODE END TIM7_IRQn 0 */HAL_TIM_IRQHandler(&htim7);/* USER CODE BEGIN TIM7_IRQn 1 *//* USER CODE END TIM7_IRQn 1 */ }

然后編譯、下載,發現程序一直在while循環無法進入定時器中斷,進入調試,查看TIM7的寄存器,發現它開始計時的使能位CEN和更新中斷使能都沒有開,CubeMX初始化之后要用戶自己開。

于是我在main函數里GPIO和TIM7初始化代碼后面加了兩行代碼使能這兩個位

/* Initialize all configured peripherals */MX_GPIO_Init();MX_TIM7_Init();/* USER CODE BEGIN 2 */__HAL_TIM_ENABLE(&htim7);__HAL_TIM_ENABLE_IT(&htim7, TIM_IT_UPDATE); /* USER CODE END 2 */

這兩個“函數”其實是宏,在stm32f4xx_hal_tim.h里面定義,內容如下:

/*** @brief Enable the TIM peripheral.* @param __HANDLE__ TIM handle* @retval None*/ #define __HAL_TIM_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1|=(TIM_CR1_CEN)) /** @brief Enable the specified TIM interrupt.* @param __HANDLE__ specifies the TIM Handle.* @param __INTERRUPT__ specifies the TIM interrupt source to enable.* This parameter can be one of the following values:* @arg TIM_IT_UPDATE: Update interrupt* @arg TIM_IT_CC1: Capture/Compare 1 interrupt* @arg TIM_IT_CC2: Capture/Compare 2 interrupt* @arg TIM_IT_CC3: Capture/Compare 3 interrupt* @arg TIM_IT_CC4: Capture/Compare 4 interrupt* @arg TIM_IT_COM: Commutation interrupt* @arg TIM_IT_TRIGGER: Trigger interrupt* @arg TIM_IT_BREAK: Break interrupt* @retval None*/ #define __HAL_TIM_ENABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->DIER |= (__INTERRUPT__))

然后LED燈就可以正常閃爍了。

其他

1、中斷處理最好寫在回調函數里面。
往往不止一種情況觸發同一個中斷,各個情況都有對應回調函數,庫函數會去檢查相關標志位并調用對應的回調函數,這樣就不需要我們自己去檢查中斷標志來確定中斷來源以及清除標志位,比如上面的中斷程序可以寫在void HAL_TIM_PeriodElapsedCallback里面。
庫的回調函數都有__weak修飾,我們可以自己定義回調函數。
2、時鐘與它的中斷使能可以用函數HAL_TIM_Base_Start_IT()。(笑哭)

總結

以上是生活随笔為你收集整理的STM32CubeMX与HAL库学习--基本定时器定时中断的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。