STM32
回帖(1)
2021-12-16 09:53:26
以下是我们平时用STM32定时器的初始化函数和中断函数:
初始化函数:
void time_init()
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; //声明一个结构体变量,用来初始化GPIO
NVIC_InitTypeDef NVIC_InitStructure;
//开启定时器4时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
//STM32f103系列通用定时器4挂在APB2上,APB2设置的频率是72M,让a*b=72M,则定时器1S进入一次中断
TIM_TimeBaseInitStructure.TIM_Period = 160(a); //设置自动重装载寄存器周期的值
TIM_TimeBaseInitStructure.TIM_Prescaler = 49999(b); //设置用来作文TIMx时钟频率预分频值
TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure);
TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE ); //使能中断
TIM_ClearITPendingBit(TIM4,TIM_IT_Update);´
TIM_Cmd(TIM4,ENABLE); //开启定时器4时钟
//设置NVIC参数
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel=TIM4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
中断函数:
void TIM4_IRQHandler(void)
{
if(TIM_GetITStatus(TIM4, TIM_IT_Update) == SET)
{
TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
//要处理的事件内容
}
}
以上是我们最常用定时器的两个函数,但是在最近项目中发现,在初始化定时器的之后,马上就会进入中断,这让我很苦恼,因为我不希望它初始化的时候就进中断,由于要求进中断的次数被限制了,所以到处找解决问题的方法,网上的方法层出不穷,
对着这篇博客我对着做过尝试https://blog.csdn.net/ygt666/article/details/79586390,发现并不能解决我的问题
但是经过本人亲身尝试,我发现在定时器初始化函数中加入下面一段代码即可
TIM_ClearFlag(TIM4,TIM_FLAG_Update);
这里需要说明一下,STM32固件库提供了两个函数用来判断定时器状态以及清除定时器状态标志位的函数 TIM_GetFlagStatus 和 TIM_ClearFlag,在初始化函数中清除标志位。
以下是我们平时用STM32定时器的初始化函数和中断函数:
初始化函数:
void time_init()
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; //声明一个结构体变量,用来初始化GPIO
NVIC_InitTypeDef NVIC_InitStructure;
//开启定时器4时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
//STM32f103系列通用定时器4挂在APB2上,APB2设置的频率是72M,让a*b=72M,则定时器1S进入一次中断
TIM_TimeBaseInitStructure.TIM_Period = 160(a); //设置自动重装载寄存器周期的值
TIM_TimeBaseInitStructure.TIM_Prescaler = 49999(b); //设置用来作文TIMx时钟频率预分频值
TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure);
TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE ); //使能中断
TIM_ClearITPendingBit(TIM4,TIM_IT_Update);´
TIM_Cmd(TIM4,ENABLE); //开启定时器4时钟
//设置NVIC参数
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel=TIM4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
中断函数:
void TIM4_IRQHandler(void)
{
if(TIM_GetITStatus(TIM4, TIM_IT_Update) == SET)
{
TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
//要处理的事件内容
}
}
以上是我们最常用定时器的两个函数,但是在最近项目中发现,在初始化定时器的之后,马上就会进入中断,这让我很苦恼,因为我不希望它初始化的时候就进中断,由于要求进中断的次数被限制了,所以到处找解决问题的方法,网上的方法层出不穷,
对着这篇博客我对着做过尝试https://blog.csdn.net/ygt666/article/details/79586390,发现并不能解决我的问题
但是经过本人亲身尝试,我发现在定时器初始化函数中加入下面一段代码即可
TIM_ClearFlag(TIM4,TIM_FLAG_Update);
这里需要说明一下,STM32固件库提供了两个函数用来判断定时器状态以及清除定时器状态标志位的函数 TIM_GetFlagStatus 和 TIM_ClearFlag,在初始化函数中清除标志位。
举报
更多回帖