STM32学习笔记(四)--TIM定时器中断详解

(1)配置步骤
++++1.配置RCC外设时钟++++
++++2.配置时基单元的时钟++++
++++3.配置初始化时基单元++++
++++4.使能更新中断++++
++++5.配置NVIC 选择一个合适的优先级++++
++++6.启动定时器++++

其中涉及外设有 RCC内部时钟(EIR外部时钟 ITR其他定时器 TIx捕获通道)、TIM、NVIC

高级定时器:

通用定时器:

基本定时器:

定时器中断基本结构:

(2)代码示例

案例1(设置内部时钟通用定时器2为1秒的定时中断)

cpp 复制代码
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
//驱动内部时钟
TIM_InternalClockConfig(TIM2);
//72MHZ=72000000HZ
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1;//自动重装值65535max
TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;//预分频65535max
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//计数器65535max
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);

//清除定时器标志位
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
//定时器更新中断源
TIM_ITConfig(TIM2, TIM_IT_Update, 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);
//启动定时器
TIM_Cmd(TIM2, ENABLE);

案例2(设置外部时钟通用定时器2 其实也就是计数模式 理解下)

cpp 复制代码
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//使用外部时钟 不分频 高电平上升沿有效 最后一个滤波器参数可以查手册
TIM_ETRClockMode2Config(TIM2,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted, 0x0F);
	
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period = 10 - 1;
TIM_TimeBaseInitStructure.TIM_Prescaler = 1 - 1;
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);

//清除定时器标志位
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
//定时器更新中断源
TIM_ITConfig(TIM2, TIM_IT_Update, 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);
//启动定时器
TIM_Cmd(TIM2, ENABLE);

(3)函数分析

函数1:void TIM_InternalClockConfig(TIM_TypeDef* TIMx)(stm32f10x_tim.h)

该函数用来驱动TIM的时基单元的内部时钟。

|-----|------|-----------|-----------|
| 序号 | 名称 | 参数解释 | 示例 |
| 参数1 | TIMx | 选择TIMx定时器 | TIM2、TIM3 |

函数2:void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct)(stm32f10x_tim.h)

该函数结构体TIM_TimeBaseInitTypeDef的成员变量如下所示。

|-----|-----------------------|--------------------|--------------------|
| 序号 | 名称 | 参数解释 | 示例 |
| 参数1 | TIM_ClockDivision | 指定时钟分频 | TIM_CKD_DIV1 |
| 参数2 | TIM_CounterMode | 计数器模式(向上 向下 中央对齐等) | TIM_CounterMode_Up |
| 参数3 | TIM_Period | ARR自动重装器的值 | 10000-1 |
| 参数4 | TIM_Prescaler | PSC预分频器的值 | 7200-1 |
| 参数5 | TIM_RepetitionCounter | 重复计数的值 | 0(高级定时器改) |

函数3:void TIM_InternalClockConfig(TIM_TypeDef* TIMx)(stm32f10x_tim.h)

该函数用来驱动TIM的时基单元的内部时钟。

|-----|------|-----------|-----------|
| 序号 | 名称 | 参数解释 | 示例 |
| 参数1 | TIMx | 选择TIMx定时器 | TIM2、TIM3 |

函数4:ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT)(stm32f10x_tim.h)

该函数用来驱动TIM的时基单元的内部时钟。

|-----|--------|-------------------|---------------------|
| 序号 | 名称 | 参数解释 | 示例 |
| 参数1 | TIMx | 选择TIMx定时器 | TIM2、TIM3 |
| 参数2 | TIM_IT | 指定要检查的定时器(TIM)中断源 | TIM_IT_Update(更新中断) |

同理void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT)用法一致,该函数为清除中断标志位函数,每次进入中断都要手动清除;如下为示例:

cpp 复制代码
//位于启动文件中startup_stm32f10x_md.s 参数名根据定时中断标志位选择 否则无法进入
void TIM2_IRQHandler(void)
{
	if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
	{
		//事件
		TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
	}
}
相关推荐
charlie1145141913 分钟前
Cinux · musl 静态移植:对齐 Linux ABI、铺初始栈,以及一个被 SMAP 拦下的潜伏 bug
linux·开发语言·c++·操作系统·开源项目
STQY燊桐启元(深圳)电子科技5 分钟前
大功率储能PCS散热升级,ST-PCM180氮化铝相变陶瓷适配高密度热管理
经验分享·笔记·pcm
_Narcissus_13 分钟前
单调栈笔记及例题详解
数据结构·c++·笔记·算法·力扣·单调栈·洛谷
流浪00118 分钟前
C/C++后端筑基系列(二):C++ 从基础到进阶
开发语言·c++
゛凌乱的记忆づ19 分钟前
50元从零到成品:一套AI辅助的嵌入式实战入门教程——中断篇
单片机·嵌入式硬件
kyle~20 分钟前
x86 汇编LOCK前缀 --- 硬件架构向软件提供的核心同步原语
汇编·c++·性能优化·硬件架构·实时系统
m4Rk_24 分钟前
【论文阅读】Agent 记忆机制(53):Experience-Following——为什么错误经验会在记忆中不断传播
论文阅读·人工智能·学习·开源·github
额,不知道写啥。1 小时前
从区间加一次函数到区间加多次函数最值-----区间数据结构与函数的一些东西(《浅谈函数最值的动态维护》的学习笔记)
数据结构·笔记·学习
LuminousCPP1 小时前
数据结构-二叉树(五):查找、销毁与前序序列建树
c语言·数据结构·笔记·二叉树