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

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

[复制链接]
STMCU小助手 发布时间:2022-6-10 19:41
02. 创建工程步骤! O) l1 h# s+ e7 e- m' h
2.1 创建对应的文件夹
2 [5 d' i6 I( M% T: N7 r
新建下面 5 个子文件夹:CORE ,FWLIB,OBJ,SYSTEM,USER。至于这些文件夹名字,实际上是可以任取的,我们这样取名只是为了方便识别。对于这些文件夹用来存放什么文件,我们后面的步骤会一一提到。* F% Q4 ~; C$ V9 x

2 ~8 P8 L1 X  d$ n8 f3 k, l8 G7 N Q@614TS)JN$RX77GB}}P7L9.png
4 M& n: P$ J: l* a8 D) w! M+ L8 E% Z0 F( }. h
2.2 创建工程项目
! l  L  e% m: a& E! h: M' C6 P1 k: m' B" A
打开 Keil,点击 Keil 的菜单:Project –>New Uvision Project ,然后将目录定位到刚才建立的文件夹 Template 之下的 USER 子目录,同时,工程取名为 01Test之后点击保存,我们的工程文件就都保存到 USER 文件夹下面。
6 H* E1 ~) A& L8 j" e
( Z8 |9 D# I* n PLN[3]TV]7[T}`1GT[@$@XE.png * }" V# ]/ U' \! p' D  x
: a* q5 _) z+ I( v2 Q1 h2 e
2.3 保存工程文件名
3 H8 B; g  N8 _# l1 P8 f; }7 G
; b) R4 x$ H- W* [  D工程取名为 01Test之后点击保存,我们的工程文件就都保存到 USER 文件夹下面。
: E; m/ h' T8 v; _) P6 \( a1 k3 V7 R8 u# T" p! F
0]Y(NR7_(VQXE4W`JPD(`U3.png
5 N2 E5 r7 D  F! o5 @2 J6 q2 ?& q6 B4 r
2.4 选择芯片型号& z2 @1 e. T, L6 Q7 g0 a4 T
8 }/ P( `. r9 `4 D8 x% m+ {
定位到STMicroelectronics 下面的 STM32F407ZG( 针对我们的 ExplorerSTM32 板子是这个型号)。这里我们选择 STMicroelectronics→STM32F4 Series→STM32F407→STM32F407ZG3 ?" b2 R) g% K% L6 N7 [' m- T

+ {- t* G+ a& C  M3 g1 W3 @5 X% Q M~2Q(LZAWG]9L5U4B~[V.png
8 b5 q. v: ^  z" Z7 }
* P( r6 O6 q  {2.5 管理运行时环境
0 b0 H7 R' B5 y' b/ |
1 p  n! L9 `8 ]8 {6 Q' p6 Q% QMDK 会弹出 Manage Run-Time Environment 对话框,这是 MDK5 新增的一个功能,在这个界面,我们可以添加自己需要的组件,从而方便构建开发环境,我们直接点击 Cancel即可,取消之后得到的界面如下:1 r! Q- e( c8 ]8 ?0 A, x/ F
2 h- t5 _8 o" a7 {' e5 X+ m
XK@R4)QA6`EX2~~SAFW73OD.png
; U* Q( L3 L; Z9 N
7 Y! X8 O& i* z5 S; r2.6 复制固件库源码文件  q6 ?5 l9 P, J/ ^! j/ }

% P6 I  a6 t' z打开官方固件库包,定位到我们之前准备好的固件库包的目录:\STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Libraries\STM32F4xx_StdPeriph_Driver 下面,将目录下面的 src,inc 文件夹 copy 到我们刚才建立的 FWLib 文件夹下面。3 j; L* {- w3 t- ]+ M

7 Z. f! x7 t$ l  Ksrc 存放的是固件库的.c 文件,inc 存放的是对应的.h 文件,每个外设对应一个.c 文件和一个.h 头文件。
0 O! ?5 p5 P# I' G) u- j( M
# E4 @; p& z) r1 H' g4 u 20200818152936112.png 5 O  n# C& [5 s& e; V
0 M" I6 q2 A0 p) ]
2.7 复制启动文件
" W2 E- ]3 Q( R2 k" b9 R. W
' U8 d1 @& J' y2 N
将固件库包里面相关的启动文件复制到我们的工程目录 CORE 之下。
  J( V" i+ V0 p3 ?3 s% d1 K: y% T5 @) X( }: g7 \# h$ d+ G
\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 文件夹下面的文件,
* d5 M7 A- ?  i: g: v4 `" i) i% @3 h3 a9 I  z) }
F2AJF4PCD9;F55{S~YA.png
5 b' ~. v* e0 A+ @% u* A) v1 o! p4 @: V# c6 ~( `; p+ i
2.8 复制其它头文件和源文件
( ?. l4 x$ m1 c2 L/ o; T; I. S+ s7 B3 ]. S

; [1 V( Q  V4 t首先定位到目录: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 目录下面。
* F% Q7 W/ q' S- L$ v' E2 ~% Q% N4 E! J, U: c# M; b6 n
0P(9O8%]X0Y4Z~[UL191{V3.png
' r% `2 R1 M! F- k8 ~. W( J& `; `# U. E* h' b' S
2.9 添加文件到工程中5 [0 c# j: O6 _8 X# f

6 |5 V% H. B8 ^& Y# V# t前面几个步骤,我们将需要的固件库相关文件复制到了我们的工程目录下面,下面我们将这些文件加入我们的工程中去。右键点击Target1,选择 Manage Project Items,# j; B: u7 e) X2 x# B/ l+ H6 N( J

& o+ x4 ~& g3 w" q/ L9 O SFHXUW$WM4_E5`H2DN]1_D5.png 7 m" v- c- h! `/ f/ u

4 E+ U* H$ L3 z6 \8 m2.10 设置项目结构4 P% h2 B& d% l& X4 t
/ ^9 C& Q7 O( o" f4 P
Project Targets一栏,我们将Target名字修改为01Test,然后在Groups一栏删掉一个SourceGroup1,建立三个 Groups:USER,CORE,FWLIB。然后点击 OK,可以看到我们的 Target名字以及 Groups 情况如下图:4 |1 e) d9 d; \5 G! B

- P3 e+ K, l+ [! Z0 O4 @ [~9N2P58R(O0`J9A_43`SYJ.png * Z5 x# H- D$ `' E; n6 R! o) C

- ~- d2 ?+ i4 e/ I  X选择OK,出现如下界面:
0 n+ L' g9 }  q1 M4 A/ Y- @  I' A, E4 O" y9 h

% [( @8 N8 n8 _& Z# h3 W! e; [! e6 t' Y" e) W- @4 ^1 q  n; u+ D2 c
2.11 添加FWLIB目录下的文件4 S0 y6 ?9 p" q7 C% W( c0 s# g0 J

. ]8 F' ?: d( }% R0 V右键点击点击01Test,选择 Manage Project Items.然后选择需要添加文件的 Group,这里第一步我们选择 FWLIB,然后点击右边的 Add Files,定位到我们刚才建立的目录\FWLIB\src 下面,将里面所有的文件选中(Ctrl+A),然后点击 Add,然后 Close.可以看到 Files 列表下面包含我们添加的文件; w* ?- x$ Y( m; E6 X
% X/ l- u% j  n  r1 t+ w
)222{JR5WB@]1WW82RVZBDT.png
; ?8 t  T* A# {% x
9 ?4 _# g3 e  @# |8 m$ n对于我们写代码,如果我们只用到了其中的某个外设,我们就可以不用添加没有用到的外设的库文件。例如我只用 GPIO,我可以只用添加 stm32f4xx_gpio.c 而其他的可以不用添加。这里我们全部添加进来是为了后面方便,不用每次添加,当然这样的坏处是工程太大,编译起来速度慢,用户可以自行选择。
1 o2 Q3 ~, K' A& o5 x5 g6 f! L9 I) w5 F! M
这里有个文件 stm32f4xx_fmc.c 比较特殊。这个文件是 STM32F42 和 STM32F43 系列才用到,所以我们这里要把它删掉(是 注意是 stm32f4xx_fmc.c 要删掉,不要删掉 stm32f4xx_fsmc.c)。0 J- w# R4 g  f3 E, Q( ]0 y

. i+ M2 a: \* D9 s- f LBK_WK9FW@P(MWP8SUU9J5L.png % @) s7 L# e, ]7 t, O$ o
  X( l; I6 o1 {  }3 ]
2.12 添加CORE目录下的文件

. k5 Z, M7 [1 w1 y7 e
0 c2 ?& W$ p& p用同样的方法,将 Groups 定位到 CORE,添加需要的文件。这里我们的 CORE 下面需要添加的文件为 startup_stm32f40_41xxx.s( 注意,默认添加的时候文件类型为.c, 也就是添加 startup_stm32f40_41xxx.s 启动文件的时候,你需要选择文件类型为 All files件才能看得到这个文件),
3 V4 e6 I7 C6 n( |
$ O8 O$ p; R. i1 o8 j$ w( a6 o+ } _TUC${`OBX@_TOL@}M`T4C4.png ; |) q; h0 _+ F( Y
6 D. w& Y( R; ?* g& h
2.13 添加USER目录下文件

" L0 \( C/ ~) ~/ r/ {- `0 q4 Z' o& @: I! p6 ^8 L! v
USER 目录下面需要添加的文件为 main.c,stm32f4xx_it.c,system_stm32f4xx.c。 这样我们需要添加的文件已经添加到我们的工程去了,最后点击 OK,回到工程主界面。: n0 ^0 K* ~. {  Z4 F0 O. b

( b6 p0 o1 }3 n* L) N- b1 K 6Z}TFPFU6M_S@$`(`[C)X.png
7 N' B" W# V4 w! E- m7 f- P9 T9 J! d8 G: c
主界面如下:
% ~9 u& M7 n! d# I' P' G9 M; U% T- m7 ]) o, `
E(7UO7`%B~)CKIQQ[@,~U.png + r% H4 E- t/ ]1 M8 A

8 i- h  ^/ ?. \+ c1 Q& M) A! m: g2.14 设置头文件路径
& q, `8 d4 q6 G. K) L0 ^1 N$ T+ @9 L2 A4 X$ d- H
我们要在 MDK 里面设置头文件存放路径。也就是告诉 MDK 到那些目录下面去寻找包含了的头文件。这一步骤非常重要。 如果没有设置头文件路径,那么工程会出现报错头文件路径找不到。' T$ ], j% d9 A0 l4 @- \- l
1 U0 E9 s- [+ b+ k. \5 H
NXKWAB3@W_56W1UT0KW[S]O.png - [2 O; {' X' z2 E. n3 h; }
( X7 P& X. v$ R5 m- \; S; A
这里我们需要添加的头文件路径包括:\CORE, \USER\以及\FWLIB\inc。这里大家务必要仔细,固件库存放的头文件子目录是\FWLIB\inc,不是 FWLIB\src。
) \: c9 ^8 ]! z4 w2 A5 c; m6 k0 R& C/ ]& J
57XMP9HARLI~7PFC7J}T}.png
- n& P0 I- u9 T
6 o( y' f! A, Z* v+ i% [3 U7 J2.15 添加宏定义
) s6 f  S1 ]4 ^# ~* u
/ i1 B: y% t. K8 D/ w接下来对于 STM32F40 系列的工程,还需要添加一个全局宏定义标识符。添加方法是点击魔术棒之后,进入 C/C++选项卡,然后在 Define 输入框连输入:STM32F40_41xxx,USE_STDPERIPH_DRIVER。注意这里是两个标识符 STM32F40_41xxx和USE_STDPERIPH_DRIVER, 他们之间是用逗号隔开的,请大家注意。* n2 e9 y6 `* m: N& t+ G, d0 @

! k7 w" r; E+ I9 T+ f9 s; J( w* ~ Q17YALQ)(32D{Q052[CD2N8.png
2 J" K: K, A5 _- x7 J# J  C2 j  G- k& m; ~+ L: n9 I; @
2.16 设置中间文件存放路径) w6 h5 i8 c9 v, [. V  [
3 J0 _# v  z8 w: H3 t9 x' ]
然后选择“Output”选项下面的“Select folder for objects…”,然后选择目录为我们上面的 新建的 OBJ 目录。同时将下方的三个选项框都勾上。
2 \/ H5 R" H9 d% M6 r( b' f: n( }3 N# |
${HKDXEL`EHPKV]4IX6S0@A.png ; T) b+ X. ]8 d0 p

: e. c8 y& h/ M- o2 }, }Create HEX File 选项选上是要求编译之后生成 HEX 文件。Browse Information 选项选上是方便我们查看工程中的一些函数变量定义。' I. F  _2 @6 c

! h! q- ^  Z0 p* [2.17 修改主函数代码: v5 m# r  @4 w; ?' K$ n. Y; u
  1. #include "stm32f4xx.h"
    ( A2 ]6 @% l% E% \# e0 p/ v' k
  2. * v1 A9 L1 p: X, b
  3. void Delay(__IO uint32_t nCount);
    & m; V' j0 q) u' K/ e
  4. ! q- ^7 x7 x0 u3 k5 a" J6 R2 M3 Z
  5. void Delay(__IO uint32_t nCount)" y8 @6 D- ]& b& d5 l, h( o
  6. {- ]( F* _7 _6 K9 U
  7.         while(nCount--){}
    8 m# C1 l; q% ~& v) S# r
  8. }" V0 s1 N0 ?$ R4 p6 M& y
  9. int main(void)
    ; r7 D; d2 h) L  \0 H( R% f$ W
  10. {+ Z. g5 V7 S6 r% _/ S
  11.         GPIO_InitTypeDef GPIO_InitStructure;
    ) @% Z6 d. Y7 e+ @1 G
  12.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);! X1 x, ^" h1 u( j$ i
  13.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
    ( r: y" f; p  u: V. N$ O" h& _
  14.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;. D, T# k& l/ s' A' f  |
  15.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    , I2 P/ d$ w, F  [
  16.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    / j1 ]  g+ ^0 G9 b. R
  17.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    ' m! i9 k- o* r  t7 [
  18.         GPIO_Init(GPIOF, &GPIO_InitStructure);9 R3 `+ l( a, ]7 o- ~. F
  19.         1 c: c% z, C9 E
  20.         while(1)
    5 d. g4 L) o( y5 @
  21.         {
    ; c. K# b6 ^- J8 g1 P, G# ?
  22.                 GPIO_SetBits(GPIOF,GPIO_Pin_9|GPIO_Pin_10);$ P: h$ L' U3 b0 `* u
  23.                 Delay(0x7FFFFF);
    + W+ q- h3 ?. y7 S
  24.                 GPIO_ResetBits(GPIOF,GPIO_Pin_9|GPIO_Pin_10);7 j7 S$ f$ z, A
  25.                 Delay(0x7FFFFF);' I& t& U# w) m7 b7 b8 w& G+ T
  26.         }% u; e5 e9 c9 T2 y8 J0 F) q8 D
  27. }
    * I- X6 `% @' y7 g
复制代码
- L9 F# V# O( V% @
与此将 同时,我们要将 USER 分组下面的 stm32f4xx_it.c 。 文件内容清空。的 或者删掉其中的 32 行对main.h 头文件的引入以及 144 行 行 SysTick_Handler 函数内容,
- k! [$ T# ~/ k, a/ c1 z2 E2 e+ Z" M& z7 D, r( r3 ~
2.18 编译工程$ t/ z  g; L+ F2 Y

' o. U5 s4 o9 ]: d可以看到工程编译通过没有任何错误和警告。# l( Z) ?$ U- W" ?, n1 w/ T, ]

% G0 j8 b  {: u2 c: `" I FBF3Y~IAMT4{F4VRAVUX}YS.png & L4 y, j. c8 g" p* K2 ]  y
. Y* x- F& g3 f! C  ]
到这里,一个基于固件库 V1.8 的工程模板就建立完成,同时在工程的 OBJ 目录下面生成了对应的 hex 文件。5 |8 C& {* V1 d
6 L9 d& G1 ?7 i7 T
03. 系统时钟配置
+ S+ C! w6 `; _) ^我们要修改 System_stm32f4xx.c 文件,把 PLL 第一级分频系数 M 修改为 8,这样达到主时钟频率为 168MHz。6 n4 Y5 U5 q$ D; X
/ F1 @( u# E5 }2 u* U
  1. /************************* PLL Parameters *************************************/, p: c* _; w/ k
  2. #if defined(STM32F40_41xxx) || defined(STM32F427_437xx) || defined(STM32F429_439xx) || defined(STM32F401xx) || defined(STM32F469_479xx)
    ! E: S! m$ R# r
  3. /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */- j) D, }3 g3 q- v( X
  4. #define PLL_M      8        //之前是250 S) U! A& K2 N1 `0 p+ l7 P: q  t# V
  5. #elif defined(STM32F412xG) || defined(STM32F413_423xx) || defined (STM32F446xx)
    ) W, V! a/ {5 q4 {) g+ z# ^
  6. #define PLL_M      8( S, z/ @4 I: f5 Q
  7. #elif defined (STM32F410xx) || defined (STM32F411xE)$ V/ `  b9 T8 d
  8. #if defined(USE_HSE_BYPASS)# G7 n; P8 d& a
  9.   #define PLL_M      8   
    $ q/ _, ^, V/ J- X. }3 O0 N8 Q
  10. #else /* !USE_HSE_BYPASS */7 P& O3 W3 F) L
  11.   #define PLL_M      16
    / u: P( w3 D: I" o
  12. #endif /* USE_HSE_BYPASS */
    ) d' l8 b2 D# W% R% w
  13. #else* r! X5 k3 L+ C( m; w- h. b- r
  14. #endif /* STM32F40_41xxx || STM32F427_437xx || STM32F429_439xx || STM32F401xx || STM32F469_479xx */  
复制代码

6 v+ v3 }$ {+ \6 s$ w% e, ]: T2 ~同时,我们要在 stm32f4xx.h 里面修改外部时钟 HSE_VALUE 值为 8MHz,因为我们的外部高速时钟用的晶振为 8M,具体修改方法如下:
: i4 G- k* G$ N; C: w- x  g1 |# i( m3 y; V0 Q- m: P0 T
  1. #if !defined  (HSE_VALUE)
    6 }7 u* `+ m1 I+ z
  2.   #define HSE_VALUE    ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
    # X; K! Z8 _  W& f+ k0 m
  3. #endif /* HSE_VALUE */
复制代码
8 b) [: E, g# n
一定要在对应的配置文件中,找到相应的代码行,修改为符合我们硬件的值即可。
" n7 g- f" A! ?& z& x0 t, i# R/ s' [2 N* \0 E
04. 添加其他功能函数
5 U6 d6 o! J' h7 \/ l" A
可以看到有一个 SYSTEM 文件夹,进入 SYSTEM 文件夹,里面有三个子文件夹分别为delay,sys,usart,每个子文件夹下面都有相应的.c 文件和.h 文件。 我们将 SYSTEM 文件夹 和 里面的三个子文件夹复制到我们工程根目录中。 如下图。我们接下来要将这三个目录下面的源文件加入到我们工程,同时将头文件路径加入到 PATH 中
: |" P  L( b5 ^, c0 Y6 ^" T0 h3 B7 e# N) {; R1 b( \; w
I`FK~K(RGY}AVM]7DGZAU5S.png
" b- {) A. h, Y! q# ~/ S% i& |  b  v* D
然后点击“OK”之后可以看到工程中多了一个 SYSTEM 组,下面有 3 个.c 文件。
$ j! h9 g6 F" z  B1 d! q+ D" n( m
接下来我们将对应的三个目录(sys,usart,delay)加入到 PATH 中去,因为每个目录下面都有相应的.h 头文件。/ n+ G- s3 D. H' `

) Y- N; X, h# ^4 i9 ]2 P (92R]SAJ}C)UA8G81U63.png
" l; ]" p" I+ O7 P3 ~9 Q% b+ c( j* S- |/ G5 J& _! h  l
修改主函数如下) f4 H2 a0 u$ y1 o

