定时器分类 G0系列有TIM1、TIM2、TIM3、TIM6、TIM7、TIM14、TIM15、TIM16、TIM17,它们区别如下图' n& Z4 J, \2 Y! { 其中TIM1为高级定时器;TIM2/3/14/15/16/17为通用定时器,TIM2支持32bit;TIM6/7为基本定时器 0 X: f/ d8 |$ K7 K# {( w. e, H 0 i( E5 L/ U- J* \3 \" @2 \& a/ s 8 O9 e+ {. A7 ]9 c 计时器时序图5 E) y- J1 t4 S# y- d1 {) C TIM1,TIM2,TIM3支持(中央对齐)向上向下模式,方向在向上向下时发生变化,减少对电机的噪声干扰。 / u* v1 \( K8 n$ {) H 基本PWM模式,边缘或者中央对齐模式 % V* c T* ^ C9 I : M4 h' K8 f$ n& E% ]8 A 非对称PWM模式 - Z/ m- H6 X+ N6 w 三相组合PWM模式 可变频率pwm,由外部信号驱动。 逐周期控制的占空比。 ! M& C( s. x N/ X7 F, D* d" X ) z1 E8 ?* A5 S- g1 J2 {( N) a TIM2定时器实验 本次实验,我们选择TIM2定时器,通过设置预分频系数(PSC减去1)和计数器周期(ARR减去1)的数值,来控制整个定时器周期。让定时器周期进入中断,在中断函数中翻转PC6引脚电平,达到闪烁的目的。 如何计算定时器周期? 1、在时钟树中确定好TPCLK频率,这里已最大化频率运行; - I, P. V: d2 ]6 B ; A u& a4 M. _/ T* X% [ 2、确定CK_CNT的值 ,CK_CNT=TPCLK / PSC,为了便于计算我们一般都是将CK_CNT的值化为整数, 5 t+ {) s# G! `4 s8 o1 S 如 64MHz / 6400=10000Hz( b7 R' _4 ?" P& R : Z4 k! M; {" u 3、确定ARR的值,ARR=CK_CNT* t(s), D! L! F" e2 |6 @6 A( C 如要1秒周期,10000Hz*1s=10000。 & H+ a' L7 l" o) h 实验代码 1、新建芯片工程,"SYS"打开"Serial Wire"调试接口,"RCC"中HSE使用"Crystal/Ceramic Resonator"; 2、在"Pinout view"中设置PC6为GPIO_Output,默认电平为low,开漏模式,不上下拉,速率为低2 Z$ s9 R% N& M 1 t" w: p& H$ ?2 v. v 2 N9 w6 J2 O- \ 0 p( E2 T; R/ P: n$ C$ X 3、设置时钟树,使用HSE、PLLCLK,HCLK为64,APB分频系数为1,APB时钟为64& R- @6 U0 W, b7 Z+ a, | u 4、 设置TIM2,在TIM2选项卡中,"Clock Source"选择"Internal Clock" ; C: A" o1 I( r. N 5、下面"Counter Settings",Prescaler填入"6400-1",Counter Mode(计数模式)"Up",Counter Period填入"10000-1",其他参数默认值; Y( m: ^3 i$ {, X: T& r3 x 如想要1秒周期,ARR=10000,PSC=TPCLK / CK_CNT ! {8 }; b4 g/ W0 P3 A4 e 3 v8 p2 t6 N% L7 B% n5 v" l 6、在"NVIC"中,配置页面中找到"TIM2 global interrupt"使能,优先级选择"2"/ \% m" F: w5 x( t% C0 J% E/ H 7、在Project Manager中填入项目名,IDE版本“MDK-ARM V5”,在Code Generator打上勾,生成代码。7 x( ]1 R: s& I3 Z p7 Y$ }3 J ' v @( ^) d w( v1 [0 F2 o 8、在main.c文件,int main函数里面,在代码MX_TIM2_Init()定时器初始化后面加上定时器中断初始化函数0 ?5 M7 ~3 S) U3 `, C * f3 P; _% b i$ H1 q' A. p5 H
9、定时器中断函数原型为void TIM2_IRQHandler(void),里面调用了HAL_TIM_IRQHandler(&htim2),该函数有很多个中断回调函数,我们这个定时器更新中断,找到我们需要的函数HAL_TIM_PeriodElapsedCallback(htim),需要手动写这个回调函数,把一下函数复制到main.c文件中
10、在int main(){}后面编写代码,编译,debug中勾上"Reset and Run"烧录固件,就能在开发板上看到输出闪烁。% y* b8 h8 _, d) }* Q) S/ w ( y# K. n5 \8 H* q$ p0 Q" n
|
X-NUCLEO-IKS4A1实现手势滑动
STM32G系列RS485自动收发控制以及自适应波特率实战
STM32G0系列ADC扫描序列模式解读
STM32固件库分享,超全系列整理
【经验分享】FPGA作为从机与STM32进行SPI协议通信---Verilog实现
【管管推荐】STM32经验分享篇
STM32G030F6P6基于HAL库模拟SPI驱动1.8寸TFT LCD屏幕
STM32的CAN FD位定时设置注意事项
基于STM32将移植 SBSFU 到 STM32G070过程分享
基于STM32G030 RAM不够用经验分享