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

STM32MP157系列教程连载-Cortex-M4开发篇6:STM32MP1微控制器之定时器中断

[复制链接]
STMCU小助手 发布时间:2022-9-20 21:13
第 1 章 Cortex-M4 TIM定时器中断' R% |1 z9 C  _& C8 s1 K
2 d' c" o" ~8 Q- W: w- ?
实验目的. O  x$ F7 n# N$ g$ Y& U
熟悉STM32CubeIDE工具软件的使用。
& I" F1 B8 B6 C; g% i掌握STM32CubeIDE软件的基本设计流程和设计步骤,能够使用工具进行设计、编程、仿真调试。2 b/ ?0 F) b' D4 o8 T6 D
学习通用定时器的使用方法,掌握如何利用STM32MP157A芯片的通用定时器定时产生中断。
; y) l" [8 c  ]- y# u实验环境8 m4 m* Z2 N: J& L
FS-MP1A开发平台
8 e* ~* h2 r1 U8 s* Q$ u' `: AST-Link仿真器& }- |7 g( n9 @# j/ Q; l6 b
STM32CubeIDE开发软件7 B( e& V. U1 ?. r; v; v+ T7 w
PC机 XP、Window7/10 (32/64bit)
  y4 F9 A% A8 O; p! E( o/ s8 I
实验原理
0 K+ U% N  E4 c: M' h4 PSTM32系列微控制器具有多种定时器,其中包括基本定时器,通用定时器,高级定时器。& j6 E5 v1 \2 u) V' V! L+ A
3 i/ `( q' T+ T/ ]% [5 e4 z
几种定时器功能比较:
/ m& R4 c% C; l* I0 c, x/ T' ~1 L
& A8 u- ?6 T& ^1、 基本定时器:主要运用于定时器计数及驱动DAC) Y$ @1 E8 z6 J9 _( o  e
2、 通用定时器:定时器定时计数、输入捕获、输出比较、PWM输出、使用外部信号控制定时器和定时器互连的同步电路3 D& r" H3 }7 y/ P. B7 }* `
3、 高级定时器:通用定时器的所有功能、带死区控制和紧急刹车,可用于PWM控制电机% l$ r4 @$ m( n
+ Q& U  [9 S- E
本章节实验以通用定时器TIM3为例实现定时计数,计数到设置值后触发中断改变LED灯亮灭状态。
; s" _" G* u* h, }; K7 q2 N( C" ]+ L' d/ y  `- a# h
从下图可以看出定时器时钟TIM3挂载在APB1时钟总线上,在STM32CubeIDE软件中可配置总线时钟频率来确定定时器时钟。
) o, n& J& Z1 }$ x/ r) x4 O, e' B9 o: L9 P2 h
20201103173755116.png
& R' ~4 Q" O) Q, _5 r: w$ N# g9 O; u( ^3 i
20201103173807292.png
, V3 a: p3 ^$ q5 k, |) w+ ^8 ~& f2 [; W3 n3 h" T
20201103173819811.png
' K6 B2 o7 G$ y! f' m, L1 Z" q
$ j1 w  l6 B9 M/ h5 C# a从上图我们可以看到,基本定时器主要由下面几部分组成。
- K4 K# @0 V1 @+ J5 U6 b& l. i. z/ J1 I$ l
时钟源* Z8 |6 _. l; H* d! g

. i/ J, n+ |8 Q+ P( O4 g定时器要实现计数必须有个时钟源,基本定时器时钟只能来自内部时钟,高级控制定时器和通用定时器还可以选择外部时钟源或者直接来自其他定时器等模式。' Y6 K& A8 h& e+ C* G9 s* m
" z" E% s6 p; w2 U9 o9 U' z, w
控制器: u* Z/ S  A1 J% B1 E6 ~: I" z
8 }+ N: B# a* J3 p% d0 a* J
定时器控制器控制实现定时器功能,控制定时器复位、使能、计数是其基础功能,基本定时器还专门用于 DAC转换触发。
& k2 M; t$ r4 D6 N& Q- H3 ?) `# v3 W# u
计数器2 C3 m7 r! _( \% \
6 P$ g, T3 M0 R& u1 T: Z! V
基本定时器计数过程主要涉及到三个寄存器内容,分别是计数器寄存器(TIMx_CNT)、预分频器寄存器(TIMx_PSC)、自动重载寄存器(TIMx_ARR),这三个寄存器都是 16 位有效数字,即可设置值为 0至 65535。上图中预分频器 PSC,它有一个输入时钟 CK_PSC和一个输出时钟CK_CNT。输入时钟 CK_PSC 来源于控制器部分,基本定时器只有内部时钟源所以CK_PSC实际等于 CK_INT。在不同应用场所,经常需要不同的定时频率,通过设置预分频器 PSC的值可以非常方便得到不同的 CK_CNT,实际计算为:fCK_CNT等于 fCK_PSC/(PSC[15:0]+1)。下图中可看到将预分频器 PSC的值从 1改为 4时计数器时钟变化过程。原来是 1分频,CK_PSC和 CK_CNT频率相同。向 TIMx_PSC 寄存器写入新值时,并不会马上更新CK_CNT输出频率,而是等到更新事件发生时,把 TIMx_PSC 寄存器值更新到影子寄存器中,使其真正产生效果。更新为 4分频后,在 CK_PSC 连续出现 4个脉冲后 CK_CNT 才产生一个脉冲。
& l0 C  r3 \! x. ~. V; F
+ ?: K# s/ W: i1 u9 ]  l 20201103173912944.png $ C1 ^* F* l3 m9 |' v

9 `" l( `+ J: i! q在定时器使能(CEN 置 1)时,计数器 COUNTER根据 CK_CNT频率向上计数,即每来一个 CK_CNT脉冲,TIMx_CNT 值就加 1。当 TIMx_CNT值与 TIMx_ARR的设定值相等时就自动生成事件并 TIMx_CNT 自动清零,然后自动重新开始计数,如此重复以上过程。为此可见,我们只要设置 CK_PSC和 TIMx_ARR 这两个寄存器的值就可以控制事件生成的时间,而我们一般的应用程序就是在事件生成的回调函数中运行的。在 TIMx_CNT 递增至与 TIMx_ARR值相等,我们叫做为定时器上溢。自动重载寄存器 TIMx_ARR用来存放于计数器值比较的数值,如果两个数值相等就生成事件,将相关事件标志位置位,生成 DMA和中断输出。TIMx_ARR 有影子寄存器,可以通过 TIMx_CR1 寄存器的 ARPE位控制影子寄存器功能,如果 ARPE 位置 1,影子寄存器有效,只有在事件更新时才把 TIMx_ARR值赋给影子寄存器。如果 ARPE位为 0,修改TIMx_ARR 值马上有效。
* s9 b5 n" D" C! r, @7 k: ]9 o# P1 I
定时器周期计算& d/ `' P$ p6 ~/ ^1 T! M
3 s+ i5 s' l- Q; Y, |
经过上面分析,我们知道定时事件生成时间主要由 TIMx_PSC 和 TIMx_ARR两个寄存器值决定,这个也就是定时器的周期。比如我们需要一个 1s周期的定时器,具体这两个寄存器值该如何设置内。假设,我们先设置 TIMx_ARR寄存器值为 9999,即当 TIMx_CNT从 0开始计算,刚好等于 9999时生成事件,总共计数 10000次,那么如果此时时钟源周期为 100us即可得到刚好 1s的定时周期。接下来问题就是设置 TIMx_PSC寄存器值使得 CK_CNT 输出为 100us 周期(10000Hz)的时钟。预分频器的输入时钟 CK_PSC为 64MHz,所以设置预分频器值为(6400-1)即可满足: w( p4 @8 l6 s# v) B/ r5 I5 _* t

" [% j8 }! c* k! R+ U0 z, R; d- R中断时间:1/(TIMxCLK/(PSC+1))* (ARR+1)4 P# o7 C; Z% z" X
2 a' ]# v8 x" g/ T. ]4 W4 }
实验步骤0 @+ @9 Z  o% Y3 v. J

& C* F4 P/ i" T0 ]* B5 K, V+ f打开STM32CubeIDE->File->New->STM32 Project/ ~; J* x2 z2 s2 j

2 R0 y- F  v, [  ~7 L& D 20201103173959815.png ' @8 {5 C" h4 `, m! f) r

