stm32f103定时器中断

stm32为我们提供了8个定时器,分为:通用是定时器(TIM2~TIM5),高级定时器(TIM1和TIM8),基本定时器(TIM6和TIM7)。

至于三者之间的区别可以参考以下博客:https://blog.csdn.net/dukai392/article/details/72058041

本次我们主要讨论的是通用定时器的基本知识以及更新中断的配置过程。

通用定时器框图如下:

由于stm32的定时器十分复杂,功能特多而本次我们只讨论他的计数跟新功能(定时)。

时钟的选择:

由框图中红色部分可知定时器的时钟来源有三个:内部时钟(CK_INT),外部时钟(TIMx_ETR),其他定时器的时钟(ITR0-ITR3).

本次我们主要讲解内部时钟的配置,至于其他时钟可以自行尝试(实际工作中大多使用内部时钟)。

内部时钟框图:

从图中可以看出:由AHB时钟经过APB1预分频系数转至APB1时钟,再通过某个规定转至TIMxCLK时钟(即内部时钟CK_INT、CK_PSC)。最终经过PSC预分频系数转至CK_CNT。

注:X1/X2有APB1预分频系数来决定,如果AHB时钟为72m,APB1预分频器值为2那么CK_PSC=APB1*2=72m。定时器最终时钟由PSC预分频器得到。

计数模式:

向上计数:从0计数到预装载值就会产生一个溢出事件,然后继续从0开始计数。

向下计数:从预装载值计数到0就会产生一个溢出事件,然后继续从预装载值开始计数。

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

相关寄存器:计数器当前值寄存器CNT,预分频寄存器TIMx_PSC,自动重装载寄存器(TIMx_ARR),控制寄存器1(TIMx_CR1),DMA中断使能寄存器(TIMx_DIER)

寄存器的相关配置方法参考手册

库函数初始化定时器方法:

能定时器时钟:RCC_APB1PeriphClockCmd();

 初始化定时器,配置ARR,PSC:TIM_TimeBaseInit();

开启定时器中断,配置NVIC:

      void TIM_ITConfig();

      NVIC_Init();

 使能定时器:TIM_Cmd();

 编写中断服务函数:TIMx_IRQHandler();

Tout(溢出时间)=ARR+1)(PSC+1)/Tclk      (其中Tclk为PSC时钟也就是定时器还未分频时的时钟,一般为72M)

例如定时1S:

1S=(10000)*(7200)/72M

注:

typedef struct

{

  uint16_t TIM_Prescaler;       //TIMx 时钟频率除数的预分频值(PSC)

  uint16_t TIM_CounterMode;    //计数模式

  uint16_t TIM_Period;       //自动重装载值

  uint16_t TIM_ClockDivision; //时钟分频

  uint8_t TIM_RepetitionCounter; //重复计数

} TIM_TimeBaseInitTypeDef

状态标志位获取和清除:

FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);

void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);

  • 8
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用STM32F103定时器中断可以实现一些时间相关的功能,例如定时采集数据、定时发送数据等。 首先,需要配置定时器的相关寄存器。以TIM3为例,可以按照以下步骤进行配置: 1. 使能TIM3的时钟:通过RCC_APB1PeriphClockCmd函数使能TIM3的时钟,例如: ``` RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); ``` 2. 配置TIM3的基本参数:设置定时器的预分频值、计数模式等。例如,设置TIM3的预分频为72,计数模式为向上计数: ``` TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; TIM_TimeBaseInitStructure.TIM_Prescaler = 71; TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInitStructure.TIM_Period = 9999; TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure); ``` 3. 配置TIM3的中断:设置需要触发中断的事件,并使能中断。例如,设置TIM3溢出时触发中断: ``` TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); ``` 4. 配置NVIC中断向量表:使能对应的中断向量,并设置优先级。例如,使能TIM3中断向量,并设置为最高优先级: ``` NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); ``` 5. 启动TIM3定时器: ``` TIM_Cmd(TIM3, ENABLE); ``` 6. 编写中断处理函数:在中断处理函数中实现需要的功能,例如: ``` void TIM3_IRQHandler(void) { if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) { // 在此处编写需要执行的代码 // 清除中断标志位 TIM_ClearITPendingBit(TIM3, TIM_IT_Update); } } ``` 以上是使用STM32F103定时器中断的基本步骤,你可以根据自己的需求进行相应的配置和编写中断处理函数。注意,在编写代码时,需要包含对应的头文件和库函数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值