stm32-定时器中断

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了stm32-定时器中断相关的知识,希望对你有一定的参考价值。

  由于现在是在学用库函数操作,我的目标是知道用到的每个函数的作用,需要的时候可以加以更改使用,所以关键是要怎么知道stm32各函数的作用

虽然从名字上也能知道个大概,但是细节还是要查stm32参考手册,准确的说是技术参考手册(主要讲如何使用),另有数据手册(注重数据的描述如内存,电压电流等)

至于怎么查  这个估计需要经验,我的一点心得是:在代码里右键 点go to definition。。。想办法找到这个代码具体操作的是哪个寄存器的哪一位,再去手册看这个位的作用。

 下面两张图主要是说明定时器时钟来源技术分享

 

技术分享

以下为代码

 

#include "timer.h"
#include "led.h"
//中断管理函数主要在misc里定义
//通用定时器中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数,psc接收的是TIMx_clk,是apb1倍频后再根据psc分频
//这里使用的是定时器3!
void TIM3_Int_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能

	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值	 计数到5000为500ms,就是设定中断发生周期
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  10Khz的计数频率  
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim   时钟分割定义的是在定时器时钟频率(CK_INT)与数字滤波器(ETR,TIx)使用的采样
	//频率之间的分频比例。数字滤波器(ETR,TIx)是为了将ETR进来的分频后的信号滤波,保证通过信号频率不超过某个限定。当fCK_INT=72MHz时,选择fDTS=fCK_INT/2=36MHz,
	//采样频率fSAMPLING=fDTS/2=18MHz且N=6,则频率高于3MHz的信号将被这个滤波器滤除,有效地屏蔽了高于3MHz的干扰。fDTS=fCK_INT/2=36MHz这里的2就是可以设置的
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
 
	TIM_ITConfig(  //使能或者失能指定的TIM中断
		TIM3, //TIM2
		TIM_IT_Update ,//中断类型,如更新中断(就是cnt到了arr就重装),触发中断,输入捕获中断
		ENABLE  //TIMx_DIER寄存器,应该是dma或时钟专用的开关
		);
	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //指明中断名称 在stm32f10x.h中定义
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级,即抢占优先级,是对抢占时的优先级的划分,高优先级能打断低优先级,能有嵌套关系
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级,相同抢占优先级时,不能相互打断,但同时发生时根据响应优先级来决定谁先,且不能有嵌套关系,另外两个优先级都相同时谁先就谁先执行
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能,操作ISER寄存器,这是在NVIC中断控制器中允许
	NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

	TIM_Cmd(TIM3, ENABLE);  //使能TIMx外设,开启定时器   TIMx_CR1寄存器
							 
}

void TIM3_IRQHandler(void)   //TIM3中断 名字在startup中定义
{
	if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 ,判断中断类型(此处是更新中断)
		{
		TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源 
		LED1=!LED1;
		}
}

 

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "timer.h"
//ALIENTEK Mini STM32开发板范例代码7
//定时器中断实验   
//技术支持:www.openedv.com
//广州市星翼电子科技有限公司
 int main(void)
 {	
	delay_init();	    	 //延时函数初始化
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2,分组x,则x位抢占优先级,(4-x)位响应优先级
	LED_Init();		  	//初始化与LED连接的硬件接口
	TIM3_Int_Init(4999,7199);//10Khz的计数频率,计数到5000为500ms  72mhz/7200=10000hz
   	while(1)
	{
		LED0=!LED0;
		delay_ms(200);		   
	}
}

 

最后 注意

技术分享

 

NVIc里的寄存器如iser是在这里面才找得到描述

 

以上是关于stm32-定时器中断的主要内容,如果未能解决你的问题,请参考以下文章

stm32-定时器中断

无法在 STM32f4xx 上启用定时器中断

STM32F4 PWM和中断用同一个定时器

STM32F103VET6基于STM32CubeMX创建定时器中断控制LED闪烁

07 STM32F4定时器中断

STM32定时器中断周期