初学stm32 --- 定时器中断

目录

时钟选择:

内部时钟选择​编辑

时钟计算方法:

计数器模式

向下计数模式(时钟分频因子=1,ARR=36)

向上计数模式(时钟分频因子=1,ARR=36)

[中央对齐计数模式(时钟分频因子=1 ARR=6)](#中央对齐计数模式(时钟分频因子=1 ARR=6))

定时器中断实验相关寄存器

控制寄存器1(TIMx_CR1):

DMA/中断使能寄存器(TIMx_DIER):

预分频器(TIMx_PSC):

计数器(TIMxCNT):

自动重转载寄存器(TIMx_ARR):

​编辑

状态寄存器(TIMx_SR):

常用库函数:

定时器参数初始化:

定时器使能函数:

定时器中断使能函数:

状态标志位获取和清除:

总结------定时器中断实现步骤


时钟选择:

计数器时钟可以由下列时钟源提供:

①内部时钟(CK_INT)

②外部时钟模式1:外部输入脚(TIx)

③外部时钟模式2:外部触发输入(ETR)

④内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器。

内部时钟选择

时钟计算方法:

这里的分频系数N = CK_PSC + 1;

计数器模式

通用定时器可以向上计数、向下计数、向上向下双向计数模式。

①向上计数模式:计数器从0计数到自动加载值(TIMx_ARR),然后重新从0开始计数并且产生一个计数器溢出事件。

②向下计数模式:计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。

③中央对齐模式(向上/向下计数):计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。

向下计数模式(时钟分频因子=1,ARR=36)

向上计数模式(时钟分频因子=1,ARR=36)

中央对齐计数模式(时钟分频因子=1 ARR=6)

定时器中断实验相关寄存器

控制寄存器1(TIMx_CR1):

首先我们来看看 TIMx_CR1 的最低位,也就是计数器使能位,该位必须置 1,才能让定时器开始计数。 从第 4 位 DIR 可以看出默认的计数方式是向上计数, 同时也可以向下计数,第 5,6位是设置计数对齐方式的。 从第 8 和第 9 位可以看出,我们还可以设置定时器的时钟分频因子为 1,2,4。

DMA/中断使能寄存器(TIMx_DIER):

这里我们同样仅关心它的第 0 位, 该位是更新中断允许位。该位要设置为 1,来允许由于更新事件所产生的中断。

预分频器(TIMx_PSC):

该寄存器用设置对时钟进行分频,然后提供给计数器,作为计数器的时钟。

这里,定时器的时钟来源有 4 个:

1) 内部时钟(CK_INT)

2) 外部时钟模式 1:外部输入脚(TIx)

3) 外部时钟模式 2:外部触发输入(ETR)

4) 内部触发输入(ITRx):使用 A 定时器作为 B 定时器的预分频器(A 为 B 提供时钟)。

这些时钟,具体选择哪个可以通过 TIMx_SMCR 寄存器的相关位来设置。这里的 CK_INT时钟是从 APB1 倍频的来的,除非 APB1 的时钟分频数设置为 1,否则通用定时器 TIMx 的时钟是 APB1 时钟的 2 倍,当 APB1 的时钟不分频的时候,通用定时器 TIMx 的时钟就等于 APB1的时钟。这里还要注意的就是高级定时器的时钟不是来自 APB1,而是来自 APB2 的。

计数器(TIMxCNT):

该寄存器是定时器的计数器,该寄存器存储了当前定时器的计数值

自动重转载寄存器(TIMx_ARR):

该寄存器在物理上实际对应着 2 个寄存器。一个是程序员可以直接操作的,另外一个是程序员看不到的,这个看不到的寄存器在《STM32参考手册》里面被叫做影子寄存器。事实上真正起作用的是影子寄存器。 根据 TIMx_CR1 寄存器中 APRE 位的设置: APRE=0 时,预装载寄存器的内容可以随时传送到影子寄存器,此时 2者是连通的;而 APRE=1 时,在每一次更新事件(UEV)时,才把预装在寄存器的内容传送到影子寄存器。

状态寄存器(TIMx_SR):

该寄存器用来标记当前与定时器相关的各种事件/中断是否发生。

常用库函数:

定时器参数初始化:

cpp 复制代码
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
cpp 复制代码
typedef struct
{
  uint16_t TIM_Prescaler;        
  uint16_t TIM_CounterMode;     
  uint16_t TIM_Period;        
  uint16_t TIM_ClockDivision;  
  uint8_t TIM_RepetitionCounter;
} TIM_TimeBaseInitTypeDef; 

实例:

cpp 复制代码
TIM_TimeBaseStructure.TIM_Period = 4999; 
TIM_TimeBaseStructure.TIM_Prescaler =7199; 
TIM_TimeBaseStructure.TIM_ClockDivision =   TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode =   TIM_CounterMode_Up; 
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); 

定时器使能函数:

cpp 复制代码
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)

定时器中断使能函数:

cpp 复制代码
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);

状态标志位获取和清除:

cpp 复制代码
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);

总结------定时器中断实现步骤

① 能定时器时钟。RCC_APB1PeriphClockCmd();

② 初始化定时器,配置ARR,PSC。 TIM_TimeBaseInit*();*

③开启定时器中断,配置NVIC。 void**TIM_ITConfig(); NVIC_Init*();*

④ 使能定时器。 TIM_Cmd*();*

⑥ 编写中断服务函数。 TIMx_IRQHandler*();*

相关推荐
LongRunning2 小时前
【BLE】STM32WB55_低功耗(十一)
stm32
芯片人0073 小时前
纯硬件一键开关机ASIC芯片,为什么比 MCU 方案更适合更可靠
人工智能·单片机·嵌入式硬件·物联网·芯片
染予4 小时前
Ka 阵面星历下发与执行逻辑说明
stm32·嵌入式硬件
芯片人0074 小时前
武汉广昇科技的GMUX1308A模拟开关芯片成功导入中国台湾上市企业联昌电子,助力汽车电子供应链自主可控
科技·嵌入式硬件·物联网·汽车·芯片
恒锐丰科技林技术员7 小时前
EG2181D 半桥栅极驱动芯片详解:高压 MOS/IGBT 驱动实用器件
经验分享·嵌入式硬件·硬件工程
国科安芯8 小时前
面向卫星测控应答机的抗辐射MCU信号采集与定时控制研究
单片机·嵌入式硬件·mcu·架构·卫星·商业航天·抗辐射
CC城子8 小时前
EtherNet/IP I/O 丢包排查(linux系统)
linux·单片机·tcp/ip·ethernetip
新晨单片机设计8 小时前
S010A-基于STM32单片机水温控制系统(数码管显示)【Proteus仿真+Keil程序+原理图】
stm32·单片机·嵌入式硬件
事界见闻9 小时前
高性能电机控制MCU选型对比:精度、功耗与实时性如何兼得?
单片机·嵌入式硬件
Brilliantwxx9 小时前
【STM32】 初认识USART串口
linux·stm32·单片机·嵌入式硬件·架构