定时器分类6 W) k: D/ \# O! _/ j G0系列有TIM1、TIM2、TIM3、TIM6、TIM7、TIM14、TIM15、TIM16、TIM17,它们区别如下图5 T1 ~; E3 K# H) H( \ - N0 `' V8 V- x2 r0 F- I3 a3 U 其中TIM1为高级定时器;TIM2/3/14/15/16/17为通用定时器,TIM2支持32bit;TIM6/7为基本定时器 0 q9 v8 Y% ~( c. s/ g, _7 P 计时器时序图 TIM1,TIM2,TIM3支持(中央对齐)向上向下模式,方向在向上向下时发生变化,减少对电机的噪声干扰。, ]3 L" {. J/ J% { D 5 x% @ j: x4 a2 ~1 g+ k3 k4 n G" C2 [) x4 w: u 0 g4 V w! Y2 Z 基本PWM模式,边缘或者中央对齐模式7 I" J6 p. D8 i0 } & I6 S1 e0 P3 ~2 q8 i n ! a( V- e. s. x, D( C 非对称PWM模式0 m q) y, ?* E6 Q3 f ( @3 K- `, g# Z/ M. H# Q* u; D- ~ $ F: y& H9 E. Y4 M( W, X5 x% } 三相组合PWM模式 可变频率pwm,由外部信号驱动。 逐周期控制的占空比。 4 Z! q0 i9 r; F2 F$ v * S, ~2 Y. m0 |6 } U) h7 Y* ` W9 ?5 T TIM2定时器实验 本次实验,我们选择TIM2定时器,通过设置预分频系数(PSC减去1)和计数器周期(ARR减去1)的数值,来控制整个定时器周期。让定时器周期进入中断,在中断函数中翻转PC6引脚电平,达到闪烁的目的。 如何计算定时器周期?( u! L3 ^+ D$ B! S 1、在时钟树中确定好TPCLK频率,这里已最大化频率运行;6 h0 ]' `# k8 B' b ; v3 c4 ~ g7 e 1 ]. _/ z. a; H, x7 |& L# } 2、确定CK_CNT的值 ,CK_CNT=TPCLK / PSC,为了便于计算我们一般都是将CK_CNT的值化为整数,- E5 X0 l6 P2 ^ q ) K/ N' C6 Y, l, V: F- m7 A 如 64MHz / 6400=10000Hz: m9 P* [4 c t J% o6 m # @ a9 o4 h# l. V 3、确定ARR的值,ARR=CK_CNT* t(s),: y5 X% _, v( v9 K* w- _ 如要1秒周期,10000Hz*1s=10000。 : q; o1 C& E8 }9 n+ L# q 实验代码 1、新建芯片工程,"SYS"打开"Serial Wire"调试接口,"RCC"中HSE使用"Crystal/Ceramic Resonator";! R6 A5 {$ d w4 R 2、在"Pinout view"中设置PC6为GPIO_Output,默认电平为low,开漏模式,不上下拉,速率为低) P3 L) X+ f* z, v* R# ~4 R ( r( q' n _+ c8 x$ ~2 ]) `+ Y3 l ( e% p2 P: H8 I: q3 w 3、设置时钟树,使用HSE、PLLCLK,HCLK为64,APB分频系数为1,APB时钟为645 `# [ C. D% U5 `3 L % u+ B& _# Y0 C5 c 4、 设置TIM2,在TIM2选项卡中,"Clock Source"选择"Internal Clock" 5、下面"Counter Settings",Prescaler填入"6400-1",Counter Mode(计数模式)"Up",Counter Period填入"10000-1",其他参数默认值! [% g4 v7 n& K9 C , b" i0 ?$ o. h. C, ^6 L4 n 如想要1秒周期,ARR=10000,PSC=TPCLK / CK_CNT ! O# V' F7 | Q5 o % B, g4 w5 q6 W6 |( f 6、在"NVIC"中,配置页面中找到"TIM2 global interrupt"使能,优先级选择"2") L$ X/ e7 t" w 7、在Project Manager中填入项目名,IDE版本“MDK-ARM V5”,在Code Generator打上勾,生成代码。 2 Q2 w8 u% _' {5 b8 M' E, k, e 8、在main.c文件,int main函数里面,在代码MX_TIM2_Init()定时器初始化后面加上定时器中断初始化函数5 j) u/ G$ W# G5 _: K8 H ( O7 r7 M# ]; p( ^9 }0 M' _& H
9、定时器中断函数原型为void TIM2_IRQHandler(void),里面调用了HAL_TIM_IRQHandler(&htim2),该函数有很多个中断回调函数,我们这个定时器更新中断,找到我们需要的函数HAL_TIM_PeriodElapsedCallback(htim),需要手动写这个回调函数,把一下函数复制到main.c文件中" y+ D! ], n. D! \/ y; O/ g * C; g4 [1 u$ X6 p: T
10、在int main(){}后面编写代码,编译,debug中勾上"Reset and Run"烧录固件,就能在开发板上看到输出闪烁。 6 R1 @4 f. W$ @# C% x L
|
STM32固件库分享,超全系列整理
STM32G030F6P6基于HAL库模拟SPI驱动1.8寸TFT LCD屏幕
STM32的CAN FD位定时设置注意事项
基于STM32将移植 SBSFU 到 STM32G070过程分享
基于STM32G030 RAM不够用经验分享
STM32G070在OLED上移植U8G2单色GUI
【经验分享】STM32 IAP+Ymodem功能实现(参考官方代码)
【经验分享】STM32的SPI问题
【经验分享】STM32 的加密实现
STM32G070—使用platformio+arduino