- Date:2023-07-18
- Time:19:32
- Subject: none
- Tags: #stm32 #定时器
[[2023-07]]
软件定时原理
定时器定时原理
定时器核心就是计数器
使用精准的时基,通过硬件的方式,实现定时功能
STM32 定时器分类
定时器特性表
F1
8 个定时器,可以计数 0-65535 数,
STM32 基本,通用,高级功能整体区
- Date:2023-07-18
- Time:19:47
- Subject: none
- Tags: #stm32 #定时器
[[2023-07]]
基本定时器简介(了解)
- 基本定时器 TIM6 TIM7
- 16 位递增计数器(计数值:0~65535)
- 16 位预分频器(分频系数:1~65536)
- 因此设置为 0 的时候为 1 分频,1 为 2 分频
- 可用于触发 DAC
- 在更新事件(计数器溢出)时,会产生中断/DMA 请求
基本定时器框图(熟悉)
经过 psc 得到计数器的工作频率,来一个时钟就加一
溢出条件,计数到影子寄存器里面的数字,psc 和自动重转载寄存器都有影子,不能直接访问影子,但是起作用的就是影子,得产生一个事件的时候会把重装载值放到影子里面
u 事件:update,更新事件,可以产生中断和 mda(需要配置,默认不产生),默认产生更新事件,将预装载的寄存器值(psc,自动重装载寄存器)加载到影子,然后起作用
定时器计数模式及溢出条件(熟悉)
实例
递增模式
psc=1,arr=36
递减模式
中心对齐模式
psc=0,arr=6
CNT=ARR-1=5、CNT=1
类似斯密特触发器的感觉
递增时溢出,上溢
递减时溢出,下溢
定时器中断实验相关寄存器(了解)
TIM6 和 TIM7 控制寄存器 1(TIMx_CR1)
没有缓存,直接就改(减少操作寄存器的误差,需要一些时间)
有缓存,当触发事件的时候才会更改
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 是预分频器寄存器的值
定时器中断实验配置步骤(掌握)
#配置
- 配置定时器基础工作参数
- HAL_TIM_Base_Init()
- 定时器基础 MSP 初始化
- HAL_TIM_Base_MspInit() 配置 NVIC、CLOCK 等
- 使能更新中断并启动计数器
- HAL_TIM_Base_Start_IT()放在 init 里面
- 设置优先级,使能中断(msp_init 里面写)
- HAL_NVIC_SetPriority()、 HAL_NVIC_EnableIRQ()
- 编写中断服务函数
- TIMx_IRQHandler() (.s 文件里面找到)等->HAL_TIM_IRQHandler()
- 编写定时器更新中断回调函数 1. HAL_TIM_PeriodElapsedCallback()(空函数,自己去重定义)
关键结构体介绍
1 | typedef struct |
1 | typedef struct |
编程实战:定时器中断实验(掌握)
- Date:2023-07-19
- Time:10:06
- Subject: none
- Tags: #stm32#定时器
[[2023-07]]
通用定时器简介
- TIM2/TIM3 /TIM4 /TIM5
- 特性
- 16 位递增、递减、中 心对齐计数器(计数值:0~65535)
- 16 位预分频器(分频系数:1~65536)
- 可用于触发 DAC、ADC
- 在更新事件、触发事件、输入捕获、输出比较时,会产生中断/DMA 请求
- 4 个独立通道,可用于:输入捕获、输出比较、输出 PWM、单脉冲模式
- 使用外部信号控制定时器且可实现多个定时器互连的同步电路(级联)
- 支持编码器和霍尔传感器电路等
通用定时器框图
触发时可到 itr0 的地方作为其他时钟的时钟源(级联)
输入捕获可以用于测量脉冲时间
写入比较值,计数器的值和影子的比较后,产生比较事件 occ1l(也会有比较中断)
左右两边的 ch 通道是分时复用
计数器时钟源
#时钟
通道一是双边沿检测,上升和下降沿都检测,检测两个
TI1FP1/2 经过边沿检测器,只能选择上升或者下降的,记一个数
ITR 用于级联,其他触发的事件进而作为时钟源
通用定时器 PWM 输出
#pwm
通用定时器输出比较部分框图介绍
捕获/比较通道 1 的主电路—输出部分
捕获/比较通道的输出部分(通道 1)
不同的通道,可以输出不同占空比的 pwm 波,可以配置某个 io 口为通道 1/2/3/4 的输出输入口,从而达到效果
通用定时器输出 PWM 原理
假设:递增计数模式
ARR:自动重装载寄存器的值
CCRx:捕获/比较寄存器 x 的值
当 CNT < CCRx,IO 输出 0
当 CNT >= CCRx,IO 输出 1
PWM 波周期或频率由 ARR 决定,PWM 波占空比由 CCRx 决定
PWM 模式
PWM 模式 1
递增:CNT < CCRx,输出有效电平
CNT >= CCRx,输出无效电平
递减:CNT > CCRx,输出无效电平
CNT <= CCRx,输出有效电平
PWM 模式 2
递增:CNT < CCRx,输出无效电平
CNT >= CCRx,输出有效电平
递减:CNT > CCRx,输出有效电平
CNT <= CCRx,输出无效电平
注:有/无效状态由 TIMx_CCER 决定
CCxP=0:OCx 高电平有效(默认)
CCxP=1:Ocx 低电平有效
坐标图
通用定时器 PWM 输出实验配置步骤
#配置
- 配置定时器基础工作参数,初始化函数内(自己定义一个函数,然后把下面的函数放里面)
- HAL_TIM_PWM_Init()
- 定时器 PWM 输出 MSP 初始化
- HAL_TIM_PWM_MspInit() 配置 NVIC、CLOCK、GPIO 等
- 配置 PWM 模式/比较值等(这个主要来看)在初始化函数里面写
- HAL_TIM_PWM_ConfigChannel()
- 使能输出并启动计数器 在初始化函数里面写
- HAL_TIM_PWM_Start()
- 修改比较值控制占空比(可选)
- __ HAL_TIM_SET_COMPARE()(宏)
- 使能通道预装载(可选) 1. __ HAL_TIM_ENABLE_OCxPRELOAD()(宏)
设置句柄,定义句柄钟的初始化结构体和基地址,看基本的定时器
1 | typedef struct |
通用定时器输入捕获实验
通用定时器输入捕获部分框图介绍(熟悉)
捕获/比较通道的输入部分(通道 1)
捕获/比较通道 1 的主电路—输入部分
cc1g 软件产生捕获
cc1e 硬件检测捕获
通用定时器输入捕获脉宽测量原理
以捕获测量高电平脉宽为例,纵坐标为计数器的值,横坐标事件
假设:递增计数模式
ARR:自动重装载寄存器的值
CCRx1:t1 时间点 CCRx 的值(设置为上升沿,吧检测到的时间的计数存到 ccrx,接着清零,然后设置下降沿检测)
CCRx2:t2 时间点 CCRx 的值
高电平期间,计时器计数的个数:N * (ARR+1) + CCRx2
先算出计数频率是 Ft/(psc+1)再取倒数为记一个数的时间,然后乘以上面的总个数即可
通用定时器输入捕获实验配置步骤
#配置
- 配置定时器基础工作参数(在 gtim_timx_cap_chy_init 里,需要提前配置定时器句柄,外部设置
- HAL_TIM_IC_Init()
- 定时器输入捕获 MSP 初始化(重定义 HAL_TIM_IC_MspInit
- HAL_TIM_IC_MspInit() 配置 NVIC、CLOCK、GPIO 等
- 配置输入通道映射、捕获边沿等(在 gtim_timx_cap_chy_init 里,在内设置 ic 通道句柄
- HAL_TIM_IC_ConfigChannel()
- 设置优先级,使能中断(在 msp 里面
- HAL_NVIC_SetPriority()、 HAL_NVIC_EnableIRQ()
- 使能定时器更新中断(宏)(在自己定义的 gtim_timx_cap_chy_init 里
- __ HAL_TIM_ENABLE_IT()
- 使能捕获、捕获中断及计数器(在 gtim_timx_cap_chy_init
- HAL_TIM_IC_Start_IT()
- 编写中断服务函数(r 如 TIM5_IRQHandler(.s 里面找),再把它 define 为 GTIM_TIMX_CAP_IRQHandler
- TIMx_IRQHandler()等 -> HAL_TIM_IRQHandler()
- 编写更新中断和捕获回调函数(重新定义下面两个
- HAL_TIM_PeriodElapsedCallback() HAL_TIM_IC_CaptureCallback()
相关 HAL 库函数介绍
关键结构体(HAL_TIM_IC_ConfigChannel)
1 | typedef struct |