STMCU小助手
发布时间:2021-11-8 16:49
|
定时器分类" F) P3 t3 H4 F n& t$ Y0 _ G0系列有TIM1、TIM2、TIM3、TIM6、TIM7、TIM14、TIM15、TIM16、TIM17,它们区别如下图- _8 @3 b2 N. W8 G% r$ g+ e, B! C s6 ?. Q0 P9 Z9 _- P. E$ D; W 其中TIM1为高级定时器;TIM2/3/14/15/16/17为通用定时器,TIM2支持32bit;TIM6/7为基本定时器1 D1 k( I% S- Y
" r/ }3 k# _, X: \! u4 j9 c
计时器时序图0 b; G3 \2 M' v8 R# R TIM1,TIM2,TIM3支持(中央对齐)向上向下模式,方向在向上向下时发生变化,减少对电机的噪声干扰。 7 I6 d. ]+ N5 h& y' c$ x
基本PWM模式,边缘或者中央对齐模式 S5 p# M( z% z9 ^$ K5 k
非对称PWM模式 m6 R$ M3 a$ @+ o
三相组合PWM模式- s, q. C: t, h# m
可变频率pwm,由外部信号驱动。 逐周期控制的占空比。) u! G& ?' z9 F/ C6 N8 S ! R+ J Z) r5 p* A' k: u( Q
TIM2定时器实验5 d e1 z7 |" E; Y: ` 本次实验,我们选择TIM2定时器,通过设置预分频系数(PSC减去1)和计数器周期(ARR减去1)的数值,来控制整个定时器周期。让定时器周期进入中断,在中断函数中翻转PC6引脚电平,达到闪烁的目的。 如何计算定时器周期?' v* X8 {9 r1 p; R / L- A- C8 q* E; h 1、在时钟树中确定好TPCLK频率,这里已最大化频率运行;
! i4 v# Z0 n8 |# T+ @9 X 2、确定CK_CNT的值 ,CK_CNT=TPCLK / PSC,为了便于计算我们一般都是将CK_CNT的值化为整数, ' S" k+ j) A0 y( R8 Z 如 64MHz / 6400=10000Hz) v& d- T* U. E- z 3、确定ARR的值,ARR=CK_CNT* t(s)," o* F% O0 W Y + Z# z4 O1 A4 Q 如要1秒周期,10000Hz*1s=10000。) V$ `8 r- P: J5 T) V! k 5 ^8 m3 Q: n& f3 h( {3 a& _) ] 实验代码 1、新建芯片工程,"SYS"打开"Serial Wire"调试接口,"RCC"中HSE使用"Crystal/Ceramic Resonator"; 2、在"Pinout view"中设置PC6为GPIO_Output,默认电平为low,开漏模式,不上下拉,速率为低 1 |0 f* k" U6 [
+ u# }- e+ l- V" i 3、设置时钟树,使用HSE、PLLCLK,HCLK为64,APB分频系数为1,APB时钟为64 8 c8 B. ]0 B n3 ]* D
w; ], g, E: p$ u! S7 i$ A 4、 设置TIM2,在TIM2选项卡中,"Clock Source"选择"Internal Clock" 5、下面"Counter Settings",Prescaler填入"6400-1",Counter Mode(计数模式)"Up",Counter Period填入"10000-1",其他参数默认值( s& T6 @0 k0 s S8 p# d% v3 c$ C( n- _8 ?2 N 如想要1秒周期,ARR=10000,PSC=TPCLK / CK_CNT% e0 o# o! N- n4 D# n/ C
6、在"NVIC"中,配置页面中找到"TIM2 global interrupt"使能,优先级选择"2"2 N* Z3 X& s; X, h 8 \, }9 ]# C) w9 o
7、在Project Manager中填入项目名,IDE版本“MDK-ARM V5”,在Code Generator打上勾,生成代码。7 i: I1 r6 b. ?1 i
Y" z9 Y0 p ?) r 8、在main.c文件,int main函数里面,在代码MX_TIM2_Init()定时器初始化后面加上定时器中断初始化函数
9、定时器中断函数原型为void TIM2_IRQHandler(void),里面调用了HAL_TIM_IRQHandler(&htim2),该函数有很多个中断回调函数,我们这个定时器更新中断,找到我们需要的函数HAL_TIM_PeriodElapsedCallback(htim),需要手动写这个回调函数,把一下函数复制到main.c文件中, W! h# o; _: s * N" _% U# b) C0 u' e2 G4 K
10、在int main(){}后面编写代码,编译,debug中勾上"Reset and Run"烧录固件,就能在开发板上看到输出闪烁。 , f! y, F) R; X. C; i8 C
2 {2 e/ ~; G& i9 U) _4 T4 A! g7 j 9 h* @" f; D4 J. m: S1 Z |
微信公众号
手机版