前言

STM32F103ZET6中包含2个高级控制定时器、4个普通定时器和2个基本定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。
下表比较了高级控制定时器、普通定时器和基本定时器的功能:

基本定时器


从上图我们可以看到,基本定时器主要由下面三个寄存器组成。
计数器寄存器 (TIMx_CNT)
预分频器寄存器 (TIMx_PSC)
自动重载寄存器 (TIMx_ARR)

计数器寄存器 (TIMx_CNT)存储的是当前的计数值。
预分频器 (TIMx_PSC)为多少个SK_PSC脉冲计数一次,如下图预分频器的值为1(预分频寄存器默认为0,为不分频),则为两个脉冲计数一次。即为二分频。如果要1000分频,则预分频器的值为1000-1。

自动重装寄存器 (TIMx_ARR)存储的是计数器的溢出值,例如下图中计数器递增计数到36计数器溢出,触发一次事件。而实际上为37个脉冲触发一次溢出事件(从0开始计数)。

实践基本定时器

要确定定时的时间我们必须先确定CK_PSC的频率,TIM6配置中选择内部时钟作为时钟源,查看数据手册或者查看代码可以知道TIM6是挂接到APB1时钟线上。

STM32之定时器时间计算

1.根据系统时钟进行计算,假设是72Mhz

2.定时器溢出时间=((arr+1)*(psc+1))/Tclk ;
Tclk:定时器的输入时钟频率(单位MHZ)
Tout:定时器溢出时间(单位为us)
.TIM_Period = arr; eg;9999
.TIM_Prescaler = psc; eg:7199

3.定时器溢出时间= ((9999+1)×(7199+1))/72 = 1000000us = 1000ms=1s

定时器有如下三种计数模式

递增计数模式:计数器从 0 计数到自动重载值,然后重新从 0 开始计数并生成计数器上溢事件。
递减计数模式:计数器从自动重载值开始递减到 0,然后重新从自动重载值开始计数并生成计数器下溢事件。
中心对齐模式:计数器从 0 开始计数到自动重载值 – 1 ,生成计数器上溢事件;然后从自动重载值开始向下计数到 1 并生成计数器下溢事件。之后从0 开始重新计数。

在NVIC Settings框勾选开启定时器中断。优先级为默认。或者在NVIC配置中使能TIM3中断。

在KEIL中的配置

现在以1秒灯闪烁为例

1.开启定时器

在使用定时器时,需要在主函数前添加定时器开启函数

2.在回调函数内写代码
/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{//根据前面的配置可知此程序每一秒被调动一次if (htim->Instance == htim7.Instance)//判断是否为定时器7的中断{HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_5);//翻转PE5}
}/* USER CODE END 4 */

定时器初始化

void MX_TIM7_Init(void)
{TIM_MasterConfigTypeDef sMasterConfig = {0};//定时器初始化结构体htim7.Instance = TIM7;//选择定时器7htim7.Init.Prescaler = 7200-1;//预分频为7200分频,100微秒向上计数一次==1s/(72M/7200)htim7.Init.CounterMode = TIM_COUNTERMODE_UP;//向上计数htim7.Init.Period = 10000-1;//自动重装载值htim7.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;//不使能自动重装预加载寄存器if (HAL_TIM_Base_Init(&htim7) != HAL_OK)//初始化定时器{Error_Handler();}sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;主模式选择。选择具体模式发送到TRG0上sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;主定时器的从模式使能与失能位if (HAL_TIMEx_MasterConfigSynchronization(&htim7, &sMasterConfig) != HAL_OK){Error_Handler();}}void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{if(tim_baseHandle->Instance==TIM7){__HAL_RCC_TIM7_CLK_ENABLE();//开启定时器7的时钟HAL_NVIC_SetPriority(TIM7_IRQn, 0, 0);//响应优先级0,抢占优先级0.(0为最高优先级)HAL_NVIC_EnableIRQ(TIM7_IRQn);//开启NVIC控制器中TIM7的中断}
}

加载与预加载关系

预加载寄存器是自动重装载寄存器的“影子”,也就是预加载寄存器是自动重装载寄存器的缓冲器。但是自动重装载寄存器不是用户用程序可以直接进行操作的,用户需要借助于预加载寄存器(缓冲区)才能访问它。

其目的是为了保证自动重装载寄存器在合适的时候被修改,不允许其随便被修改,否则可能导致在切换的时候发生事与愿违的结果。

简单来说:没有预加载寄存器,这次修改的值,立马会被执行。而有了预加载寄存器,这次修改值会等到这次执行完后,才去执行。

总结
因为定时器的周期都比较短,我们可以通过预加载寄存器配合自动重装载寄存器,来更好的操作定时器,以达到我们期望的效果。

下面的这个解释挺好的

