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初始化代碼后面加了兩行代碼使能這兩個位
這兩個“函數”其實是宏,在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库学习--基本定时器定时中断的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为要做视频?苏杰称只是配合终端不涉足内
- 下一篇: Joomla模板开发-模版是如何执行的