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-定时器中断的主要内容,如果未能解决你的问题,请参考以下文章