STMCU小助手
发布时间:2022-10-31 10:47
|
定时器分类 G0系列有TIM1、TIM2、TIM3、TIM6、TIM7、TIM14、TIM15、TIM16、TIM17,它们区别如下图 # J. r7 l2 c4 }0 Z 其中TIM1为高级定时器;TIM2/3/14/15/16/17为通用定时器,TIM2支持32bit;TIM6/7为基本定时器% B& I B% g4 K/ c6 ] : y* }# C/ L- A) O
* B9 n4 L* H1 n4 v& F7 P. ]: E 计时器时序图4 M, L% S4 I! s7 g: R TIM1,TIM2,TIM3支持(中央对齐)向上向下模式,方向在向上向下时发生变化,减少对电机的噪声干扰。! g" G3 j, A- S* M8 J 9 K) q2 R& i0 Z8 K& H" \' ]1 p0 p
# V6 J3 G, Q( @
\4 i0 a- w# O) o' ?6 Q 基本PWM模式,边缘或者中央对齐模式4 B- }- W7 S; B: Z % s" G2 P6 f* S" _- {1 H
非对称PWM模式 ! V4 Z5 Q0 F! Q$ z' ]3 y; [9 T! B
三相组合PWM模式4 _' k; h: ?, d. R1 U& P1 A
; \% b* z) g" N/ E 可变频率pwm,由外部信号驱动。 逐周期控制的占空比。
6 K" F( l8 c+ K7 W8 Q6 n TIM2定时器实验 本次实验,我们选择TIM2定时器,通过设置预分频系数(PSC减去1)和计数器周期(ARR减去1)的数值,来控制整个定时器周期。让定时器周期进入中断,在中断函数中翻转PC6引脚电平,达到闪烁的目的。! F+ A" t6 f% ~1 p 9 P% h3 L, w. k$ V- r9 k* ^ 如何计算定时器周期? 1、在时钟树中确定好TPCLK频率,这里已最大化频率运行;2 t. u5 T$ l. G% Z# A8 z
8 f. q8 Y) P n6 t% R4 e. V 2、确定CK_CNT的值 ,CK_CNT=TPCLK / PSC,为了便于计算我们一般都是将CK_CNT的值化为整数, * s& Q% f7 d1 {1 T' p: E 如 64MHz / 6400=10000Hz , |9 Z$ I/ d7 f! H$ \! O 3、确定ARR的值,ARR=CK_CNT* t(s), " \2 f4 t6 u% \: f- B4 I 如要1秒周期,10000Hz*1s=10000。 " p) {2 O3 _: Q' C5 ~ 0 d R* E9 H I& q8 @/ b 实验代码. e) X7 X6 h! ]' |7 w9 k& Y 1、新建芯片工程,"SYS"打开"Serial Wire"调试接口,"RCC"中HSE使用"Crystal/Ceramic Resonator"; 2、在"Pinout view"中设置PC6为GPIO_Output,默认电平为low,开漏模式,不上下拉,速率为低
) _' ^3 w1 d% a$ h( h8 N0 b Q
3、设置时钟树,使用HSE、PLLCLK,HCLK为64,APB分频系数为1,APB时钟为64 8 \9 m4 d$ H5 |1 y* S; J6 m
5 m& Z, V+ m }; V$ e, z 4、 设置TIM2,在TIM2选项卡中,"Clock Source"选择"Internal Clock"* W" o; v, r0 Q( p & V4 x0 u$ H( T3 \9 \% J 5、下面"Counter Settings",Prescaler填入"6400-1",Counter Mode(计数模式)"Up",Counter Period填入"10000-1",其他参数默认值 9 D/ R$ a% z. h* A# Y 如想要1秒周期,ARR=10000,PSC=TPCLK / CK_CNT* C2 f4 F( `% ^3 I4 j( N4 u ( ]7 ~3 O; Z* c( ^ Q7 E- u7 S* j
% _9 j+ q- ~% b. N& t& ?: i8 A8 j 6、在"NVIC"中,配置页面中找到"TIM2 global interrupt"使能,优先级选择"2" - x7 h' p" ]/ r( I% L
5 y3 x- X- F5 ^( @' s 7、在Project Manager中填入项目名,IDE版本“MDK-ARM V5”,在Code Generator打上勾,生成代码。 ( H# @0 s6 u0 h$ b4 p8 ?
4 y/ c6 R% Q0 e2 W3 K" k+ e 8、在main.c文件,int main函数里面,在代码MX_TIM2_Init()定时器初始化后面加上定时器中断初始化函数
9、定时器中断函数原型为void TIM2_IRQHandler(void),里面调用了HAL_TIM_IRQHandler(&htim2),该函数有很多个中断回调函数,我们这个定时器更新中断,找到我们需要的函数HAL_TIM_PeriodElapsedCallback(htim),需要手动写这个回调函数,把一下函数复制到main.c文件中1 {% W/ k, Q4 l; K % k6 ~; G" r( M) r
10、在int main(){}后面编写代码,编译,debug中勾上"Reset and Run"烧录固件,就能在开发板上看到输出闪烁。% t1 E4 i i1 f
———————————————— 版权声明:SCCELE 6 x2 U* {9 d* i) G, D |
实战经验 | 基于STM32G0B1的全桥移相+同步整流PWM解决方案
DMA 原理从 0 到 1:为什么它能解放 CPU?一文讲透 DMA 的工作流程
【福利三:逢7发帖赢大礼】8、基于STM32G070板子的Ymodem串口协议IAP Bootloader开发
【福利三:逢7发帖赢大礼】7、基于STM32G070板子TF卡的FATFS移植
【福利三:逢7发帖赢大礼】6、基于STM32G070板子spiflash的FATFS移植
【福利三:逢7发帖赢大礼】5、基于STM32G070板子IRDA红外遥控接收解码
【福利三:逢7发帖赢大礼】4、基于STM32G070板子SPI flash 移植SFUD库
【福利三:逢7发帖赢大礼】基于STM32G070板子的uart shell移植设计
【福利三:逢7发帖赢大礼】3、基于STM32G070板子的YModem串口协议通信
【福利三:逢7发帖赢大礼】2、基于STM32G070板子的OLED移植U8G2库
微信公众号
手机版