单片机交流
直播中

郝埃连

7年用户 1302经验值
私信 关注
[问答]

STM32定时器按照功能可以分成哪几类?具备哪些功能?

如何去做编写一个定时器的程序?

STM32定时器按照功能可以分成哪几类?具备哪些功能?

回帖(1)

陆轶文

2021-7-16 14:39:19
  时钟周期:时钟周期T是时序中最小的时间单位,计算方式是1/时钟频率,STC51单片机使用的晶振是11.0592M,这样时钟周期=1。
  机器周期:单片机完成一个操作的最短时间。机器周期主要是针对汇编语言而言,在汇编语言下程序的每条语句执行所使用的时间都是机器周期的整数倍,而且语句占用的时间是可以计算的,但在C语言下的一条时间是不确定的,受诸多因素的影响。在51单片机下1,一个机器周期是12个时钟周期,也就是12/11059200。
  定时器和计数器是单片机内部的通弄一个模块,通关配置SFR(特殊功能寄存器)可以实现两种不同的功能。
  定时器:是单片机内部用来定时的工具,定时器内部有一个寄存器,我们让它开始计数,这个寄存器每经过一个机器周期就会自动加1,就像我们的秒表每经过一秒自动加1,钟表是60秒会自动归0,在单片机中,我们使用的是一个数据类型,这个数据当超过最大值时,这种我们称之为溢出。假如是16位定时器,也就是2个字节,最大值是2的16次方就是65535,当加到65535后再加1就会溢出变成0。所以定时器的含义就是从某一个初始值开始经过确定的时间后溢出,这个过程就是定时器的含义。
  定时器的寄存器:
  存储定时器的计数值:记录对应寄存器的当期计数值,为了判断什么时间溢出复位。
  定时器控制寄存器TCON:控制定时器的相应功能,例如:溢出标志、运行控制和中断部分。
  对于TCON这个SFR,以定时器1为例,TF1是一个标志位,告诉我们定时器是否溢出;TR1是定时器控制位,当TR1=1以后,定时器会每经过一个机器周期自动加1,TR0 = 0,倒计时就会停止加1;
  
  定时器模式寄存器位分配TMOD:
  
  
  所以我们在做一个定时器的程序(51单片机)
  1、设置特殊功能寄存器TMOD,配置好工作模式。
  2、设置计数寄存器TH0和TL0的初值
  3、设置TCON,通过TR0置1来让定时器开始计数
  4、判断TCON寄存器的TF0位,监测定时器溢出情况。
  STM32定时器按照功能可以分成很多类
  高级定时器:TIM1和TIM8
  通过定时器:TIM2-TIM5
  基本定时器:TIM6和TIM7
  看门狗定时器
  SysTick定时器
  STM32通用定时器主要是由可编程预分频器(PSC)驱动和16位自动装载寄存器(CNT)构成。
  可实现的功能:
  1、16位向上、向下、向上/向下自动装载计数器
  2、16位可编程(可实时修改)预分频器,计数器时钟频率的分频系数为1-65536构成
  3、4个独立通道(TIMx_CH1-4),这些通道可以用来作为:输入捕获、输出捕获、PWM生成(边缘或中间对齐模式)或单脉冲模式输出
  4、可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用一个定时器控制另一个定时器)的同步电路。
  5、可产生相应事件的中断/DMA
  6、计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
  7、触发事件:(计数器启动、停止、初始化或由内部/外部触发计数)
  定时器初始化
  1、设置预分频值
  2、设置计数模式
  3、设置定时周期(自动装载的值)
  4、设置时钟分频因子
  5、使能定时器
  PS:此外在时钟配置中需要配置定时器时钟
  /* 使能APB1时钟 */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3);
  /**TIMER初始化**/
  void TIMER_Initializes(void)
  {
  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  /* TIM3时基单元配置 */
  TIM_TimeBaseStructure.TIM_Prescaler = TIM3_PRESCALER_VALUE; //预分频值
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
  TIM_TimeBaseStructure.TIM_Period = TIM3_PERIOD_TIMING; //定时周期(自动从装载寄存器ARR的值)
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //时钟分频因子
  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
  /* 使能预分频值 */
  TIM_ARRPreloadConfig(TIM3, ENABLE); //使能重载值TIM3_PRESCALER_VALUE
  TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); //使能 TIM3 更新中断
  }
  定时器中断一般随着定时器的使用而使用。
  void NVIC_Configuration(void)
  {
  NVIC_InitTypeDef NVIC_InitStructure;
  /* 优先级分组 */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  /* 外设中断 */
  NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
  }
  PS:配置外设一般这三个方面是必不可少的
  时钟配置
  IO配置
  中断配置
举报

更多回帖

发帖
×
20
完善资料,
赚取积分