前情回顾

上一篇讲解了HAL库函数点灯,初步学习了如何使用CUBE MX创建工程文件,以及文末送出了获取HAL库函数API手册方法的小福利,本篇将继续学习HAL库函数中的定时器API使用方法。

一 初识定时器

上一篇讲解了使用HAL库函数点灯,在上一篇中我们使用了HAL_DELAY函数的延时作用实现了每个1s点亮LED灯,再每隔1s熄灭LED灯。本节将使用定时器的方式实现该功能。

STM32F103R6T单片机有3个定时器,分别挂载在不同的总线上,关于总线的知识点请参见系列教程--总线篇。TIM2、TIM3挂载在APB1总线上,TIM1挂载在APB2总线上。从下图可知,APB2总线速率即时钟频率可到72MHz,是APB1总线的2倍。

TIM1为高级定时器,可测量输入信号的脉冲长度和产生输出波形;TIM2、TIM3为通用型定时器。

3个定时器均各有4个通道,每个定时器的4个通道内定了各自对应的芯片引脚。

二 高级定时器

2.1 常用寄存器种类

定时器每次达到要求后,便会产生一次更新事件,例如,结合项目要求,每次计时满1s后,产生一次更新事件,该事件负责点亮灯。

更新事件的更新周期计算公式如下:

其中,TIM_CLK是定时器的时钟输入;

PSC为16位预置数寄存器 (TIM1_PSC);

ARR 为16位自动重载寄存器 (TIM1_ARR);

RCR为16位重复计数器。

Update_event = 72*106/((1 + 1)*(65535 + 1)*(1))

Update_event = 549.3 Hz

下图为高级定时器TIM1的原理框图,主要模块是时基单元,该单元由

a)计数寄存器 (TIM1_CNT)

b)预置数寄存器 (TIM1_PSC)

预置器可对计数器的时钟进行分频,分频因子范围为1至65536,配置数据写入TIMx_PSC register寄存器。

计数器的时钟频率(CK_CNT)=预置数的时钟频率(CK_PSC)/(PSC[15:0]+1),因为这里是从0开始,为了表示分频因子范围为1至65536,所以需要加1

计数器的时钟频率(CK_CNT)由预置数寄存器的值决定,然后计数器按照该时钟频率(CK_CNT)的节拍进行计数,结果存入计数寄存器 (TIM1_CNT)。

可知,预置数寄存器的作用就是决定计数器的时钟频率(CK_CNT)。

注:需先将TIMx_CR1的CEN使能位置1。

c)自动重载寄存器 (TIM1_ARR)

该寄存器的作用是决定了计数器的计数范围。

回顾计数器的使用方法:

在使用计数器TIMER时,先确定计数器的计数周期也就是时钟周期,接着确定计数器的计数范围。

这里的计数范围就是由自动重载寄存器 (TIM1_ARR)决定的,同时每计满一次数便产生一次更新事件(UEV)。

如下图所示,如果TIM1_EGR寄存器的UG位置1也可产生一次更新事件(UEV)。

d)重复计数寄存器 (TIM1_RCR)等共四个寄存器组成,(TIM1共有19个寄存器)。

该寄存器的作用有以下两种:

1)预装载器有效时,可建立比较寄存器的更新速率;

2)相应中断使能时,可设置更新中断产生速率。

REP_CNT向下计数为0时就会产生更新事件,就会重新按照TIM1_RCR寄存器中设置的REP值开始新的计数。

该寄存器决定了重复计数的次数。

例如,计数器每次计数至5,一共需要重复20次,那么重复计数寄存器 (TIM1_RCR)需要设置为19(TIMx_RCR+1),自动重载寄存器 (TIM1_ARR)的值需要设置成5。

2.2 计数模式

计数器的计数模式有向上计数、向下计数和中间计数三种模式。

2.3 时钟输入源

上节描述可知,三种定时器都挂载不两种总线上,这两种总线其具有共同的时钟源。时钟源可分来以下两种:

  • 内部时钟
  • 外部时钟

因此,上式中的TIM_CLK可以有三种不同的选择时钟源。

