STMCU小助手
发布时间:2021-12-9 11:21
|
定时器分类- X U' D" h5 L+ v" {* n9 A G0系列有TIM1、TIM2、TIM3、TIM6、TIM7、TIM14、TIM15、TIM16、TIM17,它们区别如下图1 M! O$ L6 u* ]2 M8 m# o3 C : \" J3 A0 k+ |6 f# j/ Z 其中TIM1为高级定时器;TIM2/3/14/15/16/17为通用定时器,TIM2支持32bit;TIM6/7为基本定时器 5 S6 ?4 \# z* n$ O4 G
. _' a) g0 `( f
计时器时序图 TIM1,TIM2,TIM3支持(中央对齐)向上向下模式,方向在向上向下时发生变化,减少对电机的噪声干扰。8 R) Q8 W6 R) M! D! u 0 \4 \! k2 S8 N" @& t
% A! j9 p4 t4 N( M 基本PWM模式,边缘或者中央对齐模式 7 U1 R: N& l; \/ W/ F
非对称PWM模式
/ X4 ]2 j/ U' n6 ~* B 三相组合PWM模式
可变频率pwm,由外部信号驱动。 逐周期控制的占空比。1 C2 W) T' g4 x, X" K# v' [5 P $ ~# w F. A& c! N' Z
TIM2定时器实验 本次实验,我们选择TIM2定时器,通过设置预分频系数(PSC减去1)和计数器周期(ARR减去1)的数值,来控制整个定时器周期。让定时器周期进入中断,在中断函数中翻转PC6引脚电平,达到闪烁的目的。6 S! R/ O2 @# q5 k2 ~& f 如何计算定时器周期?' d$ @) Q3 @" `# I N1 x$ N$ r4 C' V 1、在时钟树中确定好TPCLK频率,这里已最大化频率运行;( U3 m r' L0 u9 [& z" ^' ]+ V
2、确定CK_CNT的值 ,CK_CNT=TPCLK / PSC,为了便于计算我们一般都是将CK_CNT的值化为整数, 如 64MHz / 6400=10000Hz' O* c p* ^' Q; A 4 y) |' D. C* H, \ 3、确定ARR的值,ARR=CK_CNT* t(s),- O- [$ w7 ]# u7 P- h1 l 如要1秒周期,10000Hz*1s=10000。& f1 Q3 Y U' i3 M3 n* C- h) @# B 1 R2 b' N. C: d7 |5 ]" y- s3 F 实验代码 1、新建芯片工程,"SYS"打开"Serial Wire"调试接口,"RCC"中HSE使用"Crystal/Ceramic Resonator"; : B) t9 F0 ^6 p, O$ ^. J 2、在"Pinout view"中设置PC6为GPIO_Output,默认电平为low,开漏模式,不上下拉,速率为低9 d9 a1 O) C6 X4 R1 p
, e( {; G- |5 d: [8 g7 K; X
3、设置时钟树,使用HSE、PLLCLK,HCLK为64,APB分频系数为1,APB时钟为648 C2 P3 ~: P7 o+ E4 m; E
4、 设置TIM2,在TIM2选项卡中,"Clock Source"选择"Internal Clock"1 X6 s7 b; H( I, w $ s7 ?5 j' b: X1 D* H 5、下面"Counter Settings",Prescaler填入"6400-1",Counter Mode(计数模式)"Up",Counter Period填入"10000-1",其他参数默认值 如想要1秒周期,ARR=10000,PSC=TPCLK / CK_CNT9 {& n0 S. N( ^* {" }/ `6 c- _' m 8 T' b: Y* M& l! T3 F5 k
6、在"NVIC"中,配置页面中找到"TIM2 global interrupt"使能,优先级选择"2" 3 f; ]3 Y) K1 }, v8 j
7、在Project Manager中填入项目名,IDE版本“MDK-ARM V5”,在Code Generator打上勾,生成代码。
# b9 T( F, T: B9 e/ n9 \5 F 8、在main.c文件,int main函数里面,在代码MX_TIM2_Init()定时器初始化后面加上定时器中断初始化函数 3 u6 o6 A2 H8 s
9、定时器中断函数原型为void TIM2_IRQHandler(void),里面调用了HAL_TIM_IRQHandler(&htim2),该函数有很多个中断回调函数,我们这个定时器更新中断,找到我们需要的函数HAL_TIM_PeriodElapsedCallback(htim),需要手动写这个回调函数,把一下函数复制到main.c文件中8 v' w* c3 j+ _3 V, y7 y# ]) u' ]$ F3 Z
10、在int main(){}后面编写代码,编译,debug中勾上"Reset and Run"烧录固件,就能在开发板上看到输出闪烁。 3 h8 Y7 u4 \# Z& s8 o/ [& m7 l9 o
|
实战经验 | 基于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库
微信公众号
手机版