第八章:STM32定时器

时间:2014年8月15日

一、定时器种类:

     1、四个可同步运行的通用定时器(TIM2~TIM5),每个均有一个16位的自动加载递增/递减计数器、一个16位预分频器和4个独立的通道。

      2、两个16位高级控制定时器(TIM1和TIM8)

        特点:由一个可编程预分频器驱动的16为自动装载 计数器组成,与通用定时器有共同处,但功能更强大。

      3、两个基本定时器(TIM6和TIM7)

       特点:主要用于产生DAC触发信号,也可以当作通用的16为时基计数器

      4、实时时钟RTC

       特点:能提供日历/时钟、数据存储等功能。常用作各种计算机系统的时钟信号源和参数设置存储电路。计算准、体积小功耗低。

      5、看门狗(Watchdog)

       特点:用于出错矫正。

      6、SysTick时钟(位于CM3内核)

       特点:24位递减计数器,计数到0,自动重装,同时内部COUNTFLAG标志置位。

二、通用定时器TIMx的功能(略)

2.1、时钟源选择

        计数器时钟可由下列时钟源提供:内部时钟(CK_INT)、外部时钟模式1(输入脚TIx)、外部时钟模式2(外部触发输入ETR)、内部触发(ITRx,一个定时器可作为另外一个定时器的预分频器)

2.2、时基单元

        包括计数器寄存器(TIMx_CNT)、预分频寄存器(TIMx_PSC)和自动装载寄存器(TIMX_ARR)等。

初始化相关数据结构:

typedef struct
{
  u16 TIM_Prescaler;             //预分频因子
  u16 TIM_CounterMode  ;       //定时器模式
  u16 TIM_Period;                   //定时器周期个数
  u16 TIM_ClockDivision;         // 定时器分频因子
  u8 TIM_RepetitionCounter;
} TIM_TimeBaseInitTypeDef;

注:1、TIM_Prescaler:写入预分频器中。a、新的参数要在下一次更新时间来临时被采用。b、计数器由预分频器的时钟输出CK_CNT驱动,需要设置计数器TIMx_CR1中的计数器使能位。

       2、TIM_TimeBaseInitTypeDef:设置干扰的频率限制,对应TIMx_CR1中的第八和第9位的CKD[1:0]

2.3、计数器模式(略)

2.4、定时时间计算

     T=(TIM_Prescaler+1)X(TIM_Period+1)/TIMxCLK

2.5、定时器中断

   TIM2中断通道序号为28,默认优先级35

1)初始化过程:设置寄存器AIRC中PRIGROUP的值,设置优先级的分配——>设置TIM2寄存器,允许相应中断——>设置TIM2的优先级(IP[28])——>设置允许TIM2中断通道。

2)中断响应过程:TIM2的UIE条件成立,TIM2本身中断标志置位,——>申请中断——>Pending标志置位——>执行中断服务程序——>硬件清除Pending标志位

3)执行TIM2的中断服务程序:所有TIM2的中断事件都在一个TIM2中断服务中完成,故需要在中断程序中判断是哪个中断源要服务!

三、实例1

【程序功能】数码管每个1s加一,到F跳转到0(用定时器2中断实现)

1)、主程序初始化

/* TIM2, GPIOA and GPIOB clock enable */RCC初始化配置
  RCC_APB2PeriphClockCmd(RCC_APB1Periph_TIM2 | RCC_APB2Periph_GPIOA |
                         RCC_APB2Periph_GPIOB, ENABLE);

/****************NVIC初始化****************************/

void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;

#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

/* Enable the TIM1 Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

/*****************GPIO配置************************************

void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

   /* GPIOA Configuration: */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure); 
}

/*******************************************************************************
*
*            主函数
*
*******************************************************************************/
int main(void)
{
#ifdef DEBUG
  debug();
#endif

  RCC_Configuration();  //系统时钟配置

  NVIC_Configuration();     //NVIC配置

  GPIO_Configuration();     //通用IO端口配置

  /*-----------------------------------------------------------------------------*/

  /***72M下定时值的计算((1+预分频TIM_Prescaler)/72*(1+定时周期TIM_Period))*/
 
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //配置RCC,使能TIMx

  /* Time Base configuration */
  TIM_TimeBaseStructure.TIM_Prescaler = 7199;  //时钟预分频数 例如:时钟频率=72/(时钟预分频+1) 
 
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; ////定时器模式 向上计数 

  TIM_TimeBaseStructure.TIM_Period = 9999;//自动重装载寄存器周期的值(定时时间)累计 0xFFFF个频率后产生个更新或者中断(也是说定时时间到)

  TIM_TimeBaseStructure.TIM_ClockDivision = 0; ////时间分割值 

  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //初始化定时器2

  TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //打开中断 溢出中断 

//打开定时器
  TIM_Cmd(TIM2, ENABLE); 
   /* Main Output Enable */
  TIM_CtrlPWMOutputs(TIM2, ENABLE);

  while (1)
  { 
       GPIO_Write( GPIOB ,  LED7Code[Count%16]<<8); //将Count数据送到GPIOB高八位
    
  }
}

第八章:STM32定时器

时间: 2024-10-12 22:22:29

第八章:STM32定时器的相关文章

STM32定时器的预装载寄存器与影子寄存器之间的关系【转】