三 定时器工作模式

定时器有4个通用模式,分别为:

  • 输入捕捉模式
  • 输出比较模式
  • PWM模式
  • 单脉冲模式

3.1 输入捕捉模式

该模式可用来测量外部信号,原理是:根据定时器时钟、预分频器和定时器分辨
率,可推导出最大测量周期。按照以下步骤配置寄存器:

a) 通过将 CCMRx  寄存器中的 CCxS 位置 1 选择有效输入。

b)通过对 CCMRx 寄存器中的 IC1F[3:0]  位执行写操作以编程滤波器,并通过对
IC1PSC[1:0]  位执行写操作以编程预分频器。

c)通过对 CCxNP/CCxP  位执行写操作以编程极性,即选择上升沿触发、下降沿触发或边沿
触发。

d)当输入通道检测到相应的计数器的值发生转变时,可使用输入捕捉模块进行捕捉。要获取外
部信号周期,需连续进行两次捕捉。通过将两次捕捉到的值相减可计算得到周期。

周期 = 捕捉(1) /(TIMx_CLK *(PSC+1)*(ICxPSC)*polarity_index(2))

两次连续捕捉值 CCRx_tn  和 CCRx_tn+1  的捕捉差值:
● 如果 CCRx_tn < CCRx_tn+1 :捕捉 = CCRx_tn+1 - CCRx_tn
● 如果 CCRx_tn > CCRx_tn+1 :捕捉 = (ARR_max - CCRx_tn) + CCRx_tn+1
如果使用上升沿触发或下降沿触发,则极性指数为 1 ;而如果选择边沿触发,则极性指数为 2 。

3.2  定时器PWM模式

在边沿对齐模式或中心对齐模式下,这种定时器可在每个通道上单独生成 PWM 。其中:频
率由 TIMx_ARR  寄存器的值确定,占空比由 TIMx_CCRx 寄存器的值确定。

● 递增计数时,只要 CNT < CCRx,便激活通道 x ,否则禁止通道 x 。
● 递减计数时,只要 CNT > CCRx,便禁止通道 x ,否则激活通道 x 。
● 递增计数时,只要 CNT < CCRx,便禁止通道 x ,否则激活通道 x 。
● 递减计数时,只要 CNT > CCRx,便激活通道 x ,否则禁止通道 x 。

要将定时器配置为该模式:
1. 配置输出引脚:
a)  通过对 CCMRx 寄存器中的 CCS  位执行写操作以选择输出模式。
b)  通过对 CCER  寄存器中的 CCxP 位执行写操作以选择极性。
2.  通过对 CCMRx  寄存器中的 OCxM 位执行写操作以选择 PWM  模式(PWM1 或 PMW2)。
3.  分别在 ARR  和 CCRx 寄存器中编程周期和占空比。
4.  将 CCMRx 寄存器中的预装载位置 1 ,然后将 CR1  寄存器中的 ARPE  位置 1 。
5.  选择计数模式:
a) PWM  边沿对齐模式:计数器必须配置为递增计数或递减计数模式。
b) PWM  中心对齐模式:定时器模式必须为中心对齐计数模式(CMS 位不为“00”)。
6.  使能捕捉比较。
7.  使能计数器。

​​​​​​​

