一、cubeIDE下载、安装
, O" P& R7 D. J; R- N' F: m STM32CubeIDE是STM32Cube软件生态系统的一部分,是面向st芯片的高级C/C++开发平台,具有STM32微控制器和微处理器的外设配置、代码生成、代码编译和调试功能。它基于Eclipse®/CDT™框架和用于开发的GCC工具链,以及用于调试的GDB。它支持集成数以百计的现有插件,正是这些插件使Eclipse® IDE的功能趋于完整。STM32CubeIDE集成了STM32CubeMX的STM32配置与项目创建功能,在通过所选板卡或示例选择一个空的STM32 MCU或MPU,或者预配置微控制器或微处理器之后,将创建项目并生成初始化代码。在开发过程的任何时间,用户均可返回外设或中间件的初始化和配置阶段,并重新生成初始化代码,期间不会影响用户代码。% z# G/ _5 t/ j7 K- {- g
; u4 [6 I* f8 n0 N5 X* M5 v/ C
+ I0 D* j7 `: o0 T
2 ]# r8 Y) x d% T. l下载完stmcubeIDE后,双击安装包完成安装:
6 O" i5 T, K! G% O! P" d% P9 j# `' t/ w) b2 _/ o) k- W
$ y' h! _* t0 E) E" S2 D& J
" C' W2 Q3 H/ F3 q安装完成后,去help->install new software配置安装汉化包" L) V. M# l. _8 [ Z& r8 {) ]; \
6 p, b6 `: r9 @
7 L2 A3 l0 g& a5 n, q. C: U% h6 `" P1 Q
选择简体中文完成在线安装
/ i9 Q( J: y: O( T5 i; Y. ?0 J0 q8 X: O. {
, Y1 R! ?2 M2 z. A% @1 u
7 i9 U$ ^9 l0 I) `1 q二、创建工程及配置芯片引脚4 _/ a2 i a3 M x$ r
汉化完后,重启软件,在文件->新建工程->stm32 project,输入自有芯片型号,本文是STM32L496VGTx
! a! _: N' K0 S7 F) j& t4 u
7 ]+ P5 u* D' W1 i4 C3 U& E x
8 H5 Q+ k% ~6 b% K+ E* B# h4 u
1 s2 T* o( ]3 y, I# p& h- p! |3 k
点击下一步,输入工程名,选择工程路径,完成工程创建- R( ~* v) T, t) k( @. k! f; S
6 B/ v0 o6 q$ q o% y5 T, J2 C8 e
: |+ G$ r7 ~: X o
# s' Q* o- E! k6 p4 }9 x8 K
工程完成创建后,直接弹出cubeMX配置界面,可以图形化配置芯片引脚接口/ X8 s2 Q5 x) ]8 f$ j5 H2 |
8 c$ W L0 ]8 a9 j9 A4 W 开启USB串口能力" a( j8 R1 k M* x/ s
0 g% T7 G- T8 z3 `9 B! @
& u* w. ^+ n1 q* o& K3 t
, F; k- F ?; u4 I1 [
本文仅开始外部高速时钟(HSE)$ R, D9 I* {' J' K" [3 |) V
6 l! r% f" g* y8 B% h4 O8 S4 }8 W
& d0 ?% ^9 n# R/ d
, m- L. J5 |* T7 e8 _9 f9 l+ p 系统时钟频率直接拉满到80MHz
7 J) C9 [$ Z; G$ n
, Y; [/ e4 s+ \/ H
& z6 k) E c7 [$ l% p: I
& K/ Z7 [) K ` 为了简单测试工程,仅仅配置三个按键及三个LED灯的GPIO4 \4 ]# H% J, v
: i L( B; N3 S) `$ U9 F
5 z N) n A) K6 Q( p4 J$ V/ t6 W) S% D. t0 T( s
工程管理,保持默认设置, {- J9 P! q8 e C7 O
- p* u4 `" [9 ~1 z/ [
0 l0 ?# q% F7 w7 h; e2 y; f
9 z# U6 S; a/ C0 Q- L
代码生产页面,只按需生成,为每个接口类型生成独立头文件及源码文件
3 @7 X, d' x* ?4 f( `: }) \& O+ Q. a' M( o: T& b C$ e
3 V1 y# x- H+ c* ?7 M3 [7 u
% w* O( z! A9 b6 n 高级设置页面,保持设置,1)本**PIO选择HAL库实现,也可以点击选择LL库,2)GPIO初始化调用直接生成(main.c中实现),也可在Do Not Generate Call勾选去掉,也可以去掉Visibility(Static)选项,不生成GPIO初始化函数6 q3 I9 c" t0 j1 K2 x5 C: U
d8 I" e5 p" i* e F1 t; R8 g
+ [8 G1 N0 O9 S I6 R
2 p" ~/ E5 |2 `: a 点击菜单栏保存或代码生产按钮,实现cubeMX配置到源码生成
- o; J* _5 x& E6 @6 e, O& D$ o# d% q1 o' N3 ~. x7 o' V* f
$ e/ Q7 h! a% R' c/ J- R8 ~: ^" f
1 }) i% w R4 _9 Y: T 代码生成后,GPIO接口映射信息配置在main.h中
- ]* S! b6 Y' \- C }* z
$ o! d' H2 ?( K" k# E+ o% `" b
" O" T8 ^6 L: Q/ {
' s$ E6 V. ~2 P K" x% N# \: J 生成GPIO接口源码为gpoi.h/c,仅仅提供了GPIO初始化函数,实现时调用HAL库函数来实现的。
6 d* x9 y! Y. S1 V' J9 Z+ o
$ p# ^8 R2 c. c! W
* ?3 P. K! l, `% W
% {2 \- V# d# E5 y 先创建自己的按键及LED驱动,该驱动同样是基于HAL库提供的函数实现,而HAL库和底层硬件打交道,间接帮我们实现对硬件读写控制等能力。
( p; T8 a0 h( Q3 I) ?3 i; G a9 g
1 C' G. o; v+ `+ J3 Q/ b) [' X三、编码及编译# _) c, i8 r( p: c) R, Q# {9 D
在工程目录右键->新建->source Folder创建一个源目录,并添加key.h/c、led.h/c四个源文件
7 s* h' ?& y* K$ }) I* M1 ?6 U+ c, J6 c8 G% y" K' X3 U* `
6 a: d- y. U( d" ?: J0 M" D
) o$ j; }) Y4 U7 C" m2 A9 t7 { key.h
5 z: {' E: d3 B ?; e- /*; a9 k5 L- Q8 [- X" k" b
- * key.h
/ Z, N( |8 g1 @3 }" P s% j - *
% \0 `6 m# F. u8 {' c2 T - * Created on: Sep 29, 20223 j* _# |! I0 k- `# R) c) r/ [
- * Author: py_hp9 B3 ?9 E, h9 B0 `2 C0 ^& N z
- */0 Q( T2 o6 a# |7 L7 Q
- 7 h' \( @+ F( t3 D
- #ifndef KEY_H_
' ?* M" R3 k" R! j* |5 N - #define KEY_H_" |& k! Z; P+ @8 p V5 S
- . [! M' _& w" P8 A) Y' q# G4 b
- #include "main.h"
1 x1 ~; m4 S6 Y- }: M/ H - #include "gpio.h"- ^6 U1 H5 ~; |6 t0 p7 x
- ! l! `* [" N/ v8 C6 F
- GPIO_PinState get_key0_val();
# k$ A2 C/ F7 U; f: s - GPIO_PinState get_key1_val();' T6 S# p! E; W9 m1 A: P
- GPIO_PinState get_key2_val();
) ~/ h9 D, T+ | - 2 M3 X7 R9 r6 t
- #endif /* KEY_H_ */
复制代码 ; l6 x4 t' T* k' G* D9 O5 w5 _; s; t
key.c
6 {% y! ?" [- E% N$ P6 C- /*
. K1 J O- K8 @) }( x8 `& ?7 j2 r - * key.c) f7 s6 M' T% @$ K( X: L3 r
- *" P u. L3 S, ? W
- * Created on: Sep 29, 2022
. A+ F* A$ u8 b5 f& ^ - * Author: py_hp
9 b6 f. n1 Q; F" m1 s2 h - */1 o' j/ f8 R. X( ]8 j& O, b) B- ^9 C
- #include "key.h"
3 d* }$ E7 |) P3 g8 T -
* }2 }' T% l( s - GPIO_PinState get_key0_val()
7 ?3 V4 |- L$ {2 B - {/ F' T, c7 {% q$ Z
- return HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin);
) M2 \8 T$ \% m# P: A7 _ - };: [2 Q+ b+ q" B
- 7 _/ Z6 g. x9 M z. v& B0 w
- GPIO_PinState get_key1_val() s$ H- Y$ e- b& R8 ~
- {
6 _6 j, W* b1 Q: h0 I! T - return HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin);# p& V6 {9 P V& S
- };
# X3 s1 `2 W( h0 P/ F& x' Y) w - ; ?6 u' ^7 q% f4 z- G4 S
- GPIO_PinState get_key2_val()) }* Y" w9 s- |+ C; S. m1 {
- {, ^) }" }" E6 G
- return HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin);/ g1 d. I# _! E2 H1 F- I
- };
复制代码
; [) J$ i1 [/ O
, M! H9 i% j cled.h% G3 [ C1 ]. J8 W0 w3 s2 l
- /*+ M" h+ D+ Z* o
- * led.h W5 r. S4 A* z
- *
# b2 u2 V( O+ x5 D& r2 Q. ~ - * Created on: Sep 29, 2022
# G; Y4 O' m f7 A: f7 i - * Author: py_hp
/ ?8 _$ G% `. X( B% I6 n/ R - */: q1 q" w! X: O0 F4 q7 l: e; [. Y
-
$ M* y! M3 J9 r. E" L$ @/ R' ~ d3 d - #ifndef LED_H_
/ D0 j, I6 K* L( B - #define LED_H_
/ a f) W& o9 H1 g. d+ W( a - #include "main.h"" c3 f. w, E+ B
- #include "gpio.h"2 G1 }9 g7 S1 R9 z" C+ P
- $ t6 O) _9 ~' P
- void Toggle_led0();0 W4 ^3 H) u8 M) p! F. b% }
- void Toggle_led1();( S7 {: V" ?3 {' u
- void Toggle_led2();" K# a( `7 [" [8 N
- ; }" F6 s9 Q3 {8 ~! A. l1 t7 H
- void set_led0_val(GPIO_PinState PinState);
0 u* D4 F. r! s; w% D5 ~" K7 z - void set_led1_val(GPIO_PinState PinState);- G. g! t6 U/ B D7 `
- void set_led2_val(GPIO_PinState PinState);/ ]$ w0 ~# C; Z+ a8 i* }! b
-
0 p. a6 n. X+ S' `3 ?5 B8 ` - #endif /* LED_H_ */
复制代码
% X1 u w; d" y2 Wled.c
) W' Q% H4 V, x- /*7 t0 r2 Y) _* U
- * led.c: \6 z& ~) K6 P5 y$ G' a
- *7 \8 {7 z* _- R9 Z* }
- * Created on: Sep 29, 2022; C; v# L3 U! d; N3 M& y) i& F
- * Author: py_hp# o6 g4 ^0 T& W& _9 t7 P
- */
( f: P$ F" q; H; r! \8 _ - #include "led.h"
) S1 [, v# O3 [, Q5 M( y/ h - 5 w" p* n% L& K/ v* r
- void Toggle_led0()' j4 q! f" C2 G; C& g5 ]! n; {
- {2 v$ x0 J7 n/ U6 s# d. `
- HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);4 n' l+ `# b& @ V2 q
- }
+ |: ]0 K$ d. _ -
4 |7 n* E+ `) M/ a$ K - void Toggle_led1()2 S5 [/ C6 o( h
- {
4 i. \* u1 [$ [4 o2 C6 A - HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
1 T, Q, b: t9 ~ - }; C" I3 A" @0 v6 J* R6 q3 E! W
-
7 s: n6 u Z; |) w' y% t% b/ @ - void Toggle_led2()
. S" ^' t+ f) h: M" s Q - {+ H6 c1 G2 l0 H# i# W# }1 n
- HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin);
3 `. {8 f7 _4 W x" {" z3 W* } - }. ]! P0 n: M" R! x% O
-
% j5 n6 Y/ b p# a - void set_led0_val(GPIO_PinState PinState)) n1 c$ C+ ?! h6 M! u3 h
- {
, @% p. c$ B! r! O. B) _ - HAL_GPIO_WritePin(LED0_GPIO_Port,LED0_Pin,PinState);
- t) u6 G' F9 Q0 ^0 D6 L - };- c: M/ @- x$ [; K2 ^* o; A
- 4 G0 N: c4 V4 m5 d
- void set_led1_val(GPIO_PinState PinState)! R" o, W9 s4 ^. x- Q7 P0 w
- {
+ F9 E! D9 E) Z# Q. R( X8 K - HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,PinState);
! v B8 V- y, U - };
( J( \2 W1 f# e - $ n0 R4 L/ R4 \$ C
- void set_led2_val(GPIO_PinState PinState)
' ]/ J' Z) J/ j1 d" K) C - {
: T0 N% L2 Q2 c1 t3 x' z2 [ - HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,PinState);
# s) P. v+ ?0 k1 j! I2 {9 p9 n& V - };
复制代码
. D Q, v! g( `: ?7 V7 z 在main.c加入key和led实现,在代码预留用户自行区域加入自主编写代码,这样cubeMX改动后再次生产代码不会修改抹去自己已经写入或修改的代码 U# H2 p+ e; O0 j& Z
# q$ m- e2 N1 G0 v( i
添加头文件- H+ u" H7 j- z! s" D% W2 M6 u
# q/ Y/ e: G1 g0 b8 q
5 v2 ?1 [% Y6 o% D% h
8 A7 w8 U( d. \# |8 @! C0 }* K' e 添加函数调用实现,可自行斟酌调用1 l$ r2 \% P& {
6 A0 r' B" f! u8 r
9 v4 N2 V+ V" n: n+ \2 W+ @
* g5 }* e* k( K9 a/ L6 o 右键点击项目,进入属性页面(也可以直接菜单进入),勾选本项目编译程序输出文件格式支持# K" e% S+ ^) Q" X
/ Y. {/ M% B5 s
" S: G& T- k7 K# R* t7 A
V: P/ _% s# V$ \
点击编译按钮完成编译
( A3 {: m( L1 c$ q) q V R5 X$ o- W2 U- _. G# \" \
0 D* J* P% @; K$ V8 D* d _5 `1 q5 r2 A. S# Q! k% M
/ I2 W" S" C: e. ~: v" \; V, _
四、加载已编译程序到硬件及测试
& U" y: u$ Q l& Y' g4 \ 点击help->ST-Link更新,运行配置更新,便于直接将编译好的软件下载的硬件上。% Q- v+ ~8 @( M+ R6 j# ?! g
R( e% F) G' t
2 E& r! T) \) ^) a4 c4 ^
% L& z5 F {( M- x/ ~6 l 点击运行工具按钮的运行配置,进入配置页面,在STM32 C/C++ Application新建调试配置,每个项目仅配置一次,后面就可以直接点击运行按钮加载编译好的软件到硬件,
# u# F! |$ L: z8 U3 ?7 w3 V b& ~9 g! U# K( y3 v! i
6 @2 _2 A; V% ?- [5 u
, _$ V, Q5 B$ Q0 V. _; Q
; q) R9 j) ?8 P0 G1 e( f
! q2 x- I& F' M! l4 D+ f
将电脑与硬件用数据线连接,点击运行下载程序
$ ~7 E9 w6 A7 {; k) X. L& S7 x4 r# _! e
; `, H# f5 W. v3 {( M6 h0 E9 w9 _3 @' \& u" B+ [! V6 w
或者采用其他下载工具,如STM32 ST-LINK Utility加载1 b* h% e+ d- a+ U) g
! A% t7 S# ?; |5 W2 i# K
! l* s$ `! ^( D! W! @$ E
3 q3 Z2 W% b6 G2 Z( t, `- U五、程序运行效果
$ o1 K' J- O( w 展示效果如下:3 D' Y0 a; K* s3 V& H- x2 \7 o9 \
- Toggle_led2();//闪灯
) C2 S3 Y" \9 z# y$ l3 I1 P# T- M - set_led0_val(get_key0_val());//按键亮灯
+ N2 f) i4 t$ U. y - HAL_Delay(100);
复制代码
) f0 O0 b/ r' _. A! Y 【1】闪灯9 `: R4 S- ?4 V L) }* D
: t0 \9 B2 n* u1 l% h
4 y# r: E1 Y" l; O& T; C
% Z/ D0 f6 R! V( S. f/ V- o! o 【2】按键亮灯) x" r' F. @5 n6 i0 q2 `7 r7 z+ q
7 z3 Y9 H M, J& e r* A K2 H6 w
- L" g4 P- ~0 j" g: Q3 H
0 s, G$ F& u) `$ V( ?2 p( J4 n
————————————————
( v& l5 q3 l* w# J9 X# o" r) j3 K" }, ]版权声明:py_free-物联智能
. S8 T. d9 T% k! S' ~如有侵权请联系删除 s* m: q8 U; L$ \, U
3 S' a9 k: b q
% D, a, y; t* k! r4 I2 e, i! M. K. `% }
|