STMCU小助手
发布时间:2021-11-8 16:49
|
定时器分类! w; n5 n) p) X7 N" q, r5 z G0系列有TIM1、TIM2、TIM3、TIM6、TIM7、TIM14、TIM15、TIM16、TIM17,它们区别如下图$ I# |7 n" W: G- J) o4 m% q6 A6 |1 e 其中TIM1为高级定时器;TIM2/3/14/15/16/17为通用定时器,TIM2支持32bit;TIM6/7为基本定时器7 V& K/ k C* W# N0 [; ~
b6 d" y/ G" H4 d7 _% C. W
+ I: [- t/ @! I. C0 X 计时器时序图 TIM1,TIM2,TIM3支持(中央对齐)向上向下模式,方向在向上向下时发生变化,减少对电机的噪声干扰。
5 W! N( O6 I0 r2 r
基本PWM模式,边缘或者中央对齐模式 " T9 p" L' H( h7 ]# a# _
非对称PWM模式
三相组合PWM模式$ o) O# \% _. |5 v9 V4 v( B1 g! c
可变频率pwm,由外部信号驱动。 逐周期控制的占空比。
1 l, k9 k* N+ G8 _1 [1 Z TIM2定时器实验1 _7 _ [ m# y: w, s# [ 本次实验,我们选择TIM2定时器,通过设置预分频系数(PSC减去1)和计数器周期(ARR减去1)的数值,来控制整个定时器周期。让定时器周期进入中断,在中断函数中翻转PC6引脚电平,达到闪烁的目的。0 A: ]# L# [4 C 如何计算定时器周期?% v5 j$ X/ G7 M. C- d% D# x ! D Q5 w' q$ ~0 e. T4 S' x 1、在时钟树中确定好TPCLK频率,这里已最大化频率运行; 7 A2 Q1 \3 S, {3 b
6 k" z( P/ o2 S+ K 2、确定CK_CNT的值 ,CK_CNT=TPCLK / PSC,为了便于计算我们一般都是将CK_CNT的值化为整数, 如 64MHz / 6400=10000Hz' ~* t- B8 W2 v' _1 J3 r 3、确定ARR的值,ARR=CK_CNT* t(s), 8 r( J! a0 V2 | M$ |2 o8 o 如要1秒周期,10000Hz*1s=10000。 5 {8 `8 E0 v$ \2 C" f! h) W7 U 实验代码9 m, i4 x/ o8 [# @/ b0 q 1、新建芯片工程,"SYS"打开"Serial Wire"调试接口,"RCC"中HSE使用"Crystal/Ceramic Resonator";. d8 Q z0 ~7 J 6 H$ R6 L6 U: D1 K; K8 p+ M7 M) G 2、在"Pinout view"中设置PC6为GPIO_Output,默认电平为low,开漏模式,不上下拉,速率为低 4 l# d [2 A' [# B) k7 o
3、设置时钟树,使用HSE、PLLCLK,HCLK为64,APB分频系数为1,APB时钟为64 6 u0 B% m8 G8 V1 H7 W+ l, v# p; t
4、 设置TIM2,在TIM2选项卡中,"Clock Source"选择"Internal Clock" O3 P, t! ~, K$ ]2 G 5、下面"Counter Settings",Prescaler填入"6400-1",Counter Mode(计数模式)"Up",Counter Period填入"10000-1",其他参数默认值0 D( R' L$ y1 l' x7 k3 C* D6 Z 如想要1秒周期,ARR=10000,PSC=TPCLK / CK_CNT9 E1 n. v+ f1 N* j/ K
( |& y0 z, [' ]7 u9 l; Y 6、在"NVIC"中,配置页面中找到"TIM2 global interrupt"使能,优先级选择"2"4 {7 R" g" V& M! D7 o0 Y 6 z9 G8 Z# ?, w: T X
+ k/ c9 o, i" B' v. _4 ?8 ^! ~ 7、在Project Manager中填入项目名,IDE版本“MDK-ARM V5”,在Code Generator打上勾,生成代码。
: K) A+ W3 R1 h" j, L9 I! `4 {4 V 8、在main.c文件,int main函数里面,在代码MX_TIM2_Init()定时器初始化后面加上定时器中断初始化函数0 W1 Q5 z; l/ U8 L
9、定时器中断函数原型为void TIM2_IRQHandler(void),里面调用了HAL_TIM_IRQHandler(&htim2),该函数有很多个中断回调函数,我们这个定时器更新中断,找到我们需要的函数HAL_TIM_PeriodElapsedCallback(htim),需要手动写这个回调函数,把一下函数复制到main.c文件中# i- o& x6 a! K" x + W( F' E3 g9 m A0 I. ?4 Q
10、在int main(){}后面编写代码,编译,debug中勾上"Reset and Run"烧录固件,就能在开发板上看到输出闪烁。 ' l5 P( u, v5 ?; z' u, q
5 x5 t1 b" @" c$ q; K 9 j0 v, H9 O# B" H # c% w5 y" c/ Z5 t. Y* | 2 a; N0 f, r2 v8 T |
微信公众号
手机版