TIM的中断

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

在定时器中,"CH"通常指的是"Channel",即通道的意思。TIM_CH1表示定时器的第一个通道。每个定时器可以有多个通道,用于实现不同的功能,比如输出比较、PWM(脉宽调制)、输入捕获等。通过不同的通道,可以同时控制多个输出或输入信号。

1.开启RCC

cs 复制代码
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

这一步被称启用时钟时钟配置 。具体来说,RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); 是用来启用 STM32 微控制器中 APB1 总线上的 TIM2 定时器的时钟。这样做是为了确保定时器 TIM2 可以正常工作,因为在使用任何外设之前,必须先启用其对应的时钟。

2.时钟选择

内部时钟(72MHz)
cs 复制代码
TIM_InternalClockConfig(TIM2);
外部时钟(用对射式红外传感器模拟外部时钟)
cs 复制代码
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStruct);
	
	
	TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0x0F);

3.时基单元

cs 复制代码
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1;      //ARR
	TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;     //PSC
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);

4.中断输出控制

cs 复制代码
	TIM_ClearFlag(TIM2, TIM_FLAG_Update);
	TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);

TIM_ClearFlag(TIM2, TIM_FLAG_Update); 的作用是重置定时器的更新标志,使得定时器在下一个更新事件发生之前,能够再次触发更新。

当定时器计数达到设定的自动重载值时,会产生一个更新事件,并设置更新标志。为了确保下一个更新事件可以被检测到,需要在处理中清除这个标志。这样可以避免在后续的处理中重复响应同一个事件。

TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); 使能了定时器 TIM2 的更新中断,意味着当 TIM2 的计数器达到自动重载值或者溢出时,会触发中断请求。如果配合中断服务函数使用,可以在中断发生时执行特定的代码。

5.配置NVIC

cs 复制代码
	NVIC_PriorityGroupConfig( NVIC_PriorityGroup_2);
	
	NVIC_InitTypeDef NVIC_InitStruct;
	NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
	NVIC_Init(&NVIC_InitStruct);

6.使能定时器

cs 复制代码
	TIM_Cmd(TIM2, ENABLE);

7.中断函数

cs 复制代码
void TIM2_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
	{
		Num ++;
		TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
	}
	
}
相关推荐
朝发如雪16 分钟前
快速掌握单片机基础(3)(PWM)(通信协议基础)(串口通信时序与参数)(电气特性与电平标准)(51单片机UART寄存器配置)(串口应用层协议)
单片机
小弥儿2 小时前
GitHub今日热榜 | 2026-09-18:腾讯双项目上榜
学习·开源
天空'之城3 小时前
单片机基础核心知识点汇总(四十)
单片机·嵌入式硬件
smartpi_ai3 小时前
离线语音模块误识别问题全面解决方案:命令词设计、防误触与灵敏度调优指南
人工智能·单片机·语音识别
LCG元3 小时前
STM32F103 驱动 HX711 称重实战:DOUT 就绪时序、增益切换陷阱与两点标定精度实测
stm32·单片机·嵌入式硬件
染予3 小时前
代码中相关C语言知识点总结
stm32
优信电子3 小时前
STM32 驱动 DHT30 测量环境温湿度(兼容SHT30):从时序解析到完整代码实战
stm32·嵌入式·传感器·sht30·温湿度·环境测量·dht30
知识分享小能手4 小时前
深度学习学习教程,从入门到精通,深度生成模型 —— 知识点详解与代码实现(20)
人工智能·深度学习·学习
m4Rk_5 小时前
【论文阅读】Agent 记忆机制(74):CompassMem——从相似度检索走向事件图上的记忆导航
论文阅读·人工智能·学习·开源·github
小李不想当小白5 小时前
DMA直接存储器存取(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·分享