stm32-定时器
- 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()
- 编写定时器更新中断回调函数
- HAL_TIM_PeriodElapsedCallback()(空函数,自己去重定义)
- 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()(宏)
- 使能通道预装载(可选)
- __ HAL_TIM_ENABLE_OCxPRELOAD()(宏)
设置句柄,定义句柄钟的初始化结构体和基地址,看基本的定时器
- __ 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 |