STMCU小助手
发布时间:2021-11-8 16:49
|
定时器分类 G0系列有TIM1、TIM2、TIM3、TIM6、TIM7、TIM14、TIM15、TIM16、TIM17,它们区别如下图 ( S3 ^0 z. L, f 其中TIM1为高级定时器;TIM2/3/14/15/16/17为通用定时器,TIM2支持32bit;TIM6/7为基本定时器
! a7 t6 K2 C1 k( b
' W5 F) u. y; L- q# K 计时器时序图$ G& l% t5 d7 v8 T" [+ | TIM1,TIM2,TIM3支持(中央对齐)向上向下模式,方向在向上向下时发生变化,减少对电机的噪声干扰。 ; r( ?, i/ G K9 Y; D. j% |
基本PWM模式,边缘或者中央对齐模式 6 O9 X$ s2 Q. M4 P
$ b5 h0 H @) K' m 非对称PWM模式4 S1 \7 {5 F4 N. m) g
三相组合PWM模式" T) M7 T! q5 q. P9 `9 w
可变频率pwm,由外部信号驱动。 逐周期控制的占空比。
0 U* T1 u6 Q4 V6 x; F B TIM2定时器实验 l) h/ [# o5 t/ J 本次实验,我们选择TIM2定时器,通过设置预分频系数(PSC减去1)和计数器周期(ARR减去1)的数值,来控制整个定时器周期。让定时器周期进入中断,在中断函数中翻转PC6引脚电平,达到闪烁的目的。0 D+ l7 Y9 k$ w2 D3 j% l 5 @0 p; l6 P4 L+ I; g; \ 如何计算定时器周期?5 O& q& N: E3 f9 y; S # z! |5 T& \6 K# r9 a/ c/ [ 1、在时钟树中确定好TPCLK频率,这里已最大化频率运行;0 B+ l; H" q% [$ E; d/ X . E3 m9 W! v8 o/ f! }6 W+ w
, D% w0 n1 v& P0 S6 d* d4 b, s" H 2、确定CK_CNT的值 ,CK_CNT=TPCLK / PSC,为了便于计算我们一般都是将CK_CNT的值化为整数, ' X0 ~: K, P( ~ g, E6 S 如 64MHz / 6400=10000Hz 3、确定ARR的值,ARR=CK_CNT* t(s),6 W# l7 `8 @4 _9 W- m, R2 z. d 2 g+ W. B# x. T2 Z8 b$ _ 如要1秒周期,10000Hz*1s=10000。$ U& Y s4 y6 i; c 6 F% `( |( q3 Z" l, F9 L! @ 实验代码 1、新建芯片工程,"SYS"打开"Serial Wire"调试接口,"RCC"中HSE使用"Crystal/Ceramic Resonator"; 2、在"Pinout view"中设置PC6为GPIO_Output,默认电平为low,开漏模式,不上下拉,速率为低
8 Z/ J( D: h. q4 n! K1 o/ y; S
I; t' [+ @9 V" s) l! K5 u 3、设置时钟树,使用HSE、PLLCLK,HCLK为64,APB分频系数为1,APB时钟为64
+ k, R. T7 C1 ~6 z# B( k. T 4、 设置TIM2,在TIM2选项卡中,"Clock Source"选择"Internal Clock"; T/ P2 }% f3 J% x 5、下面"Counter Settings",Prescaler填入"6400-1",Counter Mode(计数模式)"Up",Counter Period填入"10000-1",其他参数默认值 ( B: S# r8 p1 {. r! @8 f 如想要1秒周期,ARR=10000,PSC=TPCLK / CK_CNT1 [# @, ]" B, V0 W' C" G . D: f) M+ i; p9 U; V0 @5 N) T
6、在"NVIC"中,配置页面中找到"TIM2 global interrupt"使能,优先级选择"2"# d- T7 j3 d5 G+ s0 y
9 ]/ X% E8 m4 A6 t/ [6 Q, \ b 7、在Project Manager中填入项目名,IDE版本“MDK-ARM V5”,在Code Generator打上勾,生成代码。* {( V+ S, E" |; {' F
9 H4 t1 K7 l+ O! g' N4 M0 Y) i- z 8、在main.c文件,int main函数里面,在代码MX_TIM2_Init()定时器初始化后面加上定时器中断初始化函数& F2 _# k# G1 m- \% @* l
9、定时器中断函数原型为void TIM2_IRQHandler(void),里面调用了HAL_TIM_IRQHandler(&htim2),该函数有很多个中断回调函数,我们这个定时器更新中断,找到我们需要的函数HAL_TIM_PeriodElapsedCallback(htim),需要手动写这个回调函数,把一下函数复制到main.c文件中
10、在int main(){}后面编写代码,编译,debug中勾上"Reset and Run"烧录固件,就能在开发板上看到输出闪烁。$ P4 Q( a6 h7 O$ f) t4 g0 _4 j
+ V" W; @, K6 y, U8 K6 M% n6 ] 5 ~, r: M5 l& v; Q4 t4 ^/ P 0 y% @3 k' E3 B , X0 F7 U4 P$ z7 ~! v |
微信公众号
手机版