STM32学习(十二)

软件定时原理

使用纯软件(CPU死等)的方式实现定时(延时)功能。
在这里插入图片描述

  1. 不精准:函数调用压栈进栈需要耗费额外的时间;流水线使得程序执行时间不确定。
  2. CPU死等。

定时器定时原理

使用精准的时基,通过硬件的方式,实现定时功能。
定时器核心就是计数器。
在这里插入图片描述

STM32定时器分类

在这里插入图片描述
在这里插入图片描述
计数器位数16位,可以记0~65535个数。

STM32基本、通用、高级定时器功能整体的区别

在这里插入图片描述

基本定时器

基本定时器:TIM6/TIM7
16位递增计数器:计数值(0~65535)
16位预分频器:分频系数(1~65536)
可用于触发DAC(数模转换)
在更新事件(计数器溢出)时,可产生中断/DMA请求。

在这里插入图片描述

  • 基本定时器时钟源只能来自于内部时钟。
  • 影子寄存器是实际起作用的寄存器,不可直接访问。
  • 自动重载寄存器(ARR)起到缓冲作用,写入到ARR的值不能直接起作用,而是要转入到影子寄存器才能起作用。
  • 向PSC预分频器写入分频系数时,不直接起作用,而是等值转移到影子寄存器后才起作用。
  • 当计数器溢出时,更新事件默认产生,而中断和DMA并不是默认产生,而是通过配置来产生。
  • UG位可产生软件更新事件。
  • 更新事件产生后,会让预装载寄存器的值加载到对应的影子寄存器。
  • ARPE位决定ARR是否具有缓冲。如果有缓冲,将值装载到自动重载寄存器ARR中,并不立即起作用,而是等待更新事件发生后,值装载到对应的影子寄存器,才会起作用。如果无缓冲作用,则值会直接转移到影子寄存器,立刻生效。
  • 定时器1~8都是72MHz。

STM32定时器计数模式及溢出条件

在这里插入图片描述

在这里插入图片描述

递增计数模式实例说明

PSC=1,实际分频系数=PSC+1,所以这是二分频。
ARR=36
在这里插入图片描述

递减计数模式实例说明

PSC=1,实际分频系数=PSC+1,所以这是二分频。
ARR=36
在这里插入图片描述

中心对齐模式

PSC=0,也就是1分频。
ARR=6。
CNT=ARR-1或1时产生溢出。
在这里插入图片描述

定时器中断实验相关寄存器

TIM6 和TM7 控I制寄存器 1(TIMx_CR1)
用于设置ARR寄存器是否具有缓冲,使能/关闭计数器。
在这里插入图片描述

  • 默认情况下,ARPE(Auto-reload preload enable)为0,TIMx_ARR寄存器没有缓冲,操作ARR寄存器,其值会直接转移到ARR影子寄存器直接生效。

ARR寄存器具有缓冲时,会减少操作这个寄存器带来的时间误差。

TIM6 和TIM7 DMA/中断使能寄存器(TIMx_DIER)
在这里插入图片描述
用于使能更新中断

TIM6 和TIM7 状态寄存器(TIMx_SR)
在这里插入图片描述
用于判断是否发生了更新中断,由硬件置1,软件清零。

TIM6 和TIM7 计数器(TIMx_CNT)
在这里插入图片描述
计数器实时数值,可用于设置计时器初始值,范围:0~65535

TIM6 和TIM7 预分频器(TIMx_PSC)
在这里插入图片描述
用于设置预分频系数,范围:0~65535,实际预分频系数等于PSC+1

TIM6 和TIM7 自动重装载寄存器(TIMx_ARR)
在这里插入图片描述
用于设置自动重装载值,范围:0~65535

定时器溢出时间计算方法

在这里插入图片描述

  • Tout是定时器溢出时间
  • Ft是定时器的时钟源频率(没有分频)
  • ARR是自动重装载寄存器的值
  • PSC是预分频器寄存器的值

定时器中断实验配置步骤

  1. 配置定时器基础工作参数:HAL_TIM_Base_Init()
  2. 定时器基础MSP初始化:HAL_TIM_Base_MspInit() 配置NVIC,CLOCK等
  3. 使能更新中断且启动计数器:HAL_TIM_Base_Start_IT()
  4. 设置优先级,使能中断:HAL_NVIC_SetPriority()、HAL_NVIC_EnableIRQ()
  5. 编写中断服务函数:TIMx_IRQHandler() ->HAL_TIM_IRQHandler()
  6. 编写定时器更新中断回调函数:HAL_TIM_PeriodSlapsedCallback()

在这里插入图片描述

关键结构体介绍

typedef struct
{
	TIM_TypeDef *Instance; //外设寄存器基地址
	TIM_BASE_InitTypeDef Init;//定时器初始化结构体
}TIM_HandleTypeDef;//定时器句柄

typedef struct
{
	uint32_t Prescaler;//预分频系数
	uint32_t CounterMode;//计数模式
	uint32_t Period; //自动重装载值ARR
	uint32_t ClockDivision; //时钟分频因子
	uint32_t RepetitionCounter; //重复计数器寄存器的值
	uint32_t AutoReloadPreload; //自动重装载预装载使能
}TIM_BASE_InitTypeDef;//定时器基础初始化结构体

使用基本定时器6,实现500ms定时器更新中断,在中断里翻转LED0

PSC=7199,ARR=4999为例

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

饼干饼干圆又圆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值