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

【经验分享】新建基于STM32F40x 固件库的MDK5 工程

[复制链接]
STMCU小助手 发布时间:2022-6-10 19:41
02. 创建工程步骤8 Z' V) c( i, v( v+ w: Y6 y6 I
2.1 创建对应的文件夹
+ J  q2 I4 ]( A5 t8 n
新建下面 5 个子文件夹:CORE ,FWLIB,OBJ,SYSTEM,USER。至于这些文件夹名字,实际上是可以任取的,我们这样取名只是为了方便识别。对于这些文件夹用来存放什么文件,我们后面的步骤会一一提到。
6 }* j9 N* d# P$ v
1 g* h4 ^' O, u% R! r3 N( b; ~ Q@614TS)JN$RX77GB}}P7L9.png " z- L$ K! R. t/ }+ r: a+ T

: g* t( y, I( S3 L3 f2.2 创建工程项目$ d' w6 K0 r5 c- M

) ]5 }" X  E- f  n) a6 r& ?4 s打开 Keil,点击 Keil 的菜单:Project –>New Uvision Project ,然后将目录定位到刚才建立的文件夹 Template 之下的 USER 子目录,同时,工程取名为 01Test之后点击保存,我们的工程文件就都保存到 USER 文件夹下面。
. y( Y/ T( ?2 {& d( H# l
3 z% \/ y' ?( W: M' ] PLN[3]TV]7[T}`1GT[@$@XE.png
" d! R$ Y$ y  {; C  E' R8 ?$ U0 d6 ~
2.3 保存工程文件名1 S* t5 Z' i5 D$ i4 `9 B/ m5 }

! h$ i7 m0 }4 W- _工程取名为 01Test之后点击保存,我们的工程文件就都保存到 USER 文件夹下面。
, K6 q1 m% X" {# F7 g
2 \) ?; C6 {4 R# Z) @0 ^ 0]Y(NR7_(VQXE4W`JPD(`U3.png
' K( v% p" v* r4 ~  J
1 i( L3 [3 c% ]/ x+ n3 ]6 M2.4 选择芯片型号
: T3 |4 Z3 d3 U" v7 v3 o4 V3 ~8 M
, w6 K4 R# r: r7 t6 _$ R7 W定位到STMicroelectronics 下面的 STM32F407ZG( 针对我们的 ExplorerSTM32 板子是这个型号)。这里我们选择 STMicroelectronics→STM32F4 Series→STM32F407→STM32F407ZG
+ a/ i; k1 }$ J$ T& D; T0 h2 y1 g" h+ \
M~2Q(LZAWG]9L5U4B~[V.png . w: K' I0 o3 v$ l
' ~  b( h9 J& P( m
2.5 管理运行时环境& @# R* @* S& F5 Z0 @( U1 k1 I& Q

