在最近几天一直在学习STM32,由于之前接触的比较少,所以遇到了一些问题,现在问题汇总起来,供大家学习。
1.首先,定时器中断需要做的就是分配时钟:
RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);
//APB2负责AD,I/O,串口1,高级TIM;APB1负责DA,串口2345,普通TIM,USB,IIC,CAN
2.设定定时器的参数:
typedef struct
{
uint16_t TIM_Prescaler;
uint16_t TIM_CounterMode; //设置自动重装载寄存器周期的值
uint16_t TIM_Period; //设置时钟频率除数的预分频值
uint16_t TIM_ClockDivision; //设置时钟分割
uint8_t TIM_RepetitionCounter; //用于高速定时器,TIM1,TIM8;
} TIM_TimeBaseInitTypeDef;
TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);//该函数存在于stm32f10x_tim.c内
定时器溢出时间是用((TIM_CounterMode+1)*(TIM_Period+1))/72M计算得出。
3.设定中断参数:
NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);//设置中断分组,中断分组分5组;5组分别对应着先占优先级与从优先级。
typedef struct
{
uint8_t NVIC_IRQChannel; //中断的通道
uint8_t NVIC_IRQChannelPreemptionPriority; //先占优先级,0最高
uint8_t NVIC_IRQChannelSubPriority; //从优先级,0最高
FunctionalState NVIC_IRQChannelCmd; //使能通道
} NVIC_InitTypeDef;
NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
4.TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);//使能TIM
5.书写中断函数:
在书写的中断函数内一定要有EXTI_ClearITPendingBit(uint32_t EXTI_Line)函数来清楚中断标志
在3之中设置的NVIC_IRQChannel来对函数进行命名,然后书写中断函数的内容。注意 中断函数无参数,无返回值,可适当延时。
以上5点就是我理解的定时器中断的大概步骤,如果有问题大家一起探讨,不喜勿喷,谢谢。