STM32学习笔记07—基础定时器实验 7 ^! {6 |2 U) X2 U, u8 |6 N: }' P# @ C$ m0 r 7.1 STM32定时器概述 STM32内部共有8个定时器,其中Timer1和Timer8属于高级定时器,Timer2~Timer5属于通用定时器,8个定时器的资源独立,互不影响。 STM32的通用定时器是一个通过可编程预分频器(PSC)驱动的16位自动装载计数器(CNT)构成。STM32的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)等。使用定时器预分频器和RCC时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。STM32的每个通用定时器都是完全独立的,没有互相共享的任何资源。6 d/ C J' N. s1 K 通用定时器的内部结构如下图所示。 要使用通用定时器的基本功能,一共需要配置4个寄存器,剩余的寄存器都是在输入捕获和输出比较中使用到的。 7.2.1 控制寄存器1:TIMx_CR1 00:采样频率与定时器输入频率相等$ k8 b: U* n" c) l 01:采样频率是定时器输入频率的2倍 10:采样频率是定时器输入频率的4倍 11:保留! \$ K, V" e8 y' A# n# R2 |; N Bit 7:自动重装载使能1 v3 P8 `% @/ \$ P+ M 0:TIMx_ARR寄存器中没有缓冲 1:TIMx_ARR寄存器的数据装入缓存器 Bit 6~Bit 5:选择中央对齐模式- Y6 k8 V* h' r. K" |! g! s& b 00:边沿对齐模式,计数器根据方向位DIR计数 01:中央对齐模式1,计数器交替向上向下计数,当TIMx_CCMRx中的CCxS=00时,计数器向下计数时被设置8 I1 w% V, y4 M0 x/ Y* h 10:中央对齐模式2,计数器交替向上向下计数,当TIMx_CCMRx中的CCxS=00时,计数器向上计数时被设置 11:中央对齐模式3,计数器交替向上向下计数,当TIMx_CCMRx中的CCxS=00时,计数器向下和向上计数时 被均设置" u' Y1 N; D- y7 n Bit 4:计数方向6 K6 t* a4 J) A) D 0:向上计数,计数器从0计数到TIMx_ARR寄存器的数据时重新从0开始并产生一个计数器溢出事件& Y& `* C t, Q$ J) [ 1:向下计数,计数器从TIMx_ARR寄存器的数据计数到0时重新从TIMx_ARR寄存器的数据开始并产生一个计数器溢出事件) K0 Q/ N, I) C( r Bit 3:单脉冲模式$ n) N: W+ M* O- T 0:发生更新事件时计数器不停止2 w* h; k5 q$ T: R( T/ B 1:在发生下一次更新事件时,计数器停止0 k/ W- i% U# _) n Bit 2:更新请求源 T$ J" v8 S( M- p% ? 0:如果使能了更新中断或DMA请求,计数器溢出/设置UG位/从模式控制器产生更新都产生更新中断或DMA请求 1:如果使能了更新中断或DMA请求,只有计数器溢出才产生更新中断或DMA请求 Bit 1:禁止更新 0:允许UEV。更新事件由计数器溢出/设置UG位/从模式控制器产生更新事件产生 1:不产生更新事件2 P7 e2 a/ S e Bit 0:使能计数器" C4 }6 ^5 z% N3 h5 v- Y 0:禁止计数器3 k2 H# _" f2 ]+ q3 _0 c9 D, E 1:使能计数器7 X" H* e L/ r& L 7.2.2 DMA/中断使能寄存器:TIMx_DIER 0:禁止触发DMA请求 1:允许触发DMA请求 Bit 12:允许捕获/比较4的DMA请求& U' `6 A' z9 }, ~- ?' l# h 0:禁止捕获/比较4的DMA请求 1:允许捕获/比较4的DMA请求8 n% J [. ]4 ? Bit 11:允许捕获/比较3的DMA请求 0:禁止捕获/比较3的DMA请求" m; u. K5 k& R* Q0 h 1:允许捕获/比较3的DMA请求" I" a( {3 C- H3 k Bit 10:允许捕获/比较2的DMA请求 0:禁止捕获/比较2的DMA请求; L+ a; E1 ^4 s3 n+ R- v 1:允许捕获/比较2的DMA请求 |" j1 S' `: L# B/ w v Bit 9:允许捕获/比较1的DMA请求& V; e( y& u! y2 Y9 Z 0:禁止捕获/比较1的DMA请求 1:允许捕获/比较1的DMA请求 Bit 8:允许更新的DMA请求, r' n. N k/ b 0:禁止更新的DMA请求9 v+ |: t a. w, |) r% L r' ~2 e 1:允许更新的DMA请求3 K8 ^2 y6 a7 A5 H( d7 r Bit 6:触发中断使能 0:禁止触发中断 1:允许触发中断- `4 y& k' E# g0 U3 h5 q- ?& b/ B Bit 4:允许捕获/比较4的中断/ s# o( O. {, x8 V5 O' A 0:禁止捕获/比较4的中断! |0 X) }1 w/ I 1:允许捕获/比较4的中断$ Y# o% K2 d8 A) r* k Bit 3:允许捕获/比较3的中断1 Y& N0 T% E+ u4 B 0:禁止捕获/比较3的中断 1:允许捕获/比较3的中断 Bit 2:允许捕获/比较2的中断$ i) O, ~0 i: \, S6 v& {! ` 0:禁止捕获/比较2的中断. Q! m! J9 g( [& }2 I R 1:允许捕获/比较2的中断 Bit 1:允许捕获/比较1的中断1 A$ q6 }% g0 O% r' d, Q 0:禁止捕获/比较1的中断' B- J0 }: n5 a; t 1:允许捕获/比较1的中断 e: B% A v1 l8 \ Bit 0:允许更新中断 0:禁止更新中断5 L/ ^* A' M' {6 h+ B8 { 1:允许更新中断 7.2.3 预分频寄存器:TIMx_PSC/ O' X% x+ r. w ' o! i& ?" A- X/ K ' n, W4 H4 r1 D0 C6 I 7.2.4 自动重装载寄存器:TIMx_ARR4 L O3 Y! N9 z4 Q6 _2 A 7.2.5 状态寄存器:TIMx_SR2 d( B0 v" m" n4 X7 h8 o D/ o$ a 0:无重复捕获产生& B' o8 K5 h' b2 i* K 1:当计数器的值捕获到TIMx_CCR4寄存器时,CC4IF的状态已经为1 Bit 11:捕获/比较3重复捕获标记% t4 t6 K0 G4 m: C: b; n, E 0:无重复捕获产生6 G J" H. C" |6 @ 1:当计数器的值捕获到TIMx_CCR3寄存器时,CC3IF的状态已经为1 Bit 10:捕获/比较2重复捕获标记 0:无重复捕获产生' @6 h/ ?% C0 k4 U! n' E9 d 1:当计数器的值捕获到TIMx_CCR2寄存器时,CC2IF的状态已经为1% @( r: Y! \5 S) ^4 G8 Z) V M' d Bit 9:捕获/比较1重复捕获标记 0:无重复捕获产生 1:当计数器的值捕获到TIMx_CCR1寄存器时,CC1IF的状态已经为1$ U5 J# Y8 j+ X& x0 M1 f Bit 6:触发器中断标记 0:无触发事件产生, f8 S; v8 L/ u/ l, u5 q 1:触发器中断等待响应 Bit 4:捕获/比较4中断标记. _( v% ~, P! K! B8 B& g 通道CC4配置为输出模式: 0:无匹配发生9 q* E/ y. ?9 \& F+ G9 r3 V% M4 A W 1:TIMx_CNT的值与TIMx_CCR4的值匹配5 G4 q* e0 {8 c9 u 通道CC4配置为输入模式:& Y; X) _+ G# U 0:没有输入捕获产生5 m. p9 n E6 e# Q3 g9 ?) K 1:计数器值已经被捕获到TIMx_CCR4中(在IC4上检测到与所选极性相同的边沿) Bit 3:捕获/比较3中断标记 通道CC3配置为输出模式: 0:无匹配发生1 L/ p# \! V/ N' V) z# h 1:TIMx_CNT的值与TIMx_CCR3的值匹配 通道CC3配置为输入模式:+ W4 h+ M; c9 E- Y; k 0:没有输入捕获产生 1:计数器值已经被捕获到TIMx_CCR3中(在IC3上检测到与所选极性相同的边沿) Bit 2:捕获/比较2中断标记 通道CC2配置为输出模式:7 x7 n$ a9 p* W' U* T6 X6 ^ 0:无匹配发生- y: d) A+ E0 ^# H( e/ t( Q 1:TIMx_CNT的值与TIMx_CCR2的值匹配& f$ T2 ]9 _9 l f 通道CC2配置为输入模式:) V" Y/ Z( E5 x0 O 0:没有输入捕获产生& U3 ?4 @1 ^9 I, g6 ` 1:计数器值已经被捕获到TIMx_CCR2中(在IC2上检测到与所选极性相同的边沿)- m; T, s0 a& y9 x) H Bit 1:捕获/比较1中断标记( J, k8 \ G/ Y7 n/ T 通道CC1配置为输出模式: 0:无匹配发生 1:TIMx_CNT的值与TIMx_CCR1的值匹配 通道CC1配置为输入模式:7 L1 z) U. i8 X, ]+ ]4 w6 i 0:没有输入捕获产生 1:计数器值已经被捕获到TIMx_CCR1中(在IC1上检测到与所选极性相同的边沿)' ^' f# }$ w9 x) o* S Bit 0:更新中断标记# i* ]! W& r7 C, X$ ]2 R 0:无更新事件产生: E0 a: N. L/ `# c+ m8 T 1:更新中断等待响应,当产生更新事件时该位由硬件置1,由软件清0 7.2.6 计数器:TIMx_CNT 7.3 定时器例程4 S! P& L' V8 Q3 g 利用定时器1实现LED以1Hz闪烁,LED接在PA1上。, k. g) F) N. m0 U2 M. l3 F$ z' Y (1)创建TIM1驱动文件,tim.c和tim.h,并将文件添加进工程。1 h+ w- Z' Z& F1 }* K( t' d 添加定时器地址( a* h* ]# ]9 `+ l8 q. B (4)tim.c写入如下所示代码! r) l- z/ R0 [9 c. g
(5)主函数编写如下所示代码' a$ t, l& Z0 O3 F- q 7.4 软件仿真截图 9 k0 G- W: }6 y4 |7 ~% `4 q( Y |