基于stm32f103c8t6的定时器详解(持续更新)

一、stm32f103系列定时器介绍

先声明:stm32f103c8t6中没有基本定时器、只有TIM1-TIM4:分别是高级定时器和通用定时器(对照下图请自行阅读stm32f103x的datasheet)stm32f103c8t6属于48引脚、1、定时器功能:定时、输出比较、输入捕获、互补输出,其中基本定时器只有定时功能、通用定时器只没有互补输出功能、高级定时器具有所有功能。2、定时器分类:
(1)基本定时器:TIM6、7
(2)通用定时器:TIM2345
(3)高级定时器:TIM1、8

在这里插入图片描述

3、定时器总线时钟:
在这里插入图片描述

在这里插入图片描述
无特殊情况,给到定时器的内部时钟都是72M

二、基本定时器

基本定时器分为三部分讲解:
(1)时钟源
(2)控制器
(3)时基单元
在这里插入图片描述

1、时钟源

时钟源来自RCC的TIMXCLK,就是内部时钟(CK_INT)直接经过控制器传给时基单元充当CK_PSC

2、控制器

控制定时器的复位、使能、计数、DAC触发
在这里插入图片描述

3、时基单元

基本定时器的时基单元包括三个部分
(1)预分频器:分频、得到计时器的时钟,即CNT计数1次所需要的时间,预分频器时16位的寄存器、所以可分频为1-65536
(2)计数器:用来计数、基本定时器的CNT计数器只能向上计数
(3)自动装载寄存器ARR:即CNT加到ARR的值之后,会产生一个事件或中断或DMA请求,中断用得比较多(定时x时间之后、当点灯大师)
在这里插入图片描述
(4)其实、时基单元里面还有非常重要的寄存器、叫做影子寄存器,什么是影子寄存器呢?仔细看上面的图会发现PSC和自动重装载寄存器ARR都有阴影,它们就是影子寄存器
影子寄存器的作用:其实,PSC和ARR都是当影子寄存器被写入新的值时,电路才会生效,所以是用户值->寄存器->影子寄存器->生效,影子寄存器可以起到缓冲的作用,一般不会使用影子寄存器
在这里插入图片描述

如何实现500ms定时

1.分频器PSC设置:72-1(即计数器时钟为1us)
2.ARR设置为1000,即计数一次1ms
3.可通过计数产生中断,中断里面设置全局变量,每次加1,当从0加到500时,就是500ms了。

基本定时器代码实例

bsp_BasicTim.c

#include "bsp_BasicTim.h"

// 中断优先级配置
static void BASIC_TIM_NVIC_Config(void)
{
    NVIC_InitTypeDef NVIC_InitStructure; 
    // 设置中断组为0
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);		
		// 设置中断来源
    NVIC_InitStructure.NVIC_IRQChannel = BASIC_TIM_IRQ ;	
		// 设置主优先级为 0
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;	 
	  // 设置抢占优先级为3
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;	
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

static void BASIC_TIM_Config(void)
{
		TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
		
		// 开启定时器时钟,即内部时钟CK_INT=72M
    BASIC_TIM_APBxClock_FUN(BASIC_TIM_CLK, ENABLE);
	
		// 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
    TIM_TimeBaseStructure.TIM_Period = BASIC_TIM_Period;	

	  // 时钟预分频数为
    TIM_TimeBaseStructure.TIM_Prescaler= BASIC_TIM_Prescaler;
	
		// 时钟分频因子 ,基本定时器没有,不用管
    //TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
		
		// 计数器计数模式,基本定时器只能向上计数,没有计数模式的设置
    //TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; 
		
		// 重复计数器的值,基本定时器没有,不用管
		//TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
	
	  // 初始化定时器
    TIM_TimeBaseInit(BASIC_TIM, &TIM_TimeBaseStructure);
		
		// 清除计数器中断标志位
    TIM_ClearFlag(BASIC_TIM, TIM_FLAG_Update);
	  
		// 开启计数器中断:计数器溢出、产生更新事件、计数器的更新事件能够产生中断、并被使能
    TIM_ITConfig(BASIC_TIM,TIM_IT_Update,ENABLE);
		
		// 使能计数器
    TIM_Cmd(BASIC_TIM, ENABLE);
}

