HAL库自学笔记#1【通用TIM定时器】
目录
绪言
一、定时器整体工作流程梳理
二、寄存器剖析
1·CR1、ARR、PSC寄存器
2·DIER、SR、CNT寄存器
三、CubeMX配置定时器
绪言
定时器可以说是32中非常重要的一个外设了,之前虽然知道怎么去配置和使用它,但是其中的原理却是一知半解。通过最近的学习,才慢慢摸索到其中的奥秘。这篇文章主要聊一聊定时器的工作原理和定时器中断,只是最最基础的东西,关于定时器的输入输出,会在接下来的文章中更新。
一、定时器整体工作流程梳理
在最开始,先来看一下ST官方手册给出的框图
这里只是截取了本次内容需要关注的东西,有兴趣的读者可以自行去查看官方手册。
可以看到,其最基本的工作原理还是比较简单的,就是一个时钟源的选择,然后用选择的时钟源作为一个计数器的时钟。CNT计数器按照自动重装载寄存器里面的值向上或者向下计数。当计数达到阈值时,可以选择产生中断与否,然后将自动重装载寄存器的值更新到CNT计数器重新计数。如此循环往复,就是定时器的工作原理。
二、寄存器剖析
上面已经说了定时器的基本工作原理,那它是怎么知道时钟源的选择以及该向上还是向下计数呢?这些问题都是通过配置相应的寄存器去控制定时器的。接下来就来剖析剖析定时器相关的寄存器。
1·CR1、ARR、PSC寄存器
基本上很多外设都会有一个CR寄存器(控制寄存器),各个外设的这个寄存器的大致作用也都差不多,都是对外设的一些初始化参数进行配置。
对于只是让定时器“跑起来”,我们只需要关注这个寄存器的以下位:
1)ARPE位:作用是使能预装载寄存器缓冲(会在后面介绍)
2)CMS位、DIR位:这两位组合起来用于配置定时器计数方式
3)CEN:定时器使能位
ARR寄存器就是上面整体框图中的自动重装载寄存器,一个16位的用于储存计数数值的寄存器。
有一个需要注意的点是计数周期是(ARR[15:0]+1)个时钟周期,这个应该不难理解。例如:ARR中的值是10,向上计数模式中,从0开始计数到10实际上是用了计数11次的时间。因为从上次10溢出到下一次0开始中间还有一个时钟周期。
PS:第一次开始计数时,使能计数器之后,会隔一个时钟周期,计数器才会开始工作。时序图如下:
这里我们只需要关注CK_PSC、CNT_EN和CK_CNT几个参数。CK_PSC就是定时器时钟源,CK_CNT是计数器时钟,CNT_EN是计数器使能位。可以看出,在CNT_EN置1后,隔了一个时钟周期,CK_CNT才开始工作。
PSC寄存器又叫预分频寄存器,是一个16位的寄存器,可实现时钟分频。并且自带缓冲器,故可以在定时器工作时读写。分频因子的计算公式为:
PSC[15:0]+1
可能很多人和我一样刚开始不能理解为什么要加1,我是这样理解的,当PSC复位时,也就是不分频时,就相当于CLK/1;但是这个寄存器的值是0,时钟是不可能去除0的。所以用(PSC[15:0]+1)作为分频因子。
可以得出定时器溢出时间的计算公式:Tout= ((arr+1)*(psc+1))/Tclk。
2·DIER、SR、CNT寄存器
这三个寄存器没有太多值得说的地方,这里就只做简单介绍。
DIER:UIE位:允许更新中断使能
SR:状态寄存器,用于记录各种标志位
CNT:记录计数器中的值
这些寄存器可总结为下图:
定时器计数的内部了解了,再来说一说时钟源的问题,时钟是每个外设工作必不可少的东西。定时器的时钟来源有很多,作为初学者我们只需要了解最简单的内部时钟来源。(CK_INT)
下图是CubeMX配置的时钟树:
图中绿色方框框选的地方是APB1的分频因子,这里的内部时钟CK_INT时钟是从 APB1 倍频的来的,除非 APB1 的时钟分频数设置为 1,否则通用定时器 TIMx 的时钟是 APB1 时钟的 2 倍,当 APB1 的时钟不分频的时候,通用定时器 TIMx 的时钟就等于APB1的时钟。
这里结合我们最开始的整体框图看,可能更便于理解。
通过APB1总线时钟得到内部时钟CK_INT之后,再由PSC分频得到计数器时钟。所以整个定时器的时钟树可以理解为下图:
最后采用抽象艺术给大家总结一下定时器计数的工作原理:
其中U代表用户配置的东西,这里以向下计数为例。可能存在一定问题,只是为了方便理解。下面着重介绍一下影子寄存器和前面说的ARR自动重装载缓冲。
影子寄存器:真正起作用的寄存器,用户无法操作。也就是说真正工作的其实是它,ARR只是将用户和它联系起来的媒介。
自动重装载缓冲:当ARPE置1时,用户写入ARR的不会立马更新,而是会在更新事件到来的时候,从ARR寄存器转移到影子寄存器,再由影子寄存器更新到CNT计数器中。如果ARPE=0,用户写入ARR之后,就会立即传送到影子寄存器。
这里如果大家有不理解的可以去看ST官方的手册,里面有非常详细的讲解。
三、CubeMX配置定时器
Mode栏的第一部分只需要关注时钟源,其他的暂时不需要关注。这里选择内部时钟。
第二部分的东西可以看出就是对前面说的寄存器的配置。可以配置分频系数(PSC)、计数模式、自动重装载的值(ARR),其中CKD不用管,是输入捕获才用到的东西,auto-reload preload是自动重装载,应配置为使能。TRGO这里不用管。
同时还可以在NVIC Setting一栏中选择中断开启与否。
HAL库自学笔记#1【通用TIM定时器】相关推荐
- HAL库自学笔记#2【PWM】
绪言 PWM是TIM常见的作用之一,如果无法理解TIM的基本工作原理的话,可能理解起来很困难.当我第一次接触到PWM的时候,其实也是云里雾里的.但如果理解了TIM的基本工作原理,学习PWM还是很简单的 ...
- STM32 HAL库学习笔记1-HAL库简介
STM32 HAL库学习笔记1-HAL库简介 HAL库 SPL 库 和 HAL 库两者相互独立,互不兼容.几种库的比较如下 目前几种库对不同芯片的支持情况如下 ST 中文官网上有一篇<关于ST库 ...
- STM32 HAL库学习笔记4-SPI
STM32 HAL库学习笔记4-SPI 前言 一.SPI协议简介 SPI物理层 SPI协议层 1.基本通讯过程 2. 通讯的起始和停止信号 3. 数据有效性 4. CPOL/CPHA 及通讯模式 二. ...
- STM32F407霸天虎HAL库学习笔记——串口发送
STM32F407霸天虎HAL库学习笔记--串口收发 一.软件准备 二.硬件准备 三.CubeMX配置 四.Keil printf重写 main函数 五.实验效果 一.软件准备 软件准备 二.硬件准备 ...
- STM32 HAL库学习笔记2 HAL库介绍
STM32 HAL库学习笔记2 HAL库介绍 CMSIS标准 一.再次认识HAL库 HAL库设计思想 HAL库实现方式 以GPIO模块为例 GPIO外设数据类型 GPIO外设接口函数 二.使用HAL库 ...
- STM32F407霸天虎HAL库学习笔记——使用ADC采集MQ135的数据并通过OLED显示
STM32F407霸天虎HAL库学习笔记--使用ADC采集MQ135的数据并通过OLED显示 一.软件准备 二.硬件准备 三.CubeMX配置 四.Keil MQ135.c MQ135.h main函 ...
- HAL库教程8:通用定时器的使用
定时器溢出时间的计算 关于定时器溢出的时间计算,有个公式: 定时器本质上是一个不断自加的计数器,只不过在自加的时候,能够自动比较计数值跟某个设定值而已.定时器+1用时多少? 1/84000 ...
- STM32cubemx——HAL库学习笔记 六、IWDG独立看门狗的配置
一.配置STM32cubeMX工程 在配置好时钟和调试设备以后进行一下操作即可以使用 看门狗的溢出时间公式为 Tout= 分频系数/ 时钟 * 重装载值 二.IWDG的技术讲解 可以到看,看门狗相对于 ...
- STM32基于固件库学习笔记(4)(通用定时器)TIM3定时1S中断
STM32F103ZE系列定时器资源 有 TIME1 和 TIME8 等高级定时器,也有 TIME2~TIME5 等通用定时器,还有 TIME6 和TIME7 等基本定时器. 通用定时器:是一个通过可 ...
- 爱上hal库学习笔记——cubemx图形界面,洋桃电子YYDS
新建工程 选择封装芯片型号 3.图形界面 (一)系统内核 DMA 直接存储器访问:可不通过CPU程序处理直接从某个功能自动读出数据 GPIO 通用输入输出端口:可把电平输入输出,读取按键和控制LED ...
最新文章
- ​AI 面试“泛滥”的时代,HR该如何甄别真假“AI”?
- 【Java面试宝典】深入理解JAVA虚拟机
- Mysql InnoDB Plugin安装 install
- android rxjava 多线程,你真的了解RxJava的线程切换吗?
- java类无法调用值,Kotlin无法调用到Java中定义的interface类的问题记录
- 官网的python下载安装后无需配置即可使用_图文解说少儿编程软件python下载安装,没有经验的新手也可以做到...
- Vsphere auto deploy 简介
- 什么情况下你的工作最为成功_在不倦怠的情况下开始成功学习
- nginx清缓存,网站刷新不过来时用
- Linq to xml:检索
- C语言中进制转换与函数
- 三星530换固态硬盘_韩国三星网红固态硬盘PM981系列惨遭黑苹果和INTEL10代主板嫌弃...
- 女子人身安全防卫指南
- matlab解方java_如何在MATLAB中获得该方程的所有解?
- ubuntu下dbus工具d-feet不显示路径和接口
- Aqara绿米董事长游延筠专访:以用户体验为出发点,打造更懂你的家
- 单片机应用系统设计技术——LCD滚动显示汉字
- Android Activity 降低屏幕亮度 Android开发
- 计算机访问记录怎么查,电脑上微信有访客记录吗?我们要怎么查看访客?
- 许久没更新,安装Python第三方库python-docx都困难系列(统信UOS)
热门文章
- android短消息中心号码,短信服务中心号码(SMSC)的设置方法
- 2022年证券从业资格证券投资基金考试多选题专练及答案
- esp8266烧录html方法,将ESP8266刷成可以使用网页配置的固件和步骤
- 文本域中只允许输入特定长度的字符
- 中高级iOS大厂面试宝典,拿到offer率80%,金三银四将是你的新起点
- 坦克大战Netty网络联机版项目笔记
- shel文件生成和执行
- educoder平台+大数据从入门到实战+14个模块习题
- 基于STM32F103+涂鸦三明治的宠物自动喂食器
- 电瓶升级问题:在本节最后一个electric_car.py版本中,给Battery类添加一个名为upgrade_battery()的方法。这个方法检查电瓶容量,如果它不是85,就将它设置为85。