项目简介
3 W6 [0 r# R9 ] 利用CubMX生成基于32单片机的HAl库工程,然后编写程序在proteus上仿真验证。本项目最适合没有开发板的同学学习,零成本利用仿真软件率先入门STM32单片机。本项目需要实现的功能就是利用CubMX配置外部中断,由外部按键触发外部中断,控制LED灯的状态改变,并在Proteus上仿真验证。
" k( j6 z( o: t- x" d, `
) I2 F. r, t# M0 V, m3 A4 D6 m硬件模块
' e0 B( y9 e0 a( F# |, H STM32F103R4
1 Y p# E" F9 i i- F8 m LED灯
# `& O, ]. {" d9 c; q 开关Button等* T9 q. P b" D5 \4 R1 E3 x* v
4 V- S% _) m$ l! `" U, H: s$ ]
软件工具, o$ ~! Z! ~% [: g2 I$ o( @
CubMX
) u3 R2 t$ H D' Y Proteus* N# H8 \3 X, E8 Q+ F
KEIL
) g: _9 u6 E+ E
1 P, b: }+ z% A5 L电路连接图+ o4 c) u+ n9 |% c" A
9 I; C6 |+ c1 O( F: R
/ V9 E6 u/ r0 z& L; ]
' O: k# R0 k4 W( h! ^工作流程
& H/ L; A( L, [( e" Y- s- v4 Y
首先,创建好CubMX工程,PA1作为LED灯输出端,PA2作为外部中断触发端。
' R% O% ?( e5 u+ a( `# m2 U+ G3 V6 }# ~( \1 W F. `9 X
/ ?& [7 \7 v) a* O, `! A" I0 T q |9 g( r+ E5 K
设置好相应的GPIO参数。* t/ W: J( R' t& l
9 L; \4 u, D" }. f! o9 H
) W0 b+ \( [" d2 \
0 ~: O3 ~4 ^2 [$ H+ F1 R$ p* N使能外部中断$ M% m6 P6 I" n- }' G: C, M
. L4 P7 `+ M# X2 H2 I# w
+ _6 N" [2 ^9 W' U: l' a
: x/ n% Z$ a: L. _+ B- z8 {4 f
其余按照自己的习惯,也可以默认8 q, k. n, }/ L) u' N# x# F
4 T( F3 S" l9 F5 S. v
/ n7 Z* A/ i* Q
3 H; c8 W* ?1 P: C3 B# n
4 {$ v0 P0 `( r7 ^) ~! j0 @$ M
' h" p) m, ?9 Q# r+ b最后生成代码即可。
- D( F) Q9 q. t
- ?, @( }# d4 z. ?
% s ? R" A* i5 O& Z2 b* [3 ~8 X7 h; m% N) h! W, a
左边stm32f1xx_it.c中有系统中断的相关函数,在main.c中只是对外部中断的引脚进行设置并使能。需要在stm32f1xx_it.c中查找使用相应的函数才能实现需要的功能。
J1 e1 n! Q9 j* f( X1 m1 `) G
6 }7 b: P- j* i) ~1 r
. C, ]7 c6 e2 l0 _5 o* q% Q
. H' S9 n5 q- t8 l1 J ]+ A
首先在stm32f1xx_it.c中找到EXTI2_IRQHandler(void)函数,
3 c, J5 }6 e8 @+ M( i2 o- V M# z. A
) t# B. k4 Y7 d0 k2 P1 H( N
, W. v: J6 m' _; D% u, B2 c. P. V再进入HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2)中断服务函数,里面主要有两个函数,一个复位__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin),另一个是回调函数HAL_GPIO_EXTI_Callback。6 h- I0 U7 \" O+ `" R
6 {; N$ h: c7 x# e; ?7 ~; g
| `1 R, l; Z3 J0 {! w! u
# `' q# _4 h: i) g4 L3 y
我们需要把自己想要的功能写到回调函数中HAL_GPIO_EXTI_Callback并添加到main.c文件中即可。5 u* D+ b9 A# P
5 ` o" Y% b4 }+ x/ x7 j
% B. u" U3 `. t& |7 Z( e8 e: E
, H$ P2 N# S5 `$ c3 C: t接下来,我们需要创建一个Proteus工程,用来验证功能。1 v( P- B9 c6 v. l5 N) y
0 \+ `, n" u3 w' a- R1 c
0 B5 c# T' j9 e2 H, Z5 _
4 X- d( a2 @4 B$ m开始验证。默认情况下LED端是高电平,即灯是灭的。
: O% x8 @2 V; P, T
! a x1 i3 m8 Z1 P6 @
6 L" D' ^4 m. d5 Z6 d# n
( a' z: A [( u$ P/ z# x按下按键后,灯亮了。
2 t1 F# K0 a4 o, g
4 L5 `7 l1 A7 x; {
J! [6 {7 { V1 V3 A/ c- M8 C5 l; K# _- [# T/ f" K" B3 J7 k& J3 F
再按又灭,继续按又亮,以此往复,功能成功实现。) f# i8 ~& V( s; n4 v
& D A% j# @& d' e/ \; [2 L3 w; O程序代码. K( n# T. m& ?& \) T
main.c
" y! E, H, C; |/ B; N9 m7 ?- int main(void)8 }' X0 N2 w2 a) v% \
- {
, r* U& p0 c" z - /* USER CODE BEGIN 1 */: U* ]1 `- q, |9 V+ U* |& g
* E+ ~3 Q. i. W. ^* l8 ?' R1 A- /* USER CODE END 1 */6 I3 \* O. _8 n: w3 {! K
- # p: ?3 ?9 n+ m
- /* MCU Configuration--------------------------------------------------------*/
2 ~8 K m7 G% q G: H2 A- W
6 I7 x3 A! g R$ e- T3 B. C- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */4 n6 p% `/ E. F0 I% h) b
- HAL_Init();
' w& \+ F6 [3 v6 x6 R/ d
9 L' n6 ?, c8 h) ?; ]: z5 ?/ R- /* USER CODE BEGIN Init */6 e! B: n8 N1 h( t6 R- V! d
- ' a9 A' F6 q$ c
- /* USER CODE END Init */7 Z: X, O2 r' K# h; E. K+ Q: \$ a
- . ~. `: X$ Z+ @9 _
- /* Configure the system clock */: s- P, g4 \2 k7 O2 F4 M
- SystemClock_Config();
4 ^' [! Z, u/ O1 R - " U0 s" }1 |) K4 u
- /* USER CODE BEGIN SysInit */
9 h- S( b4 P. ?- J% m" w# V - 0 z' M/ S1 v* ]2 [% c" k
- /* USER CODE END SysInit */' q1 F" A( [2 H: K5 V, b
: r7 j0 J% _5 c- /* Initialize all configured peripherals */
! E u) `- Q' X d/ B" Y1 v8 E; u - MX_GPIO_Init();
8 {$ c$ l* Q0 e) U7 \$ ? v - /* USER CODE BEGIN 2 */
9 Y' K6 h- ~( o) N% V, e- B" o
/ o; |3 R1 o* t9 W7 b7 g, @2 ~- /* USER CODE END 2 */2 M1 w7 R$ x" w1 \- P- Y8 y( z
- U" L2 \, {. t3 V7 t- l
- /* Infinite loop */
& O# L" U, Y+ {& H( f# a8 j - /* USER CODE BEGIN WHILE */, n) p4 E; f; z k/ K
- while (1)
; T# }" [1 B: N3 Y - {
: ~+ }+ I" Q3 b0 q" {, j - /* USER CODE END WHILE */7 V; G1 E3 Z1 c
- 7 s, M0 d2 Z( w" g8 Q$ g, ^
- /* USER CODE BEGIN 3 */, r5 k, ^3 ?; ~6 W. y
- }
2 {; A p" l8 O; ] - /* USER CODE END 3 */; L$ ^& L4 E9 L' z" `
- }) p1 q, G b/ c0 o% t% i i
3 f6 t8 Q8 _' V+ }1 \- 6 t: b( y9 a. E/ [ Z
0 \' E8 a0 H+ T% `' v
1 o4 D" @$ E# B( G: h' K9 s5 O/ f- .....
6 \. n2 I, x% n! L% p5 W5 H& s$ u - 8 l' T) |2 Q' h9 u2 d) {3 Z1 _
+ c+ {+ p4 T5 b G6 D& f* c- @1 ^- ; j- k# b/ X2 O
- /* USER CODE BEGIN 4 */
8 W# G3 n2 I6 T8 ~$ D0 x - void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
: X9 {; o& y" N - {
" I) j' W- e/ k" i - unsigned i;' O$ p" C* W7 P5 j# v5 p t' @* Q1 ?% o
- i=5000;
1 R) p$ [0 S. m% T! _! S - while(i--);& ^: w7 @) F L& s: G( }6 X
- //HAL_Delay(20);//延时函数消抖,防止误触发
" r6 w/ |9 K8 A: R" {' |9 @ - if(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin)==0)$ ` D* S( c3 M
- {9 q9 f+ i5 v% l, `/ J
- HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);//翻转LED电平9 ]+ V H- O! H# U8 t- W* E
- }7 T @8 c1 {& _+ F5 Z5 C8 _
- }7 p0 J! _9 }! E/ A' h
6 e* n; S5 i0 K+ M# [2 e- /* USER CODE END 4 */
复制代码 1 {* E3 z3 S Y2 p. X4 X6 u
作者:jxjajl
$ @) k5 v! `1 M" _4 J2 _
; I' y0 ^/ b" W8 H1 d s6 K: G |