你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32G0学习手册——使用定时器中断(HAL库)

[复制链接]
STMCU小助手 发布时间:2021-11-8 16:49
定时器分类! w; n5 n) p) X7 N" q, r5 z
G0系列有TIM1、TIM2、TIM3、TIM6、TIM7、TIM14、TIM15、TIM16、TIM17,它们区别如下图$ I# |7 n" W: G- J) o4 m% q6 A6 |1 e

( j6 V, _7 b7 q% h) B, p9 \其中TIM1为高级定时器;TIM2/3/14/15/16/17为通用定时器,TIM2支持32bit;TIM6/7为基本定时器7 V& K/ k  C* W# N0 [; ~

7 I# i' Q+ ^) L, h) h* y& Q. w
20200505192122130.jpg
/ e9 T. j) f! ?& S$ D" z
  b6 d" y/ G" H4 d7 _% C. W
20200505192148321.jpg

: E% w5 n; i2 _4 u# J( U9 \+ I: [- t/ @! I. C0 X
计时器时序图
' o5 S/ s3 J; t; \6 B) ?( H$ @TIM1,TIM2,TIM3支持(中央对齐)向上向下模式,方向在向上向下时发生变化,减少对电机的噪声干扰。
! t' W  P) n, S$ Z9 c9 w% Q* j7 C: v
# h/ k% z) H9 |+ p* y/ C8 [
20200505193407758.png
; ^: K  z* e$ R4 M
5 W! N( O6 I0 r2 r
20200505194318226.png

" S# {- \- H1 ?, S6 x- Z) c
8 z) ^, w3 g9 E! i2 ^. H 基本PWM模式,边缘或者中央对齐模式
+ K. G+ g2 B& K) S! E& Z" T9 p" L' H( h7 ]# a# _
20200505194802587.png

+ n* ~* I0 h+ i1 l
& c" m- L' n0 W6 i2 w 非对称PWM模式
+ Q; s3 K3 s( N
9 w4 n: t" v) O/ e, J' ]
20200505195057399.png

! K4 Y) G9 ]! y# y( }4 v5 K
5 ~3 M4 [( e, @0 g, F9 v! @) \三相组合PWM模式$ o) O# \% _. |5 v9 V4 v( B1 g! c
20200505195420730.png

2 U* t3 r" H5 G
" v* Q3 D) a+ N) F5 G3 P 可变频率pwm,由外部信号驱动。                                           逐周期控制的占空比。
7 M. \. V7 f. r% @) V! \1 ~
& D9 u! e0 t" J, Q
20200505195905197.png

( n! g0 S; M& G+ e1 [1 l, k9 k* N+ G8 _1 [1 Z
TIM2定时器实验1 _7 _  [  m# y: w, s# [
本次实验,我们选择TIM2定时器,通过设置预分频系数(PSC减去1)和计数器周期(ARR减去1)的数值,来控制整个定时器周期。让定时器周期进入中断,在中断函数中翻转PC6引脚电平,达到闪烁的目的。0 A: ]# L# [4 C

7 _4 s7 K! h) m0 b如何计算定时器周期?% v5 j$ X/ G7 M. C- d% D# x
! D  Q5 w' q$ ~0 e. T4 S' x
1、在时钟树中确定好TPCLK频率,这里已最大化频率运行;
- ]9 D- |$ V% t4 t  f: o) h4 F- {; [; B7 A2 Q1 \3 S, {3 b
20200505220029633.png

1 o' z$ }8 y; {. P8 M) g6 k" z( P/ o2 S+ K
2、确定CK_CNT的值 ,CK_CNT=TPCLK / PSC,为了便于计算我们一般都是将CK_CNT的值化为整数,
. E) }1 `) n  f# Y- k7 s( X# Y
& h9 x2 y/ R2 L, X9 M% A& @" Q如 64MHz / 6400=10000Hz' ~* t- B8 W2 v' _1 J3 r

" Y. w! G: e, @  N3、确定ARR的值,ARR=CK_CNT* t(s),
  e0 x$ B! P+ H# ~; n8 r( J! a0 V2 |  M$ |2 o8 o
如要1秒周期,10000Hz*1s=10000。
; o6 Z. z5 T! `. `. R9 Y( f; D# i5 {8 `8 E0 v$ \2 C" f! h) W7 U
实验代码9 m, i4 x/ o8 [# @/ b0 q
1、新建芯片工程,"SYS"打开"Serial Wire"调试接口,"RCC"中HSE使用"Crystal/Ceramic Resonator";. d8 Q  z0 ~7 J
6 H$ R6 L6 U: D1 K; K8 p+ M7 M) G
2、在"Pinout view"中设置PC6为GPIO_Output,默认电平为low,开漏模式,不上下拉,速率为低
: H1 n7 X- J, h5 f, F4 j+ v4 l# d  [2 A' [# B) k7 o
20200419170920422.png

5 ^+ D1 b' d+ M* |* x* d7 f% G. ?* J
7 A. V$ w; Z6 V  X* D
20200505223426701.png

9 T2 S. c- ?) A! X6 i; O6 s8 p/ g
5 F+ j& Z+ A! d) `2 p% {3、设置时钟树,使用HSE、PLLCLK,HCLK为64,APB分频系数为1,APB时钟为64
! [% o) P9 f3 D7 S% ^7 o7 v" h  _6 u0 B% m8 G8 V1 H7 W+ l, v# p; t
20200505223701644.png

+ j8 G) L7 \1 H  ]* C
0 `* T  H& d7 k, g4、 设置TIM2,在TIM2选项卡中,"Clock Source"选择"Internal Clock"  O3 P, t! ~, K$ ]2 G

