STMCU小助手
发布时间:2021-12-9 11:21
|
定时器分类# u- f3 _7 g6 J+ n0 V$ Y/ j' @ G0系列有TIM1、TIM2、TIM3、TIM6、TIM7、TIM14、TIM15、TIM16、TIM17,它们区别如下图7 ?6 ?5 d) ^* a 其中TIM1为高级定时器;TIM2/3/14/15/16/17为通用定时器,TIM2支持32bit;TIM6/7为基本定时器1 D* E u& ` b+ B2 j b4 ]
计时器时序图$ R+ [) G. ~% J2 u6 K0 V TIM1,TIM2,TIM3支持(中央对齐)向上向下模式,方向在向上向下时发生变化,减少对电机的噪声干扰。 & o% q: o# t4 u7 W% X; q
; Q3 F& G- V% C* d2 c8 d4 W 基本PWM模式,边缘或者中央对齐模式 1 d* Z! C9 R/ f/ a5 z' R
) [$ v$ o1 s: m4 C: Y, J 非对称PWM模式% W, t1 G+ o. e: L ; Q- K# b. n9 ]% h! J) q5 \- A7 f8 {$ p
4 L# ]$ N) `. p 三相组合PWM模式 ( |- N0 _- @& r/ M
; Q- S& ~! A3 h* ~' @/ x, V1 ?+ G 可变频率pwm,由外部信号驱动。 逐周期控制的占空比。 * c+ s8 i5 t+ d0 G. v
9 E( ?; u0 X4 I' k; O: [& ^ TIM2定时器实验* i1 V9 G7 U8 x8 h6 @. r 本次实验,我们选择TIM2定时器,通过设置预分频系数(PSC减去1)和计数器周期(ARR减去1)的数值,来控制整个定时器周期。让定时器周期进入中断,在中断函数中翻转PC6引脚电平,达到闪烁的目的。 如何计算定时器周期?" x H5 m, |5 P/ X% ]2 C 1、在时钟树中确定好TPCLK频率,这里已最大化频率运行;
, a: r0 H. ~8 ~0 W7 \" L 2、确定CK_CNT的值 ,CK_CNT=TPCLK / PSC,为了便于计算我们一般都是将CK_CNT的值化为整数, 如 64MHz / 6400=10000Hz* C- s9 i9 J- T: I; M7 o 3、确定ARR的值,ARR=CK_CNT* t(s),- |8 j' T8 o5 V8 H 0 Z: x) U6 g2 B5 P5 P* O# b 如要1秒周期,10000Hz*1s=10000。$ F6 C; m: _- p% Q; [ 实验代码 1、新建芯片工程,"SYS"打开"Serial Wire"调试接口,"RCC"中HSE使用"Crystal/Ceramic Resonator";/ _( c+ i, O! h" f: d, d1 l 9 }+ b7 |$ |$ e2 z& U8 e 2、在"Pinout view"中设置PC6为GPIO_Output,默认电平为low,开漏模式,不上下拉,速率为低4 e4 M* h% t4 ?# x" `5 f8 u
- {3 Z9 p, O9 @- C# Q
* h2 m5 P, E, j% y: k& D 3、设置时钟树,使用HSE、PLLCLK,HCLK为64,APB分频系数为1,APB时钟为64
4、 设置TIM2,在TIM2选项卡中,"Clock Source"选择"Internal Clock"& O7 N) x* h5 M8 i a 4 J! r$ x, P# q3 @1 k 5、下面"Counter Settings",Prescaler填入"6400-1",Counter Mode(计数模式)"Up",Counter Period填入"10000-1",其他参数默认值0 ~. C3 g1 M1 D+ q' F 如想要1秒周期,ARR=10000,PSC=TPCLK / CK_CNT5 d# |2 B5 a, Q# ~) J$ S6 @
6、在"NVIC"中,配置页面中找到"TIM2 global interrupt"使能,优先级选择"2"- T3 V; q9 P5 ~4 s + j) g9 l7 Z4 V2 ?8 O. _3 g4 K
; {* g. u: Q' l% W 7、在Project Manager中填入项目名,IDE版本“MDK-ARM V5”,在Code Generator打上勾,生成代码。/ h' @% k' M4 ~7 y
8、在main.c文件,int main函数里面,在代码MX_TIM2_Init()定时器初始化后面加上定时器中断初始化函数7 _# G% g& ]7 v, u % n6 n- e+ ^5 }( ?$ ^6 }# m# r
9、定时器中断函数原型为void TIM2_IRQHandler(void),里面调用了HAL_TIM_IRQHandler(&htim2),该函数有很多个中断回调函数,我们这个定时器更新中断,找到我们需要的函数HAL_TIM_PeriodElapsedCallback(htim),需要手动写这个回调函数,把一下函数复制到main.c文件中; E3 r# W4 o$ r" d+ c6 b+ y0 v, w
10、在int main(){}后面编写代码,编译,debug中勾上"Reset and Run"烧录固件,就能在开发板上看到输出闪烁。
|
实战经验 | 基于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库
微信公众号
手机版