STM32F103系列之定时器TIM

本篇主要介绍STM32的一个重要的外设——TIM定时器,如果把一个芯片比作一个人的话,那么定时器就好比人的心脏,可见TIM对于STM32的重要性!

TIM简介:

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

·16位计数器CNT、预分频器PSC、自动重装寄存器ARR的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时。

·定时器不仅具备基本的定时中断功能,而且还包含内外时钟源选择,输入捕获、输出比较、编码器接口、主从触发模式等多种功能。

·定时器分为基本定时器(TIM6,TIM7)、通用定时器(TIM2,TIM3,TIM4,TIM5)、高级定时器(TIM1,TIM8)。

在进行定时器初始化配置的时候需要知道你的芯片具备哪些定时器资源,例如STM32F103C8T6定时器资源:TIM1,TIM2,TIM3,TIM4

基本定时器

可以这么理解,定时器通过选择内部时钟(72MHz),经过一个触发控制器,再经过PSC预分频器得到CK_CNT,每多少频率记一次数,当达到自动重装载寄存器(ARR)的值时,就可以触发一个中断或者一个事件。但是基本定时器不具备输入捕获和输出比较等功能。

通用定时器

通用定时器的时钟源的选择就很多了,可以选择内部时钟也可以选择外部时钟或者其他定时器等,同样是经过一个触发控制器,在这个触发控制器里面可以选择计数模式,复位,使能等功能,然后通过PSC分频和CNT计数来控制中断和事件的产生,另外通用定时器可以输入捕获和输出比较的功能,在后续的文章中会向大家说明。

高级定时器

高级定时器有通用定时器的所有功能,还有其他功能这里不再进行叙述。

定时中断基本结构

首先需要就是时钟源的选择,可以选择RCC内部时钟,或者如果是通用定时器,高级定时器,还可以选择ETR外部时钟,ITRx其他定时器,TIx捕获通道等,接下来就是配置时基单元(PSC,CNT,ARR寄存器),然后就是到达ARR设定的值之后,产生一个中断或者事件,如果是一个中断的话,需要对中断输出控制,然后NVIC的配置,最后不要忘了对定时器使能。具体的配置结构图如下:

具体的初始化代码如下:

具体的中断服务函数如下:

以上就是定时器中断

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要配置STM32F103C8T6的TIM8定时器,需要进行以下步骤: 1. 使能TIM8定时器和GPIO时钟。 2. 配置TIM8的时基单元,包括时钟分频、计数模式、计数方向和计数周期等参数。 3. 配置TIM8的输出比较功能,包括输出比较通道、比较模式和比较值等参数。 4. 配置TIM8的PWM输出模式,包括PWM模式、极性和占空比等参数。 5. 启动TIM8定时器计数。 下面是一个示例代码,用于配置TIM8的PWM输出模式: ```c #include "stm32f10x.h" void TIM8_PWM_Init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; TIM_OCInitTypeDef TIM_OCInitStruct; // 使能TIM8和GPIO时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); // 配置TIM8时基单元 TIM_TimeBaseInitStruct.TIM_Prescaler = 72 - 1; // 时钟分频,72MHz / 72 = 1MHz TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; // 计数模式,向上计数 TIM_TimeBaseInitStruct.TIM_Period = 1000 - 1; // 计数周期,1MHz / 1000 = 1kHz TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分频因子,不分频 TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0; // 重复计数器,不使用 TIM_TimeBaseInit(TIM8, &TIM_TimeBaseInitStruct); // 配置TIM8输出比较通道1 TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; // PWM模式1 TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; // 输出使能 TIM_OCInitStruct.TIM_OutputNState = TIM_OutputNState_Disable; // 输出反相禁止 TIM_OCInitStruct.TIM_Pulse = 500 - 1; // 比较值,占空比50% TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High; // 输出比较极性,高电平有效 TIM_OCInitStruct.TIM_OCNPolarity = TIM_OCNPolarity_High; // 输出比较反极性,高电平有效 TIM_OCInitStruct.TIM_OCIdleState = TIM_OCIdleState_Reset; // 输出空闲状态,低电平 TIM_OCInitStruct.TIM_OCNIdleState = TIM_OCNIdleState_Reset; // 输出反相空闲状态,低电平 TIM_OC1Init(TIM8, &TIM_OCInitStruct); // 启动TIM8计数 TIM_Cmd(TIM8, ENABLE); } ``` 这段代码配置了TIM8定时器的PWM输出模式,使用PC6引脚作为PWM输出通道。在定时器时基单元配置中,设置了时钟分频为72,计数周期为1000,这样TIM8的计数频率为1MHz,PWM的周期为1ms。在输出比较通道配置中,设置了比较模式为PWM模式1,比较值为500,这样PWM的占空比为50%。最后通过使能TIM8定时器计数,开始输出PWM信号。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值