void BASIC_TIM_Init(void)
{
	BASIC_TIM_NVIC_Config();
	BASIC_TIM_Config();
}

bsp_BasicTim.h

#ifndef __BSP_TIMEBASE_H
#define __BSP_TIMEBASE_H

#include "stm32f10x.h"

/********************基本定时器TIM参数定义,只限TIM6、7************/
#define BASIC_TIM6 // 如果使用TIM7,注释掉这个宏即可

#ifdef  BASIC_TIM6 // 使用基本定时器TIM6
#define            BASIC_TIM                   TIM6
#define            BASIC_TIM_APBxClock_FUN     RCC_APB1PeriphClockCmd
#define            BASIC_TIM_CLK               RCC_APB1Periph_TIM6
#define            BASIC_TIM_Period            (1000-1)
#define            BASIC_TIM_Prescaler         71
#define            BASIC_TIM_IRQ               TIM6_IRQn
#define            BASIC_TIM_IRQHandler        TIM6_IRQHandler

#else  // 使用基本定时器TIM7
#define            BASIC_TIM                   TIM7
#define            BASIC_TIM_APBxClock_FUN     RCC_APB1PeriphClockCmd
#define            BASIC_TIM_CLK               RCC_APB1Periph_TIM7
#define            BASIC_TIM_Period            1000-1
#define            BASIC_TIM_Prescaler         71
#define            BASIC_TIM_IRQ               TIM7_IRQn
#define            BASIC_TIM_IRQHandler        TIM7_IRQHandler

#endif

void BASIC_TIM_Init(void);

#endif	/* __BSP_TIMEBASE_H */

中断服务子程序:BASIC_TIM_IRQHandler

void BASIC_TIM_IRQHandler(void)
{
	if ( TIM_GetITStatus( BASIC_TIM, TIM_IT_Update) != RESET ) //当更新时间到来、定时器TIM的状态寄存器就不为0,满足条件。
	
	{	
		time++;
		TIM_ClearITPendingBit(BASIC_TIM , TIM_FLAG_Update);  		 
	}		 	
}

三、高级定时器

高级定时器分为6个部分讲解:
(1)时钟源
(2)控制器
(3)时基单元
(4)输入捕获
(5)输出比较
(6)刹车控制区

附上功能框图:
在这里插入图片描述

1、时钟源

高级定时器的时钟源有4种:
(1)内部时钟源IN_CLK
(2)外部时钟模式1: TIx(x=1,2,3,4)
(3)外部始终模式2: ETR
(4)内部触发输入: ITRx

在这里插入图片描述
在这里插入图片描述

二、控制器

触发控制器用来针对片内外设输出触发信号,比如为其它定时器提供时钟和触发 DAC/ADC 转换。

从模式控制器可以控制计数器复位、启动、递增/递减、计数。

三、时基单元

参考基本定时器

四、输入捕获

在这里插入图片描述

