一、简介
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反转 */
}
}