/ Q" d7 [1 p( l3 G8 A2 k  I可以在左侧搜索框内输入芯片型号STM32MP157A进行搜索,选择对应芯片,点击Next。
3 B% l* @# d* r1 A. S. h$ m) W
: ]( E2 r3 }4 Y; M7 D: P% | 20201103174017354.png   S7 Q5 z# f: |5 R# R

' P) h: b! Z& K- Q0 n填写工程名,点击Finsh。" E9 W# _- j0 [8 D; h( J1 b
. D6 \6 a: P. y0 k
20201103174034570.png
. @2 e6 w  H( U# S$ X
! q% ^& Y" `% p- R8 k! T) i5 C- ~点击Yes打开配置页面。3 m" j( w$ X8 F2 k7 N- L: l
# r" u9 k) \6 E: K' g
20201103174054417.png : v$ \1 A3 U6 {; I; w5 r; z# M2 ?

) J: A- u0 p3 J5 Z: j- u9 K0 O$ Q配置TIM3,勾选Cortex-M4,Clock Source选择Internal Clock Configuration下依据时钟频率配置预分频和计数值,NVIC使能。
8 d- P- |- N: a
3 \9 @" f3 g! K' v0 v9 i! p 2020110317412190.png
2 U7 _) w% T" a5 Z8 R$ \+ r' ~) q' f+ f
2020110317413569.png
8 D/ I5 U- }  {4 p
% [# Z. L+ ]  F! U. |3 p搜索框内搜索LED对应GPIO引脚PZ5、PZ6、PZ7,左键点击设置为GPIO_Output。6 N) @& D; Q% K$ o2 ]' [8 S1 L

0 V; f' n0 p' H 20201103174151943.png
8 {: |0 U$ s3 r5 O9 s' j  K, Z0 I% g  M
这里我们需要注意一下,和其他单片机不同,还需要继续设置“ Pin Reservation”给“ Cortex-M4”,否则STM32CubeMX不会生生成GPIO初始化相关代码。具体操作:在刚才选择的引脚上,鼠标右键选择“ Pin Reservation”->“ Cortex-M4”。
/ |  m  `  x5 e5 h5 O3 M' N% m! R6 L0 C. }3 u3 Y; z9 r, g
20201103174209602.png " B) k) E4 K8 u

0 Y/ W. S( _' b3 s. f在Code Generator处选择为每个外设生成单独的C和H文件,这样设置方便阅读代码。2 Z$ g# u  D% X# ^5 J' `

& i" D0 ?' r% b$ [ 20201103174230154.png . |7 U' b" g; X8 k! i

( w9 A% z! C2 w/ c8 H5 s3 h5 E7 R完成以上设置后,Ctrl+S保存,会提示是否需要生成代码,选择Yes即可自动生成代码。系统会自动生成System Clock代码。+ @* t# C; G" l. _/ \

: q& n) a' ]1 r 20201103174248718.png
2 Q0 r( A+ h$ S) e2 Q% y
: @% b9 B; z) D! m% G. M8 v可以在左侧工程文件夹找到TIM_CM4子工程,打开main.c
! n  m4 D' u3 Q0 ]# Q$ K$ \7 @: d9 T$ z, P4 ]1 ]
添加定时器中断回调函数
- T3 m& R  t) J' A
) ^+ {& ?1 B" t3 [, K5 p* f+ I
  1. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)# z' w* a1 g; Z  u  h
  2. {* t; v, K* V0 p9 W
  3.     if(htim->Instance == TIM3)  //TIM3周期1s
    & a# C* l( A% J5 N1 @% l! v
  4.     {
    ) j/ ], I/ S1 c: O
  5.         HAL_GPIO_TogglePin(GPIOZ, GPIO_PIN_5);
    # p( X9 f1 P, U/ E2 P7 x; ]
  6.     }1 P4 I: |  h5 T/ }  m
  7. }
