定时器分类: p; i0 I) x) m. w7 Y' ~* Y G0系列有TIM1、TIM2、TIM3、TIM6、TIM7、TIM14、TIM15、TIM16、TIM17,它们区别如下图 其中TIM1为高级定时器;TIM2/3/14/15/16/17为通用定时器,TIM2支持32bit;TIM6/7为基本定时器+ v( p1 |% }% k9 D; s! N- [) ?4 X * _- M) W C8 y O" A' o5 q5 G 计时器时序图 TIM1,TIM2,TIM3支持(中央对齐)向上向下模式,方向在向上向下时发生变化,减少对电机的噪声干扰。- t7 ~0 b! k! G! V 2 r/ _( ]& ^) e " _; s; p5 |9 Q 基本PWM模式,边缘或者中央对齐模式 + B; l; }2 K% y/ K+ ~ 非对称PWM模式 ( j4 L. F4 f' C" _ 三相组合PWM模式 . n, S2 B1 b9 K) N! z. A7 I 6 H# y, B+ R& o- `4 Y Q 可变频率pwm,由外部信号驱动。 逐周期控制的占空比。 # O9 ]+ D B- t. [& J" g0 W ! B0 r) G* ^" e0 k TIM2定时器实验9 V* t& ] {9 P( q" q 本次实验,我们选择TIM2定时器,通过设置预分频系数(PSC减去1)和计数器周期(ARR减去1)的数值,来控制整个定时器周期。让定时器周期进入中断,在中断函数中翻转PC6引脚电平,达到闪烁的目的。 如何计算定时器周期? 6 I. @5 a6 _* M7 x4 H 1、在时钟树中确定好TPCLK频率,这里已最大化频率运行;" R: l" a2 T7 K( x% _6 A 0 `. l4 ~" h8 n2 j( P ) b' Q! F. U) T w 2、确定CK_CNT的值 ,CK_CNT=TPCLK / PSC,为了便于计算我们一般都是将CK_CNT的值化为整数, 如 64MHz / 6400=10000Hz- b u8 n3 J/ ^( y! X 3、确定ARR的值,ARR=CK_CNT* t(s),. q: Q" Y+ \' {2 _; ]- K9 v n ) D) S4 f( \" }; {9 x 如要1秒周期,10000Hz*1s=10000。8 L) c8 b8 A( L0 \2 R0 W / J3 b* {& F7 C 实验代码- Y9 X% G; @. t6 e e8 x n 1、新建芯片工程,"SYS"打开"Serial Wire"调试接口,"RCC"中HSE使用"Crystal/Ceramic Resonator";, q, W3 B, _* @7 r, q 2、在"Pinout view"中设置PC6为GPIO_Output,默认电平为low,开漏模式,不上下拉,速率为低3 ^) {- Q) o! |) q5 _ _ 6 U2 }4 }* ~ Q) } 3、设置时钟树,使用HSE、PLLCLK,HCLK为64,APB分频系数为1,APB时钟为649 c$ T. Z8 _; F) h4 o- p, a. _ $ g3 A& E; @4 S! m 4、 设置TIM2,在TIM2选项卡中,"Clock Source"选择"Internal Clock" " R0 w( U( ]- Y1 e% U5 Z0 z/ U' { 5、下面"Counter Settings",Prescaler填入"6400-1",Counter Mode(计数模式)"Up",Counter Period填入"10000-1",其他参数默认值" I6 J% U+ I: ` 如想要1秒周期,ARR=10000,PSC=TPCLK / CK_CNT5 j/ y; Q4 {% j# y2 S) g 6、在"NVIC"中,配置页面中找到"TIM2 global interrupt"使能,优先级选择"2" 7、在Project Manager中填入项目名,IDE版本“MDK-ARM V5”,在Code Generator打上勾,生成代码。 + y, ?9 v/ e$ c! \- ~/ ?# D* g3 } 8、在main.c文件,int main函数里面,在代码MX_TIM2_Init()定时器初始化后面加上定时器中断初始化函数4 g. ], x6 Z# a 0 S7 b1 V; [1 e+ ~
9、定时器中断函数原型为void TIM2_IRQHandler(void),里面调用了HAL_TIM_IRQHandler(&htim2),该函数有很多个中断回调函数,我们这个定时器更新中断,找到我们需要的函数HAL_TIM_PeriodElapsedCallback(htim),需要手动写这个回调函数,把一下函数复制到main.c文件中 7 T& k0 j* K& `! ~
10、在int main(){}后面编写代码,编译,debug中勾上"Reset and Run"烧录固件,就能在开发板上看到输出闪烁。3 q( ?( j- T( R# |* ^1 d. T) t
|
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