! F: [# c$ r& U8 \; O$ b) U' `
  1. #include "stm32f4xx.h"7 ~. _* U" S+ l8 d
  2. #include "usart.h"
    7 Z1 B; j% V; L7 W$ X) U3 V6 S
  3. #include "delay.h"1 W* C- y0 V# Q9 b/ f; q% ]9 i
  4. 3 v1 u- B0 W/ e0 U0 M( z
  5. int main(void)
    7 X9 p1 l, w" L5 ?" e
  6. {
    ! x" N% `! n. ^; D, m
  7.         u32 t=0;
    % B8 w# s- P( h
  8.         uart_init(115200);& C9 u- x1 I) B- j( v8 U+ o
  9.         delay_init(84);( V9 y- d$ S# `2 C- I
  10.         while(1)
    2 H& C/ X2 q3 X
  11.         {2 J8 n8 W6 u3 S& N
  12.                 printf("t:%d\r\n",t);
    - [" P5 Q3 Q7 \" J
  13.                 delay_ms(500);5 ]7 q# a! m# O4 J: o4 g/ T
  14.                 t++;6 b' W" H4 G8 C/ E1 S% M6 d
  15.         }/ Y; ]8 t5 @1 d" g. N0 y: T
  16. }
复制代码

% l& @7 D  V; L! t4 G4 G+ G编译结果
; V$ Z* X& h9 p3 V
" ^* ~( H  i. b1 Y5 ]# f4 n0 ] RX~AnYA4)HSQ[LD$FO`}X.png : n" [& P! `3 v  \# h* T
$ e" u, {- I6 _; {) p3 k0 s1 b

2 |& l8 Q* p7 s! j' ^% d  U5 M: P" I0 ~8 t; E; ~

3 e; Q+ ^( e7 U+ q
: `* S- f, g9 @0 I6 |( Q: R
收藏 评论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 手机版