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

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

[复制链接]
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

: B) J( L! Y0 N! x' }' O+ q其中TIM1为高级定时器;TIM2/3/14/15/16/17为通用定时器,TIM2支持32bit;TIM6/7为基本定时器1 D* E  u& `  b+ B2 j  b4 ]

; B5 l. Z8 I% v  N$ H8 K# O
20200505192122130.jpg
6 b+ E4 {- T4 r3 ?5 S

1 u( l( ?  q! v2 }2 m
20200505192148321.jpg
: e5 i4 M9 N" e, y( o4 Y6 Y3 w) S

. V0 h( Z( l6 g 计时器时序图
$ R+ [) G. ~% J2 u6 K0 V
TIM1,TIM2,TIM3支持(中央对齐)向上向下模式,方向在向上向下时发生变化,减少对电机的噪声干扰。
' W& e$ X8 F. L0 v+ A/ n& o% q: o# t4 u7 W% X; q
20200505193407758.png

) Z# i+ q( R+ r- d& _
$ Q, r8 k- ^, A0 j* D
20200505194318226.png

$ ?5 h& D' n. x; {" `, B; Q3 F& G- V% C* d2 c8 d4 W
基本PWM模式,边缘或者中央对齐模式
$ N+ Z% l2 j- J1 d* Z! C9 R/ f/ a5 z' R
20200505194802587.png

5 C1 s0 G( u5 v/ M% Z6 F) [$ v$ o1 s: m4 C: Y, J
非对称PWM模式% W, t1 G+ o. e: L
; Q- K# b. n9 ]% h! J) q5 \- A7 f8 {$ p
20200505195057399.png

# u8 o' i+ N* V1 m8 i- o4 L# ]$ N) `. p
三相组合PWM模式
, [: S5 k1 d4 a1 z/ H( |- N0 _- @& r/ M
20200505195420730.png

4 j/ X" \6 s( C3 T5 z; Q- S& ~! A3 h* ~' @/ x, V1 ?+ G
可变频率pwm,由外部信号驱动。                                           逐周期控制的占空比。
9 {; Y1 z  W6 H, i+ |* c+ s8 i5 t+ d0 G. v
20200505195905197.png
6 T7 h6 k2 R, y: R( J! E1 {' z

0 h5 o4 b' y# ~8 g! A7 P4 i9 N
20200505200041645.png

% C2 ?1 |$ O0 g7 E* {9 E( ?; u0 X4 I' k; O: [& ^
TIM2定时器实验* i1 V9 G7 U8 x8 h6 @. r
本次实验,我们选择TIM2定时器,通过设置预分频系数(PSC减去1)和计数器周期(ARR减去1)的数值,来控制整个定时器周期。让定时器周期进入中断,在中断函数中翻转PC6引脚电平,达到闪烁的目的。
5 [  q+ r/ E2 V1 f
. t9 w4 k4 D& J6 a% x* B$ U如何计算定时器周期?" x  H5 m, |5 P/ X% ]2 C

0 F6 a8 k( s7 |7 d( u% I1 M$ u' f# B# `1、在时钟树中确定好TPCLK频率,这里已最大化频率运行;
" N& m' }7 y/ E7 u
+ {" ?) x7 ?1 a( O3 a5 P
20200505220029633.png
: ~& S6 G, ^) d: @
, a: r0 H. ~8 ~0 W7 \" L
2、确定CK_CNT的值 ,CK_CNT=TPCLK / PSC,为了便于计算我们一般都是将CK_CNT的值化为整数,
: R/ N3 ^7 Z) S7 R4 ]
2 B: q+ ^; u% Z' b/ J如 64MHz / 6400=10000Hz* C- s9 i9 J- T: I; M7 o

0 W) w$ u7 Q$ a1 A4 ?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; [

7 B3 u' m4 T% M实验代码
; k- p7 C3 K! h1、新建芯片工程,"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

: ]' X- f6 P% A" ]; M% @
20200419170920422.png

- `+ J0 f0 n2 ?- {3 Z9 p, O9 @- C# Q
20200505223426701.png
/ |  S' i& L" I; s; Q
* h2 m5 P, E, j% y: k& D
3、设置时钟树,使用HSE、PLLCLK,HCLK为64,APB分频系数为1,APB时钟为64
) O: p( g5 @% x5 `
- w+ O6 @! F) ^  j3 j2 q' {
20200505223701644.png
4 P3 W- r# K7 S2 K) u
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

/ ?% b8 ]  n. \6 u7 S如想要1秒周期,ARR=10000,PSC=TPCLK / CK_CNT5 d# |2 B5 a, Q# ~) J$ S6 @

7 a+ F8 g+ \: T5 m+ k
20200505225312371.png
1 Z4 `/ X1 H: S- \( A. T8 Y4 |

) }1 Q  K, s$ W$ M8 f, p  c  D' e6、在"NVIC"中,配置页面中找到"TIM2 global interrupt"使能,优先级选择"2"- T3 V; q9 P5 ~4 s
+ j) g9 l7 Z4 V2 ?8 O. _3 g4 K
20200505225419137.png
0 l: ?0 m5 n% i8 M, M* P: R, J* J
; {* g. u: Q' l% W
7、在Project Manager中填入项目名,IDE版本“MDK-ARM   V5”,在Code Generator打上勾,生成代码。/ h' @% k' M4 ~7 y

+ p* E# _3 j0 ]6 w7 g4 R5 Z
20200505225614187.png
* x  s% j! _, N

0 Y, z, [7 X8 v( g4 u6 L0 `$ R8、在main.c文件,int main函数里面,在代码MX_TIM2_Init()定时器初始化后面加上定时器中断初始化函数7 _# G% g& ]7 v, u
% n6 n- e+ ^5 }( ?$ ^6 }# m# r
  1. int main(void)' W( u3 [4 i$ Q, I2 q* P' T* A
  2. {
    " O) j$ ~+ E9 g  `/ M  J7 {, a8 _
  3.   **) \5 {9 U% _! L7 a# `4 r9 L
  4.   **5 l+ G, Q- Z+ ?
  5.   MX_GPIO_Init();$ ?7 G0 Z; @: D6 B8 O) Z* X* G
  6.   MX_TIM2_Init();
    7 c% U8 C6 }7 h. u* Q; `1 }
  7.   /* USER CODE BEGIN 2 */2 _4 w0 M* ?9 x6 `
  8.     HAL_TIM_Base_Start_IT(&htim2);          //初始化定时器中断
    * A9 p2 ]  u9 p- |) M
  9.   /* USER CODE END 2 */
    # t; T9 s% r# I( {) V' P
  10.   **
    3 v7 t/ G5 j- k+ Y, s5 _5 P
  11.   **
复制代码

/ v" q7 _) {' p; o# C7 N9、定时器中断函数原型为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

9 e4 P; r" T' |
  1. /*
    7 u+ _" P, P" y! K
  2. *stm32g0xx_hal_tim.c
    6 e& \# Q5 A4 \# R( u+ b# M4 |+ X
  3. */8 I, d% H% Q* \9 \
  4. __weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    0 Q" j% B8 F; C+ m& X& f6 Z1 r
  5. {
    ; x* |2 u: w4 A- _/ K/ U; y  l
  6.   /* Prevent unused argument(s) compilation warning */! Q' y7 R5 n# ]8 d/ p4 J: c
  7.   UNUSED(htim);
    2 H$ n6 g2 E- `7 i7 o  O- A0 k8 F% y

  8. & L0 q" n: ^( D* Q: M/ [0 }: p/ [
  9.   /* NOTE : This function should not be modified, when the callback is needed,
    : z: X7 P# g' }. m# l8 A4 I- ]
  10.             the HAL_TIM_PeriodElapsedCallback could be implemented in the user file2 y3 I) F& w1 G1 g
  11.    */
    7 ?; f( M4 h: u9 c2 U- i
  12. }
复制代码
: C( s7 C9 t/ `( |8 @8 c% N
10、在int main(){}后面编写代码,编译,debug中勾上"Reset and Run"烧录固件,就能在开发板上看到输出闪烁。
8 m( b9 U8 X* M5 g. o' O, k- a
/ N" |, s! Y; G( u
  1. /* USER CODE BEGIN 4 */
    : O1 t" @# v$ B
  2. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    2 I& G# }( h2 c8 t( P0 @, z  O
  3. {
    # e9 g( o& W1 \: F
  4.   /* Prevent unused argument(s) compilation warning */0 u+ N1 L: Z$ u7 D0 q- j' U
  5.   UNUSED(htim);  B6 {( a: J- o6 u6 J0 Y& o4 l) O
  6.     HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_6);            //只有定时器有中断,就翻转一次引脚电平1 M% ^, {) G0 f3 E' F' ]
  7. }$ q1 |* Q! V7 N! {1 N
  8. /* USER CODE END 4 */
    2 x' n5 _3 k/ L8 D% g+ ?

  9. : @! O6 l# S* o3 T
复制代码

, M3 a! `" Y2 j. F9 }! m! ~
收藏 评论0 发布时间:2021-12-9 11:21

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版