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是在这里面才找得到描述

 

猜你喜欢

转载自blog.csdn.net/sinat_30457013/article/details/89383416