STM32F103ZE基本定时器笔记相关推荐

  1. STM32——TIM1和TIM8定时器笔记

    STM32--TIM1和TIM8定时器 写了一点点发现太多了,根本写不完,下次配合源码写吧,也比较好理解 定时器分类 1.高级定时器(TIM1和TIM8) 2.通用定时器(TIMx(只要不是高级或者基 ...

  2. STM32F103ZE的定时器

    整个stm32的时钟系统 定时器个数和功能 计数模式 通用定时器可以向上计数.向下计数.向上向下双向计数模式. ①向上计数模式:计数器从0计数到自动加载值(TIMx_ARR),然后重新从0开始计数并且 ...

  3. STM32基于固件库学习笔记(4)(通用定时器)TIM3定时1S中断

    STM32F103ZE系列定时器资源 有 TIME1 和 TIME8 等高级定时器,也有 TIME2~TIME5 等通用定时器,还有 TIME6 和TIME7 等基本定时器. 通用定时器:是一个通过可 ...

  4. Material Design风格神框架vuetify 学习笔记(八) 基础组件4 头像 扩展面板 消息条 评分...

    一. 头像 v-avatar v-avatar 组件通常用于显示循环用户个人资料图片. 此组件将允许您动态尺寸并添加响应图像.图标和文字的边框半径. <v-avatar color=" ...

  5. MSP430定时器介绍

    MSP430定时器笔记 1.定时器参数 1.1 基本定时器 typedef enum {TIMER_A0 ,TIMER_A1 ,TIMER_A2 ,TIMER_B0 ,TIMER_NUM , }TIM ...

  6. linux 备份信息查看器,Linux_MaxDOS V6 系统备份查看器 批处理代码,复制代码 代码如下:@echo off :_ma - phpStudy...

    MaxDOS V6 系统备份查看器 批处理代码 复制代码 代码如下: @echo off :_max mode con: cols=62 lines=23 set bt=MaxDOS V6 系统备份查 ...

  7. [笔记].如何使用Nios II的中断:PIO中断与定时器中断

    引子 定时器中断,我以前在艾米电子论坛发帖讨论过:PIO中断我在博客里也讨论过,最近发现以前的总结有一点小错误.于是结合我最近玩触摸屏的一点点心得,写篇博文. 软硬件环境 硬件:艾米电子EP2C8核心 ...

  8. 昼猫笔记 JavaScript -- 异步执行 | 定时器真的定时执行?

      本篇主要内容:异步.定时器引发的思考 预计阅读时间:8分钟 了解 我们都知道在js中定时器有两种  setInterval()  . setTimeout()   setInterval() :按 ...

  9. freeRtos学习笔记 (6)软件定时器

    freeRtos学习笔记 freeRtos软件定时器 软件定时器需要注意事项 软件定时器的精度基于时钟节拍,例如系统时钟节拍为10ms, 软件定时器定时时间必须是10ms的整数倍,因此软件定时器一般用 ...

最新文章

  1. 数字测图原理与方法的实习日志_【技术】消费级无人机倾斜摄影测量1:500测图方法及精度研究...
  2. 模板 - 数学 - 数论 - 莫比乌斯反演 - 2
  3. 多视图几何总结——等距变换、相似变换、仿射变换和射影变换
  4. android 微信登录点击没翻译,[android] 微信登录,没有唤起微信,直接返回ERR_AUTH_DENIED...
  5. oracle-sql优化-通过分组和缓存减少不必要的读
  6. error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version
  7. ReactiveCocoa简单介绍
  8. 『实践』Matlab实现Flyod求最短距离及存储最优路径
  9. 98.验证二叉搜索树
  10. groovy语言 累加_使用Groovy管理数据:查找和累加器
  11. Greensock JavaScript动画教程
  12. 软件开发过程与需求获取
  13. 电脑打开应用程序提示配置系统未能初始化--解决方案
  14. html5游戏封包工具,游戏解包Extractor
  15. TCP复位报文的发送
  16. k8s——kubeadm工具使用
  17. Dining (匹配,最大流)
  18. java金额三位一撇方法_Java数据格式化问题
  19. 国密算法 SM4 对称加密 分组密码 python实现完整代码
  20. 物不知数用计算机解法怎么解,物不知数

热门文章

  1. 放大镜-第12届蓝桥杯Scratch选拔赛真题精选
  2. 文献分享 | PNAS:先天性失明患者白内障手术后的白质可塑性
  3. CIO40: 从精益生产到智能制造!
  4. 朱民:Fintech“逼迫”金融机构剥离内生封闭产业链,机构监管走向功能监管
  5. 大数据电信客服-数据分析(三)
  6. wine —— windows软件移植到Linux系统
  7. ios - app store 上架被拒记录(uniapp)
  8. Tomcat 管理和监控工具 - PSI Probe
  9. 流水线技术与并行技术
  10. 小米前端面试、字节跳动前端面试、百分点前端面试-面试总结