### 回答1: STM32F103C8T6是一款基于ARM Cortex-M3内核的微控制器,它具有多个定时器模块,可以用于各种定时、计数和PWM控制等应用。 定时器STM32F103C8T6中非常重要的一个模块,它可以用于生成各种定时信号,比如周期性的中断、PWM波形等。STM32F103C8T6中有多个定时器模块,每个模块都有多个通道,可以独立工作或者互相协作。 定时器的基本工作原理是通过计数器来实现定时功能。定时器模块中有一个计数器寄存器,每当计数器计数到一定值时,就会产生一个定时中断或者输出一个PWM波形。定时器模块还可以配置时钟源、分频系数、计数模式等参数,以满足不同的应用需求。 在STM32F103C8T6中,定时器模块的使用非常灵活,可以通过编程来实现各种复杂的定时、计数和PWM控制功能。同时,STM32F103C8T6还提供了丰富的开发工具和文档,方便开发者进行开发和调试。 ### 回答2: STM32F103C8T6 是 ARM Cortex-M3 内核的 32 位微控制器。它配备了多个定时器,包括基本定时器,高级定时器和通用定时器。这些定时器能够提供很多不同的功能,如 PWM,捕获/比较等。 基本定时器STM32F103C8T6 拥有三个基本定时器 TIM2,TIM3 和 TIM4。它们均可用于通用定时器,PWM 产生和输出比较。基本定时器有 16 位计数器,被预先装载在自动重装载寄存器(ARR)中,并使用更新事件。用户可以通过修改 ARR 和 Prescaler 来更改计数器的周期。 高级定时器STM32F103C8T6 拥有两个高级定时器 TIM1 和 TIM8。它们可用于与基本定时器相同的功能,另外还包括编码器和 PWM 正交解码功能。高级定时器通常具有更高的分辨率,计数器可以是 16 位和 32 位。该计数器由 CNT 寄存器表示。高级定时器有更多的预分频器和 ARR 值,因此可以更好地满足用户的要求。 通用定时器:通用定时器STM32F103C8T6 中最有用的定时器之一,因为它们有很多种应用。 STM32F103C8T6 拥有三个通用定时器 TIM2,TIM3 和 TIM4。这些定时器通常用于产生 PWM 信号,也可以用于捕获和比较输入。在 PWM 模式下,用户可以设置占空比和频率。在捕获和比较模式下,用户可以使用定时器来控制测量输入脉冲的周期,脉冲宽度和延迟等参数。通用定时器具有更高分辨率,最高可以到 32 位。它们还支持定时器级联,可以通过 TIM2 与 TIM3 和 TIM4 进行级联,以扩展计时范围和提高分辨率。 定时器的配置和使用是 STM32F103C8T6 中的重要任务,它们使用户能够为不同的应用场景提供不同的功能。开发人员需要了解不同类型的定时器以及它们的特性,才能在 STM32F103C8T6 上实现最佳性能。同时,要注意定时器配置和使用的复杂性,例如定时器可能与其他外设共享中断等。 ### 回答3: STM32F103C8T6 是一款基于 ARM Cortex-M3 内核的微控制器,内置多个定时器和计数器模块,用于实现各种定时事件和频率测量等功能。 该芯片内置三个基本定时器 TIM1、TIM2 和 TIM3,以及一个高级定时器 TIM4。其中 TIM1 是一个功能最为强大的定时器,支持高级控制功能,如基础定时、PWM 输出、编码器模式、多通道输出等。TIM2 和 TIM3 也是使用比较广泛的定时器,可以实现多种脉冲计数、频率测量和定时中断等应用。TIM4 是一个相对简单的定时器,主要用于周期性任务的计时。 除了基本定时器外,STM32F103C8T6 还内置了多个通用定时/计数器模块 TIM9~TIM14,它们能够实现较高的精度、较强的灵活性和多种操作模式。其中 TIM9 和 TIM12 支持 PWM 模式,TIM10 和 TIM11 支持单脉冲和周期性脉冲输出等。 使用 STM32F103C8T6定时器功能,可以轻松实现各种定时任务和周期性控制,如定时中断、PWM 信号输出、频率测量、编码器计数和舵机控制等。同时,定时器的多种操作模式和多种触发源也为各种应用提供了灵活性和扩展性,用户可以根据实际需求自行选择定时器类型和操作方式。 总之,STM32F103C8T6定时器是该芯片的一个强大功能模块,它不仅提供了基础的定时和计数功能,还支持各种高级控制模式和多种触发源,能够满足各种应用的需求。同时,通过合理的配置和编程,用户可以利用定时器功能实现更多有意义的应用。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值