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

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

[复制链接]
STMCU小助手 发布时间:2022-6-10 19:41
02. 创建工程步骤( j$ {) q+ f1 T- d% b; `
2.1 创建对应的文件夹

# z9 Z  E) C. l+ m4 E5 x- }新建下面 5 个子文件夹:CORE ,FWLIB,OBJ,SYSTEM,USER。至于这些文件夹名字,实际上是可以任取的,我们这样取名只是为了方便识别。对于这些文件夹用来存放什么文件,我们后面的步骤会一一提到。, v' h7 K/ a% S, I: i: E4 ?

+ E6 P9 O' v$ h/ i- W2 d Q@614TS)JN$RX77GB}}P7L9.png ) G1 w( F) Q6 C8 Z+ |0 L5 N
% A" L4 L( H! y1 r% t
2.2 创建工程项目4 E* K" s* P0 z. j
" [! f. C5 S5 w3 q- Z
打开 Keil,点击 Keil 的菜单:Project –>New Uvision Project ,然后将目录定位到刚才建立的文件夹 Template 之下的 USER 子目录,同时,工程取名为 01Test之后点击保存,我们的工程文件就都保存到 USER 文件夹下面。
5 s# I9 A3 }7 B$ L4 O
+ Y6 s. |2 J5 C5 `" K5 o+ @0 H PLN[3]TV]7[T}`1GT[@$@XE.png
0 ?0 ?: |/ f+ a& M. g$ Z9 v2 ]* x
2.3 保存工程文件名
$ O! z% c" b" j. ]# c* }
0 t* n$ L- w4 u, ~+ L# y+ i# s工程取名为 01Test之后点击保存,我们的工程文件就都保存到 USER 文件夹下面。
" O  t3 f  a9 s4 J. S+ C4 O# i/ E9 Y$ }$ D
0]Y(NR7_(VQXE4W`JPD(`U3.png
# A9 ?0 \# g. ]
1 w5 f# _! F- r  c) T2.4 选择芯片型号
% I/ @( d+ {; o. P- [$ z# j- p
: E" F# N% n- V7 u8 ?定位到STMicroelectronics 下面的 STM32F407ZG( 针对我们的 ExplorerSTM32 板子是这个型号)。这里我们选择 STMicroelectronics→STM32F4 Series→STM32F407→STM32F407ZG
4 @7 A0 u* z3 `/ B: c
1 [- e! j& r8 T% a M~2Q(LZAWG]9L5U4B~[V.png , l- n$ R2 S! C% n& \& I
$ R) e: f# l9 m
2.5 管理运行时环境
& h. W& u( G8 Y* \% B4 R0 u3 y! l% f7 p" n
MDK 会弹出 Manage Run-Time Environment 对话框,这是 MDK5 新增的一个功能,在这个界面,我们可以添加自己需要的组件,从而方便构建开发环境,我们直接点击 Cancel即可,取消之后得到的界面如下:+ @1 S' j1 s4 F# |4 o( l) \. o

5 K: t. m( f8 p" `% N8 e  v XK@R4)QA6`EX2~~SAFW73OD.png - s8 J3 D+ o4 z4 X+ w3 e

% r: U# P, W4 T) R4 d& i6 D2.6 复制固件库源码文件8 S% t6 a  N) t" N

0 z# Y4 G$ a7 T+ f: }打开官方固件库包,定位到我们之前准备好的固件库包的目录:\STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Libraries\STM32F4xx_StdPeriph_Driver 下面,将目录下面的 src,inc 文件夹 copy 到我们刚才建立的 FWLib 文件夹下面。
) \% D- \% m! p; |2 O/ S1 _. _
; M. b5 E) R: l* u" Y/ Isrc 存放的是固件库的.c 文件,inc 存放的是对应的.h 文件,每个外设对应一个.c 文件和一个.h 头文件。, o) m% f& k# ?
- r$ u" X3 a' e8 B4 Z0 O& M
20200818152936112.png
9 K, b- k/ s! W
3 C! k% j1 i$ F( ^2 J% z2.7 复制启动文件

4 J3 ?- w- p2 H: I
. g2 H- ]8 X9 h: s+ X6 ?将固件库包里面相关的启动文件复制到我们的工程目录 CORE 之下。
  [* A2 x$ q3 l. }$ i- F; E- n3 |  \. ~  ~
\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 文件夹下面的文件,
& U% }! _' l4 x
2 c8 W, {; b6 y8 @5 f7 W F2AJF4PCD9;F55{S~YA.png ! n& p1 s* P8 T# c' F
; e9 K3 C8 L. W# r9 M+ r
2.8 复制其它头文件和源文件

' x/ K! a* |4 B0 O+ H2 }& {: u3 G$ H' m" J
首先定位到目录: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 目录下面。( E- f# N  W  N

$ B  z% V' [8 b' g+ v' [% G/ R  } 0P(9O8%]X0Y4Z~[UL191{V3.png
* a* \/ H$ [  O( n8 U! F! D  N' Z5 {; |& L
2.9 添加文件到工程中/ B& z  X4 ~5 e4 Q

' @9 I% x/ R# ]+ @; u4 {" D; y前面几个步骤,我们将需要的固件库相关文件复制到了我们的工程目录下面,下面我们将这些文件加入我们的工程中去。右键点击Target1,选择 Manage Project Items,. L# y0 z+ ^- J- R9 F( _
2 m* n6 [) p3 W3 e0 e
SFHXUW$WM4_E5`H2DN]1_D5.png
* p) C6 P4 t! C% O: ~
! k4 B2 j: A1 P( y0 D7 p( O2.10 设置项目结构
6 a$ [  L$ P# p/ f# B) c- H

2 O! F- @1 T+ a1 F/ Q2 Q, KProject Targets一栏,我们将Target名字修改为01Test,然后在Groups一栏删掉一个SourceGroup1,建立三个 Groups:USER,CORE,FWLIB。然后点击 OK,可以看到我们的 Target名字以及 Groups 情况如下图:
+ h. U' _. Z) \- h% U" y' v% C' U7 C* }! ~% K0 R, v
[~9N2P58R(O0`J9A_43`SYJ.png
, ], b9 Z! ?- _+ d
* M+ j: g: u$ v6 A  H, c# H选择OK,出现如下界面:
' |  F' E  {2 Z5 r8 X  m, n" A* {& e' p; ~" `  h  ^
, a) R# @% N/ K8 M

2 z9 ]: e& |' O& f. w0 N9 C. b2.11 添加FWLIB目录下的文件
! T0 r0 Y" D2 V4 R  T$ {+ `& Z: `
: i' I6 H4 a- \4 |右键点击点击01Test,选择 Manage Project Items.然后选择需要添加文件的 Group,这里第一步我们选择 FWLIB,然后点击右边的 Add Files,定位到我们刚才建立的目录\FWLIB\src 下面,将里面所有的文件选中(Ctrl+A),然后点击 Add,然后 Close.可以看到 Files 列表下面包含我们添加的文件8 c; C2 D7 O8 V+ s7 J( U3 h
$ S( {5 c) {4 j4 h& |0 F
)222{JR5WB@]1WW82RVZBDT.png
0 p( u4 Z& V* S" Z3 C9 V% H: B* V
7 H% P, r- y7 ^+ v2 i4 D* Y对于我们写代码,如果我们只用到了其中的某个外设,我们就可以不用添加没有用到的外设的库文件。例如我只用 GPIO,我可以只用添加 stm32f4xx_gpio.c 而其他的可以不用添加。这里我们全部添加进来是为了后面方便,不用每次添加,当然这样的坏处是工程太大,编译起来速度慢,用户可以自行选择。
8 F% |* E6 m- J6 `) Q3 m+ O) U+ x
这里有个文件 stm32f4xx_fmc.c 比较特殊。这个文件是 STM32F42 和 STM32F43 系列才用到,所以我们这里要把它删掉(是 注意是 stm32f4xx_fmc.c 要删掉,不要删掉 stm32f4xx_fsmc.c)。
+ i, n/ b* k% V$ }$ E! G% u" W3 [' ?5 Y3 {8 [+ ~2 o9 N. d' T
LBK_WK9FW@P(MWP8SUU9J5L.png
7 d9 m6 D" ~' M$ v; B  v0 }& k) ]" I6 l7 d- F' Y7 o2 z+ g
2.12 添加CORE目录下的文件
0 x5 d  `, S+ V

# o  C/ ~' |4 ~/ E4 p' a& `用同样的方法,将 Groups 定位到 CORE,添加需要的文件。这里我们的 CORE 下面需要添加的文件为 startup_stm32f40_41xxx.s( 注意,默认添加的时候文件类型为.c, 也就是添加 startup_stm32f40_41xxx.s 启动文件的时候,你需要选择文件类型为 All files件才能看得到这个文件),
9 C, K' l: ]7 v8 E4 g
& l% U4 l2 H$ p' N. T( e, O3 ? _TUC${`OBX@_TOL@}M`T4C4.png 5 u! V  V( S$ J8 F9 O6 O7 F: u& r
! U( v# B6 J  M
2.13 添加USER目录下文件
/ r' `! Z( R! g4 e" v
4 m+ o4 n: O: ]4 H1 G, p6 t
USER 目录下面需要添加的文件为 main.c,stm32f4xx_it.c,system_stm32f4xx.c。 这样我们需要添加的文件已经添加到我们的工程去了,最后点击 OK,回到工程主界面。: i: Q! R) g& [3 v9 o% N+ h) r* A/ D
+ a% F. z, p# e2 S
6Z}TFPFU6M_S@$`(`[C)X.png , i9 r- c& ~& Y. ^8 ]- g; W/ X

' v, X/ {( ^3 j' Y4 \主界面如下:' d' M) Q, ^2 K& d% Y9 D) G/ a; D8 q
- [9 |. F( W8 l0 s* R* k
E(7UO7`%B~)CKIQQ[@,~U.png
2 v1 }% N% b9 F- C9 q" H% [, A! |; p  z& S- R" z
2.14 设置头文件路径
+ n4 u  M6 v6 ]5 r# o/ G, O5 {' }# ?5 {4 Y
我们要在 MDK 里面设置头文件存放路径。也就是告诉 MDK 到那些目录下面去寻找包含了的头文件。这一步骤非常重要。 如果没有设置头文件路径,那么工程会出现报错头文件路径找不到。5 t9 U7 s( @' N7 z6 D

! A& g, Y' c8 y8 C% ~  r/ r# u NXKWAB3@W_56W1UT0KW[S]O.png 7 Y+ \, f4 S. q$ P  U
( G. i* ?3 Q  X8 z* s! q
这里我们需要添加的头文件路径包括:\CORE, \USER\以及\FWLIB\inc。这里大家务必要仔细,固件库存放的头文件子目录是\FWLIB\inc,不是 FWLIB\src。! d2 K# S( C4 n
. f1 G2 l) H' [- j- g9 K9 k% S2 n
57XMP9HARLI~7PFC7J}T}.png 5 K) Z# a( u" v8 t. E
- b. o9 W, s% l5 O1 E; l8 M5 u
2.15 添加宏定义
8 o, r8 R* m4 k% B4 W+ a; E/ V" P5 t, w* G
接下来对于 STM32F40 系列的工程,还需要添加一个全局宏定义标识符。添加方法是点击魔术棒之后,进入 C/C++选项卡,然后在 Define 输入框连输入:STM32F40_41xxx,USE_STDPERIPH_DRIVER。注意这里是两个标识符 STM32F40_41xxx和USE_STDPERIPH_DRIVER, 他们之间是用逗号隔开的,请大家注意。; l3 i' A6 l1 V- ^) K$ a% Z

% k& N$ A) ~4 g) v Q17YALQ)(32D{Q052[CD2N8.png 1 D- H/ ~1 S4 d$ V& F. W
$ k: ~+ f, N8 u" E, b; Y; e/ Z1 U
2.16 设置中间文件存放路径+ K8 `5 h  K% e3 @

) c1 p4 `2 s7 l" F7 o8 K然后选择“Output”选项下面的“Select folder for objects…”,然后选择目录为我们上面的 新建的 OBJ 目录。同时将下方的三个选项框都勾上。
9 L" n3 {6 I2 z" n
$ |( F. e( ^+ g ${HKDXEL`EHPKV]4IX6S0@A.png
- H" b2 |  a% ~8 P! m; o$ k4 `( g- {* n6 V9 w6 c6 p
Create HEX File 选项选上是要求编译之后生成 HEX 文件。Browse Information 选项选上是方便我们查看工程中的一些函数变量定义。
- _) w8 q* S* c  C$ L
0 k4 Q- Z; o, {1 k2.17 修改主函数代码$ i( N, x( n  S# R& b9 H( K7 X
  1. #include "stm32f4xx.h"( M: o4 I8 m* q
  2. 5 }- ~2 o& R% }
  3. void Delay(__IO uint32_t nCount);" \0 u5 p9 o  h  w

  4. . m  j0 e. z' o( @
  5. void Delay(__IO uint32_t nCount)3 e0 m7 G8 {/ F
  6. {
    0 u# {* C+ i% f3 ?6 Z$ G
  7.         while(nCount--){}0 q- g2 T9 ]' x- e& e* I9 C
  8. }% }5 j- U. B7 M- M- ?3 d
  9. int main(void)2 {1 e8 b2 T) E) {2 q
  10. {" U' b2 {4 M! C  ^0 |
  11.         GPIO_InitTypeDef GPIO_InitStructure;
      s" s& E/ C% d$ Z: B
  12.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);6 |" Z* j! G1 T5 f! X
  13.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;" d. b, ~. G, T, u% f! t
  14.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    1 F1 f9 ?" {: T1 T5 ~) z9 L
  15.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    4 G; J& ?/ n" e
  16.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;1 m0 G* z2 x( K6 T. k' v3 u
  17.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;0 J+ A# J# @7 Y3 J
  18.         GPIO_Init(GPIOF, &GPIO_InitStructure);
    . _, D  l9 T* V
  19.         + U5 P" {6 c) n/ u
  20.         while(1)
    ' k0 ^  ~0 Y' Q  \' {
  21.         {0 E3 |* X/ s3 X
  22.                 GPIO_SetBits(GPIOF,GPIO_Pin_9|GPIO_Pin_10);7 P) P3 o1 b/ M+ M3 k% }- w
  23.                 Delay(0x7FFFFF);3 J1 Z  Z  V2 |+ r
  24.                 GPIO_ResetBits(GPIOF,GPIO_Pin_9|GPIO_Pin_10);8 a/ Q2 T5 F9 l& h
  25.                 Delay(0x7FFFFF);
    2 e+ E' V. |9 u, D+ e7 r5 y% c; S
  26.         }$ e# u* |: m' h$ h# z  W# E
  27. }7 n0 a6 p( L. b6 m" |8 U
复制代码
3 X* Z" E+ O  z/ ~' N7 @
与此将 同时,我们要将 USER 分组下面的 stm32f4xx_it.c 。 文件内容清空。的 或者删掉其中的 32 行对main.h 头文件的引入以及 144 行 行 SysTick_Handler 函数内容,, ^+ h& B6 w8 ~3 [! m2 C# N3 X
! e) V4 I, o3 G9 z  A( _& |7 e
2.18 编译工程+ _; v! v3 w' x# K4 |" m% t4 Y/ ^% H4 q  k
* l; L( g  j1 ?
可以看到工程编译通过没有任何错误和警告。, j8 [0 s5 I/ f
) L  @* g/ ^$ i1 E2 S
FBF3Y~IAMT4{F4VRAVUX}YS.png
$ M8 R+ L6 p& }: `$ C6 e* R8 P- v0 U0 [7 @
到这里,一个基于固件库 V1.8 的工程模板就建立完成,同时在工程的 OBJ 目录下面生成了对应的 hex 文件。3 u! `8 t9 e! U
) [. e2 n) r. E9 o+ l# X
03. 系统时钟配置
% L% C( t+ R" y我们要修改 System_stm32f4xx.c 文件,把 PLL 第一级分频系数 M 修改为 8,这样达到主时钟频率为 168MHz。
9 G! Q1 p5 D; B+ G3 `. d  u+ v  y+ o! O6 u' J# G9 U
  1. /************************* PLL Parameters *************************************/
    / l( e5 F9 {4 R; l
  2. #if defined(STM32F40_41xxx) || defined(STM32F427_437xx) || defined(STM32F429_439xx) || defined(STM32F401xx) || defined(STM32F469_479xx)
    $ f, v# j: A1 A8 _# l
  3. /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */
    4 E1 t3 z$ C& _8 t& ~) J8 F
  4. #define PLL_M      8        //之前是25# C5 E. t3 U9 G+ P2 O- S: ?5 G
  5. #elif defined(STM32F412xG) || defined(STM32F413_423xx) || defined (STM32F446xx)+ ?4 g! u8 }3 n1 y' O1 f
  6. #define PLL_M      8
    , I1 w& ~! M$ W" F/ A
  7. #elif defined (STM32F410xx) || defined (STM32F411xE)9 H& Z% J' j% C. ]0 o
  8. #if defined(USE_HSE_BYPASS)
    9 n1 [+ a; i% R
  9.   #define PLL_M      8    - o4 K9 E/ e6 `
  10. #else /* !USE_HSE_BYPASS */
    : |) c5 G+ X8 t6 z8 y$ F8 Y! `
  11.   #define PLL_M      163 `1 ^) i$ ~, X  \/ o7 D8 _
  12. #endif /* USE_HSE_BYPASS */
    7 v" R+ e8 R5 K/ `1 K5 E. v
  13. #else0 I7 r3 a/ E. Y" @
  14. #endif /* STM32F40_41xxx || STM32F427_437xx || STM32F429_439xx || STM32F401xx || STM32F469_479xx */  
