一、简介
F429默认需要配置的频率如下:* CPU频率(HCLK) = pll_p_ck = 180Mhz* AHB1/2/3(rcc_hclk1/2/3) = 180Mhz* APB1(rcc_pclk1) = pll_p_ck / 4 = 45Mhz* APB2(rcc_pclk2) = pll_p_ck / 2 = 90Mhz基本定时器的时钟为APB1时钟的2倍, 而APB1为45M, 所以定时器时钟 = 90Mhz
二、通用定时器HAL库函数流程
btim_timx_int_init(5000 - 1, 9000 - 1); /* 90 000 000 / 9000 = 10KHz 10KHz的计数频率,计数5K次为500ms */1.TIMx时钟使能(x:2~5) 拿TIM3为例HAL_RCC_TIM3_CLK_ENABLE(); // 使能TIM3时钟2.初始化定时器参数,设置自动重装值,分频系数,计数方式等HAL_TIM_Base_Init();3.使能定时器更新中断,使能定时器HAL_TIM_Base_Start_IT; // 使能句柄指定的定时器更新中断4.TIM3中断优先级设置HAL_NVIC_SetPriority(TIM3_IRQn, x, x);HAL_NVIC_EnableIRQ(TIM3_IRQn);
5.编写中断服务函数(也要编写中断回调函数)void HAL_TIM_IRQHandler(); // 中断服务函数HAL_TIM_IRQHandler(); // 中断处理入口函数void HAL_TIM_PeriodElapseCallback(); // 定时器更新中断回调函数
定时器控制LED灯的反转
/******************************************************************************************************* @file btim.c* @author 正点原子团队(ALIENTEK)* @version V1.0* @date 2022-04-20* @brief 基本定时器 驱动代码* @license Copyright (c) 2020-2032, 广州市星翼电子科技有限公司***************************************************************************************************** @attention** 实验平台:正点原子 阿波罗 F429开发板* 在线视频:www.yuanzige.com* 技术论坛:www.openedv.com* 公司网址:www.alientek.com* 购买地址:openedv.taobao.com** 修改说明* V1.0 20220420* 第一次发布******************************************************************************************************/#include "./BSP/LED/led.h"
#include "./BSP/TIMER/btim.h"TIM_HandleTypeDef g_timx_handle; /* 定时器参数句柄 *//*** @brief 基本定时器TIMX定时中断初始化函数* @note* 基本定时器的时钟来自APB1,当PPRE1 ≥ 2分频的时候* 基本定时器的时钟为APB1时钟的2倍, 而APB1为45M, 所以定时器时钟 = 90Mhz* 定时器溢出时间计算方法: Tout = ((arr + 1) * (psc + 1)) / Ft us.* Ft=定时器工作频率,单位:Mhz** @param arr : 自动重装值。* @param psc : 时钟预分频数* @retval 无*/
void btim_timx_int_init(uint16_t arr, uint16_t psc)
{g_timx_handle.Instance = BTIM_TIMX_INT; /* 定时器x */g_timx_handle.Init.Prescaler = psc; /* 分频 */g_timx_handle.Init.CounterMode = TIM_COUNTERMODE_UP; /* 递增计数模式 */g_timx_handle.Init.Period = arr; /* 自动装载值 */HAL_TIM_Base_Init(&g_timx_handle);HAL_TIM_Base_Start_IT(&g_timx_handle); /* 使能定时器x和定时器更新中断 */
}/*** @brief 定时器底层驱动,开启时钟,设置中断优先级此函数会被HAL_TIM_Base_Init()函数调用* @param htim : 定时器句柄* @retval 无*/
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{if (htim->Instance == BTIM_TIMX_INT){BTIM_TIMX_INT_CLK_ENABLE(); /* 使能TIMx时钟 */HAL_NVIC_SetPriority(BTIM_TIMX_INT_IRQn, 1, 3); /* 抢占1,子优先级3 */HAL_NVIC_EnableIRQ(BTIM_TIMX_INT_IRQn); /* 开启ITMx中断 */}
}/*** @brief 基本定时器TIMX中断服务函数* @param 无* @retval 无*/
void BTIM_TIMX_INT_IRQHandler(void)
{HAL_TIM_IRQHandler(&g_timx_handle); /* 定时器回调函数 */
}/*** @brief 回调函数,定时器中断服务函数调用* @param htim : 定时器句柄* @retval 无*/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if (htim->Instance == BTIM_TIMX_INT){LED1_TOGGLE(); /* LED1反转 */}
}