STM32—TIM应用—定时器定时中断

  • Post author:
  • Post category:其他


定时器类型:

定时器类型定时器类型定



类型



编号



总线



功能


高级定时器


TIM1





TIM8


APB2


拥有通用定时器全部功能,并额外具有重复计数器、死区生成、互补输出、刹车输入等功能


通用定时器


TIM2





TIM3





TIM4





TIM5


APB1


拥有基本定时器全部功能,并额外具有内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等功能


基本定时器


TIM6





TIM7


APB1


拥有定时中断、主模式触发


DAC


的功能

本章学习到的TIM函数:

TIM_InternalClockConfig(TIM2) 设置 TIMx 内部时钟,默认是开启的
TIM_TimeBaseStructure.
TIM_ClockDivision 时钟分屏参数
TIM_CounterMode 计数模式:向上计数、向下计数、三种中央对齐
  • TIM_CounterMode_Up
  • TIM_CounterMode_Down
TIM_Period ARR自动重载寄存器的值

CK_CNT_OV=CK_PSC/(PSC+1)/

(ARR+1

)

1s(1HZ)=72000000HZ/(PSC+1)/(

10000-1

)

TIM_Prescaler 设定 TIMx_PSC寄存器的值

CK_CNT_OV=CK_PSC/(

PSC+1

)/(ARR+1)

1s(1HZ)=72000000HZ/(

7200-1

)/(10000-1)

TIM_RepetitionCounter 重复计数器的值

参数设置为0 时,时间周期不翻倍。

参数设置为1 时,时间周期翻1倍。

参数设置为2 时,时间周期翻2倍。

TIM_ClearFlag
清除标志位

,让计数从0开始。(TIMx,TIM_IT_Upadate(更新中断))
TIM_ITConfig 使能中断
void TIM2_IRQHandler(void) 通道函数名是规定的,startup_stm32f10x_hd.s文件可查
TIM_GetITStatus 获取中断标志位(TIMx,TIM_IT_Upadate(更新中断))
TIM_ClearITPendingBit
清除中断待处理位

(TIMx,TIM_IT_Upadate(更新中断))
TIM_GetCounter TIM计数器的值(TIMx)

Timer.c

#include "stm32f10x.h"                  // Device header

void Timer_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);			//RCC使能时钟 TIM2挂载APB1总线
	
	TIM_InternalClockConfig(TIM2);								//设置 TIMx 内部时钟,默认是开启的
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;			//时钟分屏参数
	TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;		//计数模式
	TIM_TimeBaseInitStruct.TIM_Period = 10000 - 1 ;						//定时器周期,设定自动重载寄存器的值
	TIM_TimeBaseInitStruct.TIM_Prescaler = 7200 - 1 ;					//定时器预分频器,设定 TIMx_PSC寄存器的值
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;					//重复计数器的值,设置为x时,时间周期翻x倍
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);						//初始化
	
	TIM_ClearFlag(TIM2,TIM_IT_Update);									//清楚标志位,让计数从0开始
	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);							//使能中断
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);						//配置中断源
	
	NVIC_InitTypeDef NVIC_InitStruture;
	NVIC_InitStruture.NVIC_IRQChannel = TIM2_IRQn;						//配置抢占优先级
	NVIC_InitStruture.NVIC_IRQChannelCmd = ENABLE;						//配置通道是否开启
	NVIC_InitStruture.NVIC_IRQChannelPreemptionPriority = 2 ;			//抢占优先级
	NVIC_InitStruture.NVIC_IRQChannelSubPriority = 1;					//响应优先级
	NVIC_Init(&NVIC_InitStruture);
	
	TIM_Cmd(TIM2,ENABLE); //启动定时器
	
}

/*
void TIM2_IRQHandler(void)												//定时器产生中断时被执行,通道函数名是规定的,startup_stm32f10x_hd.s文件可查
{
	if (TIM_GetITStatus(TIM2,TIM_IT_Update) == SET)						//判断标志位
	{
		Num ++;															//每更新一次标志位加1
		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);						//清除标志位
	}
		
	
}
*/ 

main.c

#include "stm32f10x.h"                  // Device header
#include "Timer.h"
#include "OLED.h"

uint16_t Num;		//全局变量,用于接收中断次数

int main(void)
{
	Timer_Init();
	OLED_Init();
	
	OLED_ShowString(1,1,"Num:");
	
	while(1)
	{
		OLED_ShowNum(1,5,Num,5);
		OLED_ShowNum(2,5,TIM_GetCounter(TIM2),5);						//TIM计数器的值
	}
}

void TIM2_IRQHandler(void)												//定时器产生中断时被执行,通道函数名是规定的,startup_stm32f10x_hd.s文件可查
{
	if (TIM_GetITStatus(TIM2,TIM_IT_Update) == SET)						//判断标志位
	{
		Num ++;															//每更新一次标志位加1
		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);						//清除标志位
	}
		
	
}



版权声明:本文为zdjnba原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。