STMCU小助手
发布时间:2022-7-5 22:02
|
一、定时器介绍 STM32G4系列共有10个定时器 0 H0 e3 l2 R) J. J! e+ M • 2个基本定时器(TIM6和TIM7)。. P/ I2 o/ l5 X! G+ s • 3个通用定时器(TIM2~TIM4):全功能通用定时器。 • 3个通用定时器(TIM15~TIM17):只有1个或者2个通道。 • 2个高级控制定时器(TIM1和TIM8)。
不同定时器的功能区别: 基本定时器有的功能通用定时器都有 通用定时器有的功能高级控制定时器都有 功能: * B! F$ \4 M- o) R! a • ADC和DAC开始转换触发. |; P. [# ]' h( p0 ]; h9 p7 C • 输入捕获:脉冲计数、上升沿或下降沿时间检测、PWM输入检测# z1 _( x7 u. f# A0 o • 输出比较:脉冲输出、步进电机控制 • 脉冲宽度调节PWM:电压输出控制、直流减速电机控制、直流无刷电机控制7 I: F6 F/ g( o4 B' n" L% h • 单脉冲模式输出 • 编码器接口、霍尔传感器接口 % \4 D% `8 f; U 定时器时钟:来源于APB- S6 y' W/ Y% g$ C9 H& a 3 Q5 K% {' B' I
1 Q3 x& ~1 F! A7 w V; W1 ~; r 当APB1/2分频系数为1时,给定时器的时钟为X1* N! j# H7 U$ M0 |6 Z9 [+ s$ Q# j/ Y 当APB1/2分频系数不为1时,给定时器时钟需X27 l1 V6 `- P' E 5 ~$ L D. S8 [2 K) Z2 O* S 总之给定时器的时钟频率是高频率,若不分频,分频系数为1,给定时器的时钟为X1;若APB1/2进行了分频,就给分频后的时钟x2,提供时钟频率$ `+ l& K' H2 ~. v( u! ` 时钟引脚:
+ Z4 ~! P0 `) Q8 j5 A$ A 注意一个定时器有多个输出通道,引脚要与通道相对应 * c2 b3 f, v, a0 C3 `& s& s 定时器计数方式8 H4 q9 B. P9 U. ?- D . I$ U- m3 { Z& r
二、基本定时器9 h t. B( i, [6 { 基本定时器:TIM6和TIM7 基本定时功能:当累加的时钟脉冲数超过预定值时,能触发中断或者触发DMA请求。是专门用于驱动数模转换器(DAC) 8 e" J% i( s' \( `# E9 ~ 基本定时器功能框图
: z( K) `, w# m/ r* m, `% {9 q3 T 触发控制器:核心功能是控制CK_INT时钟是否可以正常传输到PSC预分频器内: Q8 M* L5 a7 N N1 S% x. K5 Y 基本信号 $ S+ W% w" x6 _* {4 c' b* A
定时器时钟 tim_pck,即内部时钟 tim_ker_ck,经 APB1 /2分频器后分频提供,定时器时钟经过 PSC 预分频器之后,即 tim_psc_ck,用来驱动计数器计数。 PSC 是一个16 位的预分频器,可以对定时器时钟进行1~65536 之间的任何一个数进行分频。具体计算方式为: tim_psc_ck=tim_ker_ck/ (PSC+1) b9 b1 @# l# ]1 V" ~ . p9 c' {! x9 k: A! Y/ L) u% F 计数器 CNT 是一个 16 位的计数器,只能往上计数,最大计数值为 65535。当计数达到自动重装载寄存器的时候产生更新事件,并清零从头开始计数。) Q" M& f5 L% { r; k ? 自动重装载寄存器 ARR 是一个 16 位的寄存器,这里面装着计数器能计数的最大数值。当计数到这个值的时候,如果使能了中断的话,定时器就产生溢出中断。6 C0 r' Q& ?& \+ q4 L " s4 X# r" O+ W$ _ 该寄存器在物理上实际对应着 2 个寄存器。一个是程序员可以直接操作的,另外一个是程序员看不到的叫做影子寄存器,当更新事件发生的时候,重装载寄存器的数值才传递到影子寄存器里。影子寄存器是真正起作用的寄存器。当使用定时器过程中,如果不修改这个寄存器,就不涉及这个问题' G& L' ~, M) B; u% Q! o9 K* q3 [% b 定时时间的计算:) u, p& B7 p- T) h+ T 定时器的定时时间等于计数器的中断周期乘以中断的次数。计数器在 tim_ker_ck的驱动下,计一个数的时间则是 tim_ker_ck的倒数,等于: 1/(tim_ker_ck/(PSC+1)),产生一次中断的时间则等于: 1/(tim_ker_ck* ARR)1 o. n" _2 p( k/ K. b* x% P " j. A3 ~0 t" p& g2 }5 z& v/ e; O 如果在中断服务程序里面设置一个变量 time,用来 记 录 中 断的 次 数,那 么 就 可 以计 算 出我们 需 要 的 定时 时 间等于 : 1/tim_ker_ck*5 G$ U9 S8 p+ {3 S" r. f$ F" d (ARR+1)*time。 / R8 n3 {$ Y" @# c 若tim_pck = 80Mhz , TIM6定时1s:分频系数设置为8 000-1 ,tim_psc_ck=80 000 000 / 8 000 = 10000hz,周期=0.1ms,arr寄存器设置为10000-1, 因为从0开始计数的,既定时1s. ' Y7 u3 R& S2 \" n; J: r 计数过程: 每来一个CK_CNT脉冲,TIMx_CNT值就加1,当TIMx_CNT值与TIMx_ARR的设定值相等时就自动生成更新事件(也可以产生DMA请求、产生中断信号或者触发DAC同步电路),并且TIMx_CNT自动清零,然后重新开始计数,不断重复上述过程。! B! ^2 f* @: E7 E9 _% y6 E 因此我们只要设定TIMx_PSC和TIMx_ARR这两个寄存器的值就可以控制事件生成时间。对应的就是程序中定时器预分频设置(斜率)和定时器期。 + N! C' \/ T% f; b 小结: 寄存器组成:& H7 Z' s, S" F$ m/ F) g7 o 计数器寄存器(TIMx_CNT)、0 c; @' m1 i3 v* X 预分频寄存器(TIMx_PSC)、* E5 u3 n6 ]! @5 N0 K 自动重装载寄存器(TIMx_ARR)。0 x& @. i3 }# _( m% g 三个寄存器都是16位有效数字,可设置的值为0~65535。. q4 q# a- f. ~2 Q$ t: j + o- G# l9 w4 B+ j# _$ T 三、STM32CubeMX配置( i. F6 Z+ j! D# |8 K 设置基本定时器6定时1s; G- V6 h" B0 \3 H 0 D4 F8 C1 c" |% {; r: W* R (1)激活定时器6
* c- O/ c" L4 z0 ^1 K (2)配置定时器参数
* q- F2 F! ~# |; w) E# p (3)配置NVIC ( p7 `4 w+ O7 V% I$ ~
* d X4 {" R7 m9 C) W* M. k 四、编写中断回调函数 注意在定时器初始完成后,一定要开启定时器中断和串口中断一样的,
回调函数模板 ( O+ A0 n- s& D8 ?# I; E" B
* J) N& o8 u" u. `5 w' k. [ 7 @* C7 F! y. A4 D! c; R |
STM32G47x 双 Bank 模式下在线升级
DMA 原理从 0 到 1:为什么它能解放 CPU?一文讲透 DMA 的工作流程
NUCLEO-G474RE 扩展 LSM6DSO 传感器数据融合实操演示全解析
经验分享 | STM32G474 高精度定时器同步功能全解析 从内部互联到多芯片协同的实现方案
经验分享 | STM32G4双BANK启动应用演示
STM32G4 LPTIM+DMAMUX 实现并行输出应用示例
实战经验 | LAT1578 SAU对NSC分区的影响
经验分享 | STM32G474 HRTIM Triggered-half模式实现两相交错电源180°相位同步方案
STM32大神笔记,超详细单片机学习汇总资料
经验分享 | 为什么重启ADC的DMA传输要先停掉ADC?
微信公众号
手机版
请教一下,TIM6在stm3cuemx配置界面中这个dithering是什么意思