这些基础的东西看视频很费时间而且有过基础的在学习只是库不太清楚,希望我总结的库使用的一些使用能节约一点大家的时间。
void TIM3_Init(u16 arr,u16 psc)
{
TIM3_Handler.Instance=TIM3; //通用定时器3
TIM3_Handler.Init.Prescaler=psc; //分频系数
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更新中断:TIM_IT_UPDATE
}
HAL库的特点就是有很多结构体嵌套这样一个句柄就可以配置所有的函数非常方便。
就在HAL_TIM_Base_Init(&TIM3_Handler);函数中有调用 HAL_TIM_Base_MspInit(htim);函数在这个函数里配置NVIC中断优先级配置。
进入中断配置我们都不需要配置只要在回调函数中写上我们想执行的函数就可以了,超级简单而且只要搞清楚回调函数这个函数实际上就类似于我们配置判断中断产生后执行只是把我们想执行的东西放到一个函数调用中实现。非常简洁
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM3)
{
__HAL_RCC_TIM3_CLK_ENABLE(); //使能TIM3时钟
HAL_NVIC_SetPriority(TIM3_IRQn,1,3); //设置中断优先级,抢占优先级1,子优先级3
HAL_NVIC_EnableIRQ(TIM3_IRQn); //开启ITM3中断
}
}
//定时器3中断服务函数
void TIM3_IRQHandler(void)
{
HAL_TIM_IRQHandler(&TIM3_Handler);
}
回调函数,定时器中断服务函数调用
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim==(&TIM3_Handler))
{
LED1=!LED1; //LED1反转
}
}
理解了我们就看通用定时器很常用的两个功能 (我一般就是PWM 控制电机和编码器反馈转速这两个功能,个人个感觉很实用自己写个函数测试一下)
编码器我整整调了三天,以前没有自己写过直接拿来用,现在自己写发现自己不了解的太多了TIM_HandleTypeDef
TIM4_Handler; //定时器4句柄
TIM_Encoder_InitTypeDef TIM4_Encoder_Handler;
//定时器4通道1输入捕获配置
//arr:自动重装值(TIM2,TIM4是16位的!!)
//psc:时钟预分频数
void TIM4_Encoder_Configration(u16 arr,u16 psc)
{
TIM4_Handler.Instance=TIM4;
TIM4_Handler.Init.Prescaler=0; //分频系数
TIM4_Handler.Init.CounterMode=TIM_COUNTERMODE_UP; //向上计数器
TIM4_Handler.Init.Period=65535; //自动装载值
TIM4_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;//时钟分频银子
//HAL_TIM_Base_Init(&TIM4_Handler);//HAL_TIM_OC_Init(&TIM4_Handler);
TIM4_Encoder_Handler.EncoderMode=TIM_ENCODERMODE_TI12;
TIM4_Encoder_Handler.IC1Filter=0;
TIM4_Encoder_Handler.IC1Polarity=TIM_ICPOLARITY_RISING;
TIM4_Encoder_Handler.IC1Prescaler=TIM_ICPSC_DIV1;
TIM4_Encoder_Handler.IC1Selection=TIM_ICSELECTION_DIRECTTI;
TIM4_Encoder_Handler.IC2Filter=0;
TIM4_Encoder_Handler.IC2Polarity=TIM_ICPOLARITY_RISING;
TIM4_Encoder_Handler.IC2Selection=TIM_ICSELECTION_DIRECTTI;
TIM4_Encoder_Handler.IC2Prescaler=TIM_ICPSC_DIV1;
HAL_TIM_Encoder_Init(&TIM4_Handler,&TIM4_Encoder_Handler);
HAL_TIM_Encoder_Start(&TIM4_Handler,TIM_CHANNEL_ALL);
HAL_TIM_Encoder_Start_IT(&TIM4_Handler,TIM_CHANNEL_ALL);//开启中断
TIM4->CNT=0;
__HAL_TIM_ENABLE_IT(&TIM4_Handler,TIM_IT_UPDATE); //使能更新中断一定要使能这一句话困扰了我两天
//__HAL_TIM_ENABLE(&TIM4_Handler);
}
void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef *htim)
{
GPIO_InitTypeDef GPIO_Initure;
if(htim->Instance==TIM4)
{
__HAL_RCC_GPIOD_CLK_ENABLE(); //开启GPIOA时钟
__HAL_RCC_TIM4_CLK_ENABLE(); //使能TIM3时钟
GPIO_Initure.Pin=GPIO_PIN_12|GPIO_PIN_13; //PA0
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //输入
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Alternate=GPIO_AF2_TIM4; //PA0复用为TIM4通道1
HAL_GPIO_Init(GPIOD,&GPIO_Initure);
//// HAL_NVIC_SetPriority(TIM4_IRQn,2,0); //设置中断优先级,抢占优先级2,子优先级0
//// HAL_NVIC_EnableIRQ(TIM4_IRQn); //开启ITM4中断通道
//ARPE使能
TIM4->CNT=0;
//TIM4->CNT = 0;
// __HAL_RCC_TIM4_CLK_ENABLE();//配置定时器四开启
}
}