欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

蓝桥杯嵌入式学习STM32之定时器中断TIM

程序员文章站 2024-02-25 14:55:51
...

题外话

STM32在进行IO翻转操作的时候可以使用以下方法:以PE.5为例

GPIO_WriteBit(GPIOE,GPIO_Pin_5,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOE,GPIO_Pin_5))));
GPIO_WriteBit(GPIOE, GPIO_Pin_5, (BitAction)!GPIO_ReadOutputDataBit(GPIOE, GPIO_Pin_5))
GPIOE->ODR ^= GPIO_Pin_5

基本概念

TIM2~7定时器时钟的计算方法
如果APB1的时钟分频系数是1的话,定时器时钟等于1APB1 CLK
否则定时器时钟等于2
APB1 CLK。
一般来说,APB1分频系数是2,36MHz=72MHz/2;
所以定时器的时钟是36*2=72Mhz。

参数确定

Tout= ((arr+1)*(psc+1))/Tclk;

如果要定时500ms

72M/7200分频得到10KHz,也就是0.1ms。
所以计数器设置为5000。
也就是说psc(分频系数)是7199
arr(计数器)4999.

(其实这些都是重0开始计数导致的)

相关寄存器

1.当前值寄存器(CNT)
蓝桥杯嵌入式学习STM32之定时器中断TIM
2.预分频寄存器(TIMx_PSC)
蓝桥杯嵌入式学习STM32之定时器中断TIM
3.自动重装载寄存器(TIMx_ARR)
蓝桥杯嵌入式学习STM32之定时器中断TIM
4.控制寄存器1(TIMx_CR1)

蓝桥杯嵌入式学习STM32之定时器中断TIM
5.DMA中断使能寄存器(TIMx_DIER)

蓝桥杯嵌入式学习STM32之定时器中断TIM

常用库函数


初始化函数:
void TIM_TimeBaseInit(TIM_TypeDef*TIMx,TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
定时器使能函数:
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)
定时器中断使能函数:
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);
状态标志位获取和清除
FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);

配置步骤

  1. 使能时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
  1. 初始化定时器
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
	TIM_TimeBaseInitStruct.TIM_Period=4999;
	TIM_TimeBaseInitStruct.TIM_Prescaler=7199;
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);
  1. 配置中断类型
	TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
  1. 中断优先级设置
	NVIC_InitTypeDef NVIC_InitStruct;
	NVIC_InitStruct.NVIC_IRQChannel=TIM3_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority=2;
	NVIC_Init(&NVIC_InitStruct);
  1. 使能定时器
TIM_Cmd(TIM3,ENABLE);

附:

void TIM3_IRQHandler(void) //TIM3 中断
{
	if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3 更新中断发生与否
		{
			TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIM3 更新中断标志
			GPIOB->ODR^=GPIO_Pin_5;
		}
}

这里需要说明一下,固件库还提供了两个函数用来判断定时器状态以及清除定时器状态标
志位的函数TIM_GetFlagStatus 和TIM_ClearFlag,他们的作用和前面两个函数的作用类似。只是在TIM_GetITStatus 函数中会先判断这种中断是否使能,使能了才去判断中断标志位,而TIM_GetFlagStatus 直接用来判断状态标志位。
而且TIM_GetFlagStatus判断的类型多。