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

2023-10-30

前情回顾

上一篇讲解了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.  使能计数器。

​​​​​​​

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

零基础入门STM32编程(七)——定时器篇(HAL) 的相关文章

  • ARM Linux 如何模拟 PTE 的脏位、访问位和文件位?

    As per pgtable 2 level h https git kernel org cgit linux kernel git torvalds linux git tree arch arm include asm pgtable
  • 将 GCC 内联汇编与采用立即值的指令结合使用

    问题 我正在为 ARM Cortex M3 处理器开发定制操作系统 为了与我的内核交互 用户线程必须生成 SuperVisor Call SVC 指令 以前称为 SWI 用于软件中断 该指令在ARM ARM中的定义是 这意味着该指令需要即时
  • 在嵌入式设备上使用new或malloc引起的段错误[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在尝试
  • C 嵌入式应用程序中 time() 函数的问题

    我在用time 在 ARM 微控制器上 处理器一到达此函数就会重新启动 奇怪的是 当我处于调试模式时 代码运行得很好 但一旦我想将其应用到独立模式 我就会遇到重置 我是否忽略了什么 这个功能有替代品吗 代码部分是这样的 include
  • 当端点和 PMA 地址均更改时,CubeMX 生成的 USB HID 设备发送错误数据

    我正在调试我正在创建的复合设备的问题 并在新生成的仅 CubeMX 代码中重新创建了该问题 以使其更容易解决 我添加了少量代码main 让我发送 USB HID 鼠标点击 并在按下蓝色按钮时使 LED 闪烁 uint8 t click re
  • arm-thumb指令集的blx指令如何支持4MB范围

    读自https www keil com support man docs armasm armasm dom1361289866046 htm https www keil com support man docs armasm arma
  • 是否可以将 SpaCy 安装到 Raspberry Pi 4 Raspbian Buster

    我一整天都在安装 SpaCy sudo pip install U spacy Looking in indexes https pypi org simple https www piwheels org simple Collectin
  • 基于 Windows 8 ARM 的平板电脑上的 VB6

    随着 Windows 8 将支持 VB6 我的问题是 Microsoft 是否在任何地方表示 是或否 VB6 应用程序将在基于 ARM 的平板电脑上运行 如果没有 是否有任何 ARM 模拟器 以便我们可以在 Windows 8 ARM 平板
  • 使用 NEON 优化 Cortex-A8 颜色转换

    我目前正在执行颜色转换例程 以便从 YUY2 转换为 NV12 我有一个相当快的函数 但没有我预期的那么快 主要是由于缓存未命中 void convert hd uint8 t orig uint8 t result uint32 t wi
  • gdb 不会从外部架构读取核心文件

    我正在尝试在 Linux 桌面上读取 ARM 核心文件 但似乎无法找出我的核心文件 有什么方法可以指示 gdb 我的核心文件是什么类型吗 file daemon daemon ELF 32 bit LSB executable ARM ve
  • 直接在 ARM 目标上调试单声道应用程序

    我最近在 BeagleBone 嵌入式 ARM 设备上安装了 Mono 希望通过 USB 连接 Kinnect 传感器并使用 C Mono 控制它 我想知道 Mono 我正在使用 MonoDevelop 但我想这个问题也适用于 VS 是否允
  • 如何模拟ARM处理器运行环境并加载Linux内核模块?

    我尝试加载我的vmlinux into gdb并使用 ARM 内核模拟器 但我不明白为什么我会得到Undefined target command sim 这是外壳输出 arm eabi gdb vmlinux GNU gdb GDB 7
  • 架构armv7的重复符号

    尝试在我现有的应用程序中使用 Layar SDK 时出现以下错误 我该如何解决这个问题 Ld Users pnawale Library Developer Xcode DerivedData hub afxxzaqisdfliwbzxbi
  • ARM Cortex-M3 启动代码

    我试图了解 STM32 微控制器的 Keil realview v4 附带的初始化代码是如何工作的 具体来说 我试图了解堆栈是如何初始化的 In the 文档 http infocenter arm com help index jsp t
  • 让 TensorFlow 在 ARM Mac 上使用 GPU

    我已经安装了TensorFlow在 M1 上 ARM Mac 根据这些说明 https github com apple tensorflow macos issues 153 一切正常 然而 模型训练正在进行CPU 如何将培训切换到GPU
  • 可以对 Xcode 中的 Arm 架构设置进行一些澄清

    据我了解 iPhone 5将采用新的架构 armv7s 我的项目具有有效的架构armv7 并且有Build Active Architecture Only set to true 由于现在商店中的每个应用程序都是为armv6 and or
  • 哪些 GCC 优化标志对二进制大小影响最大?

    我正在使用 GCC 为 ARM 开发 C 我遇到了一个问题 我没有启用优化 我无法创建二进制文件 ELF https en wikipedia org wiki Executable and Linkable Format 对于我的代码 因
  • A64 Neon SIMD - 256 位比较

    我想将两个小端 256 位值与 A64 Neon 指令 asm 进行有效比较 平等 为了平等 我已经有了解决方案 bool eq256 const UInt256 lhs const UInt256 rhs bool result 首先 将
  • 了解带有 pc 偏移的 Cortex-M 组件 LDR

    我正在查看这段 C 代码的反汇编代码 define GPIO PORTF DATA R volatile unsigned long 0x400253FC int main void Initialization code while 1
  • ARM、VFP、浮点、惰性上下文切换

    我正在为 ARM 处理器 Cortex A9 编写操作系统 我正在尝试实现浮点寄存器的延迟上下文切换 这背后的想法是 浮点扩展最初对线程禁用 因此不需要在任务切换上保存浮点上下文 当线程尝试使用浮点指令时 会触发异常 然后 操作系统启用浮点

随机推荐

  • UART、RS-232、RS-422、RS-485的区别

    v3学院带你一次性认清UART RS 232 RS 422 RS 485的区别 https www cnblogs com laokai p 6488910 html 通讯问题 和交通问题一样 也有高速 低速 拥堵 中断等等各种情况 如果把
  • LBP算法及其改进算法

    LBP LBP指局部二值模式 英文全称 Local Binary Pattern 是一种用来描述图像局部特征的算子 LBP特征具有灰度不变性和旋转不变性等显著优点 它是由T Ojala M Pietik inen 和 D Harwood在1
  • 第二十五章 Chisel进阶——隐式参数的应用

    用Chisel编写的CPU 比如Rocket Chip RISCV Mini等 都有一个特点 就是可以用一个配置文件来裁剪电路 这利用了Scala的模式匹配 样例类 偏函数 可选值 隐式定义等语法 本章内容就是来为读者详细解释它的工作机制
  • VC++ HBITMAP保存文件

    请先看下面这段代码 BOOL SaveBmp HBITMAP bmp string path FILE f fopen path c str wb if f return 0 BITMAP bmpinfo GetObject bmp siz
  • 既然敢于炮轰C++,那么Linus的C++造诣和编程水平如何呢?

    之前有一篇文章谈到Linux 之父对 C 进行了炮轰 说它是糟糕程序员的垃圾语言 引起了大家的较多讨论 毕竟 我们都知道Linus Torvalds为了Linux内核开发而专门打造的版本控制软件Git已经引起了业界的广泛关注 后来又看到大家
  • MSF令牌窃取

    令牌简介及原理 令牌就是系统的临时密钥 相当于账户名和密码 原来决定是否允许这次请求和判断是属于哪一个用户的 他允许你不提供密码或其他凭证的前提下访问网络和系统资源 令牌最大的特点就是随机性 不可预测 一般黑客或软件无法猜测出来 令牌有很多
  • Docker 镜像和容器的导入导出及常用命令

    作者 微枫Micromaple 来源 CSDN博客 Docker 镜像和容器的导入导出 1 1 镜像的导入导出 1 1 1 镜像的保存 通过镜像ID保存 方式一 docker save image id gt image save tar
  • Redis数据迁移:方法二AOF

    启动2个实例 开启AOF备份 源实例 127 0 0 1 7000 目标实例 127 0 0 1 8000 127 0 0 1 7000 中有k1 k100 一共100个key 文件目录如下 7000 conf配置如下 standalone
  • 计算机用户帐户域怎么查找,win7计算机域怎么查?小编教你查看计算机域、工作机组的方法...

    win7计算机域怎么查 当我们在同一个工作机组的情况下我们可以互相访问传输文件 非常方便 但是有的用户的工作机组或者域不同导致无法正常使用局域网的现象 这个时候我们就可以通过查看这些计算机使用的域工作机组是否一致 在 域 模式下 至少有一台
  • 突破50亿美元的想象:RPA市场持续被看好

    RPA 机器人流程自动化 指用软件机器人实现业务处理的自动化 是当下科技领域最热门的一个领域之一 RPA机器人使用用户界面 UI 捕获数据并模拟人类操作应用程序 它们能够模仿大多数人类用户的行为 识别 触发 响应并和其他系统进行通信 以此来
  • 控制台运行XX.jar时出现 “jar中没有主清单属性“解决方法

    1 首先我是用Maven导出到包 得到的jar文件保存在 2 在这个文件目录下cmd运行 执行java jar 01helloworld jar这句命令提示出现 XX jar中没有主清单属性 3 解决方法 有两种解决办法 springboo
  • 上传本地Vue项目到github和gh-pages预览

    利用git命令将项目上传到github 1 登陆自己的github账号 点击new repository进行创建一个新的仓库 如下图所示 2 用命令将项目上传 1 先进入项目文件夹 通过命令 git init 把这个目录变成git可以管理的
  • webpack5学习笔记—基础篇

    目录 1 webpack 1 1 Webpack是什么 有什么用 1 2 webpack的几个概念 2 webpack的基础使用 3 2 1 安装 3 2 2 webpack配置文件 3 2 3 打包命令 3 资源模块 resource i
  • 小米9008授权账号_小米手表体验:中肯点评,这是一款优点和缺点同样突出的智能手表...

    前不久 小米推出了两款智能手表 一款是方形表盘设计的小米手表 一款是圆形表盘的小米手表Color 除了价格上的区别 小米手表要比小米手表Color功能更丰富些 价格也要比小米手表Color贵一点 虽然小米手表Color的圆形圆盘更好看些 但
  • Android PDF开发:android-pdfview

    Android PDF开发 android pdfview Android平台自身没有直接可以阅读和处理pdf的方案 在github上面有一个第三方开源的pdf开发SDK 其主页地址是 https github com JoanZapata
  • 【Android性能优化】Android图片加载方案--Bitmap的内存管理和优化方案

    转载请注明原文地址 http blog csdn net mxm691292118 article details 51028953 我把Android重难点和读书笔记都整理在github上 https github com miomin
  • 期货交易一个品种好(期货买几个品种好)

    期货新手该做哪个品种 期货新手品种选择 看风险承受能力 风险承受能力较低 建议只交易豆 豆粕 玉米 强麦 籼稻等品种 风险承受能力中等 建议在以上基础上增加白糖 塑料 PTA 豆油 棕榈油 菜籽油 玻璃 螺纹钢 鸡蛋等 风险承受能力较高 那
  • 35岁IT前辈,测试11年,第一次分享面试感悟

    最近几年我一直担任着软件测试面试官的角色 正好过年回来 也差不多金三银四求职季了 所以想写点面试的经验分享给大家 希望能对大家有些帮助 碍于才疏学浅 又是理工出身 字里行间未免词不达意 可能会让大家见笑了 软件测试面试环节 一般求职无非几个
  • java new数组_Java如何使用new创建数组

    java语言使用new操作符来创建数组 语法如下 arrayRefVar new dataType arraySize 上面的语法语句做了两件事 一 使用dataType arraySize 创建了一个数组 二 把新创建的数组的引用赋值给变
  • 零基础入门STM32编程(七)——定时器篇(HAL)

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