STM32F103ZE基本定时器笔记
前言
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基本定时器笔记相关推荐
- STM32——TIM1和TIM8定时器笔记
STM32--TIM1和TIM8定时器 写了一点点发现太多了,根本写不完,下次配合源码写吧,也比较好理解 定时器分类 1.高级定时器(TIM1和TIM8) 2.通用定时器(TIMx(只要不是高级或者基 ...
- STM32F103ZE的定时器
整个stm32的时钟系统 定时器个数和功能 计数模式 通用定时器可以向上计数.向下计数.向上向下双向计数模式. ①向上计数模式:计数器从0计数到自动加载值(TIMx_ARR),然后重新从0开始计数并且 ...
- STM32基于固件库学习笔记(4)(通用定时器)TIM3定时1S中断
STM32F103ZE系列定时器资源 有 TIME1 和 TIME8 等高级定时器,也有 TIME2~TIME5 等通用定时器,还有 TIME6 和TIME7 等基本定时器. 通用定时器:是一个通过可 ...
- Material Design风格神框架vuetify 学习笔记(八) 基础组件4 头像 扩展面板 消息条 评分...
一. 头像 v-avatar v-avatar 组件通常用于显示循环用户个人资料图片. 此组件将允许您动态尺寸并添加响应图像.图标和文字的边框半径. <v-avatar color=" ...
- MSP430定时器介绍
MSP430定时器笔记 1.定时器参数 1.1 基本定时器 typedef enum {TIMER_A0 ,TIMER_A1 ,TIMER_A2 ,TIMER_B0 ,TIMER_NUM , }TIM ...
- linux 备份信息查看器,Linux_MaxDOS V6 系统备份查看器 批处理代码,复制代码 代码如下:@echo off :_ma - phpStudy...
MaxDOS V6 系统备份查看器 批处理代码 复制代码 代码如下: @echo off :_max mode con: cols=62 lines=23 set bt=MaxDOS V6 系统备份查 ...
- [笔记].如何使用Nios II的中断:PIO中断与定时器中断
引子 定时器中断,我以前在艾米电子论坛发帖讨论过:PIO中断我在博客里也讨论过,最近发现以前的总结有一点小错误.于是结合我最近玩触摸屏的一点点心得,写篇博文. 软硬件环境 硬件:艾米电子EP2C8核心 ...
- 昼猫笔记 JavaScript -- 异步执行 | 定时器真的定时执行?
本篇主要内容:异步.定时器引发的思考 预计阅读时间:8分钟 了解 我们都知道在js中定时器有两种 setInterval() . setTimeout() setInterval() :按 ...
- freeRtos学习笔记 (6)软件定时器
freeRtos学习笔记 freeRtos软件定时器 软件定时器需要注意事项 软件定时器的精度基于时钟节拍,例如系统时钟节拍为10ms, 软件定时器定时时间必须是10ms的整数倍,因此软件定时器一般用 ...
最新文章
- 数字测图原理与方法的实习日志_【技术】消费级无人机倾斜摄影测量1:500测图方法及精度研究...
- 模板 - 数学 - 数论 - 莫比乌斯反演 - 2
- 多视图几何总结——等距变换、相似变换、仿射变换和射影变换
- android 微信登录点击没翻译,[android] 微信登录,没有唤起微信,直接返回ERR_AUTH_DENIED...
- oracle-sql优化-通过分组和缓存减少不必要的读
- error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version
- ReactiveCocoa简单介绍
- 『实践』Matlab实现Flyod求最短距离及存储最优路径
- 98.验证二叉搜索树
- groovy语言 累加_使用Groovy管理数据:查找和累加器
- Greensock JavaScript动画教程
- 软件开发过程与需求获取
- 电脑打开应用程序提示配置系统未能初始化--解决方案
- html5游戏封包工具,游戏解包Extractor
- TCP复位报文的发送
- k8s——kubeadm工具使用
- Dining (匹配,最大流)
- java金额三位一撇方法_Java数据格式化问题
- 国密算法 SM4 对称加密 分组密码 python实现完整代码
- 物不知数用计算机解法怎么解,物不知数