stm32“>stm32单片机的守时器资源适当丰厚,它的守时器分为高档操控守时器、通用守时器和根本守时器,详细这些守时器资源在哪个系列的片子有就得看不同的片子的手册了。他们详细有什么区别,我也是刚触摸这个,看他的数据手册介绍也是茫然,主要是刚开始摸,那些功用都没用到,横竖用做守时效果的话哪种守时器都行。在这我就把我自己装备通用守时器的办法及心得简略做个总结,以防今后忘记了。我装备的是守时器2(TIM2)。
通用守时器的时钟可来自于外部或内部,选用默许便是选用内部的。通用守时器的时钟来历为APB1总线,所以首要,得将APB1外设时钟翻开。
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
其次,便是守时器的相关参数信息的装备,这些参数信息都在TIM_TimeBaseInitTypeDef这么一个结构体傍边,所以得界说这么一个结构体变量。结构体中的有关成员意义如下:
TIM_TimeBaseInitStrcture.TIM_Prescaler = 0x1c20; //时钟预分频系数,看单词意思就知道了,便是将APB1时钟进行相应分频得到一个适宜的频率
TIM_TimeBaseInitStrcture.TIM_CounterMode = TIM_CounterMode_Up; //计数模式
TIM_TimeBaseInitStrcture.TIM_Period = 0x270f; //计数周期,便是往ARR寄存器中填的一个主动转载值,这个值等于目标值-1
TIM_TimeBaseInitStrcture.TIM_ClockDivision=TIM_CKD_DIV1; //这是数字滤波器的相关设置,守时的时分不必外部时钟,所以这个设为0即可,TIM_CKD_DIV1这个便是等价于0,你要是设为其他值也不影
下面自然是初始化这个结构体傍边的参数信息了。
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStrcture);
再次,便是守时器中止的相关装备了,在装备中止的时分特别必定要留意次序,不然就会出问题,我一开始便是没留意这个次序问题,看着过错还不知道怎么回事,还好后边被我发现,哈哈。在使能中止之前必定得先清掉中止中止标志位和中止挂起位,如下:
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
TIM_ClearITPendingBit(TIM2, TIM_FLAG_Update);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
假如不先清掉挂起位和标志位,那么一使能中止,就立马进入中止服务函数,明显这不是咱们想要的,我就被这个问题整了一下。接下来便是使能守时器了,TIM_Cmd(TIM2, ENABLE);这自不必说。
最终,便是装备NVIC嵌套向量中止操控寄存器了。
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x00);//the second parameter must be a multiple of 0x200
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//2 bits for pre-emption priority, 2 bits for subpriority
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
其实,我以为在主函数里调用守时器装备函数和NVIC装备函数时,应该先调用NVIC装备函数,因为先设置好中止分组等相关参数信息后,再去翻开守时器,守时器中止就能依照NV%&&&&&%的信息去作业。
接下来的便是在stm32f10x_it.c中写自己的中止服务函数了。
void TIM2_IRQHandler(void)
{
…………
}
到此,通用守时器装备成功。