一、cubeIDE下载、安装
' F \; w4 s+ r, E. l8 y STM32CubeIDE是STM32Cube软件生态系统的一部分,是面向st芯片的高级C/C++开发平台,具有STM32微控制器和微处理器的外设配置、代码生成、代码编译和调试功能。它基于Eclipse®/CDT™框架和用于开发的GCC工具链,以及用于调试的GDB。它支持集成数以百计的现有插件,正是这些插件使Eclipse® IDE的功能趋于完整。STM32CubeIDE集成了STM32CubeMX的STM32配置与项目创建功能,在通过所选板卡或示例选择一个空的STM32 MCU或MPU,或者预配置微控制器或微处理器之后,将创建项目并生成初始化代码。在开发过程的任何时间,用户均可返回外设或中间件的初始化和配置阶段,并重新生成初始化代码,期间不会影响用户代码。
) u! L3 P/ k& F0 I$ k
3 T$ z* w+ N. Y4 M" N; R4 k
7 N/ z+ L ?+ t; Q( H! x- @& [# Q; A X; h9 ~& ]8 Z
下载完stmcubeIDE后,双击安装包完成安装:. s* F" E, I8 d8 G" D* n
2 ^* b: [7 a0 t& k+ o/ X
- u( ~8 Y8 F# c: k$ O. Z/ e6 ~; t2 z3 i L; i
安装完成后,去help->install new software配置安装汉化包
2 X Y+ T5 ?% v& Z9 j. f+ f6 @; G; g2 S: B; J+ Y
6 ]/ [6 J; h' L+ F
) m X( y* Y( t9 \+ }0 v选择简体中文完成在线安装6 Q2 d. m' z9 b
9 ~4 p+ C) y- r: O$ b4 p- `
) y& I) W- g; v H& Z. k" E1 s! \8 i K' D4 z5 X
二、创建工程及配置芯片引脚
) ?; D4 K- z8 ~+ @6 y 汉化完后,重启软件,在文件->新建工程->stm32 project,输入自有芯片型号,本文是STM32L496VGTx2 [- G; C2 c) O1 E% J$ c
$ N5 E) r- X9 g: W! K- S
- L$ }* v" I; W& C" W
% N0 W8 v$ h/ B* E' u, S
点击下一步,输入工程名,选择工程路径,完成工程创建
+ _+ j! \) J/ F- j
" O& |# B7 H" Y" u' n
# E; _ O0 d) F+ z) }2 H4 ~( `
. _- u/ @6 T: r- e# U 工程完成创建后,直接弹出cubeMX配置界面,可以图形化配置芯片引脚接口
, U6 _7 O$ i0 G5 p
8 t. s2 M) z2 @( t 开启USB串口能力
( A! h `9 r9 Z* S, y. A+ O8 ]8 b5 G8 t+ q
# q; L4 M/ c5 f, S# |0 h) j" v
: g' h: Q1 t' G8 b
本文仅开始外部高速时钟(HSE)
4 L' G* m Y8 b( w3 ?/ \! n9 I# T2 ^/ w+ m2 @' p
) K* S0 \$ {2 r( @9 s4 `# N. [$ a% S, o1 N" c: m* F, o
系统时钟频率直接拉满到80MHz/ v: m2 p: {' U! L6 O( x
" `) l3 @* Z3 l
- u7 n9 X1 ^& G; ]$ p a
( J3 B" j2 g5 J( n, ^
为了简单测试工程,仅仅配置三个按键及三个LED灯的GPIO
( t; w% Y1 G7 }4 @4 Q Z4 y' B, e; i+ { R3 _
+ [; t* J0 C0 i2 v- a/ z2 l3 z- j8 j+ @/ G9 } G6 m* l% P0 [
工程管理,保持默认设置,: z3 f5 `/ |8 p1 K5 ~
1 U. d: h* A& d) R
' B* ]1 G6 g7 C! l# n' P( C
& T% y2 e/ @+ a4 M6 { 代码生产页面,只按需生成,为每个接口类型生成独立头文件及源码文件! ~ E" I2 W2 l# L" F6 o
5 o, q5 ]7 T* H7 L2 T
: c5 q/ {; o% \$ b# f
/ p. ?5 _& H0 f& z- P1 U 高级设置页面,保持设置,1)本**PIO选择HAL库实现,也可以点击选择LL库,2)GPIO初始化调用直接生成(main.c中实现),也可在Do Not Generate Call勾选去掉,也可以去掉Visibility(Static)选项,不生成GPIO初始化函数2 V6 u7 [+ s l! n3 L' C. U7 F
, P7 e5 M8 B- M9 m* }3 }) D
- Y4 X- @- P0 L! Y0 W( q1 c
1 e! P& z) v& ^9 d# f z 点击菜单栏保存或代码生产按钮,实现cubeMX配置到源码生成: j$ @$ Y; h* n- P2 m
9 A2 L0 o8 ?: B/ S. U' l
# O& W+ m Q! _+ `9 f. Y
/ R# n$ }4 F) \% C* X0 Y 代码生成后,GPIO接口映射信息配置在main.h中0 _8 f6 M3 F6 f7 _
7 H" `0 Z( R8 a0 m5 @% t
2 p+ K2 X: Q `* A0 ?0 L
- S. v9 F: O& Q1 ]' J 生成GPIO接口源码为gpoi.h/c,仅仅提供了GPIO初始化函数,实现时调用HAL库函数来实现的。
* n# w k9 ?0 o* a3 v7 L" j9 }6 @# W/ Y$ X
6 k S. e1 y6 J
. E6 p3 |. x7 O; n2 h! Y3 E 先创建自己的按键及LED驱动,该驱动同样是基于HAL库提供的函数实现,而HAL库和底层硬件打交道,间接帮我们实现对硬件读写控制等能力。8 E6 D/ G) m# |( b$ T( L
4 k% x5 E: H1 o1 a6 n8 M3 B( w4 C# v0 w$ X+ s- [% p
三、编码及编译
! s w" s. n8 v+ S$ h$ m0 I) x" s 在工程目录右键->新建->source Folder创建一个源目录,并添加key.h/c、led.h/c四个源文件1 N# C; [! {2 S5 l( g' b! y5 _# X
. ?# r, d( |% v% ^% k" ~8 ^
, `3 U# x0 Q/ X( S/ H, K
& a; p* m f! ]9 P, e9 e, A$ U3 Z$ J key.h7 |7 Y- x& x9 e" A
- /*
8 ~- K' z) i6 e! B. J0 x8 A - * key.h
8 S1 V- e4 S- C* P/ H1 k - *3 @, K( }* X# p1 H7 W# K
- * Created on: Sep 29, 2022
* f# R! t1 e* I0 H7 g' F' a/ S( c, f, A - * Author: py_hp
7 C% k( g x3 [8 Z0 ~ - */
! _. V4 \6 D4 L# ?% d -
9 j; y6 m F* c" e: ~9 j8 `0 | - #ifndef KEY_H_
S: a' @5 U7 |/ }0 ] - #define KEY_H_$ m0 b& U1 g5 T% t1 S* C4 v6 q$ @
- 6 ^: o3 X& U Z/ T+ C0 j) F
- #include "main.h"- M6 v4 I4 }6 G: S
- #include "gpio.h"
# s* T- L" X A7 s' C2 H- \& i -
( f: r8 e( i/ u8 k1 S8 q9 N. a - GPIO_PinState get_key0_val();0 \3 `( m$ c; m- w- l9 w. z
- GPIO_PinState get_key1_val();
# ?: p* _6 |% B# _ - GPIO_PinState get_key2_val();
$ k, l: f# j3 D( }6 F$ v' X0 j -
% n7 v# ?3 v6 l4 J6 ~/ L* z - #endif /* KEY_H_ */
复制代码
6 A2 }. q) t' ~6 F) K% [1 mkey.c
) }' v$ ?5 Q' s) V7 o9 P- /*) H+ A# F: P% d# X( a
- * key.c
; c$ @' @3 F+ k9 K% v! l - *
& `8 N, i" n3 K& v$ f m+ t# I - * Created on: Sep 29, 2022. |& A @9 z" g% U
- * Author: py_hp; C8 C$ h* \% y- n: F; z' O
- */# g2 S b, G) Y6 J6 s+ |
- #include "key.h"
y, L" L# ~ D4 s - , l2 v1 x- b0 g' u t! i; g u p
- GPIO_PinState get_key0_val(). t E2 T! N+ n- u1 T5 g
- {
- l5 U$ \$ ]/ f' ?" ? `% G" k - return HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin);
( K; \1 U3 D' [" B# s4 {, Q - };: S @1 d5 ^9 v8 \/ D" D* \+ \
- * S2 \7 f& c' ]
- GPIO_PinState get_key1_val()
$ x! x3 _9 h4 T; @- } - {
' a2 ^3 S. H7 p- \" w - return HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin);# b! G+ ^" C+ R! C
- };
9 n( W6 P0 |/ J& L -
5 Q; s$ `3 e5 X p( Z - GPIO_PinState get_key2_val()
/ y- p8 R. R6 F0 N3 l - {( J" R* j( |; P- x3 {/ k. c! P
- return HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin);
& j$ h8 J5 w3 I) d - };
复制代码
* u9 Q4 j4 U) i6 V2 f6 h" V V* K$ g5 q
led.h& Q2 n# A8 g1 {, J9 p
- /*
2 o- I4 k# i0 g# P; p - * led.h" b8 Z! U/ {8 [" l! n8 `% R9 V1 F
- *4 \# I, T1 J4 u/ W ?' Q) a
- * Created on: Sep 29, 2022
$ t# x0 }* {8 [+ W9 ]) ` - * Author: py_hp
1 C- s' E& R- g! W' \/ X - */
O% z7 H) q1 J8 p -
( g: Y. c+ |7 V, N - #ifndef LED_H_. D8 Z' u% k. U z5 ?
- #define LED_H_
, n' ?4 P% r* D/ ^8 G# B: N3 ?& V - #include "main.h"
( u3 u# I$ |4 G. P0 y. K - #include "gpio.h"
7 b! G4 [' l8 H8 I( P# l @9 f -
/ V* R, Y+ z7 ^3 v0 E - void Toggle_led0();6 B. m4 n/ _, o. M" v: G! p
- void Toggle_led1();1 h, M, `0 A8 p1 W& i
- void Toggle_led2();
( s+ D8 c+ J; P. d8 N ?* F -
3 b8 l* \* }! F3 m0 Z! p. O - void set_led0_val(GPIO_PinState PinState);
/ f9 U0 D5 V1 b" b - void set_led1_val(GPIO_PinState PinState);) V9 I' B. ~ a
- void set_led2_val(GPIO_PinState PinState);
2 G& w5 `1 o% C- b: X - , j& M. q( J2 A! ^$ A+ ~
- #endif /* LED_H_ */
复制代码 " g: p( N2 ]: H$ @
led.c% m5 g. E! i! O; o4 j6 W
- /*
% f5 K6 q* Z q: ?3 X. j/ U - * led.c
9 D1 P& s' q' Q; _9 h' P: K - *, `2 F( z2 b1 s" D% W2 S
- * Created on: Sep 29, 2022% D, v8 V4 E. M( d4 K
- * Author: py_hp2 P: j- I; i: K
- */$ @: Q. Y; }7 c# s/ |: O {0 q
- #include "led.h"* \# b; v$ R7 K1 i8 I
-
& D; N; ?7 a' f1 L4 S6 | - void Toggle_led0()
j( j3 m2 |. u6 Q. H1 o! l - {
3 ]/ n# B0 c* i1 c5 F( A: g - HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);
1 E7 I8 n! M; k - }2 N6 P- \8 n8 u7 O. @
- 0 _2 N# g& _* s& S
- void Toggle_led1()$ w# Z4 `; S, H
- { w' V! ?5 i, K: z' m
- HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);! Z- @) D1 r. l7 ?
- }
% O& y2 k8 b/ C+ l4 ? - ! r! {4 w5 U. x3 m$ Z( _
- void Toggle_led2()2 e8 G3 L- B+ a/ H& R
- {
- e7 w3 T2 i3 ]. }! F4 } - HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin);
/ S' H5 n% ?8 n5 r: d - }
. Z: O5 F: c9 }+ p% Q# N% o8 G -
) F( p; [8 U! p; w7 z5 g - void set_led0_val(GPIO_PinState PinState)( ?. t2 f- v* W; C/ i
- {) e2 ?9 \) O9 g! S7 X
- HAL_GPIO_WritePin(LED0_GPIO_Port,LED0_Pin,PinState);! |. f$ M8 t. }2 q3 L! A, U; P
- };
: \6 M, R+ J% ^) G1 z' Y$ z - 5 u+ n- J( p9 b+ w
- void set_led1_val(GPIO_PinState PinState)
- K/ h% y" D% ^; n0 l" b# H - {
2 T+ W& v- J8 _: ^3 L - HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,PinState);
0 n, y: p! y" f G5 {' W - };
9 H% p# O! {: l h7 a -
8 |8 C. y# z- T% n - void set_led2_val(GPIO_PinState PinState)3 @! ~6 e- Y3 ?
- {. a, S5 ~3 N/ r9 H) [! K$ |: y
- HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,PinState);2 | I" q) F( x. ?1 Z0 X1 X" O
- };
复制代码
5 p/ d0 G9 @* o& m 在main.c加入key和led实现,在代码预留用户自行区域加入自主编写代码,这样cubeMX改动后再次生产代码不会修改抹去自己已经写入或修改的代码
( }) Q! p( B& `
& X9 E4 k8 i4 F& A1 R1 v 添加头文件
, \# s" z/ V# s6 O) P3 H3 @2 E; r$ y4 m$ S U+ u
$ @; [6 D6 L4 C2 g4 J. z* Y4 m
' {: Y$ J4 R& {% n' p9 E7 U8 p) O 添加函数调用实现,可自行斟酌调用! k9 g8 b6 n8 Q) e: Y% z
* n7 H- Q' Y0 z4 s. p$ O/ K0 ^
* l" f1 Z2 l7 B
1 t8 ]! _) o5 t. M" z2 G; |0 E 右键点击项目,进入属性页面(也可以直接菜单进入),勾选本项目编译程序输出文件格式支持) p& H" }5 h' T, J7 _
: N4 I& W: k7 m# a p, |3 {
5 X X3 T1 P: c% m% C v- B
. k4 h2 e9 [. n8 s1 {4 y 点击编译按钮完成编译: k( t& P6 B+ N& ^7 v
+ s3 ]4 m7 r9 y* X7 n
* W3 d# J+ T" ~8 z3 i
2 a0 v9 F& F- K* G9 n8 J
& C$ l4 k( ~' @, \6 R四、加载已编译程序到硬件及测试8 G, W, X Y" C) Z% a) r: j
点击help->ST-Link更新,运行配置更新,便于直接将编译好的软件下载的硬件上。
( f# u# C5 K1 t# }0 `7 P0 k$ f
0 k: m3 h) Q4 y2 D* }+ ]# w4 `
, i) c- Q: B& M9 y
+ U/ x: L/ d9 a& j+ r) u# g 点击运行工具按钮的运行配置,进入配置页面,在STM32 C/C++ Application新建调试配置,每个项目仅配置一次,后面就可以直接点击运行按钮加载编译好的软件到硬件,8 U1 F; N% R4 F! ^
/ `0 c& ?/ h% H
" [' D7 {8 { j
3 w7 Y5 x" G. @! Z% ^3 ]( F0 {+ C- c
$ K& U7 c8 r' \) t7 R; u6 e L/ S
& k0 R+ M0 h6 p9 w( \ 将电脑与硬件用数据线连接,点击运行下载程序
& j( ~4 ~: k: D% o2 R
+ e( g+ G k4 n6 l# {7 p t- n
0 N) l4 E6 H8 w7 O3 _* |3 Z0 a9 R! r, H
或者采用其他下载工具,如STM32 ST-LINK Utility加载 _3 e# |% t. O' P I( [
5 y% b" x% e) j5 v% D j. H
+ e4 M/ \4 @/ S& N7 w. V1 _7 @" p/ k
. U' G( R$ Z% P. E9 U* @
五、程序运行效果
! Y; r8 a( p7 V, E% a8 n 展示效果如下:; A3 l- F. @! }, }9 P% p8 B
- Toggle_led2();//闪灯1 U; [# |) U% z
- set_led0_val(get_key0_val());//按键亮灯% j* N" P0 k3 h/ Y: z
- HAL_Delay(100);
复制代码 # @/ c, I* h$ V" I: _
【1】闪灯
3 \# i/ h) o8 c- I, A
" G* i& F+ j4 C5 B# p0 v. a6 k
. q% q" B2 Q9 S" k
( ~- N: y v1 f4 ]( M 【2】按键亮灯
0 Y! [3 t! f# p
, h! L$ U+ ]( y, C2 n3 j- ?
|6 U `1 W* h7 q2 u$ d
. L- D( W1 q# W# A7 J! M————————————————3 x8 `. F/ m3 t" h9 R! C+ I
版权声明:py_free-物联智能
7 p3 H% _2 ^4 a6 B7 M: `2 j l" x如有侵权请联系删除5 Z7 N0 Z) m/ @2 w/ w9 B
6 R9 u: P+ K9 U! i, e6 P; E( y
& q- M; `- G& ^4 M) O
2 Q6 W( e/ v }- G N |