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

【经验分享】STM32Cube 中断控制器NVIC

[复制链接]
STMCU小助手 发布时间:2022-4-25 20:55
7.1 新建NVIC工程0 C2 p! n! G+ W8 y: b
7.1.1 新建工程文件

6 M7 w5 ^4 Z( B: W5 `: d5 ?" G; j在桌面新建文件夹,命名为“NVIC_Project”(根据实际需求选择文件夹存放路径和命名,其中路径不能包含中文),用于存放串口实验的工作空间。打开STM32CubeIDE软件,点击“Browse…”按钮,选择 “NVIC_Project”文件夹路径作为工作空间存放路径,然后点击“Launch”按钮,启动运行STM32CubeIDE。
$ k9 P" [  }1 `+ s% a. r; S& L: M$ ]
MBQN{S3WYG0K7A5HLTGO24L.png / X0 h8 Z" Z) Z$ _% x" e
0 N  _$ }/ v* o
点击“Start New STM32 project”按钮。
  i) B% E0 a' Y- y. x+ [+ o' l0 [3 L: `: l  g
B5[(T9_C%M0~W00YI0CMW.png : Y+ i* X/ |, k' [' r- D: `

4 N$ E; h, |, b% z. z7 T在搜索栏中输入需要配置的STM32芯片名称进行搜索,例如本文使用的芯片就输入“STM32H743II”,并单击选择对应封装“ LQFP176”,即可进入下一步。9 r6 e4 O/ j- x) I% w, r. P
" u" c  `( ~4 ?  o
)H0@8$%V{UUTF4_DIRL]W{H.png
( z" N6 G; G- Z9 W! u
9 o& a. b: M' l# S4 u/ T6 ]在进入芯片详细页面后,可以点击“Block Diagram”或者“Datasheet”对芯片进行概览。在确认芯片信息与手头的芯片一致后,点击Next下一步开始配置芯片。3 D, ^% ?% z  r- y, Z; y: S# G# E& @
1 Q# h4 l- S1 B  f. m. U
1e1c540b95e9416a996d9069b0c57bd0.png
$ K# v  v- x  P- Q4 T5 W0 g4 S  g( F: q$ H7 x$ Y& [  o6 q4 Z  z
输入工程名,其余选型默认,点击“Finish”按钮。操作该步骤前需要保证网络正常,因为STM32CubeIDE需要下载对应芯片的数据包,也可以到STM官网上下载可离线安装的数据包。2 F: w( q$ s5 Q. k( o
, h- W1 Y. E! y) [3 w) x
P`(O`T56LX0M[5JG]RIE$@E.png
3 d' z: S  d2 t% q. L. ]9 r# \/ n. f& ]2 s, Z% D. j* g
点击“Yes”按钮。
; k8 Q9 w" P$ f" j, A8 X1 M- U% A0 d- }. G
820e31a8c0f84c34bcd0ae4430b0f99c.png 8 R* \& \5 C5 l0 }) W& Q
; m8 T, F( u) G6 x1 ^$ Q% E
点击“Project Manager->Code Generator”,将“Generated files”第1和第2选项勾选,其余默认。+ d' r; p; o) @0 ]) q( _# H9 S
# ?; B* `* B4 K% t  [- f
(73$A[U]9R29MF08LR1NK.png " q% e( v" \( w' Y0 i- D5 x; z8 m

! Z4 O) ]" h1 Z; L+ Z4 C点击“Pinout & Configuration->System Core->RCC”,在“RCC Mode”中将“High Speed Clock(HSC)”设置为“Crystal/Ceramic Resonator”,其余保持默认。. F- w2 Z* [9 L
) f  r# V1 e0 ?9 h. ?
~CE($Z[LA1)1V`{8(~75$A6.png
& t2 }6 F+ \/ T- b2 G  d5 `+ a9 i1 l
第一个选项High Speed Clock选择Crystal/Ceramic Resonator。其余选项无特殊需求不用打开。点击“Clock Configuration”,在“Input Frequency”输入“25”,在“PLL Source Mux”选择“HSE”作为时钟输入,在“System Clock Mux”选择“PLLCLK”作为时钟输入,在“SPI1,2,3 Clock Mux”输入“480”,然后按回车键,其他暂不设置,保持默认。# y  d! r2 q0 m8 F+ D) ~& h

+ L, A/ Z! X4 Z2 @  d" M _W~8O516F(V~W_8$N4J8I[Q.png
# s: ]& D7 m* f
: B$ Y: \: A5 ]! H. }- j/ k( G7.1.2 配置芯片内核6 S. C1 p9 v. @# l  @' f
点击左边菜单栏“System Core”的“CORTEX_M7”进入M7的配置页面。( j* w5 X0 b! a9 U

2 }2 s0 h' s  H  I  A8 x LW3%7M(NC0ESZ68EO8DB3TP.png
9 G( T  S0 V3 F/ `0 E$ a/ n) G. s1 o. y
CPU ICache:使能I-Cache,用来缓存指令,选择打开。7 ]+ j5 Z1 J7 E$ T
CPU DCache:使能D-Cache,用来缓存数据,选择打开,其他选项不变。
$ K, x' t" w5 N5 v! q点击左侧“Trace and Debug”,进入“DEBUG”页面,用自己所用的调试方式,选的是“Serial Wire”。下面的选项是外部触发调试,暂且不开。' |: Y6 W* J, B- J6 L% e) e9 t

! n5 t* g. w; j2 w5 c9 _  f R@C}2V~Y@WJD_H4NZF4OGTA.png
3 s: h4 V1 Z) U
; v1 |2 r9 p' L$ W; c. H9 T7.1.3 配置GPIO用于LED2 C  G0 U% {  s! E2 E1 `
点击“Pinout & Configuration”,在软件右下角的引脚搜索框输入“PB0”,此时,STM32H743IIT6可视化图的PB0引脚闪烁,点击“PB0”引脚,在弹出的PB0功能列表中选择“GPIO_Output”功能。. ]( t& _3 f' M+ X1 ]8 \

: p! k% Q# E0 T1 ]+ ^$ s/ H7 [ %9}_Z(UD`X5}K]P{5BOS_R0.png " x; E! {) c. ^& f8 [, H6 @

  X9 F! c! m% s  [/ {同理,为PB1引脚选择“GPIO_Output”功能。2 r3 W* i: Q- n8 q2 Z" V! c5 r

2 n! S: B  x1 O/ o. A) ~ ba05291721434209ade8fe1828fcfccb.png
: k% Z, O  ^9 a. M4 x" r' K1 V9 Y* Z: r  ?0 L
点击“Pinout & Configuration->System Core->GPIO->PB0”,在“PB0 Configuration”中,按照下图对PB0进行配置。
! u2 F4 f" n0 R& o6 [) m( r- J+ d+ e, Y
6G]$S]T_MEM(TEPTTB({6(4.png , \/ g* d# A0 P5 }4 _, H: ^

1 t8 @: p0 t! A' b' Q* y同理,对PB1进行如下配置:9 p6 z9 M+ c3 j- N4 x3 e
GPIO output leval:GPIO的输出电平,选High为打开高电平。
' T! r/ Z# c& I4 t- s! yGPIO mode:选择GPIO的模式,开漏或者推挽,这边选Push Pull为推挽模式! U$ J3 t7 X% d' G5 u
GPIO Pull-up/Pull-down:GPIO上下拉模式,这根据电路LED选上拉模式。
5 y1 _. r3 i; k' g' j/ F3 tMaximum output speed:GPIO的IO口响应速度。选择High高速模式。$ ^8 H6 _( A! I. A- {7 y
User Label:GPIO的程序使用标签,例如本文这边将PB0的名称改为IO_LED0。
! ^2 W: C8 x6 Y9 l( g. n7 f7.2 使用基本定时器中断

* p+ {4 X9 L6 U5 t7.2.1 内部定时器设置
& A: I* C' R$ K" v2 m
首先我们需要在定时器配置栏中将定时器初始化。
4 \; X! B( Y& U9 X: u4 K点击“Timers”-“TIM1”-“Clock Source”设置为“Internal Clock”将定时器1使用内部时钟。0 r) ?* g. n7 k: X6 {% t* Q) z

* b( n; _5 d5 R
& \4 p) t! P! w5 ?, |
# }8 @) P+ b% x8 Q此时系统时钟需要刷新才能自动分配给定时器中断。点击“Clock Configuration”,点击“撤销”返回上一步,再点击“前进”复原以达到刷新的效果。/ l# U; R: I1 O) B

, ~9 l+ H9 a, x" ~8 v9 R/ k 5S6{M{I19F]7LAP714J78IQ.png
( f! `* s- ~. u. v& e/ w0 c5 |0 ]7 C4 C, v5 `( O
接着回到之前的TIM页面,将下方新增的“Configuration”将“ Prescaler”分频数设为48000,将“Counter Period”计数个数设为1000。由于系统时钟为480MHZ,因此将分频数设为48000得到10KHZ频率,10KHZ一次读数记10微秒,计数1000使定时器1在100ms时中断,并打开“auto-reload”开启自动清零。
9 h% e5 ]1 m5 u* t! }- W) s9 D+ F& e
]}2LVGA@MYNVK4QC9V7RG5I.png / ?8 ^) [* t7 r7 V+ l* q4 V
8 a+ y' F/ O6 n! K6 I: O; g' E) {" c
接着点击“NVIC Settings”开启定时器中断即可。( t! v# X" C- k# \1 d$ v
TIM1为高级定时器,开启“ update interrupt”即可。
( u% z# M  d3 A$ J$ C. a" c: |
1 ^; s( G+ a) t& G6 w  i% D- C ZQ_D}YC@S`R))_CMPLSINHD.png # Z" f! V* z, [5 O
: T# |3 v* R$ M/ W4 r0 s
其余普通定时器正常开启定时器即可。
5 q- h0 V5 k$ x! @
( k/ z; V6 [$ U/ m- ?$ ` 4dc5cfb33b9e4c10bc9e1275d574169b.png
( j3 H- `* h" ^
" O4 [; |" z/ [' l+ C" ^5 c7.2.2 编写程序代码
5 J7 U4 v  `9 m
点击保存,并生成代码。
2 E& u, `$ h" _% q7 _4 }/ Q! F6 y
+ S8 L3 w- h; q( P2 J( S  F% L OMAERI2YQD`E]S9)_(6_)KX.png ) S$ Y  H+ E7 o
% n* L3 G$ m! d1 Z8 I
新建NVIC自己的HARDWAVE文件夹以及.c和.h文件,并添加路径调用。(详见5.8章)4 b" N$ |9 O6 e- L
6 @5 \8 f2 {2 [- M5 i
0420ad9dbbf7463cb50dd9b3d09c81d9.png
5 [/ J: O& T+ T3 V! Z( M9 ]  j9 X4 U9 _* ^2 ]) |' S( O& t
f3447adb6d5d47fcbc8eabb29e8571c5.png
8 o2 h: J* f4 F0 f8 R. q/ @! w' x
' c- F6 B( b8 t. U7 {
; I, ~. N+ ?* W8 V% |; Q  ]& [+ n( o6 h' o6 y! U
在“NVIC.h”中完成中断初始化函数以及回调函数的调用,同时调用“GPIO.h”“TIM.h”
; G) I0 t& h' Q+ a9 U1 k, p& {$ ]7 M' @. x  M0 \: O. \8 o4 J% z9 l. }
42c1f1ec89db4772ab353d479074ab38.png
1 o6 u. E# h6 |+ j. Q- z9 d( D! C! Z3 q, `- Y6 r/ q
在“NVIC.c”中调用“NVIC.h”后,将定时器中断初始化代码以及回调函数添加即可。9 a3 t& o! R8 C. b& H

5 A) h  v! X" k9 I$ B, Z b55c840edf71459ab68d2a997f529cdc.png
& B9 w. e6 [6 k8 i7 P! j5 f% y5 c8 I
% A4 C. U: D  C" |6 l最后在“ main”函数中调用定时器中断初始化即可。
  o2 ~% x& N/ s- a4 ^. T( T0 X6 `# K  |1 W( _' @; H* ^) _3 t
51084b9444764f15bc862753a66b8009.png
9 d: U! a( t  e9 }. d$ F# t
/ z! B  K* l8 b, n6 c! b% O烧录程序 至单片机开发板,可以看到定时器正常控制LED闪烁。
- l2 E0 f' o9 I) @& D# Z! m4 E% K
0a8a3a1dc38a411396f3c6569f80341c.png
6 o7 v% ]& B  A9 f: e; g! [7 f8 ?& ?' H7 Z8 [: M
附上程序:
  1. #ifndef INC_NVIC_H_8 u, ^! |8 v$ l, U
  2. #define INC_NVIC_H_
      Y" b  [3 k8 c- }1 `' E
  3. #endif /* INC_NVIC_H_ */
    ! o' Y. e0 a. o
  4. #include "main.h"  R, F2 r7 J. R+ \4 B, a, \
  5. #include "tim.h"
    ' y1 C. k; C* }+ f) @9 G& M
  6. #include "gpio.h"2 _6 S) j* z% ~  X, r
  7. void NVIC_Init(void);
    2 C2 d' ^( c2 L7 |% U; e3 v6 e
  8. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);
复制代码
  1. /** Configure pins
    8 L  l' \2 m- F% M5 M# ~# p2 R
  2.      PB0   ------> IO_LED0_Pin7 B- n3 [# C9 x: t& i
  3.      PB1   ------> IO_LED1_Pin
    6 [% Z7 m( W' ^- L
  4. */# s7 r& S, r% Z" K; i: I
  5. #include "NVIC.h"
    , N3 c( i& W) F9 K+ `
  6. void NVIC_Init(){) f8 g1 S4 j3 \0 z; c% E7 x' m# F
  7.         HAL_TIM_Base_Start_IT(&htim1);        //HAL库开启定时器1
    ) J7 M+ X! V0 Q, y( F$ z( g" T
  8. / m1 {+ v" y/ f0 |/ m
  9. }; r6 Z# y' k1 f  U6 q. r
  10. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {        //中断回调函数. g, f8 K3 H' Z( t2 I+ r6 g/ a/ `4 V
  11. if (htim->Instance == htim1.Instance) {                                        //判断是哪个定时器产生中断
    # p' A6 k1 d" G* d5 S
  12.         HAL_GPIO_TogglePin(IO_LED0_GPIO_Port, IO_LED0_Pin);        //HAL库控制IO_LED0电平反转
    / o: e" F+ z4 z5 L
  13. }7 Z6 T9 B: D2 v) F. |& _
  14. }
复制代码
3 {1 l% `, `1 Y) c

: a( J4 F8 d* W  Q- ?' o0 q( p' X: t  N6 r8 s8 `1 q3 ~

* Q( _" @0 m' B- K5 \) T% }3 n" C1 E2 s& G% z* V' w& U$ X
赞 收藏 评论0 发布时间:2022-4-25 20:55

举报

0个回答

所属标签

相似技术帖

官网相关资源

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