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

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

[复制链接]
STMCU小助手 发布时间:2022-6-10 19:41
02. 创建工程步骤% h  L0 B. c4 ]& J
2.1 创建对应的文件夹

3 V5 j! J- s( M7 b+ Z新建下面 5 个子文件夹:CORE ,FWLIB,OBJ,SYSTEM,USER。至于这些文件夹名字,实际上是可以任取的,我们这样取名只是为了方便识别。对于这些文件夹用来存放什么文件,我们后面的步骤会一一提到。' E! B, y) v8 d( K

4 }* G( U' \: [* t( Y Q@614TS)JN$RX77GB}}P7L9.png 1 U. a' m+ [2 m* b2 |. I+ M
+ g5 I5 p6 [; z) ?8 O! W
2.2 创建工程项目" C" [7 J  N- R! H
" S% d0 P8 W! z" i0 f/ D# O7 N
打开 Keil,点击 Keil 的菜单:Project –>New Uvision Project ,然后将目录定位到刚才建立的文件夹 Template 之下的 USER 子目录,同时,工程取名为 01Test之后点击保存,我们的工程文件就都保存到 USER 文件夹下面。/ E) O. _! `) ]& V3 y% B  P
7 h8 h) H, \2 Z1 ~% y! w
PLN[3]TV]7[T}`1GT[@$@XE.png ( G9 ~/ V- e' t* j& w

5 n# O* s* V/ }4 Q0 N9 `. G: G1 y2.3 保存工程文件名
" g9 s0 u% G4 |- q9 ]. S5 `$ b4 X# T/ u1 w# H; t" t$ \/ a/ Z2 K
工程取名为 01Test之后点击保存,我们的工程文件就都保存到 USER 文件夹下面。+ X# W6 e( l) y- h% {# ?

/ ~9 x7 ~/ z( f! \, H3 M3 g* U8 v. r 0]Y(NR7_(VQXE4W`JPD(`U3.png ! o- C( I8 c) C# w; d
, B: ]3 k1 y4 [$ y( ^( u
2.4 选择芯片型号" i8 E! I4 G- g8 ]5 _
! `4 U/ w" P% v0 M. t* Z6 {6 ?
定位到STMicroelectronics 下面的 STM32F407ZG( 针对我们的 ExplorerSTM32 板子是这个型号)。这里我们选择 STMicroelectronics→STM32F4 Series→STM32F407→STM32F407ZG
0 t3 ~  t8 l( R# |+ F8 G8 L
9 Q; M( C5 B4 _4 Z  [* S M~2Q(LZAWG]9L5U4B~[V.png / ]: G9 j$ w# b1 Q3 \! _

$ M. T: r) l/ w; W% ~4 U2.5 管理运行时环境% u( t; x2 y/ z- v
# m3 c8 `* r# Z0 w3 P
MDK 会弹出 Manage Run-Time Environment 对话框,这是 MDK5 新增的一个功能,在这个界面,我们可以添加自己需要的组件,从而方便构建开发环境,我们直接点击 Cancel即可,取消之后得到的界面如下:
9 G! E( s3 d1 _/ N
. U: f- ^( _, |* z XK@R4)QA6`EX2~~SAFW73OD.png
4 F9 g( G8 N( \* E# [7 B) o( {( c/ ]7 s2 N. O0 y
2.6 复制固件库源码文件$ F- c0 ~; N; b6 p" D6 e
) U6 r4 a7 @! S
打开官方固件库包,定位到我们之前准备好的固件库包的目录:\STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Libraries\STM32F4xx_StdPeriph_Driver 下面,将目录下面的 src,inc 文件夹 copy 到我们刚才建立的 FWLib 文件夹下面。$ P. A* A3 C! R9 M7 ~

, @& J0 f, U+ g* B- Wsrc 存放的是固件库的.c 文件,inc 存放的是对应的.h 文件,每个外设对应一个.c 文件和一个.h 头文件。
1 _- X' E' h6 ?! c& r+ v$ K
7 D* H2 c( W! G 20200818152936112.png " @" i) `7 j! m3 j$ x! V1 `7 ^

& {% P' `& D5 f: }2.7 复制启动文件

2 v/ y; l1 g( v# L5 W3 h
; k  X: J3 l) W9 a; X+ J将固件库包里面相关的启动文件复制到我们的工程目录 CORE 之下。
" `; x( y$ z- P& Q# G3 d5 e2 a7 q" m  n" h3 v! ~' [: f: d
\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 文件夹下面的文件,
3 O. U% A. Y# W; F
( w$ `. g" |' r$ I' N) q, O F2AJF4PCD9;F55{S~YA.png
! D. r' Z. s/ V6 Z: r' z* c7 A' }0 X* b
2.8 复制其它头文件和源文件
/ v' @9 u. z: Y- N* N2 P( @

; j- L; \3 A. s4 C! x9 Y& V首先定位到目录: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 目录下面。
1 L9 t) x6 q$ E
8 X. ]3 E! I& K! \& u 0P(9O8%]X0Y4Z~[UL191{V3.png 2 }. ~/ U! J5 k/ z* ^6 L0 \; l
5 W  h# z3 ~  [: t. H  A; b6 V
2.9 添加文件到工程中
, @) V# w6 k7 ?/ E% F# E5 Q. O9 e8 K
前面几个步骤,我们将需要的固件库相关文件复制到了我们的工程目录下面,下面我们将这些文件加入我们的工程中去。右键点击Target1,选择 Manage Project Items," X8 S1 P8 [* w; @8 z
" |% c% m, ^7 [2 x) J
SFHXUW$WM4_E5`H2DN]1_D5.png
1 Z  g$ m, c( B5 a7 l  Y/ |
# \; a5 x' ^& c# V2.10 设置项目结构; e0 G% }: ]9 `( K0 y! J4 F6 A

, }8 \9 \6 b  pProject Targets一栏,我们将Target名字修改为01Test,然后在Groups一栏删掉一个SourceGroup1,建立三个 Groups:USER,CORE,FWLIB。然后点击 OK,可以看到我们的 Target名字以及 Groups 情况如下图:
$ I# Y1 I+ }* g3 k6 n/ e: y8 g8 S
[~9N2P58R(O0`J9A_43`SYJ.png
4 v" O% ~& R; D+ y7 r' c# o; m% s: r3 z, `, I/ R
选择OK,出现如下界面:( n5 E+ l( |6 @! {+ k* K

: I5 q2 n& o% q0 f$ B4 A  b ' F/ G: ~' `+ V# H% v& X  m

. g( |+ @0 f! ?7 ^. w4 L9 w2.11 添加FWLIB目录下的文件, M; c5 z, q9 }% v* V/ w9 ?$ D1 H7 S
& A6 W! ]# T: a# V0 ]9 C! F
右键点击点击01Test,选择 Manage Project Items.然后选择需要添加文件的 Group,这里第一步我们选择 FWLIB,然后点击右边的 Add Files,定位到我们刚才建立的目录\FWLIB\src 下面,将里面所有的文件选中(Ctrl+A),然后点击 Add,然后 Close.可以看到 Files 列表下面包含我们添加的文件
0 D, ]- \9 |5 v* D2 y, z# I/ q
)222{JR5WB@]1WW82RVZBDT.png
: O* F. ?& `! r& ^; `) X' @  ?+ X
对于我们写代码,如果我们只用到了其中的某个外设,我们就可以不用添加没有用到的外设的库文件。例如我只用 GPIO,我可以只用添加 stm32f4xx_gpio.c 而其他的可以不用添加。这里我们全部添加进来是为了后面方便,不用每次添加,当然这样的坏处是工程太大,编译起来速度慢,用户可以自行选择。  |* o, h% ~9 _
& K- b; r1 T, q# Q5 [( n
这里有个文件 stm32f4xx_fmc.c 比较特殊。这个文件是 STM32F42 和 STM32F43 系列才用到,所以我们这里要把它删掉(是 注意是 stm32f4xx_fmc.c 要删掉,不要删掉 stm32f4xx_fsmc.c)。+ I9 p) V% V& z7 i0 V* U/ \$ z
! ?. \2 a8 {/ m0 W
LBK_WK9FW@P(MWP8SUU9J5L.png
; \6 @  @6 I4 L$ v
4 s% J: p) H. [# e2.12 添加CORE目录下的文件

  T/ Z! Y& V2 Q+ A, B, o. r9 s# d8 o, Y8 c
用同样的方法,将 Groups 定位到 CORE,添加需要的文件。这里我们的 CORE 下面需要添加的文件为 startup_stm32f40_41xxx.s( 注意,默认添加的时候文件类型为.c, 也就是添加 startup_stm32f40_41xxx.s 启动文件的时候,你需要选择文件类型为 All files件才能看得到这个文件),( W5 x# @4 `1 k( k/ M" v& B6 E* h

- H# p: R$ h3 P  d" K/ D _TUC${`OBX@_TOL@}M`T4C4.png
. R8 X7 ~* I' C1 i- @% I8 e2 |4 ?6 ^# {2 d+ p% o# o
2.13 添加USER目录下文件
3 z) k' o! m, C2 [3 T' h; x
% U% A( |) H" T8 X1 M
USER 目录下面需要添加的文件为 main.c,stm32f4xx_it.c,system_stm32f4xx.c。 这样我们需要添加的文件已经添加到我们的工程去了,最后点击 OK,回到工程主界面。( H# f1 k  P9 }8 i5 Q6 y& x  W' N
7 D/ P' t8 S  B. S7 G
6Z}TFPFU6M_S@$`(`[C)X.png
# W7 N6 Y9 [- b5 }% O5 e# g0 x& d! s* }* g- h
主界面如下:
. ~# C. }' F7 V
! V4 @9 E) h  J  l- C* `1 r" U E(7UO7`%B~)CKIQQ[@,~U.png
/ t! ~9 [" e! `  r7 T- a
* D) `- B: l! r2.14 设置头文件路径
% h$ a* @; S8 I6 Z( T- J8 b6 d+ }  B8 x5 O3 a% y# I
我们要在 MDK 里面设置头文件存放路径。也就是告诉 MDK 到那些目录下面去寻找包含了的头文件。这一步骤非常重要。 如果没有设置头文件路径,那么工程会出现报错头文件路径找不到。% V4 a# h4 f7 e/ W
5 f2 t0 [9 Y. n
NXKWAB3@W_56W1UT0KW[S]O.png % g0 Y, [+ @) |- F# I

$ b7 N$ p$ K- K" p5 I这里我们需要添加的头文件路径包括:\CORE, \USER\以及\FWLIB\inc。这里大家务必要仔细,固件库存放的头文件子目录是\FWLIB\inc,不是 FWLIB\src。
/ S1 ^( |' o, e2 u
  J# ]# o- z1 I3 X: ^( _ 57XMP9HARLI~7PFC7J}T}.png   C; p: O6 Y6 [9 _  w7 ?
9 T, Z% X0 J5 y$ N0 h
2.15 添加宏定义" R* |  o8 ~8 T+ x
# B  ]5 a/ l' {0 L0 T( u5 ~
接下来对于 STM32F40 系列的工程,还需要添加一个全局宏定义标识符。添加方法是点击魔术棒之后,进入 C/C++选项卡,然后在 Define 输入框连输入:STM32F40_41xxx,USE_STDPERIPH_DRIVER。注意这里是两个标识符 STM32F40_41xxx和USE_STDPERIPH_DRIVER, 他们之间是用逗号隔开的,请大家注意。( h' m  m* K0 b' W

1 x6 d) Q$ r* s$ }! M/ q9 x1 q, ` Q17YALQ)(32D{Q052[CD2N8.png
  ?( W2 L& W' N' P5 y0 k+ g+ A, m
2.16 设置中间文件存放路径& K! w# ~# d  p4 n  W

  z" D. `6 n) O  u3 d% k然后选择“Output”选项下面的“Select folder for objects…”,然后选择目录为我们上面的 新建的 OBJ 目录。同时将下方的三个选项框都勾上。9 o3 o/ b4 q( m6 R/ d

- H5 J0 I1 S% |: ? ${HKDXEL`EHPKV]4IX6S0@A.png % R) k* d/ x4 r4 c/ \6 D
  f( e8 \2 y& G1 F+ q  Z$ ^. t9 g
Create HEX File 选项选上是要求编译之后生成 HEX 文件。Browse Information 选项选上是方便我们查看工程中的一些函数变量定义。
( i8 s9 C( m3 E8 `( @
: e" z9 r' m7 \2 Z& l4 P2.17 修改主函数代码
6 S/ y8 E' _( n& S; ^
  1. #include "stm32f4xx.h"
    7 u0 F3 G8 d1 ^7 V! y

  2. 0 n  I  \# H  b' s. h. p, i
  3. void Delay(__IO uint32_t nCount);
    % p0 M! }' L7 E4 a
  4. ; d/ C7 ?3 o- K  M% h: `2 X" }
  5. void Delay(__IO uint32_t nCount). Q! A5 E* z8 k; Z- e' c
  6. {
    - S8 n" j- I" S& K6 N
  7.         while(nCount--){}
    : F# c$ R) W+ o' b# q( j0 D
  8. }2 U" L8 C+ F& @+ G% `) f9 x* e
  9. int main(void)) J. L# F1 \6 @( G1 i) f
  10. {
    ! B$ H# T$ J9 T* d1 m' f
  11.         GPIO_InitTypeDef GPIO_InitStructure;8 u, J. W5 `+ \( m0 ?/ w% a
  12.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
    & U: W9 V7 s5 ^" a" P. g
  13.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;8 o9 G& T6 S0 |
  14.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    , [0 L' E$ {2 _8 V
  15.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    ( m! X5 E5 E7 D1 D5 p3 k) {0 h
  16.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    . Q, _  e( t; E/ Q0 k
  17.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    4 E  g! ?4 o5 n4 s6 n# o
  18.         GPIO_Init(GPIOF, &GPIO_InitStructure);
    . ^3 R# v2 g6 x+ S: `5 q
  19.        
    0 k0 H3 W) h/ |1 U8 W6 F" _( S( O' n+ s
  20.         while(1)
    5 X7 h! y" K% y3 q( E$ T0 B9 _
  21.         {) a; d. S) _% \+ }
  22.                 GPIO_SetBits(GPIOF,GPIO_Pin_9|GPIO_Pin_10);$ w" G. ]7 o" }; z% X. X6 P
  23.                 Delay(0x7FFFFF);
    / F& X- I7 V/ f4 p) v; L7 g2 q' S
  24.                 GPIO_ResetBits(GPIOF,GPIO_Pin_9|GPIO_Pin_10);
    2 i, Z; r0 o- Y( g
  25.                 Delay(0x7FFFFF);
    $ }1 |8 K3 I0 K, I/ y* X
  26.         }
    9 w4 d, i$ H5 z# J, P" w
  27. }5 O. [+ C6 W$ i" S
复制代码

& t- [9 ~4 n3 ~$ `# f5 q0 ~5 l与此将 同时,我们要将 USER 分组下面的 stm32f4xx_it.c 。 文件内容清空。的 或者删掉其中的 32 行对main.h 头文件的引入以及 144 行 行 SysTick_Handler 函数内容,+ S( N. j$ \) a. L3 d# B
9 E5 E9 p- R5 [2 y' {1 E6 k& I6 k& e! l8 T
2.18 编译工程8 z& D- Y, S- B, ]: x  s) L5 f& A8 @

9 c' a, ~. }; M可以看到工程编译通过没有任何错误和警告。
. _! m' y/ |5 }* u' `& b) @6 l) o- K# F9 J  ~4 I
FBF3Y~IAMT4{F4VRAVUX}YS.png
( I- F3 o4 b- m
  d+ ]3 F- I8 i1 r7 {到这里,一个基于固件库 V1.8 的工程模板就建立完成,同时在工程的 OBJ 目录下面生成了对应的 hex 文件。4 O) m* B; _. F

/ c/ D+ z: D% g& `' }2 w03. 系统时钟配置7 o( Z; f6 }8 i' r
我们要修改 System_stm32f4xx.c 文件,把 PLL 第一级分频系数 M 修改为 8,这样达到主时钟频率为 168MHz。9 N$ a9 k4 C. P' k1 l

8 @9 k, d. v! M4 b9 e
  1. /************************* PLL Parameters *************************************/
    " g( R; O3 S* O
  2. #if defined(STM32F40_41xxx) || defined(STM32F427_437xx) || defined(STM32F429_439xx) || defined(STM32F401xx) || defined(STM32F469_479xx)
    4 A! t- Y& c  `0 V( g% g5 N
  3. /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */2 g& |: [1 m" x0 L
  4. #define PLL_M      8        //之前是25
    1 X% L+ K, a" S: D) s9 O5 V
  5. #elif defined(STM32F412xG) || defined(STM32F413_423xx) || defined (STM32F446xx)
    / Z: x2 R) g$ X& s7 Q! D! m. d, Z
  6. #define PLL_M      8$ a/ K& \6 p, c
  7. #elif defined (STM32F410xx) || defined (STM32F411xE)
    & x: \" F+ R' i! O4 r6 W9 G/ k
  8. #if defined(USE_HSE_BYPASS)
    # ^( e" z: K) y9 I- y2 g2 Q
  9.   #define PLL_M      8    ( Q: ?% W. K* `7 Y/ Y( `
  10. #else /* !USE_HSE_BYPASS */% M. T% z. M2 f
  11.   #define PLL_M      16; i9 D$ w7 P2 Y5 P6 M2 T
  12. #endif /* USE_HSE_BYPASS */
    ' D  i% ^# b' ]* {8 q! P5 o
  13. #else* `3 [) Q- ]/ S4 `
  14. #endif /* STM32F40_41xxx || STM32F427_437xx || STM32F429_439xx || STM32F401xx || STM32F469_479xx */  
复制代码

) o7 r% P) N8 r! n5 A同时,我们要在 stm32f4xx.h 里面修改外部时钟 HSE_VALUE 值为 8MHz,因为我们的外部高速时钟用的晶振为 8M,具体修改方法如下:9 t# I! h! Z3 m$ I' a5 ^. X
% h7 h  @; l$ W6 Q, o- u* o/ V
  1. #if !defined  (HSE_VALUE)
    ! ~7 m, ~7 q8 K7 R8 M* r
  2.   #define HSE_VALUE    ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
    # [" g( T) @  ], ]
  3. #endif /* HSE_VALUE */
复制代码
# R" w( @! z# O& ~
一定要在对应的配置文件中,找到相应的代码行,修改为符合我们硬件的值即可。
8 p  {1 z4 h5 {1 Y# U& a" z0 n; I: ~# ?- O
04. 添加其他功能函数

2 f8 Q% a# M) C可以看到有一个 SYSTEM 文件夹,进入 SYSTEM 文件夹,里面有三个子文件夹分别为delay,sys,usart,每个子文件夹下面都有相应的.c 文件和.h 文件。 我们将 SYSTEM 文件夹 和 里面的三个子文件夹复制到我们工程根目录中。 如下图。我们接下来要将这三个目录下面的源文件加入到我们工程,同时将头文件路径加入到 PATH 中2 S. A- x; Y) {9 ?7 ]  o$ L$ C

) O! b" V# O3 o1 N$ Q I`FK~K(RGY}AVM]7DGZAU5S.png 9 C. v* k: \$ x1 u& g

  m5 U. J# V3 ~' s) O- I2 d( z9 M然后点击“OK”之后可以看到工程中多了一个 SYSTEM 组,下面有 3 个.c 文件。
1 [' @7 S8 Z0 b- H" V! Y3 s3 t
; Z, U+ |) ?, }% o接下来我们将对应的三个目录(sys,usart,delay)加入到 PATH 中去,因为每个目录下面都有相应的.h 头文件。
& X0 M9 y. a, z3 G# N5 v5 a4 A- ]9 G
(92R]SAJ}C)UA8G81U63.png
6 B# p) y- E! g  }3 t% h7 g3 j! l6 S# t) M8 b
修改主函数如下. y- |! b: b! k& _2 D) U" I5 {, ]" W

' L5 ]& _- O+ m; c% g- S
  1. #include "stm32f4xx.h": v& ]7 T. B, R$ s" ]! b! n
  2. #include "usart.h"
    * e3 W/ [' r6 r
  3. #include "delay.h"# ~7 o- T& d" O$ X

  4. , ]$ n" q4 L$ k2 I: C
  5. int main(void)
    2 X2 g- B# w6 z
  6. {  o' E  J$ n- S7 r. f# Y+ U
  7.         u32 t=0;
    * l& S* k; }  }/ G" T+ t
  8.         uart_init(115200);
    2 W# }0 b( Z, P- P' T8 M5 d- h
  9.         delay_init(84);
    % c% `2 c+ R' V% N& l% H
  10.         while(1)
    # j( C% J/ |+ k+ E; k
  11.         {% d: p/ c* F1 B5 P. Y
  12.                 printf("t:%d\r\n",t);
    1 c& B7 i  @" k1 B6 N
  13.                 delay_ms(500);! O! q* T3 X- O
  14.                 t++;; o0 |" U" a+ [2 N1 w5 z
  15.         }
    5 Z! c. s, l7 Q
  16. }
复制代码

* X/ q  V: O/ T: G1 r# c* t编译结果" U  y9 w: Q, C$ \
% n" L1 j9 @$ t# Y
RX~AnYA4)HSQ[LD$FO`}X.png $ W) G( T/ U# E' O! R% Y
* y! s- N3 C0 S( Q7 ~

, e) h0 n  S) B( K9 L! [3 w' ^. m  i7 q- Y3 Q
, B1 f: C, J0 ?& ^2 `
! a" j' V& A+ n3 e  b9 W+ I! e
收藏 评论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 手机版