! N- I" @8 P( d/ ~- EMDK 会弹出 Manage Run-Time Environment 对话框,这是 MDK5 新增的一个功能,在这个界面,我们可以添加自己需要的组件,从而方便构建开发环境,我们直接点击 Cancel即可,取消之后得到的界面如下:$ c! r/ R: b0 Q+ S/ {
5 C, G  P$ G& n# N4 i
XK@R4)QA6`EX2~~SAFW73OD.png
& B1 Q/ D6 b/ P9 O2 k* p2 b# o# X. e$ b' o
2.6 复制固件库源码文件
& b8 y( c" L1 l2 {# G5 ^  s7 `* W! w* {
打开官方固件库包,定位到我们之前准备好的固件库包的目录:\STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Libraries\STM32F4xx_StdPeriph_Driver 下面,将目录下面的 src,inc 文件夹 copy 到我们刚才建立的 FWLib 文件夹下面。# B  f/ Z1 f% y% I2 `

: f3 C" ?7 D! ^7 l9 `src 存放的是固件库的.c 文件,inc 存放的是对应的.h 文件,每个外设对应一个.c 文件和一个.h 头文件。2 O4 B9 j/ P0 H5 D" h1 z
: ]. F* e$ @* \0 n1 F' M
20200818152936112.png " S; z$ p; a: O) y
/ H, z3 H. o" K) P4 V$ |
2.7 复制启动文件
7 ^0 y2 k, {" k# F9 g+ B
1 z" ?2 v7 i8 i! ?. [
将固件库包里面相关的启动文件复制到我们的工程目录 CORE 之下。: l8 u( P# |( Q
& t. Y# E. z( u4 S# \2 s
\STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Libraries\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm 下面,将文件 startup_stm32f40_41xxx.s 复制到 CORE 目录下面。然后定位到目录\STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Libraries\CMSIS\Includ , 将 里 面 的 四 个 头 文 件 :core_cm4.h 、core_cm4_simd.h 、core_cmFunc.h 以及 core_cmInstr.h 同样复制到 CORE 目录下面。现在看看我们的 CORE 文件夹下面的文件,* r+ V. b, A" L

8 y- H$ X$ w% i) y F2AJF4PCD9;F55{S~YA.png
. Q+ w, L. Q- v0 P! p, |% o  {3 b5 H, p2 c$ U5 A% f
2.8 复制其它头文件和源文件
7 i: D3 K* D  V9 U9 ]

8 D9 A9 i0 T! X8 Q  w3 b首先定位到目录:STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Libraries\CMSIS\Device\ST\STM32F4xx\Include 将里面的 2 个头文件 stm32f4xx.h 和 system_stm32f4xx.h 复制到 USER 目录之下。这两个头文件是STM32F4 工程非常关键的两个头文件。后面我们讲解相关知识的时候会给大家详细讲解。然后进入目录\STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Project\STM32F4xx_StdPeriph_Templates ,将 目 录 下 面 的 5 个 文 件 main.c , stm32f4xx_conf.h , stm32f4xx_it.c , stm32f4xx_it.h ,system_stm32f4xx.c 复制到 USER 目录下面。
. W; |! Q6 W" a+ s* d
# I& i- R  C( @( D) f+ V 0P(9O8%]X0Y4Z~[UL191{V3.png $ V. i* ~9 X& K# @: Z( Y" ~* A7 d; M
) x! j& N& h' C8 w' r4 k
2.9 添加文件到工程中% J- r& G$ `: O2 @5 n7 H
9 ]2 Y9 j  c9 O
前面几个步骤,我们将需要的固件库相关文件复制到了我们的工程目录下面,下面我们将这些文件加入我们的工程中去。右键点击Target1,选择 Manage Project Items,' i+ b7 v- e  |& o
" Q7 s  q. S; M8 ~
SFHXUW$WM4_E5`H2DN]1_D5.png
2 [( i1 B% T7 ^2 |7 n8 ?& \0 r* i, i) ^$ H
2.10 设置项目结构
1 e6 t; [& h- A2 }* F# Q) n0 w
% |% Y; e. P4 g9 G1 @1 \
Project Targets一栏,我们将Target名字修改为01Test,然后在Groups一栏删掉一个SourceGroup1,建立三个 Groups:USER,CORE,FWLIB。然后点击 OK,可以看到我们的 Target名字以及 Groups 情况如下图:
4 z: d! C: t/ N  f! @
" `1 ]$ l3 b# m( d6 _! |# y [~9N2P58R(O0`J9A_43`SYJ.png
1 g, I4 j1 k; J, R) l0 I, H
; J% `$ p, {4 o% }0 @' ^" P9 P选择OK,出现如下界面:( H" H& K# |7 f: c7 \6 Z8 E

) z2 e* o% E! J/ X7 w7 w/ w 0 ?1 S4 I6 P9 p2 A. v2 W

  F9 w5 c+ \; g2 O! g( K5 I2.11 添加FWLIB目录下的文件
; |% G8 Y* k  A( p( |- {* C% S; m2 }/ D' W0 t+ b
右键点击点击01Test,选择 Manage Project Items.然后选择需要添加文件的 Group,这里第一步我们选择 FWLIB,然后点击右边的 Add Files,定位到我们刚才建立的目录\FWLIB\src 下面,将里面所有的文件选中(Ctrl+A),然后点击 Add,然后 Close.可以看到 Files 列表下面包含我们添加的文件
7 p( h5 x& q/ Z
5 E' W- C; }# }. F# V/ J& b& s# j2 o )222{JR5WB@]1WW82RVZBDT.png   i# J6 v+ s, K

2 n, T0 z+ q8 B- Y2 T- ?9 l对于我们写代码,如果我们只用到了其中的某个外设,我们就可以不用添加没有用到的外设的库文件。例如我只用 GPIO,我可以只用添加 stm32f4xx_gpio.c 而其他的可以不用添加。这里我们全部添加进来是为了后面方便,不用每次添加,当然这样的坏处是工程太大,编译起来速度慢,用户可以自行选择。
, \3 p, K. r; x& {+ a# U- k
, U/ ~& \8 {  c8 T+ v7 _5 t- y4 o这里有个文件 stm32f4xx_fmc.c 比较特殊。这个文件是 STM32F42 和 STM32F43 系列才用到,所以我们这里要把它删掉(是 注意是 stm32f4xx_fmc.c 要删掉,不要删掉 stm32f4xx_fsmc.c)。
' G" z0 h2 x- y
+ Q0 K# I% U( | LBK_WK9FW@P(MWP8SUU9J5L.png * J+ P' N) X7 Y4 G, v0 \) o; n
  V2 m4 N! P6 s  @; F' k
2.12 添加CORE目录下的文件

) l2 d; t: G+ A2 z" P8 t
4 \6 T8 i6 |% b1 X用同样的方法,将 Groups 定位到 CORE,添加需要的文件。这里我们的 CORE 下面需要添加的文件为 startup_stm32f40_41xxx.s( 注意,默认添加的时候文件类型为.c, 也就是添加 startup_stm32f40_41xxx.s 启动文件的时候,你需要选择文件类型为 All files件才能看得到这个文件),
! C8 `- z( J' M, o' t. o2 v5 U1 K+ c( d: H
_TUC${`OBX@_TOL@}M`T4C4.png
; H5 T3 f) V5 }5 O+ W
3 ^5 i6 F4 ^5 k7 q4 y! x% e2.13 添加USER目录下文件

# K9 Y2 [0 l1 `" U. z- m: \( Z. U  }; d- m
USER 目录下面需要添加的文件为 main.c,stm32f4xx_it.c,system_stm32f4xx.c。 这样我们需要添加的文件已经添加到我们的工程去了,最后点击 OK,回到工程主界面。* J: J* Q. s3 Q

" Y, R) F# t+ c8 R 6Z}TFPFU6M_S@$`(`[C)X.png / W7 |7 N( N  R* C# n
8 E2 {2 z- Y* I2 j1 ]
主界面如下:6 h/ D. Z: |% o- K

8 U6 ?% {: I# `4 s E(7UO7`%B~)CKIQQ[@,~U.png
5 [( L% c- E0 H
0 @7 `5 o4 ~+ p! ^& x2.14 设置头文件路径- a" r8 ]; x8 Z7 a4 W
6 C+ n+ {, G* z2 Z2 l
我们要在 MDK 里面设置头文件存放路径。也就是告诉 MDK 到那些目录下面去寻找包含了的头文件。这一步骤非常重要。 如果没有设置头文件路径,那么工程会出现报错头文件路径找不到。
: w3 v, U+ I% j6 m/ |3 D7 ]# }# u% W  L! G
NXKWAB3@W_56W1UT0KW[S]O.png
1 K* c! |1 \) ?% z7 x4 Z3 z- |, c; y6 b$ N3 {9 e' N
这里我们需要添加的头文件路径包括:\CORE, \USER\以及\FWLIB\inc。这里大家务必要仔细,固件库存放的头文件子目录是\FWLIB\inc,不是 FWLIB\src。
3 ]6 }' ^; y, `, o2 g
" z5 t* o% a+ N' a  q3 l5 [7 S 57XMP9HARLI~7PFC7J}T}.png ; l  o7 E* M" j! R$ r
, p  \. k; ~' g  A
2.15 添加宏定义
, Q4 K/ b( U2 S* _4 j0 W0 Z5 c& a" A( ^% i9 H' v
接下来对于 STM32F40 系列的工程,还需要添加一个全局宏定义标识符。添加方法是点击魔术棒之后,进入 C/C++选项卡,然后在 Define 输入框连输入:STM32F40_41xxx,USE_STDPERIPH_DRIVER。注意这里是两个标识符 STM32F40_41xxx和USE_STDPERIPH_DRIVER, 他们之间是用逗号隔开的,请大家注意。
5 f7 ?3 @, I6 s& h; e; [7 |" ~3 S: x
Q17YALQ)(32D{Q052[CD2N8.png
! m& R$ z7 u/ J1 w5 ]1 ]! O
" {0 ^. e* s+ Y; ~3 M7 y1 c9 U2.16 设置中间文件存放路径3 K3 M* R. z5 `5 {" z1 T8 ^
. e1 L- \: P5 W; ~
然后选择“Output”选项下面的“Select folder for objects…”,然后选择目录为我们上面的 新建的 OBJ 目录。同时将下方的三个选项框都勾上。. W- y% q# W4 \

# i$ d/ p9 y" T3 f ${HKDXEL`EHPKV]4IX6S0@A.png
; r& C' M/ }. q, F
( ^9 Q6 u, R. p9 |1 JCreate HEX File 选项选上是要求编译之后生成 HEX 文件。Browse Information 选项选上是方便我们查看工程中的一些函数变量定义。% W0 ]+ X; i9 L4 \4 q: S  q+ u
9 x3 L2 |" S  \9 I, L, X' W. u
2.17 修改主函数代码
* `; A4 f: F4 Z8 R# q  l! F8 o
  1. #include "stm32f4xx.h"
    ( ]2 {! S- R# v( T' N4 p

  2.   \2 `2 Q: {" w# ]
  3. void Delay(__IO uint32_t nCount);# I9 }8 p* ~, Z7 H$ u- v( _  c

  4. # `  U) |1 d8 ]6 X# |( t
  5. void Delay(__IO uint32_t nCount)
    2 ~* Q: j+ [& T7 H
  6. {! i$ N2 I; [1 U) e* ^6 J
  7.         while(nCount--){}
    ; O* o. r+ E6 c3 b( G
  8. }* d' @& ?: L: o) M8 c6 }3 Z
  9. int main(void)
    - T1 G) v5 \& G; a, a& A9 L8 l1 Q
  10. {
    - D1 H% u8 e3 ]
  11.         GPIO_InitTypeDef GPIO_InitStructure;3 Z0 ]# U1 {$ I# h+ v
  12.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);- T2 ?* u0 z1 n
  13.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;6 c0 o; x% c5 q: L/ H; x
  14.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;# X8 N+ ^' m! V. K' s% r
  15.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;4 g( a( R3 D* |/ H2 B
  16.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    ' T' R% T5 j% [+ Y/ `0 ]4 X5 E
  17.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;# ~4 e& j4 H9 k  z& B. V3 K
  18.         GPIO_Init(GPIOF, &GPIO_InitStructure);
    8 [! r5 I; |/ E- Q1 F$ W
  19.         ' p  l6 y+ V' f3 Q" p% d8 Q
  20.         while(1)
    9 a5 @! q% \( U7 e& g0 D7 n- x' ?
  21.         {
      D: D: `9 A0 S) N( D
  22.                 GPIO_SetBits(GPIOF,GPIO_Pin_9|GPIO_Pin_10);
    ) H! I5 ]9 P  W, l6 K% g
  23.                 Delay(0x7FFFFF);+ F5 j7 T8 v9 B
  24.                 GPIO_ResetBits(GPIOF,GPIO_Pin_9|GPIO_Pin_10);
    ; s& w* m7 [7 w$ D) @& j0 y
  25.                 Delay(0x7FFFFF);* b8 k( r0 |+ q" }
  26.         }
    6 Y( [* f" h: u' ?" N2 X) |' k6 e
  27. }+ J% W% u& c4 P: I* u
复制代码

+ E7 n7 _. K( Q7 c与此将 同时,我们要将 USER 分组下面的 stm32f4xx_it.c 。 文件内容清空。的 或者删掉其中的 32 行对main.h 头文件的引入以及 144 行 行 SysTick_Handler 函数内容,1 h( h  l% Q, n0 m+ f, c: S& r6 E  J

; c8 d+ Y9 D: J5 D0 K2 ^2.18 编译工程
- x) d6 O9 F- }- O1 N' A  ?. G/ ?& X# H2 }& S& L5 k8 C
可以看到工程编译通过没有任何错误和警告。% z3 \' F6 \4 c% Z, U- ~- P
! t! Y8 y/ n, B* }( z- D& K( H
FBF3Y~IAMT4{F4VRAVUX}YS.png ' `" x% f, s5 K" T  R
# Z0 j  f2 `- x' ^3 l
到这里,一个基于固件库 V1.8 的工程模板就建立完成,同时在工程的 OBJ 目录下面生成了对应的 hex 文件。
% J- T: F) n6 p7 G5 Y- f; @  N5 P1 c! z1 T7 K; R
03. 系统时钟配置
; K. b" m4 {- r+ r4 i% ^; ~1 T我们要修改 System_stm32f4xx.c 文件,把 PLL 第一级分频系数 M 修改为 8,这样达到主时钟频率为 168MHz。+ @' h0 J0 o& _& N( D; ?6 ^/ e) V
! }2 v; x2 E  M# K1 s
  1. /************************* PLL Parameters *************************************/  P. @- a, r) B( `% e5 `7 m
  2. #if defined(STM32F40_41xxx) || defined(STM32F427_437xx) || defined(STM32F429_439xx) || defined(STM32F401xx) || defined(STM32F469_479xx)8 A2 W4 t9 j, q; N' G
  3. /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */5 S0 A0 n& b) A3 c2 z: N
  4. #define PLL_M      8        //之前是25$ P1 ?: q1 f8 H$ S- O( y
  5. #elif defined(STM32F412xG) || defined(STM32F413_423xx) || defined (STM32F446xx)
    7 ?4 T( U5 D$ H  u) c# T3 h
  6. #define PLL_M      8
    : B# s. ~- B0 _: M/ ?0 I' V
  7. #elif defined (STM32F410xx) || defined (STM32F411xE)
    ! z9 N( b; w0 B0 v, G/ o
  8. #if defined(USE_HSE_BYPASS)9 \8 t" o( _6 r$ ~; }
  9.   #define PLL_M      8   
      t2 G( D3 ]) E6 S8 K3 ^& Y( m
  10. #else /* !USE_HSE_BYPASS */; P) e" r( x5 |, h% e
  11.   #define PLL_M      169 `# G$ a8 z1 Q6 x7 I
  12. #endif /* USE_HSE_BYPASS */' X$ D1 i. U+ \4 a7 M9 D
  13. #else
    + V9 m( u8 n5 s' x/ v
  14. #endif /* STM32F40_41xxx || STM32F427_437xx || STM32F429_439xx || STM32F401xx || STM32F469_479xx */  
复制代码
" ^- \) h( e4 K& J4 _# Q3 Q
同时,我们要在 stm32f4xx.h 里面修改外部时钟 HSE_VALUE 值为 8MHz,因为我们的外部高速时钟用的晶振为 8M,具体修改方法如下:$ b! ~7 L! W! A4 U5 I" }

( w; w# o' [( y8 g9 Z
  1. #if !defined  (HSE_VALUE) : K% e  P) D* t; N9 j
  2.   #define HSE_VALUE    ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
    : d7 y; K' F# `; y
  3. #endif /* HSE_VALUE */
复制代码

8 `+ }7 i9 M  k& u一定要在对应的配置文件中,找到相应的代码行,修改为符合我们硬件的值即可。& P: d* n3 S0 T7 o
* A- x9 v5 \- A7 N( h3 p
04. 添加其他功能函数
( C1 w$ t! l. U8 K
可以看到有一个 SYSTEM 文件夹,进入 SYSTEM 文件夹,里面有三个子文件夹分别为delay,sys,usart,每个子文件夹下面都有相应的.c 文件和.h 文件。 我们将 SYSTEM 文件夹 和 里面的三个子文件夹复制到我们工程根目录中。 如下图。我们接下来要将这三个目录下面的源文件加入到我们工程,同时将头文件路径加入到 PATH 中. }+ n2 L5 D1 q; |" _

& x; w5 g4 X" H" j, e3 w I`FK~K(RGY}AVM]7DGZAU5S.png - {+ w* f! h5 ~: p2 U0 E. g

* ^/ o! z5 y* k* B4 k+ }" J$ Z; E然后点击“OK”之后可以看到工程中多了一个 SYSTEM 组,下面有 3 个.c 文件。9 v  Q" e$ }. S) H0 |  C1 x

3 T) ?7 R* c4 w接下来我们将对应的三个目录(sys,usart,delay)加入到 PATH 中去,因为每个目录下面都有相应的.h 头文件。
" T) ~0 H/ I6 N5 O+ [& f- ?; O5 g* `
(92R]SAJ}C)UA8G81U63.png " K2 e& S5 O9 r: e
% g  o3 T0 U  q
修改主函数如下, K4 }& k6 N/ r8 m
! M2 X; A$ Y* b8 S/ w
  1. #include "stm32f4xx.h"
    * {* h& [3 g6 \: w. @
  2. #include "usart.h"+ N: Q4 q+ u) G8 a+ o
  3. #include "delay.h"" D8 r# I, W1 K* D
  4. ; b; o3 `8 p3 X/ q8 [
  5. int main(void)
    , H- M# g8 x& {3 Z! r* J9 \
  6. {; J9 a8 I1 }8 B5 d1 J3 S  w' }. X' h2 P
  7.         u32 t=0;
    * p8 z' ?7 K! u& n' a% }
  8.         uart_init(115200);
    ( z4 t" U: ]; T1 M1 p2 y3 T5 O; e
  9.         delay_init(84);
    " ~! }. m% y, _- S
  10.         while(1)
    + d6 h4 X9 B3 W5 B2 B' q
  11.         {
    " |  |2 t6 b  r
  12.                 printf("t:%d\r\n",t);) `  D  m4 h" j
  13.                 delay_ms(500);  o' ~# y  n+ u: \
  14.                 t++;" j0 s6 M3 v8 I; ^
  15.         }
    ) o  I6 T0 A6 n
  16. }
复制代码

, ~. F  T, `' h0 s+ l& @3 Z, z3 d6 o编译结果" o- [8 L9 g% G( w$ ]

3 c  j( ]3 k! B) U9 B) J- {/ B RX~AnYA4)HSQ[LD$FO`}X.png 4 Y$ b! H& F! G0 O. i) l
; O" k1 v! e1 i
9 d& k5 P: A5 ?- c1 v

' W! v- o$ o) y1 U3 {4 q4 t) X6 x. I7 b7 ~

2 d" d# m4 _  T. t$ s, }  s- _* g- Q
收藏 评论1 发布时间:2022-6-10 19:41

举报

1个回答
Xalen 回答时间:2025-1-25 15:32:55

你好,请问第四步SYSTEM 文件夹,里面有三个子文件夹分别为delay,sys,usart,这个SYSTEM文件夹是哪里的文件夹呀,具体路径是什么呢?

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版