复制代码

) q9 n# P" |5 \; o同时,我们要在 stm32f4xx.h 里面修改外部时钟 HSE_VALUE 值为 8MHz,因为我们的外部高速时钟用的晶振为 8M,具体修改方法如下:
2 }: ^8 y1 u2 n2 O: s& _! u& D. ]# c
  1. #if !defined  (HSE_VALUE) & A% ?4 i8 S  a9 Y
  2.   #define HSE_VALUE    ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */5 c9 ~3 \; `* H: `2 i& _
  3. #endif /* HSE_VALUE */
复制代码
' T! `" q8 W' D/ F2 f; a
一定要在对应的配置文件中,找到相应的代码行,修改为符合我们硬件的值即可。! H9 b. X* y. n: z/ F7 Q

) m8 F2 l5 ?, z2 M" ~% h. F$ Y8 a  |04. 添加其他功能函数

" y7 Y5 O" _+ S4 `可以看到有一个 SYSTEM 文件夹,进入 SYSTEM 文件夹,里面有三个子文件夹分别为delay,sys,usart,每个子文件夹下面都有相应的.c 文件和.h 文件。 我们将 SYSTEM 文件夹 和 里面的三个子文件夹复制到我们工程根目录中。 如下图。我们接下来要将这三个目录下面的源文件加入到我们工程,同时将头文件路径加入到 PATH 中
% i* ^( c0 j: P. l2 m+ }# ]) J: S* r1 j: t2 H( O
I`FK~K(RGY}AVM]7DGZAU5S.png * `. `/ G7 T1 G/ _3 T+ q0 E9 {
( z& ^6 `' _% G4 z6 S0 ~
然后点击“OK”之后可以看到工程中多了一个 SYSTEM 组,下面有 3 个.c 文件。
# E* b& L. k& y8 x- A% V
$ ~: D* D/ _: f; b接下来我们将对应的三个目录(sys,usart,delay)加入到 PATH 中去,因为每个目录下面都有相应的.h 头文件。, ]; {& u; i/ R  T  n

1 `7 `. ]) K1 b& Z, o$ y: l% L (92R]SAJ}C)UA8G81U63.png & n9 j5 @: M/ y7 r/ d, K: D7 ~. a

8 \2 {+ M# d' B+ L% \* ]修改主函数如下
! j5 ]' t8 W, U. b% C  r" b
3 v6 K* Z' ], ^" k, n8 a" z
  1. #include "stm32f4xx.h"% l8 Z2 I3 ^& ?7 T6 h( @
  2. #include "usart.h"
    , b2 t3 J# k1 v! I& I6 Z; Z
  3. #include "delay.h"
    $ u  I+ a( y5 u; m2 r" i- Y( j
  4. $ d$ Z( o9 `! }: L# m
  5. int main(void)4 d2 C5 @5 [0 V3 {8 O+ z
  6. {( ?3 b8 B0 c# g
  7.         u32 t=0;5 O+ n/ k- `( t* T9 f
  8.         uart_init(115200);' o5 o% n) E; S. n! N1 k
  9.         delay_init(84);
    5 D, X/ S& r! h% [! R5 [! |( J
  10.         while(1)3 J0 V- W& A4 m' d' c
  11.         {
    7 P2 e7 d& ?, J5 ]
  12.                 printf("t:%d\r\n",t);
    + `& q& R4 q1 _/ n9 w# S
  13.                 delay_ms(500);, e; a2 h; ?7 X" s; N
  14.                 t++;
    8 I8 G# s7 ?2 V- S
  15.         }# u: c6 k* y% \7 {! z) ^
  16. }
复制代码

  M& v4 p3 o( r. D3 ]* v, V0 R, P编译结果' p1 n# S) u9 e, f% T

& z0 R" E0 c4 G; y6 c RX~AnYA4)HSQ[LD$FO`}X.png 4 [* W1 S5 K. y* r; ^

$ P* A0 m. {: ]% Q0 N# ~3 O4 g  O/ I8 h& Z
+ D; k( E0 A8 Y: W6 \/ M4 S

9 o& R/ j! D7 E$ c. g, c) O6 a$ N4 ~* z1 |" f
赞 收藏 评论1 发布时间:2022-6-10 19:41

举报

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

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

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版