一、工具
1、硬件:STM32L053R8單片機(HAL庫)
2、編譯環境:Atollic TrueSTUDIO for STM32 9.3.0
3、輔助工具:STM32CubeMX
二、單片機系統時鍾配置
1、系統時鍾配置(沒有顯示的默認),這里選擇的是內部的高速時鍾(HSI)作為時鍾源,系統時鍾頻率配置到24MHz。
三、定時器配置
1、選用的定時器為TIM22,時鍾源選擇內部時鍾,即24MHz,分頻值為24(設置值為24-1),自動重裝載值為1000(設置值為1000-1),得到該定時器的周期為(1000x24)/24000000 = 1ms。
2、使能定時器中斷
四、生成工程並進行完善
1、工程生成設置
2、完善代碼
因為用到了定時器中斷,在配置完定時器后,在定時器啟動之前清除一下更新事件中斷以防止中斷提前觸發(開啟定時器中斷后,每隔一個周期硬件就把定時器更新事件置1)。
/** * @brief TIM22 Initialization Function * @param None * @retval None */ static void MX_TIM22_Init(void) { /* USER CODE BEGIN TIM22_Init 0 */ /* USER CODE END TIM22_Init 0 */ TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; /* USER CODE BEGIN TIM22_Init 1 */ /* 定時器設定的是1ms延時產生一次中斷 */ /* USER CODE END TIM22_Init 1 */ htim22.Instance = TIM22; htim22.Init.Prescaler = 23; htim22.Init.CounterMode = TIM_COUNTERMODE_UP; htim22.Init.Period = 999; htim22.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim22.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim22) != HAL_OK) { Error_Handler(); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim22, &sClockSourceConfig) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim22, &sMasterConfig) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN TIM22_Init 2 */ __HAL_TIM_CLEAR_IT(&htim22, TIM_IT_UPDATE); /* USER CODE END TIM22_Init 2 */ }
定時器中斷響應后會調用一個回調函數,該函數的內容可以由用戶自己添加(該函數為固定寫法不能隨意更改)。
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim->Instance == TIM22) { HAL_TIM_Base_Stop_IT(&htim22); } }
3、其它不用修改的代碼
定時器時鍾控制和中斷設置。
/** * @brief TIM_Base MSP Initialization * This function configures the hardware resources used in this example * @param htim_base: TIM_Base handle pointer * @retval None */ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base) { if(htim_base->Instance==TIM22) { /* USER CODE BEGIN TIM22_MspInit 0 */ /* USER CODE END TIM22_MspInit 0 */ /* Peripheral clock enable */ __HAL_RCC_TIM22_CLK_ENABLE(); /* TIM22 interrupt Init */ HAL_NVIC_SetPriority(TIM22_IRQn, 0, 0); HAL_NVIC_EnableIRQ(TIM22_IRQn); /* USER CODE BEGIN TIM22_MspInit 1 */ /* USER CODE END TIM22_MspInit 1 */ } } /** * @brief TIM_Base MSP De-Initialization * This function freeze the hardware resources used in this example * @param htim_base: TIM_Base handle pointer * @retval None */ void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base) { if(htim_base->Instance==TIM22) { /* USER CODE BEGIN TIM22_MspDeInit 0 */ /* USER CODE END TIM22_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_TIM22_CLK_DISABLE(); /* TIM22 interrupt DeInit */ HAL_NVIC_DisableIRQ(TIM22_IRQn); /* USER CODE BEGIN TIM22_MspDeInit 1 */ /* USER CODE END TIM22_MspDeInit 1 */ } }
定時器中斷函數實現。
/** * @brief This function handles TIM22 global interrupt. */ void TIM22_IRQHandler(void) { /* USER CODE BEGIN TIM22_IRQn 0 */ /* USER CODE END TIM22_IRQn 0 */ HAL_TIM_IRQHandler(&htim22); /* USER CODE BEGIN TIM22_IRQn 1 */ /* USER CODE END TIM22_IRQn 1 */ }
4、啟動定時器
在啟動前清空計數器的內容,在有些情況下作用很大。
__HAL_TIM_SET_COUNTER(&htim22, 0); HAL_TIM_Base_Start_IT(&htim22);
#end