STM32学习日志——定时器定时中断

        定时器

        定时器最基本的功能可以理解为对输入的时钟进行计数,在计数值达到设定值后,定时器会触发中断(因此定时器的本质是一个计数器,当计数的频率可靠的时候,计数就是计时)

        时基单元

        定时器的时基单元可分为计数器(16位,用来计数,根据频率每次加1),预分频器(用来分频基准频率),自动重装计时器(当计数值达到该值时产生中断)

        定时器分类

        STM32主要有三种类型的定时器,分别位高级定时器,通用计时器和基本定时器,其中用的最多的是通用计时器

        基本定时器

 

        基本定时器的结构十分简单那,主要有一个时基单元,基准频率进入预分频器PSC后被分频,得到一个新的频率,这个频率决定了CNT计时器计数的频率,当计数值到达自动重装计数器的值ARR的时候,产生中断信号(更新中断),这个信号通往NVIC,NVIC配置好后就可以得到CPU的响应了,或者产生更新事件,不触发中断,但是触发内部其它电路的工作(例如说主从模式DAC功能,这样就能节省软件资源,不需要通过中断来触发)

        基准频率的输入来自于内部时钟TIMxCLK(系统频率),通过控制器使能,供予预分频器

        通用定时器

        相比基本定时器,通用定时器就复杂了很多,时基单元和基本定时器是一样的,通用和高级定时器,在自动重装这里除了向上自增模式,还包括了向下自减和中间对齐的模式

        其它部分首先看上面,与基本定时器只能使用内部时钟作为基准频率不同,通用定时器还可以完成内外时钟源的选择,例如外部的时钟信号通过ETR(也就是PA0接口)进入经过极性选择,边沿检测还有一些滤波操作,一部分就通过上面一路输入作为基准时钟信号(这一路叫做外部时钟模式2) 

        除了这种外部输入时钟,TRGI也可以作为外部时钟来源(这一路叫做外部时钟模式1),通过这一路的时钟有1.ETR引脚的信号,2.ITR信号,这一部分呢时钟信号来自其它定时器,定时器的TRGO信号就可以通过ITR引脚作为外部时钟(以此可以实现定时器级联的功能)3.TI1F_ED这里连接的是输入捕获的CH1引脚,从CH1边沿获得时钟,ED表示上升沿下降沿都有效 4.Tl1FP和Tl2FP分别连接了CH1和CH2的时钟

        上面电路最右边的TRGO事件,可以把内部的一些事件映射到这个引脚上,用于触发其它定时器,DAC或者ADC

        下面部分的电路,首先是右边的输出比较电路,总共有四个通道,对应了从CH1到CH4的引脚,用于输出PWM波形,左边则是输入捕获通道,用以测量输入方波的频率,中间的寄存器是捕获/比较寄存器,输入捕获和输出比较电路公用这一个寄存器(具体作用在PWM波和输入捕获中讲解)

        高级定时器

        相比于通用定时器,左上的部分没有变化,主要是右下几个变化

        首先是多了一个重复次数计数器,可以实现每隔几个周期触发一次中断或事件,相当于对输出的更新信号又做了一次分频

        主要升级的地方在于对输出比较寄存器的升级,多了FTG死区寄存器(避免开关切换时对电机造成的损坏),前三路输出后面生成了两个PWM波(互补的输出),用以驱动三相无刷电机

        最后时刹车输入的功能(最下面),若是外部引脚BKIN产生了刹车信号,或者内部时钟信号损坏,控制电路会自动切断电机的输出,防止意外

        定时中断基本逻辑

        上图可以很直观的看出实现定时中断的逻辑和需要配置那些东西,最后的中断输出控制,是因为在定时器中有多个申请中断的信号,需要对其进行选择

        计数器的溢出频率为基准频率(CK_PSC)/(预分频器系数+1)/(自动重装计时器系数+1)

在计时器工作时改变预分频器系数,频率不会立刻改变,而是发生一个中断之后再改变

        左边是时钟产生,右边时钟选择(systrminit函数中这些配置已经完成了),内部基准时钟都是72MHZ

        有关代码部分        

void Timer_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	
	TIM_InternalClockConfig(TIM2);
	
	TIM_TimeBaseInitTypeDef TimeBaseInitStruct;
	TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
	TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
	TimeBaseInitStruct.TIM_Period = 10000-1;
	TimeBaseInitStruct.TIM_Prescaler = 7200-1;
	TimeBaseInitStruct.TIM_RepetitionCounter = 0 ;
	TIM_TimeBaseInit(TIM2,&TimeBaseInitStruct);
	
	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
	TIM_ClearFlag(TIM2,TIM_FLAG_Update);
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	NVIC_InitTypeDef NVIC_InitStruct;
	NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
	NVIC_Init(&NVIC_InitStruct);
	
	TIM_Cmd(TIM2, ENABLE);

}

        主要逻辑就是图中的逻辑,先开启时钟,选择时钟源时钟输入模式,通过结构体配置时间基本单元,除了说的那些,结构体需要配置计数方式(向上还是向下)(重复计数器在通用计数器中不用配置)还有一个滤波采样频率的配置,然后对于这一个中断需要使用中断输出控制使能,清除标志位(先给标志位置0,避免一开始就先进入一次中断)之后对NVIC(中断优先级)进行配置,最后给定时器使能就可以了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值