1. stm32 HAL庫 確定定時器時鐘
確定定時器爲哪個時鐘?
- 找到初始化函數 MX_TIM1_Init();
- 進入函數,找到 HAL_TIM_Base_Init(&htim1)
- 進入函數,找到 HAL_TIM_Base_MspInit(htim);
- 進入函數,依次找到定時器時鐘開啓函數;
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{
if(tim_baseHandle->Instance==TIM1)
{
/* USER CODE BEGIN TIM1_MspInit 0 */
/* USER CODE END TIM1_MspInit 0 */
/* TIM1 clock enable */
//就是這裏,進入就能看見是哪個時鐘
__HAL_RCC_TIM1_CLK_ENABLE();
/* USER CODE BEGIN TIM1_MspInit 1 */
/* USER CODE END TIM1_MspInit 1 */
}
else if(tim_baseHandle->Instance==TIM3)
{
/* USER CODE BEGIN TIM3_MspInit 0 */
/* USER CODE END TIM3_MspInit 0 */
/* TIM3 clock enable */
__HAL_RCC_TIM3_CLK_ENABLE();
/* TIM3 interrupt Init */
HAL_NVIC_SetPriority(TIM3_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(TIM3_IRQn);
/* USER CODE BEGIN TIM3_MspInit 1 */
/* USER CODE END TIM3_MspInit 1 */
}
else if(tim_baseHandle->Instance==TIM8)
{
/* USER CODE BEGIN TIM8_MspInit 0 */
/* USER CODE END TIM8_MspInit 0 */
/* TIM8 clock enable */
__HAL_RCC_TIM8_CLK_ENABLE();
/* USER CODE BEGIN TIM8_MspInit 1 */
/* USER CODE END TIM8_MspInit 1 */
}
}
- 假如我們要看TIM1在哪個時鐘下,進入TIM1時鐘開啓函數即可
2. 配置定時器1爲 ms 毫秒延時定時器
- 根據文章開頭的方法,定時器1使用APB2時鐘,主頻80MHz
- 設置TIM1參數,分頻係數10,000,計數頻率爲8KHz
- 生成工程,添加延時函數代碼
void tx_delay_ms(uint16_t nms) //量程0-8191ms
{
__HAL_TIM_SetCounter(&htim1, 0);//htim1
__HAL_TIM_ENABLE(&htim1);
while(__HAL_TIM_GetCounter(&htim1) < (8 * nms));//計數頻率8KHz,8次即爲1ms
/* Disable the Peripheral */
__HAL_TIM_DISABLE(&htim1);
}
- 然後再在頭文件添加聲明即可
3. 配置定時器8爲 us 微秒延時定時器
- 根據文章開頭的方法,定時器8使用APB2時鐘,主頻80MHz
- 設置TIM8參數,分頻係數10,計數頻率爲8MHz
- 生成工程,添加延時函數代碼
void tx_delay_us(uint16_t nus) //量程0-8191us
{
__HAL_TIM_SetCounter(&htim8, 0);//htim8
__HAL_TIM_ENABLE(&htim8);
while(__HAL_TIM_GetCounter(&htim8) < (8 * nus));//計數頻率8MHz,8次即爲1us
/* Disable the Peripheral */
__HAL_TIM_DISABLE(&htim8);
}
- 然後再在頭文件添加聲明即可
4. 中斷方式延時函數
- 我們使用定時器3來產生中斷,定時器3在APB1下,80MHz
- 設置定時器3參數
- 編寫延時函數
- 首先聲明中斷累加變量
static volatile uint16_t tim3_counter;
- 編寫延時函數延時時長(0-65535ms)
void tim3_delay_ms(uint16_t nms)
{
tim3_counter = 0;
while(tim3_counter!=nms);
}
- 設置定時器中斷回調函數
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == htim3.Instance) //定時器3中斷 1ms/次
{
tim3_counter++;
}
}
- 開始使用!