当前位置:   article > 正文

Stm32配置TIM(定时器)详解_各个参数含义_用法&配置中断(NVIC)介绍_stm32 用定时器 需要配置 nvic吗

stm32 用定时器 需要配置 nvic吗

唠叨话

这篇随记主要记录了stm32定时器配置过程中一些参数的含义,这样可以使配置过程中更加清楚自己在干什么,而不是代码的直接CV。这些网上都有,但是不太全,也是为了下次自己节省点查阅资料的时间,在这里总结一下。

开始

void tim2_init(int ms)
{
	// 打开外设时钟,TIM2挂在APB1上
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
	// 预分频系数为71+1=72,这样计数器时钟为72MHz/72=1MHz
	// 相当于1*10^-6秒记一次数
	TIM_TimeBaseStructure.TIM_Prescaler = 71;
	// 设置计数溢出大小,每当计数到ms*1000就触发一个中断事件
	// 结合上面计数频率,可得出中断周期为ms,单位毫秒
	TIM_TimeBaseStructure.TIM_Period = ms * 1000;
	// 设置时钟分割
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	// 设置计数器模式为向上计数模式
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
	// 将配置应用到TIM2中
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

	NVIC_InitTypeDef NVIC_InitStructure;
	// 设置NVIC分组
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	// 设置IRQ通道
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
	// 设置抢占优先级
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	// 设置相应优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	// 通道使能
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	// 应用配置
	NVIC_Init(&NVIC_InitStructure);

	// 开启TIM2的中断
	TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
	// TIM2定时器使能
	TIM_Cmd(TIM2, ENABLE);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

上面这些是开启一个定时器的基本配置,我这里用的是TIM2为例,使用别的修改相应的编号即可。

下面给出其他一些有关定时器的方法:

	// 重新将TImer设置为缺省值
	TIM_DeInit(TIMx);

	// 采用内部时钟给TIMx提供时钟源
	TIM_InternalClockConfig(TIMx);
	// 清除TIMx的待处理标志位
	TIM_ClearFlag(TIMx, TIM_FLAG_Update);
	// 获取定时器TIMx状态
	TIM_GetFlagStatus(TIMx, TIM_IT_Update);
	// 禁止ARR预装载缓冲器
	// 即预装载寄存器的内容被立即传送到影子寄存器
	TIM_ARRPreloadConfig(TIMx, DISABLE);
	// 清楚TIMx的中断待处理位
	TIM_ClearITPendingBit(TIMx, TIM_FLAG_Update);
	// 获取定时器TIMx的状态
	TIM_GetITStatus(TIMx, TIM_IT_Update) ;
	
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

不难看出上面有两种获取TIM状态以及对应的清楚方法,这里说一下他们的区别:

TIM_GetITStatus()函数会先判断中断是否使能,使能了才去判断对应的中断标志位;
而TIM_GetFlagStatus()函数则不管是否使能,直接来判断状态标志位。
两者都可使用,注意的是使用对应的清楚标志函数即可。

我们常用的中断处理方式如下:
void TIMx_IRQHandler(void)
{
   	if ( TIM_GetITStatus(TIMx, TIM_IT_Update) != RESET ) 
    {
			/*
				产生中断后,需要处理的逻辑
			*/
			TIM_ClearITPendingBit(TIMx, TIM_FLAG_Update);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

先关的中断配置的东西基本就这些了,接下来我来说说中断配置当中NVIC中断优先级的相关参数意义。

	配置中断时,我们要配置抢占优先级以及响应优先级;
	所谓抢占式优先级和响应优先级,他们之间的关系是:具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套。
	当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,
如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。
如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;
如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。每一个中断源都必须定义2个优先级。
	
	对于NVIC来说,抢占优先级和响应优先级的数量是由4个比特位来决定,
	而这就导致了VNIC有5组分配方式来分配抢占优先级和响应优先级部分:
	
	第0组:所有4位用来配置抢占优先级,即NVIC的配置有24次方16中,此时无响应优先级;
	第1组:最高1位用来配置抢占优先级,低3位用来配置响应优先级。解释如下,有21次方2种抢占优先级(0级,1),有23次方8种响应优先级;
即在16种中断中,有8种中断,其抢占优先级为0级,而它们的响应优先级分别为0~7,其余8种中断的抢占优先级则都为1级,响应优先级别分别为0~7。
	第2组:高2位用来配置抢占优先级,低2位用来配置响应优先级;
	第3组:高3位用来配置抢占优先级,低1位用来配置响应优先级;
	第4组:所有4位用来配置响应优先级。即16种中断具有都不相同的响应优先级。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

差不多就这了,定时器的使用。

结尾

ok,完事。上面那些内容,基本一搜都能找的到,但很零散,这里算是做一个总结的性质。最后,对你有帮助的话,来个小小滴赞。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/912840
推荐阅读
相关标签
  

闽ICP备14008679号