STMCU小助手
发布时间:2021-11-8 16:49
|
定时器分类 G0系列有TIM1、TIM2、TIM3、TIM6、TIM7、TIM14、TIM15、TIM16、TIM17,它们区别如下图 1 e N) P! e9 o, _ 其中TIM1为高级定时器;TIM2/3/14/15/16/17为通用定时器,TIM2支持32bit;TIM6/7为基本定时器 ; k$ l5 s( T; s& J6 L$ M0 X
# W) a* L2 u: Q8 v* A
+ `+ F( \3 o* J* L, M 计时器时序图, p2 k8 a( x+ S4 X) d* o/ u TIM1,TIM2,TIM3支持(中央对齐)向上向下模式,方向在向上向下时发生变化,减少对电机的噪声干扰。 * z& {3 S9 d8 V+ I3 C/ o- o
+ ^/ e9 O! b1 d* a% [
基本PWM模式,边缘或者中央对齐模式2 g7 c2 V7 Z0 |& i9 z- I( c7 x 5 G4 K; G$ g9 F& x
, P, Q+ X4 @9 |( G 非对称PWM模式4 s$ a: n6 Q- f' Z4 z0 Y5 O Q# [8 \; ?2 O% N7 l5 P7 T! s9 s
3 d8 K- _/ S% \( o: k/ Z 三相组合PWM模式' a$ A: j- m+ H" P) Y2 ` ~
! N2 x+ u$ h: w0 l1 Y* m 可变频率pwm,由外部信号驱动。 逐周期控制的占空比。' x1 Q7 D. }) P( ~. @/ A+ D * l, ^! f* l& z$ z( Q5 J+ Z
a1 e/ J7 x; o1 K TIM2定时器实验 本次实验,我们选择TIM2定时器,通过设置预分频系数(PSC减去1)和计数器周期(ARR减去1)的数值,来控制整个定时器周期。让定时器周期进入中断,在中断函数中翻转PC6引脚电平,达到闪烁的目的。1 }% Y! z( z- L# h: i- d* M% ? 如何计算定时器周期? 1、在时钟树中确定好TPCLK频率,这里已最大化频率运行;
( H3 ?) C9 `8 N( [: q1 y( a, b 2、确定CK_CNT的值 ,CK_CNT=TPCLK / PSC,为了便于计算我们一般都是将CK_CNT的值化为整数,5 I* P v( ?6 H5 d' I9 c/ i 如 64MHz / 6400=10000Hz; p. ?9 e |9 S8 ^6 }. ~6 n7 i V1 ] . v( a3 e* L, M9 ?# h7 Z 3、确定ARR的值,ARR=CK_CNT* t(s),2 Y$ k0 v. p& S+ P 如要1秒周期,10000Hz*1s=10000。3 y/ @4 }( P# Y9 F V( K 实验代码" \ ~5 d1 r, e 1、新建芯片工程,"SYS"打开"Serial Wire"调试接口,"RCC"中HSE使用"Crystal/Ceramic Resonator";2 D! T& i, S4 \ ( s: `. s0 f# T& B! c! H4 a 2、在"Pinout view"中设置PC6为GPIO_Output,默认电平为low,开漏模式,不上下拉,速率为低- H8 j! n2 F X7 U
2 W' i8 f( k, `& u4 Q8 V
8 k! w r d; X. n+ |7 w& q9 p. j 3、设置时钟树,使用HSE、PLLCLK,HCLK为64,APB分频系数为1,APB时钟为64
0 F1 [* w3 q0 ?+ j# f 4、 设置TIM2,在TIM2选项卡中,"Clock Source"选择"Internal Clock"- X) y1 r- J) h$ j( D: f8 e 0 ?8 W7 y# Y. P" q3 R+ B 5、下面"Counter Settings",Prescaler填入"6400-1",Counter Mode(计数模式)"Up",Counter Period填入"10000-1",其他参数默认值1 O% `1 y R1 B2 x' s3 n + H# \$ Z7 P" ?* O 如想要1秒周期,ARR=10000,PSC=TPCLK / CK_CNT : B# I, q+ r$ F: }
6 X8 u$ n' a- k, h& x) P! s( p2 ~; _) J* ] 6、在"NVIC"中,配置页面中找到"TIM2 global interrupt"使能,优先级选择"2" , q7 H' A0 G1 X& k! M
7、在Project Manager中填入项目名,IDE版本“MDK-ARM V5”,在Code Generator打上勾,生成代码。9 ~' a( B4 [6 _6 G5 v$ Y; U. ~
' {% T; j& f1 F. a+ ]$ c7 N 8、在main.c文件,int main函数里面,在代码MX_TIM2_Init()定时器初始化后面加上定时器中断初始化函数
9、定时器中断函数原型为void TIM2_IRQHandler(void),里面调用了HAL_TIM_IRQHandler(&htim2),该函数有很多个中断回调函数,我们这个定时器更新中断,找到我们需要的函数HAL_TIM_PeriodElapsedCallback(htim),需要手动写这个回调函数,把一下函数复制到main.c文件中 V! l+ R- h* I# B- }) z$ h
10、在int main(){}后面编写代码,编译,debug中勾上"Reset and Run"烧录固件,就能在开发板上看到输出闪烁。) x/ U ]% D6 v3 x & g8 ^/ Y6 J7 p/ B6 z% H5 b2 T
4 E! |! W$ H1 n, C7 F& ^' R, e 0 I0 [' I1 c& r/ B0 I3 U* P ( f4 f% j( E2 M/ [* Q( q |
微信公众号
手机版