复制代码

8 R: y& u2 l5 f, P% L- ?main函数调用定时器中断使能函数。2 a- s7 L4 G6 U4 u$ u
5 \4 z, q1 ^/ d0 g' v& f0 k
20201103174328713.png " S6 U% \: d1 t7 [; H  x3 k) W
+ s% z# `" h0 F# b
上述为新建工程配置过程,可参考《Cortex-M4开发篇1:STM32MP1微控制器之开发环境》章节进行导入已有工程,工程存放路径【华清远见-FS-MP1A开发资料\02-程序源码\ARM体系结构与接口技术\Cortex-M4\5_TIM】
, C' U% s7 c% U5 r/ \
4 i( k' Q0 S& x配置完成或导入工程后进行程序下载,具体步骤参考《Cortex-M4开发篇1:STM32MP1微控制器之开发环境》节进行开发板连接,程序编译、下载。5 y- v; J# \5 w; L: ?
4 `1 g- O1 U5 h/ P0 T. K' y! U
实验现象
; L* E5 t* l$ A# |可看到LED灯间隔1S改变一次亮灭状态! g' y& p5 A! b/ j- @
————————————————
; E" w1 a9 q1 X. n" h0 p3 L版权声明:左月先生) Y; I1 A7 S; b
/ ]5 S4 t8 w9 S. S% A

( u( R3 n# G1 u: P8 {# \/ U/ G
赞 收藏 评论0 发布时间:2022-9-20 21:13

举报

0个回答

所属标签

相似技术帖

官网相关资源

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