STM32——基本定时器

        基本定时器的用途有两个:定时触发驱动DAC,此类定时器内部连接到 DAC 并能够通过其触发输出驱动 DAC。这些定时器彼此完全独立,不共享任何资源。其框图如下:


一、时钟

        由框图可知,来自RCC的TIMxCLK即是定时器的内部时钟(CK_INT),TIMxCLK的时钟频率可以在标准库中的RCC函数中去寻找,例如 TIM6CLK 和 TIM7CLK 的时钟频率如图所示:

        由此可知,TIM6CLK 和 TIM7CLK 的时钟频率即APB1的时钟频率,但是要注意,对于定时器,如果预分频系数等于 1,则频率不变,否则频率乘以 2,APB1 预分频的系数是 2,所以定时器时钟频率是APB1时钟频率的两倍。内部时钟经过控制器变为CK_PSC时钟,但时钟的频率并未改变;然后CK_PSC时钟经过PSC预分频器分频变为CK_CNT时钟,CK_CNT时钟用于给计数器提提供计数时钟。最终就是来自RCC的时钟经过预分频器进行时钟分频后即为计数器时钟

        该预分频器是一个16位可编程预分频器,分频系数介于 1 和 65536 之间,分频系数值可通过向 TIMx_PSC 寄存器写入值来进行配置,要注意的是写入的值硬件会自动加一。 TIMx_PSC 控制寄存器是有缓冲的,即影子寄存器,当寄存器在下方有阴影的时候,表示这个寄存器还自带有影子寄存器,在硬件结构上实际上是有两个寄存器。源寄存器是我们可以进行读写操作的,例如这里的TIMx_PSC 寄存器就是源寄存器,而影子寄存器我们是无法操作的,由内部硬件使用,并且影子寄存器的值才是实际产生效果的。因此我们可以对预分频器的值进行实时更改,但是并不会实时生效,其值只有在下一更新事件发生时才会传入影子寄存器,从而被实际使用

        在不同应用场所,经常需要不同的定时频率,通过设置预分频器 PSC的值可以非常方便得到不同的 CK_CNT,实际计算为:fCK_CNT 等于 fCK_PSC/(PSC[15:0]+1)

二、计数器与自动重载寄存器

定时器定时工作过程:基本定时器的计数器只能进行向上计数计数器 COUNTER根据 CK_CNT频率向上计数,即每来一个 CK_CNT脉冲,TIMx_CNT 值就加 1。当 TIMx_CNT值与 TIMx_ARR的设定值相等时计数器就会重新从 0 开始计数并生成计数器上溢事件(更新事件),如此重复以上过程。        

        计数器由预分频器输出 CK_CNT 提供时钟,仅当 TIMx_CR1 寄存器中的计数器启动位 (CEN)置 1 时,才会启动计数器。请注意,实际的计数器使能信号 CNT_EN 在 CEN 置 1 的一个时钟周期后被置 1

        自动重载寄存器 TIMx_ARR用来存放与计数器值比较的数值,如果两个数值相等就生成更新事件,如果将相关事件标志位置位,则会生成 DMA和中断输出。自动重载寄存器也有影子寄存器,我们只能对自动重载寄存器进行读写操作,与预分频器寄存器不同的是,预分频器寄存器只有在发生更新事件时其值才会传入影子寄存器,而自动重载寄存器的内容既可以直接传送到影子寄存器,也可以在每次发生更新事件 UEV 时传送到影子寄存器,这取决于 TIMx_CR1 寄存器中的自动重载预装载使能位 (ARPE)

        在功能框图中,自动重载寄存器左边有一个带有“U”字母的事件图标,表示在更新事件生成时就把自动重载寄存器内容拷贝到影子寄存器内,这个与上面分析是一致。寄存器右边的事件图标、中断和DMA输出图标表示在自动重载寄存器值与计数器寄存器值相等时生成事件、中断和 DMA输出。

更新事件的产生方式与作用

        控制寄存器 1 (TIMx_CR1) 的 UDIS 位控制更新是否可以产生,如图所示

 基本定时器的更新事件产生方式就两个:一个是由硬件产生,即计数器上溢;一个是由软件产生,即将UG位置1

更新事件的作用

1、更新影子寄存器的值

        如果禁止产生更新事件,计数器仍然能正常工作,只是说你改变预分频器寄存器的值和自动重载寄存器的值都不会被送入影子寄存器产生实际效果,即修改了没有用。(当然如果自动重装载使能位为0时,则自动重载寄存器的值可以直接送入影子寄存器,不受更新事件的影响)

