stm32的守时器用的时分是依据原子开发版的程序直接使用的,用的时分也没有详细的考量,可是在用的时分呈现了一个问题,便是守时器的中止在设置之后,并没有翻开守时器可是程序碑文到这儿就会进入中止,假如中止中有其他一些硬件功用,例如在守时器中发送一些数据,而这个时分串口并没有初始化时,便是呈现程序死在这儿的问题。经过网上查找材料发现是守时器中止标志未铲除的问题,调用TIM_ClearFlag函数之后就不会产生以上问题了。看来在硬件装备时必定要留意这个问题,不管是其他外围设备的初始化都需求留意。之前看到SPI、USART等初始化的时分会常常加上XXX_DeInit()函数,看来也并非剩余,关于硬件初始化是很有必要的,纪虽然在手册上看到这些值的初始值都是0,可是在使用中仍是呈现这种问题,因而往后在使用中必定的多加留意。详细初始化程序如下:
void TIM2_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能
TIM_DeInit(TIM2);
//守时器TIM2初始化
TIM_TimeBaseStructure.TIM_Period = 7199; //设置鄙人一个更新事情装入活动的主动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =9; //设置用来作为TIMx时钟频率除数的预分频值 输出周期为T=(Prescaler+1)(Period+1)/72M
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟切割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //依据指定的参数初始化TIMx的时刻基数单位
// TIM_ITConfig(TIM2,TIM_IT_UpdateTIM_IT_Trigger,ENABLE ); //使能指定的TIM2中止,答应更新中止
TIM_ClearFlag(TIM2 , TIM_FLAG_Update); //铲除中止标志
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM2中止,答应更新中止
//中止优先级NVIC设置
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //TIM2中止
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //先占优先级3级 优先级设置最低
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
}
这是守时器的更新中止,还有守时捕获形式等,这些能够愈加灵敏的用于一些需求守时器的问题中,