首先转载:   STM32定时器的预装载寄存器与影子寄存器之间的关系 本文的说明依据STM32参考手册(RM0008)第10版:英文:http://www.st.com/stonline/products/literature/rm/13902.pdf中译文:http://www.stmicroelectronics.com.cn/stonline/mcu/images/STM32_RM_CH_V10_1.pdf 在STM32参考手册的第13.14章中,都有一张定时器的框图,下面是第14章中定时

STM32 定时器用于外部脉冲计数(转)

源:STM32 定时器用于外部脉冲计数 STM32 定时器(一)——定时器时间的计算 STM32的定时器是灰常NB的,也是灰常让人头晕的(当然是对于白菜来说的). STM32中的定时器有很多用法: (一)系统时钟(SysTick) 设置非常简单,以下是产生1ms中断的设置,和产生10ms延时的函数: void RCC_Configuration(void) { RCC_ClocksTypeDef RCC_ClockFreq; SystemInit();//源自system_stm32f10x.c

[原创] STM32 定时器TIMx 编码器应用 函数 TIM_EncoderInterfaceConfig 分析

今天把STM32 定时器输入作为 编码器接口相关的 函数   TIM_EncoderInterfaceConfig ,好好分析了一遍 因为网上不少人对这个函数有问题 1 void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode, 2 uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity) 3 { 4 uint16_t tmpsmcr = 0; 5 uint

STM32 定时器级联

根据参考手册给出的主/ 从定时器的例子 其实就是主定时器产生一个触发信号,让从定时器去接收这个触发信号,通过这个触发信号来让从定时器工作. 下面我们来看看我设置的从定时器 只需要配置 TIMx->SMCR 的TS[2:0] (Trigger selection)   选择是哪一个触发信号来触发从定时器工作 和位 SMS[2:0](Slave mode Selection)  选择外部时钟模式1-选中(TRGI)的上升沿驱动计数器 下面是STM32规定的内部触发连接的表格,如果某个产品中没有 相应

关于Stm32定时器+ADC+DMA进行AD采样的实现

Stm32的ADC有DMA功能这都毋庸置疑,也是我们用的最多的!然而,如果我们要对一个信号(比如脉搏信号)进行定时采样(也就是隔一段时间,比如说2ms),有三种方法: 1.使用定时器中断每隔一定时间进行ADC转换,这样每次都必须读ADC的数据寄存器,非常浪费时间! 2.把ADC设置成连续转换模式,同时对应的DMA通道开启循环模式,这样ADC就一直在进行数据采集然后通过DMA把数据搬运至内存.但是这样做的话还得加一个定时中断,用来定时读取内存中的数据! 3.使用ADC的定时器触发ADC转换的功能,

STM32定时器输出多路可调频率方波实现细节记录

最近有个项目要用到多达16路的可调频率的方波,于是想到用stm32的定时器输出比较翻转模式(TIM_OCMode_Toggle),一个定时器可以产生4路的信号输出.仔细阅读手册,并且参考了官方的例程,大体过程实现过程是:打开一个TIMx计数器,再打开TIMx的一路或几路输出比较器(共4路),都配置好以后,计数器开始计数,当计数器里的值和比较寄存器里的值相等时,产生输出比较中断,在中断中将计数器中的值读出,与翻转周期相加再写道比较寄存器中. 先以timer3为例,上代码: TIM3配置部分: 1

关于STM32 定时器 PWM 实时调节占空比时,预装载特性

最近在调试项目的时候遇到一个奇怪的现象:在调试状态下,给定时器捕获比较寄存器赋不同值,能产生不同占空比的波形(图1).反映到器件上也有不同的电压显示,但是在设备运行的时候,就不行了(图2). 图1 图2 纠结了N天后,也没有办法解决,只好乖乖的看STM32 控制器手册找找看了,结果还真找到了. 从图中可以看到,如果使能预装载特性,则数据会立即写入寄存器中,如果没有使能,那就得等到有事件(?)发生了.这我就明白了,在调试状态下,给寄存器赋值,不会产生什么影响,因为人的反应速度很慢,但是在运行的时候

stm32定时器计数功能

stm32的外部时钟源模式2和外部时钟源模式1都可以用来实现计数功能,他们的区别是什么呢? 以上2种模式对应不同的管脚输入: 外部时钟源模式2 <-->TIMx_ETR 外部时钟源模式1 <-->TIMx_CHx 从功能框图可以看到,ETR模式下多了一个分频器ETPS,搜索该分频器的寄存器,有如下解释:外部触发信号ETRP的频率必须最多是TIMxCLK频率的1/4.当输入较快的外部时钟时,可以使用预分频降低ETRP的频率. 每个定时器只能对一路信号计数,但每个定时器可同时捕捉4路信

STM32定时器输出PWM频率和步进电机控制速度计算

1.STM32F4系列定时器输出PWM频率计算 第一步,了解定时器的时钟多少: 我们知道AHP总线是168Mhz的频率,而APB1和APB2都是挂在AHP总线上的. (1)高级定时器timer1, timer8以及通用定时器timer9, timer10, timer11的时钟来源是APB2总线(2)通用定时器timer2~timer5,通用定时器timer12~timer14以及基本定时器timer6,timer7的时钟来源是APB1总线 从STM32F4的内部时钟树可知: 当APB1和APB