原创 STM32高级控制定时器1学习

2011-3-20 23:16 10618 7 8 分类: MCU/ 嵌入式

学习STM32这么久了,很想将所学到的东西总结一下,好让自己不会在遗忘中迷失。

高级控制定时器(Tim1)是由一个16位的自动装载计数器组成,它由一个可编程预分频器驱动。

用途在于:测量输入信号的脉冲宽度(输入捕获),或者产生输出波形(输出比较,PWM,嵌入死区时间的互补PWM等)。

使用定时器预分频器和RCC时钟控制预分频器,可以实现脉冲宽度和波形周期从几个微秒到几个毫秒的调节。

具体如下:

 

16位上下,自动装载计数器。

 

16位可编程预分频器,计数器时钟频率的分频率的分频系数为1-65535之间任意数值

 

4个独立通道:

输入捕获

输出比较

PWM生成

单脉冲模式输出

死区时间可编程的互补输出

使用外部信号控制定时器和定时器互连的同步电路

在指定数目的计数器周期之后更新定时器寄存器

刹车输入信号可以将定时器输出信号置于复位状态或者一个已知状态

如下事件发生时产生中断:

更新:计数器向上溢出或者向下溢出,计数器初始化。

触发事件(计数器启动,停止,初始化)

输入捕获

输出比较

刹车信号输入

 

今天我们来实现用tim1实现计数器的功能:

步骤一:进行定时器时钟启动:

void tim1_on()
{
  //Step1.时钟设置:启动TIM1
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);  

}

步骤二:实现对定时器的配置(对其内部寄存器进行配置初始化)

//Step2.TIM1模块设置
void TIM_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;
//TIM_OCInitTypeDef TIM_OCInitStructure;  //比较PWM的时候用。

//TIM1 使用内部时钟
//TIM_InternalClockConfig(TIM1);

//TIM1基本设置
//设置预分频器分频系数71,即APB2=72M, TIM1_CLK=72/72=1MHz
//TIM_Period(TIM1_ARR)=1000,计数器向上计数到1000后产生更新事件,计数值归零
//向上计数模式
//TIM_RepetitionCounter(TIM1_RCR)=0,每次向上溢出都产生更新事件
TIM_BaseInitStructure.TIM_Period = 1000;
TIM_BaseInitStructure.TIM_Prescaler = 71;
TIM_BaseInitStructure.TIM_ClockDivision = 0;
TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_BaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM1, &TIM_BaseInitStructure);

//清中断,以免一启用中断后立即产生中断
TIM_ClearFlag(TIM1, TIM_FLAG_Update);
//使能TIM1中断源
TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);

//TIM1总开关:开启
TIM_Cmd(TIM1, ENABLE);
}

根据上面的提示,我们可以看到1000*1/1MHz=1ms的时候进入中断一次。

步骤三:对定时器中断进行优先级别设置:

void NVIC_Configuration(void)

#ifdef  VECT_TAB_RAM 
  /* Set the Vector Table base location at 0x20000000 */
  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else  /* VECT_TAB_FLASH  */
  /* Set the Vector Table base location at 0x08000000 */
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);  
#endif

//Step3.中断NVIC设置:允许中断,设置优先级
NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQChannel;    //更新事件
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;   //抢占优先级0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;          //响应优先级1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;             //允许中断
NVIC_Init(&NVIC_InitStructure);                            //写入设置

}

将这里基本设施都能好了。

我们可以进行中断函数的设置,就是进入中断要干什么。

tim1中断有:

TIM1_BRK_IRQHandler(void) //tim1的暂停中断

TIM1_CC_IRQHandler(void)//tim1的捕获比较中断

TIM1_TRG_COM_IRQHandler(void)//tim1的触发

TIM1_UP_IRQHandler(void)//tim1的刷新中断和通讯中断。

我们使用的是向上计数的模式,所以要进入向上计数的中断:

void TIM1_UP_IRQHandler(void)
{
 GPIO_SetBits(GPIOB, GPIO_Pin_12);
 delay_nms(100);                       //闪灯
 GPIO_ResetBits(GPIOC, GPIO_Pin_8);
 TIM_ClearITPendingBit(TIM1, TIM_FLAG_Update); //清中断

}

 

将所有的准备工作的做好了,我们开始写main函数()

如下:

  /* 系统时钟初始化 */
  RCC_Configuration();
  /* Led_IO 口初始化 */
  ledGPIO_init();
  /*Key_IO 口初始化*/
  //key_init();
  tim1_on();
  TIM_Configuration();
  NVIC_Configuration();
 
  while(1)
  {
   
  }

这样就完成了定时器1的计数器功能。


 

文章评论1条评论)

登录后参与讨论

用户377235 2013-12-4 15:50

这个就是定时器的基本使用了···
相关推荐阅读
用户307537 2011-07-12 01:24
ad603中文资料
ad603中文资料 2008-03-24 21:32:16|  分类: 电子设计 |  标签: |字号大中小 订阅 正文内容: 在很多信号采集系统中,信号变化的幅度都比较大,那么放大以后的信号幅...
用户307537 2011-06-10 20:39
电脑PC端下载电子市场(Market)软件,Android SDK模拟器安装电子市场(Market)
http://bbs.dospy.com/thread-10844471-1-404-1.html...
用户307537 2011-06-02 15:48
使用BSRR和BRR寄存器直接操作STM32的I/O端口
标签: STM32  GPIO   使用BSRR和BRR寄存器直接操作STM32的I/O端口 STM32的每个GPIO端口都有两个特别的寄存器,GPIOx_BSRR和GPIOx_BRR寄存器,通...
用户307537 2011-05-30 22:53
免费芯片申请地址
免费芯片申请地址 1、铁电存储器(未见量的限制,据说最多有人申请了100片,不知真假.)介绍:铁电存储器(FRAM)产品将ROM的非易失性数据存储特性和RAM的无限次读写、高速读写以及低功耗等优势结...
用户307537 2011-03-20 01:02
2440串口纠结后
以前一直都是在纠结在串口中,现在终于解决了。我整个人都好像轻松了不少。我又可以进行我的嵌入式之旅了。原来市面上卖的串口线,有两种,一种是默认TXD和RXD相连的,而另外一种没有,所以,我不知道,刚刚好...
EE直播间
更多
我要评论
1
7
关闭 站长推荐上一条 /7 下一条