前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >STM32中定时器的配置与使用

STM32中定时器的配置与使用

原创
作者头像
皓琦
修改2024-01-14 17:22:58
2101
修改2024-01-14 17:22:58
举报
文章被收录于专栏:STM32学习STM32学习

一、定时器的简介

定时器说白了就是计数器,应用在我们生活的方方面面,比如有闹钟、计时器等。在STM32参考手册中,定时器分为3类,即高级控制定时器(TIM1和TIM8)、通用定时器(TIMx)以及基本定时器(TIM6和TIM7),要学会定时器要懂得分频设置、计数器设置。

1、高级控制定时器(TIM1和TIM8)

高级控制定时器(TIM1和TIM8)由一个16位的自动装载计数器组成,它由一个可编程的预分频器驱动。它适合多种用途,包含测量输入信号的脉冲宽度(输入捕获),或者产生输出波形(输出比较、PWM、嵌入死区时间的互补PWM等)。使用定时器预分频器和RCC时钟控制预分频器,可以实现脉冲宽度和波形周期从几个微秒到几个毫秒的调节。高级控制定时器(TIM1和TIM8)和通用定时器(TIMx)是完全独立的,它们不共享任何资源。它们可以同步操作

2、通用定时器(TIMx)

通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成。它适用于多种场合,包括测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)。使用定时器预分频器和RCC时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。每个定时器都是完全独立的,没有互相共享任何资源。它们可以一起同步操作,

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

基本定时器TIM6和TIM7各包含一个16位自动装载计数器,由各自的可编程预分频器驱动。它们可以作为通用定时器提供时间基准,特别地可以为数模转换器(DAC)提供时钟。实际上,它们在芯片内部直接连接到DAC并通过触发输出直接驱动DAC。这2个定时器是互相独立的,不共享任何资源

二、通用定时器(TIMx)的配置参数

1、单片机上使用定时器需要知道的参数

(1)定时器的时间;

(2)单片机内部的计数功能:CNT,CNT不断累加(向上计数)或者减减(向下计数);

(3)计算出每次CNT每次+1或者-1的时间,这个时间通过单片机运行的速度也就是频率计算得出,详细的情况可以查看图1。(预分频器的作用就是为了减慢速度)

(4)计数器存放值范围:0-2^16-1(0-65535) ,(16位自动装载计数器).

(5)怎么降低计数器计数的速度,使用分频,72MHZ对应的时间为1/72=0.013us,如果使用72MHZ的速度计数到65535,需要消耗的时间大概是0.013*65535(HZ与时间对应的关系有:MHZ-us,KHZ-ms,HZ~s).

图1
图1
2、提出的问题

(1)、计数器自增的频率是72MHZ,想让计数器+1的时间为1us,如何分频?计数到65535,需要多少的时间?

分频为72,,得到的技术频率就是1MHZ(1/1MHZ),计数到65535,需要消耗的时间就是65.535ms。

(2)计数器自增的频率是72MHZ,想定时500ms,如何分频,如何设置计数器的最大值?

分频:720,计数器每次+1的时间为10us,计数器最大值为50000。

三、定时器的配置

1、定时1的配置

(1)根据框架图我们可以知道定时器1挂载在APB2上,如图2所示是开时钟位,如图3是定时器1的复位时钟位。

图2
图2
图3
图3

(2)TIM1 和TIM8 预分频器(TIMx_PSC)

图 4
图 4

(3)TIM1 和TIM8 自动重装载寄存器(TIMx_ARR)

图 5
图 5
2、代码实现

(1)timer.c

代码语言:#include "timer.h"
复制
/*
函数功能: 配置定时器1
函数参数: psc 预分频器  arr重装载值
*/
void TIMER1_Init(u16 psc,u16 arr)
{
   /*1. 开时钟*/
   RCC->APB2ENR|=1<<11; //开启定时器1的时钟
   RCC->APB2RSTR|=1<<11;//开启定时器1复位时钟
   RCC->APB2RSTR&=~(1<<11);//关闭定时器1复位时钟
   /*2. 配置核心寄存器*/
   TIM1->PSC=psc-1;
   TIM1->ARR=arr;
   TIM1->CR1|=1<<0; //开启定时器00
}

(2)main.c

代码语言:#include "stm32f10x.h"
复制
#include "led.h"
#include "delay.h"
#include  "key.h"
#include "sys.h"
#include "usart.h"
#include "string.h"
#include "stdio.h"
#include "timer.h"
#include "string.h"
#include  "stdlib.h"
int main(void)
{
  KEY_Init();
	LED_Init();
  USARTx_Init(USART1,72,115200);
	TIMER1_Init(720,50000);
	while(1)
	{
	 if(TIM1->SR&1<<0)
	 {
	 LED0=!LED0;
	 LED1=!LED1; 
	 TIM1->SR&=~(1<<0);
	 }
	}
}

2、实验现象

图 6
图 6

我正在参与2024腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、定时器的简介
    • 1、高级控制定时器(TIM1和TIM8)
      • 2、通用定时器(TIMx)
        • 3、基本定时器(TIM6和TIM7)
        • 二、通用定时器(TIMx)的配置参数
          • 1、单片机上使用定时器需要知道的参数
            • 2、提出的问题
            • 三、定时器的配置
              • 1、定时1的配置
                • 2、代码实现
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档