H7所含的定时器资源
H7中一共包含10个通用定时器(TIM2~TIM5,TIM12~TIM17),
其中TIM2~TIM5具有4个通道,而TIM12~TIM17只具有2个通道。
其中TIM2~TIM5支持向上、向下、向下/向上自动装载计数器(TIMx——CNT)
(仅TIM2和TIM5是32位计数器)TIM12~TIM17只支持向上(递增)计数方式。
软件设计部分
定时器初始化
TIM_HandleTypeDef TIM3_Handler; //创建TIM3句柄
void TIM3_Init(u16 arr,u16 psc)
{
TIM3_Handler.Instance=TIM3; //选择通用定时器3
TIM3_Handler.Init.Prescaler=psc; //预分频系数,TIM3是十六位计数器
TIM3_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;//模式向上计数
TIM3_Handler.Init.Period=arr; //重装载值
TIM3_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;//时钟分频因子
HAL_TIM_Base_Init(&TIM3_Handler); //初始化定时器
HAL_TIM_Base_Start_IT(&TIM3_Handler); //使能定时器3和定时器3更新中断
定时器频率设置:如果设置MCU系统时钟为400MHz,则定时器频率为200MHz/(psc+1)
计数时间:T=(arr+1)/定时器频率
2.定时器底层驱动
//此函数会被上方的HAL_TIM_Base_Init(&TIM3_Handler)调用
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
__HAL_RCC_TIM3_CLK_ENABLE(); //定时器3时钟使能
HAL_NVIC_SetPriority(TIM3_IRQn,1,3); //定时器中断优先级设置,抢占优先级为1,子优先级3
HAL_NVIC_EnableIRQ(TIM3_IRQn); //使能定时器3中断
}
定时器3中断函数
void TIM3_IRQHandler(void)
{
HAL_TIM_IRQHandler(&TIM3_Handler);
}
定时器中断服务函数调用
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim==(&TIM3_Handler)) //判断是定时器3溢出中断
{
定时器中断处理函数
}
}
H7所含的定时器资源
H7中一共包含10个通用定时器(TIM2~TIM5,TIM12~TIM17),
其中TIM2~TIM5具有4个通道,而TIM12~TIM17只具有2个通道。
其中TIM2~TIM5支持向上、向下、向下/向上自动装载计数器(TIMx——CNT)
(仅TIM2和TIM5是32位计数器)TIM12~TIM17只支持向上(递增)计数方式。
软件设计部分
定时器初始化
TIM_HandleTypeDef TIM3_Handler; //创建TIM3句柄
void TIM3_Init(u16 arr,u16 psc)
{
TIM3_Handler.Instance=TIM3; //选择通用定时器3
TIM3_Handler.Init.Prescaler=psc; //预分频系数,TIM3是十六位计数器
TIM3_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;//模式向上计数
TIM3_Handler.Init.Period=arr; //重装载值
TIM3_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;//时钟分频因子
HAL_TIM_Base_Init(&TIM3_Handler); //初始化定时器
HAL_TIM_Base_Start_IT(&TIM3_Handler); //使能定时器3和定时器3更新中断
定时器频率设置:如果设置MCU系统时钟为400MHz,则定时器频率为200MHz/(psc+1)
计数时间:T=(arr+1)/定时器频率
2.定时器底层驱动
//此函数会被上方的HAL_TIM_Base_Init(&TIM3_Handler)调用
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
__HAL_RCC_TIM3_CLK_ENABLE(); //定时器3时钟使能
HAL_NVIC_SetPriority(TIM3_IRQn,1,3); //定时器中断优先级设置,抢占优先级为1,子优先级3
HAL_NVIC_EnableIRQ(TIM3_IRQn); //使能定时器3中断
}
定时器3中断函数
void TIM3_IRQHandler(void)
{
HAL_TIM_IRQHandler(&TIM3_Handler);
}
定时器中断服务函数调用
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim==(&TIM3_Handler)) //判断是定时器3溢出中断
{
定时器中断处理函数
}
}
举报