stm32三.TIM定时中断

一.定时器介绍

  1. 对输入的时钟进行计数,计数值达到设定值时触发中断
  2. 有16位计数器/预分频器/自动重装寄存器的时基单元,在72MHZ计数时钟下可实现59.65s定时
  3. 功能:定时中断,内外时钟源选择,输入捕获,输出比较,编码接口,主从触发模式
  4. 分类:高级定时器,通用定时器,基本定时器

 

二.基本定时器结构

  1. 预分频器:对RCC传来的72MHz的时钟进行分频,设置为1即为2分频,最多设置为65535
  2. CNT计数器:对预分频后的时钟计数,每个上升沿加1
  3. 自动重装载寄存器:设置重装置,当计数值达到重装值是产生中断

三.通用定时器结构(TIM2、TIM3、TIM4和TIM5)

  1. 功能:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM)。
  2.  计数器模式:向上计数/向下计数/中央对齐
  • 时钟选择
  1. 内部时钟(CK_INT)
  2. 外部时钟模式1:外部输入脚(TIx)
  3. 外部时钟模式2:外部触发输入(ETR)
  4. 内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时 器Timer1而作为另一个定时器Timer2的预分频器

四.定时中断基本结构

 

 五.预分频器时序

 

 六.计数器时序

 

  •  计数器有缓冲寄存器

 

 六.RCC时钟树

 

 七.实现代码

  •  TIM库函数

 

  •  步骤
  1.  RCC开启时钟
  2. 选择时基单元时钟源-定时中断选择内部模式
  3. 配置时基单元
  4. 配置输出中断控制
  5. 配置NVIC

void TIM_DeInit(TIM_TypeDef* TIMx);//恢复定时器默认缺省配置
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
//配置时基单元
void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);//结构体赋默认值
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);//使能计时器
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);//使能中断输出控制
//时基单元时钟选择部分
void TIM_InternalClockConfig(TIM_TypeDef* TIMx);//选择内部时钟

void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);//选择ITRX其他定时器

void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,
uint16_t TIM_ICPolarity, uint16_t ICFilter);//选择TIX捕获通道时钟

void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter);//外部输出模式1输入时钟

void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, 
uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);//外部输出模式2输入时钟

void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter);//配置ETR引脚参数


void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode);//写入预分频值
void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode);//改变计数器计数模式
void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);//使能计数器预(缓冲)功能
void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter);//给计数器写入一个值
void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload);//给自动重装寄存器写入一个值

uint16_t TIM_GetCounter(TIM_TypeDef* TIMx);//获取当前计数器的值
uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx);//获取当前预分频值

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);




  • 模板

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32F103是一款基于ARM Cortex-M3内核的微控制器,它具有丰富的外设和功能。其中,TIM1是STM32F103系列中的一个定时器模块,可以用于生成定时中断TIM1定时中断的实现步骤如下: 1. 配置TIM1的时钟源和预分频器,确定计数器的时钟频率。 2. 配置TIM1的自动重装载寄存器(ARR),设置定时器的周期。 3. 配置TIM1的计数器(CNT),确定计数器的初始值。 4. 配置TIM1的工作模式,选择定时器的工作方式(例如,向上计数、向下计数等)。 5. 配置TIM1的中断使能,使能定时中断。 6. 编写中断服务函数,处理定时中断事件。 以下是一个简单的示例代码,演示了如何配置和使用TIM1定时中断: ```c #include "stm32f10x.h" void TIM1_IRQHandler(void) { if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) { // 处理定时中断事件 // ... // 清除中断标志位 TIM_ClearITPendingBit(TIM1, TIM_IT_Update); } } int main(void) { // 启用TIM1的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); // 配置TIM1 TIM_TimeBaseInitTypeDef TIM_InitStruct; TIM_InitStruct.TIM_Prescaler = 7200 - 1; // 设置预分频器,得到10kHz的计数频率 TIM_InitStruct.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式 TIM_InitStruct.TIM_Period = 10000 - 1; // 设置定时器周期为1秒 TIM_InitStruct.TIM_ClockDivision = TIM_CKD_DIV1; TIM_InitStruct.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM1, &TIM_InitStruct); // 使能TIM1更新中断 TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE); // 配置中断优先级 NVIC_InitTypeDef NVIC_InitStruct; NVIC_InitStruct.NVIC_IRQChannel = TIM1_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStruct); // 启动TIM1 TIM_Cmd(TIM1, ENABLE); while (1) { // 主循环 // ... } } ``` 在上述示例代码中,我们首先启用了TIM1的时钟,并配置了TIM1的工作模式和定时周期。然后,使能了TIM1的更新中断,并编写了中断服务函数`TIM1_IRQHandler`来处理定时中断事件。最后,在主循环中可以执行其他任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值