1、外設初始化
- 設置硬件無關參數,調用初始化函數,比如:
設置參數1 TIM_HandleTypeDef TIM3_Handler; //定時器句柄 2 3 //通用定時器3中斷初始化 4 //arr:自動重裝值。 5 //psc:時鍾預分頻數 6 //定時器溢出時間計算方法:Tout=((arr+1)*(psc+1))/Ft us. 7 //Ft=定時器工作頻率,單位:Mhz 8 //這里使用的是定時器3!(定時器3掛在APB1上,時鍾為HCLK/2) 9 void TIM3_Init(u16 arr,u16 psc) 10 { 11 TIM3_Handler.Instance=TIM3; //通用定時器3 12 TIM3_Handler.Init.Prescaler=psc; //分頻系數 13 TIM3_Handler.Init.CounterMode=TIM_COUNTERMODE_UP; //向上計數器 14 TIM3_Handler.Init.Period=arr; //自動裝載值 15 TIM3_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;//時鍾分頻因子 16 HAL_TIM_Base_Init(&TIM3_Handler); 17 18 HAL_TIM_Base_Start_IT(&TIM3_Handler); //使能定時器3和定時器3更新中斷:TIM_IT_UPDATE 19 }
- 按需重寫MSP函數,如:
重寫MSP函數1 //定時器底冊驅動,開啟時鍾,設置中斷優先級 2 //此函數會被HAL_TIM_Base_Init()函數調用 3 void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim) 4 { 5 if(htim->Instance==TIM3) 6 { 7 __HAL_RCC_TIM3_CLK_ENABLE(); //使能TIM3時鍾 8 HAL_NVIC_SetPriority(TIM3_IRQn,1,3); //設置中斷優先級,搶占優先級1,子優先級3 9 HAL_NVIC_EnableIRQ(TIM3_IRQn); //開啟ITM3中斷 10 } 11 }
2、中斷使用
- 中斷服務函數中調用HAL中斷函數,該函數可能會自動清理中斷標志位,用CubeMX生成的中斷服務函數放在stm32f..._it.c里面,代碼示例
1 //定時器3中斷服務函數 2 void TIM3_IRQHandler(void) 3 { 4 HAL_TIM_IRQHandler(&TIM3_Handler); 5 }
- 重寫中斷回調函數,回調函數類型可以在.h文件查看,如定時器的更新中斷回調函數
中斷回調函數1 //回調函數,定時器中斷服務函數調用的HAL庫函數調用 2 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) 3 { 4 if(htim==(&TIM3_Handler)) 5 { 6 LED1=!LED1; //LED1反轉 7 } 8 }
