Stm32定时器

文章详细介绍了STM32F103C8T6芯片中的TIM定时器工作原理,包括16位计数器、预分频器、自动重装寄存器等组件,以及不同类型的定时器(高级、通用、基本)。文中给出了一个使用TIM2进行1秒中断的例子,用于在OLED屏幕上显示时间更新。
摘要由CSDN通过智能技术生成

TIM简介

TIM(Timer)定时器

定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断

16位计数器(每来一个时钟,计数器加1)、预分频器(对计数器的时钟进行分频)、自动重装寄存器的时基单元(设定多少个时钟申请中断),在72MHz计数时钟下可以实现最大59.65s(1/(72/65536/65536))的定时,还可用级联(多个定时器串联)增加定时时长。

不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等多种功能

根据复杂度和应用场景分为了高级定时器、通用定时器、基本定时器三种类型

STM32F103C8T6定时器资源:TIM1、TIM2、TIM3、TIM4

预分频寄存器:对时钟进行预分频,写0时不分频,就是1分频(输出频率=输入频率),写1时就是2分频(输出=输入/2),依次类推。

计数器寄存器:计数时钟每来一个上升沿,计数+1的向上计数模式,到达65535,产生中断后重回0。

自动重装寄存器:存的是写入的计数目标,当计数值等于设定值时就产生中断信号,清零计数器寄存器 。UI通向NVIC,U会触发其他电路的工作。

通用定时器这里包含了基本定时器的功能,但基本定时器只有向上计数的模式,而通用和高级定时器还支持向下(从重装值开始向下自减,减到0回到重装值同时申请中断)和中央对齐的模式(从0开始,先向上自增,计到重装值,申请中断,然后向下自减,减到0再申请中断)。

在基本时钟上方的部分为内外时钟源和主从触发模式结构:ETR为外部时钟,对应PAO口。TRGI主要用作触发输入来使用,也可以当做外部时钟使用,这一路叫做外部时钟模式1。TRGO可以接回到ITR部分的可以实现定时器的级联,连接方式见手册14.4.3,

在基本定时器右下部分是输出比较电路1-4,可用于输出PWM波形,驱动电机。左边的是输入捕获电路,用于测输入方波的频率、中间的是捕获/比较寄存器。

 运行控制是控制启动停止、向上或向下计数等功能,中断输出控制只允许一个中断。使用定时器中断时就需要配置这些定时器。

CK_PSC:预分频的输入时钟,选内部时钟一般是72(由时钟决定)。

CK_EN:计数器使能,决定工作

CK_CNT:前半段为预分频的时钟,系数变2,时钟也变一半。

计数寄存器:自增到FC从0开始,重装值就是FC同时UEV产生更新事件或者中断。

上述以下的的就是为了改写分频值后不会立刻发生改变,而是计完这个周期才开始变。0的时候就输出CNT后半部分的时钟。(通用定时器电路图中有阴影的就是带有这种功能)

计数器计数频率:CK_CNT = CK_PSC / (PSC + 1)

计数器溢出频率:CK_CNT_OV = CK_CNT / (ARR + 1)

       = CK_PSC / (PSC + 1) / (ARR + 1)

以下是使用定时器进行1s的时间更新一次中断并显示在OLED屏上

//定时器代码C
#include "stm32f10x.h"                  // Device header

extern uint16_t Num;

void Timer_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//选择TIM2定时器
	TIM_InternalClockConfig(TIM2);//由内部时钟驱动
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;     //预分频系数1
	TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数模式
	
	TIM_TimeBaseInitStructure.TIM_Prescaler=7200-1;//在72M进行7200分频	=10K的计数频率,产生一次更新事件 
TIM_TimeBaseInitStructure.TIM_Period=10000-1;//10K的频率下,计算10000个数得到定时1S的时间,-1因为公式里面PSC+1了,而这里配置的就是PSC
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;//高级定时器的中的重复计数器的
	
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);//时机单元初始化函数
	
	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//使能中断
	
	TIM_Cmd(TIM2,ENABLE);
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
	NVIC_Init(&NVIC_InitStructure);
	
	
	}

void TIM2_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)//检查标志位
	{
		Num++;
	}
	TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
}
		
		
	

//main函数
#include "stm32f10x.h"                  // Device header
#include "Delay.h" 
#include "OLED.h"
#include"Timer.h"
uint16_t Num=-1;
int main(void)
{
	OLED_Init();
    Timer_Init();
	OLED_ShowString(1,1,"Num;");


	while(1)
	{
		OLED_ShowNum(1,5,Num,5);
	}
}

//头文件
#ifndef __TIMER_H
#define __TIMER_H
void Timer_Init(void);
#endif

本文是跟着江科大学习,这是本人的学习笔记,如有侵权请联系本人删除!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值