7 X5 ?* V. x+ J( q5、下面"Counter Settings",Prescaler填入"6400-1",Counter Mode(计数模式)"Up",Counter Period填入"10000-1",其他参数默认值0 D( R' L$ y1 l' x7 k3 C* D6 Z

7 Y. P& \' R# i2 [8 a- T8 K如想要1秒周期,ARR=10000,PSC=TPCLK / CK_CNT9 E1 n. v+ f1 N* j/ K

* w8 U" ?$ [! m) Q0 H
20200505225312371.png
* N+ a7 D; S9 d7 s) g0 h6 v
( |& y0 z, [' ]7 u9 l; Y
6、在"NVIC"中,配置页面中找到"TIM2 global interrupt"使能,优先级选择"2"4 {7 R" g" V& M! D7 o0 Y
6 z9 G8 Z# ?, w: T  X
20200505225419137.png
7 s" _) C4 s( ~. B4 y
+ k/ c9 o, i" B' v. _4 ?8 ^! ~
7、在Project Manager中填入项目名,IDE版本“MDK-ARM   V5”,在Code Generator打上勾,生成代码。
' F$ E1 `6 @+ ~7 ~& d
- Y2 S* s9 D& _) B4 E+ F) z
20200505225614187.png

" V: z/ Q5 g6 F+ l' e9 k: K) A+ W3 R1 h" j, L9 I! `4 {4 V
8、在main.c文件,int main函数里面,在代码MX_TIM2_Init()定时器初始化后面加上定时器中断初始化函数0 W1 Q5 z; l/ U8 L

$ _6 z3 {, O) `0 b2 y9 @+ M% K7 ~
  1. int main(void)
    2 F) {; v# p, V2 V3 Q
  2. {$ L/ H  Y- ?3 [  S+ q3 C
  3.   *** Q( W, \* A1 n, \
  4.   **
    2 P: R  P& W: g% g
  5.   MX_GPIO_Init();
    . C+ d- L8 ?' W( p. o# r
  6.   MX_TIM2_Init();
    " l- C0 s& A% o& z3 g% D% m1 y, {. g7 M
  7.   /* USER CODE BEGIN 2 */
    0 H$ U3 G$ X& j; O
  8.     HAL_TIM_Base_Start_IT(&htim2);          //初始化定时器中断( |9 W$ \1 Y7 r3 n. U9 w
  9.   /* USER CODE END 2 */
      r# M6 o6 T1 c; g
  10.   **
    4 ]- K. g7 j& q
  11.   **
复制代码

. B  J7 Y! y9 \* ?+ S. q9、定时器中断函数原型为void TIM2_IRQHandler(void),里面调用了HAL_TIM_IRQHandler(&htim2),该函数有很多个中断回调函数,我们这个定时器更新中断,找到我们需要的函数HAL_TIM_PeriodElapsedCallback(htim),需要手动写这个回调函数,把一下函数复制到main.c文件中# i- o& x6 a! K" x
+ W( F' E3 g9 m  A0 I. ?4 Q
  1. <span style="background-color: rgb(255, 255, 255);">/</span>*, K4 t& I  ^  ^, n+ s
  2. *stm32g0xx_hal_tim.c
    ( [$ \6 A+ r( \2 `* |
  3. */) W# B" V% y8 [4 h, [* H
  4. __weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)1 }$ v- k" q& ^
  5. {
    , G! W6 k- \/ s: d
  6.   /* Prevent unused argument(s) compilation warning */
    9 f0 D, P* o6 G+ t8 s% I* z3 o* x
  7.   UNUSED(htim);2 d4 D/ y' ]! l* [

  8. 3 k3 C- V& K1 X1 l
  9.   /* NOTE : This function should not be modified, when the callback is needed,( a5 P& W, R/ X% R+ r
  10.             the HAL_TIM_PeriodElapsedCallback could be implemented in the user file0 K% ^; X7 k% ^' O1 l4 e  y5 X. K: N
  11.    */
    9 g% t: i( l' c2 G6 _' S
  12. }
复制代码
1 V' Q6 I: W7 V( |7 c+ s# X, M# d
10、在int main(){}后面编写代码,编译,debug中勾上"Reset and Run"烧录固件,就能在开发板上看到输出闪烁。
% ?4 y7 J7 S1 H* H$ p7 R0 y' p5 X' l5 P( u, v5 ?; z' u, q
  1. /* USER CODE BEGIN 4 */, B8 O7 p* Q! x: P
  2. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)- q6 _& d( n* H9 {% ^; c: `
  3. {
    & R* J; t8 n5 R, E/ O
  4.   /* Prevent unused argument(s) compilation warning */
    . `0 O6 j7 h. g3 B7 E# ?/ y
  5.   UNUSED(htim);* @( h5 j/ E( t, R4 R
  6.     HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_6);            //只有定时器有中断,就翻转一次引脚电平
    5 u' y5 L& d8 ~) y" l1 ^
  7. }  q+ L+ D; C/ I. F
  8. /* USER CODE END 4 */
复制代码

; T$ j0 G! s) N' q8 z5 x5 t1 b" @" c$ q; K
9 j0 v, H9 O# B" H
# c% w5 y" c/ Z5 t. Y* |

- R, e) W% F/ |* {2 a; N0 f, r2 v8 T

7 y, D# t$ F& i
20200505200041645.png
赞 收藏 评论0 发布时间:2021-11-8 16:49

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版