零基础入门STM32编程(七)——定时器篇(HAL)相关推荐

  1. 零基础入门STM32编程(三)

    前情回顾 通过前面两篇文章的学习,我们已经对STM32有了一定的了解,知道了STM32单片机的基本分类和不同产品间的特点等知识,今天起围绕STM32F103xx继续深入浅出地学习单片机编程. 一.总线 ...

  2. 零基础入门STM32编程(二)

    前情回顾 上篇文章初步认识了STM32,了解了STM32的分类及型号命名规则,本篇内容继续STM32串口编程入门学习. 一 走进STM32 STM32的单片机分为四类,主流单片机又分为五种,四类介绍参 ...

  3. 零基础入门STM32编程——GPIO(五)

    系列教程链接 HAL库编程点灯篇https://blog.csdn.net/oHaoEr/article/details/122999523 一 GPIO简介 1.1 概述 GPIO(通用输入输出端口 ...

  4. 一篇文章让你从JAVA零基础入门`OOP`编程12.19

    一篇文章让你从JAVA零基础入门OOP编程 前言: 此文为玄子,复习ACCP-S1课程后,整理的文章,文中对知识点的解释仅为个人理解. 配套PPT,站点源码,等学习资料 一.预科 1.1 JAVA 介 ...

  5. 一篇文章让你从JAVA零基础入门`OOP`编程12.20

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(QQ_3336392096.png)] 一篇文章让你从JAVA零基础入门OOP编程 前言: 此文为玄子,复习ACCP-S1课程后, ...

  6. 一期完结《一篇文章让你从JAVA零基础入门`OOP`编程》12.21

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(QQ_3336392096.jpg)] 一篇文章让你从JAVA零基础入门OOP编程 前言: 此文为玄子,复习ACCP-S1课程后, ...

  7. 零基础入门网络安全,收藏这篇不迷茫【2023 最新】

    零基础入门网络安全,收藏这篇不迷茫[2023 最新] 前言 最近收到不少关注朋友的私信和留言,大多数都是零基础小友入门网络安全,·需要相关资源学习.其实看过的铁粉都知道,之前的文里是有过推荐过的.新来 ...

  8. python编程零基础-如何零基础入门Python编程?

    Python目前已经成为最受欢迎的编程语言之一,吸引了一大批粉丝,但是很多人在要跨入的时候犹豫了,原因竟然是觉得零基础学习Python太难了,真的是这样吗?零基础入门Python编程学习有什么好的技巧 ...

  9. 九宫怎么排列和使用_剪映零基础入门教程第三十七篇:一学就会系列之九宫格小程序配音...

    很多玩儿抖音的朋友都看过九宫格视频,但是并不是每个玩抖音的人都会制作这个九宫格视频,实际这个需要借助小工具来帮忙,而常用抖音的朋友们会对剪映更加熟悉一些,且九宫格视频在剪映内的制作方式则比较简单.那么 ...

最新文章

  1. 一种注册表沙箱的思路、实现——研究Reactos中注册表函数的实现4
  2. 4springboot:日志(上)
  3. 百度网络推广介绍网站在更换老域名时都需注意哪些?
  4. IE8 CSS HACK 兼容集合
  5. 6.1.2.6 盒子
  6. all ,any,abs的使用
  7. isinfinite_Java Double类isInfinite()方法与示例
  8. 面试题05. 替换空格
  9. MySQL第41题怎么评分_mysql练习题1-41
  10. 使用Android Studio 进行NDK开发和调试
  11. iOS开发之oc(五)--成员变量(实例变量)
  12. 在 JavaScript 中将 String 与 XML 相互转换
  13. 开源GIS(三)——openlayers地图基本框架与天地图加载
  14. Sql 语句:显示 Sql Server 中所有表中的信息
  15. 35岁腾讯员工:准备退休!1kw房产+1kw股票+3百万现金,勉强够用了
  16. 思考,基于高密度闪存的存储系统未来到底是一个什么样子?
  17. C语言中类型转换那些事儿
  18. [ActionScript 3.0] AS3.0 把图片分析成文本表现形式
  19. 新能源汽车行业资讯-2022-9-16
  20. 「实战」南京房价的秘密——准备篇

热门文章

  1. android动态设置背景
  2. 一个IT从业者的课外读物___经济管理篇
  3. 【Source教程】Crowbar下载部署与使用方法
  4. x8086千行汇编项目——汇编贪吃蛇、画图、两个程序的调度
  5. 腾讯全球合作伙伴大会腾讯云火爆专场
  6. 算法-动态规划入门(C++实现)
  7. 微信小程序小案例——简单数据增删改查模拟
  8. Java 后端工程师的书单推荐
  9. Linux 系统结构详解,看这一篇就够了?(又一篇万字长文)
  10. 点云降采样--ApproximateVoxelGrid点云降采样