2、产生中断或DMA请求

        当产生更新事件时,就会产生更新中断或DMA请求。但是并不是所有的更新事件都能产生更新中断或DMA请求,能不能产生由控制寄存器 1 (TIMx_CR1) 的 URS 位控制。

        当URS为0时,则两个更新事件都能产生更新中断或DMA请求;

        当URS为1时,只有计数器上溢能产生更新中断或DMA请求。

三、定时器周期计算

        经过上面分析,我们知道定时事件生成时间主要由 TIMx_PSC 和 TIMx_ARR两个寄存
器值决定,这个也就是定时器的周期。比如我们需要一个 1s周期的定时器,我们可以先设置预分频器的值,预分频器的输入时钟 CK_PSC为 90MHz,那么可以设置预分频器值为(9000-1),要注意设置的最大值为65535,即计数器时钟为10KHz,即100us计数器计数一次。

        然后就是设置TIMx_ARR寄存器的值,1s/100us = 10000,即要计数10000次才能达到1s,因此可以设置TIMx_ARR寄存器值为(10000-1)。

四、基本定时器初始化结构体详解

        标准库函数对定时器外设建立了四个初始化结构体,基本定时器只用到其中一个即TIM_TimeBaseInitTypeDef,该结构体成员用于设置基本定时器基本工作参数,并由定时器基本初始化配置函数 TIM_TimeBaseInit 调用,这些设定参数将会设置定时器相应的寄存器,达到配置定时器工作环境的目的。这一章我们只介绍 TIM_TimeBaseInitTypeDef 结构体,其他结构体将在相关章节介绍。

typedef struct {
    uint16_t TIM_Prescaler; // 预分频器
    uint16_t TIM_CounterMode; // 计数模式
    uint32_t TIM_Period; // 定时器周期
    uint16_t TIM_ClockDivision; // 时钟分频
    uint8_t TIM_RepetitionCounter; // 重复计算器
} TIM_TimeBaseInitTypeDef;


(1) TIM_Prescaler:定时器预分频器设置,时钟源经该预分频器才是定时器时钟,它设定
TIMx_PSC 寄存器的值。可设置范围为 0 至 65535,实现 1至 65536 分频。

(2) TIM_CounterMode:定时器计数方式,可是在为向上计数、向下计数以及三种中心对齐模式。基本定时器只能是向上计数,即 TIMx_CNT只能从 0开始递增,并且无需初始化。

(3) TIM_Period:定时器周期,实际就是设定自动重载寄存器的值,在事件生成时更新到影子寄存器。可设置范围为 0至 65535。

(4) TIM_ClockDivision:时钟分频,设置定时器时钟 CK_INT 频率与数字滤波器采样时钟频率分频比,基本定时器没有此功能,不用设置。

(5) TIM_RepetitionCounter:重复计数器,属于高级控制寄存器专用寄存器位,利用它可以非常容易控制输出 PWM 的个数。这里不用设置。

        虽然定时器基本初始化结构体有 5个成员,但对于基本定时器只需设置其中两个就可以,想想使用基本定时器就是简单。

        

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
舵机驱动是STM32的一种应用方式,通过使用PWM输出信号来控制舵机的转动角度。PWM(脉冲宽度调制)是一种通过改变脉冲信号的高电平时间来控制电机或舵机的转动角度的技术。在STM32中,可以使用定时器模块来生成PWM信号,并通过改变占空比来控制舵机的位置。 具体来说,舵机驱动需要以下几个步骤: 1. 配置定时器:选择一个合适的定时器,并配置其工作模式和时钟源。 2. 配置输出通道:选择一个定时器的输出通道,并配置其工作模式为PWM输出模式。 3. 设置PWM周期:根据舵机的要求,设置定时器的重载值,确定PWM信号的周期。 4. 设置占空比:通过改变定时器的比较值,可以改变PWM信号的占空比,从而控制舵机的转动角度。 5. 启动定时器:使能定时器开始生成PWM信号。 通过以上步骤,可以实现对舵机的驱动控制。具体的代码实现可以参考引用\[3\]中的学习记录文章,其中详细介绍了如何在STM32中使用PWM输出来驱动舵机。 #### 引用[.reference_title] - *1* *2* *3* [总结篇:STM32舵机、电机的驱动&OSBoat电路逻辑的梳理](https://blog.csdn.net/weixin_47723114/article/details/127727386)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彷徨不前@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值