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

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

[复制链接]
STMCU小助手 发布时间:2022-6-10 19:41
02. 创建工程步骤
# X! ]+ c/ F+ r4 w2.1 创建对应的文件夹

: O& x/ \- y; e7 Z. G7 T5 a新建下面 5 个子文件夹:CORE ,FWLIB,OBJ,SYSTEM,USER。至于这些文件夹名字,实际上是可以任取的,我们这样取名只是为了方便识别。对于这些文件夹用来存放什么文件,我们后面的步骤会一一提到。) ~7 E3 E* A7 _& G6 a# L" H

2 H+ G* }$ ^  E: N( I' B Q@614TS)JN$RX77GB}}P7L9.png
3 M# i: g& H% B% w4 W  K/ m7 i" B; n# e5 }5 l/ U  i+ u) V* G
2.2 创建工程项目
3 h- q4 v* \# p! ?9 A7 c. W) ~, K: v9 ^- V( [
打开 Keil,点击 Keil 的菜单:Project –>New Uvision Project ,然后将目录定位到刚才建立的文件夹 Template 之下的 USER 子目录,同时,工程取名为 01Test之后点击保存,我们的工程文件就都保存到 USER 文件夹下面。
* c) h4 s$ ?7 i, S4 N. G# @6 z# v. [1 P. w) a" f( x
PLN[3]TV]7[T}`1GT[@$@XE.png
3 Q9 D9 c) c% Y
0 v/ ~0 b( b" @, n2.3 保存工程文件名
$ t/ |) ^& p# o: V) y# n
1 ]/ Y4 O3 q* S工程取名为 01Test之后点击保存,我们的工程文件就都保存到 USER 文件夹下面。
0 J7 E: H& k$ C; f/ g( Q7 J8 r5 k6 y, H" r6 s% L
0]Y(NR7_(VQXE4W`JPD(`U3.png
1 M& H3 h; ?( B; s- `1 e. ^6 M9 e& i- ^! K: S' G6 K9 S6 R1 M
2.4 选择芯片型号  }$ K/ E, I* c7 c! \7 P

) E+ q8 o! q7 y. P) R2 ]定位到STMicroelectronics 下面的 STM32F407ZG( 针对我们的 ExplorerSTM32 板子是这个型号)。这里我们选择 STMicroelectronics→STM32F4 Series→STM32F407→STM32F407ZG
, j9 x/ y$ ]4 u, F: d
0 h' V9 S% p. X" I9 o M~2Q(LZAWG]9L5U4B~[V.png
9 t* ^( Y8 ~& h5 s* Q& d- k4 S8 D
; |7 M, o, j' k' q2.5 管理运行时环境
3 d! j% A7 x$ G; n5 h8 P8 J: t7 ^/ @! Z( |* T
MDK 会弹出 Manage Run-Time Environment 对话框,这是 MDK5 新增的一个功能,在这个界面,我们可以添加自己需要的组件,从而方便构建开发环境,我们直接点击 Cancel即可,取消之后得到的界面如下:
; w# u0 V4 x# G: ?1 W
6 z. k% \( }# y! {& [) y XK@R4)QA6`EX2~~SAFW73OD.png % T- n3 A! K0 A/ A; k; u

' o3 O! f- V) W* K2.6 复制固件库源码文件
9 b4 T/ C0 c7 ?9 s
3 w7 F' r# A. C7 s) W" n, u3 Y打开官方固件库包,定位到我们之前准备好的固件库包的目录:\STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Libraries\STM32F4xx_StdPeriph_Driver 下面,将目录下面的 src,inc 文件夹 copy 到我们刚才建立的 FWLib 文件夹下面。
. b3 v8 I2 r; w9 Z& q( o/ o1 j; p
/ b: T* r, F3 ^' g2 J3 |8 osrc 存放的是固件库的.c 文件,inc 存放的是对应的.h 文件,每个外设对应一个.c 文件和一个.h 头文件。
8 @( p0 J# p( B9 O( z7 v$ X) d- e. T5 r" M/ Z2 z" }
20200818152936112.png + I: J. p( `: q/ K

6 Q9 u9 C, [" p, Q" u2.7 复制启动文件
7 w% n) L! y9 W9 Y& O6 F+ p

- f8 G  U/ p* v3 D! k5 Y) G+ J; Z( c将固件库包里面相关的启动文件复制到我们的工程目录 CORE 之下。
  q/ d" {1 h  l# s" `7 k" y3 N9 Y# E8 Q4 H4 m) [& c6 L
\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 文件夹下面的文件,
) I  V5 N9 a, z! _
7 F. x  ?' _5 \0 m1 K/ C! L F2AJF4PCD9;F55{S~YA.png : `9 Z; L  q' X3 ^: ?
% M  w  A& J3 j7 H# ]7 }: w
2.8 复制其它头文件和源文件
# x1 P5 Y/ d8 i

. Y; m* R0 _5 o首先定位到目录: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 目录下面。
& @% w9 S. T% @0 O7 w) t1 Z
' \( M+ h# y+ n3 J) T 0P(9O8%]X0Y4Z~[UL191{V3.png
7 D5 _$ j9 K0 b/ X5 g7 G. G* T8 J8 V. ~5 M! \! q# f& F2 |
2.9 添加文件到工程中
+ r- C0 @( {. }, J4 S- ^6 q
# v. q6 b' E! N前面几个步骤,我们将需要的固件库相关文件复制到了我们的工程目录下面,下面我们将这些文件加入我们的工程中去。右键点击Target1,选择 Manage Project Items,
2 v  X, R2 G+ ~- h7 J. F" }
- G% f# r3 ^, ~ SFHXUW$WM4_E5`H2DN]1_D5.png ' A- P! w4 Y! G* w5 }( a7 H' c9 R

! _9 J9 ?2 B: T8 W" `8 O6 x2.10 设置项目结构
  t+ C% s2 W4 _- u- f9 N
8 h$ t. s, _! [9 C
Project Targets一栏,我们将Target名字修改为01Test,然后在Groups一栏删掉一个SourceGroup1,建立三个 Groups:USER,CORE,FWLIB。然后点击 OK,可以看到我们的 Target名字以及 Groups 情况如下图:: d; v5 v0 {! H# E6 r
6 ~. \" b/ ?+ x
[~9N2P58R(O0`J9A_43`SYJ.png - u; ]0 o! {' j- U/ A5 F
" |9 O' u4 s% m  ]
选择OK,出现如下界面:* h4 \) Y: f, q

! }) v7 K( W8 m; I ! P7 l$ @4 O" y' X- ^9 w
2 \5 Z. l8 c6 H3 O* k7 G
2.11 添加FWLIB目录下的文件0 K7 v% X4 q4 A$ W
; P% ~% n% v0 b9 A
右键点击点击01Test,选择 Manage Project Items.然后选择需要添加文件的 Group,这里第一步我们选择 FWLIB,然后点击右边的 Add Files,定位到我们刚才建立的目录\FWLIB\src 下面,将里面所有的文件选中(Ctrl+A),然后点击 Add,然后 Close.可以看到 Files 列表下面包含我们添加的文件
! ^0 W# b& `, M% y+ ]7 E& H1 L+ X) u( Y/ q
)222{JR5WB@]1WW82RVZBDT.png 3 O) d+ e  }( N- M; ^: {6 Y

$ L( P% I2 _- H4 m, U0 u对于我们写代码,如果我们只用到了其中的某个外设,我们就可以不用添加没有用到的外设的库文件。例如我只用 GPIO,我可以只用添加 stm32f4xx_gpio.c 而其他的可以不用添加。这里我们全部添加进来是为了后面方便,不用每次添加,当然这样的坏处是工程太大,编译起来速度慢,用户可以自行选择。1 L0 L. u8 T  s" H

3 ?8 v1 A/ K: L这里有个文件 stm32f4xx_fmc.c 比较特殊。这个文件是 STM32F42 和 STM32F43 系列才用到,所以我们这里要把它删掉(是 注意是 stm32f4xx_fmc.c 要删掉,不要删掉 stm32f4xx_fsmc.c)。: i# ]6 c; {0 ]1 ?8 l! O) ~$ y
8 C) c- p! x8 [
LBK_WK9FW@P(MWP8SUU9J5L.png 4 P% z- A/ P# h( F! s, }- }$ i8 `. A
  ~2 f% U# S, Z% @* R& X
2.12 添加CORE目录下的文件

4 g  q8 A9 _# @3 g$ v' H$ e1 T( y
用同样的方法,将 Groups 定位到 CORE,添加需要的文件。这里我们的 CORE 下面需要添加的文件为 startup_stm32f40_41xxx.s( 注意,默认添加的时候文件类型为.c, 也就是添加 startup_stm32f40_41xxx.s 启动文件的时候,你需要选择文件类型为 All files件才能看得到这个文件),9 |- I6 `  X$ A/ E( L: `
: h9 n, N" }8 A9 u2 i
_TUC${`OBX@_TOL@}M`T4C4.png , `3 V1 e% \* @" p+ B4 f

, O$ i8 s, o7 p. G1 j2.13 添加USER目录下文件

; f! l% A+ W- F0 o0 Y* |; l4 v5 o% N9 }- T- ^8 U& r
USER 目录下面需要添加的文件为 main.c,stm32f4xx_it.c,system_stm32f4xx.c。 这样我们需要添加的文件已经添加到我们的工程去了,最后点击 OK,回到工程主界面。; g$ W7 Z0 C) ^. N
1 {& i% F5 F1 r) J
6Z}TFPFU6M_S@$`(`[C)X.png
; Y) U; [6 [  z$ v% H" }- o: g! B; x6 w) ?! R8 {
主界面如下:
! ~) j% B% m/ n2 l9 C5 {3 Z' R  p' e8 ^) L0 `- a/ M0 e4 d% o: h2 c
E(7UO7`%B~)CKIQQ[@,~U.png
" f/ o' P; ^6 y! k1 N' m/ Z$ g* h9 q) G6 Y% t. d+ B
2.14 设置头文件路径+ V* J/ @, D9 q: K! l

7 v! g8 H/ f' \" [我们要在 MDK 里面设置头文件存放路径。也就是告诉 MDK 到那些目录下面去寻找包含了的头文件。这一步骤非常重要。 如果没有设置头文件路径,那么工程会出现报错头文件路径找不到。8 c2 F# v9 q- q6 p9 {. y1 f" d
9 Q8 z  ]' c  Q) Y
NXKWAB3@W_56W1UT0KW[S]O.png 1 O! b6 Z, P! \% J7 u
) N) z/ Q- E8 S: t6 h
这里我们需要添加的头文件路径包括:\CORE, \USER\以及\FWLIB\inc。这里大家务必要仔细,固件库存放的头文件子目录是\FWLIB\inc,不是 FWLIB\src。
7 e, A7 C0 P4 c5 C( S. C4 k5 s; V: ?# @/ f0 Q
57XMP9HARLI~7PFC7J}T}.png ' ]3 @  c- q# U/ A# J6 `6 k' g
4 C; A  W0 W6 i$ W" b; y1 O
2.15 添加宏定义; S& ^: T. _! D0 j

+ X" V- a# L$ I$ M0 Q4 o! {接下来对于 STM32F40 系列的工程,还需要添加一个全局宏定义标识符。添加方法是点击魔术棒之后,进入 C/C++选项卡,然后在 Define 输入框连输入:STM32F40_41xxx,USE_STDPERIPH_DRIVER。注意这里是两个标识符 STM32F40_41xxx和USE_STDPERIPH_DRIVER, 他们之间是用逗号隔开的,请大家注意。
) J# @2 b1 ^0 b0 z- \- ~
+ B! T. o2 r: ?% l- J Q17YALQ)(32D{Q052[CD2N8.png ) n7 p  Y) a5 X/ \2 c+ _
4 @  X8 u5 Z, c0 H! s4 _. f
2.16 设置中间文件存放路径' ]/ a& G( ^; T$ v

! k, e+ d- ]5 j" {然后选择“Output”选项下面的“Select folder for objects…”,然后选择目录为我们上面的 新建的 OBJ 目录。同时将下方的三个选项框都勾上。1 f$ M3 D% c4 k

0 I" O3 H& v5 L& Q& ?, V  t ${HKDXEL`EHPKV]4IX6S0@A.png + m. M7 a/ X5 N6 J- K0 P: p. W

6 x0 p2 G- \: g3 [; GCreate HEX File 选项选上是要求编译之后生成 HEX 文件。Browse Information 选项选上是方便我们查看工程中的一些函数变量定义。
  \# V, T7 w! h1 F9 ^; U* g) A# L6 R; p' w. m
2.17 修改主函数代码
! x( {) {9 S/ `/ t+ R3 M, n
  1. #include "stm32f4xx.h"
    - x  v% \: |- U: ^/ W
  2. 8 h- D+ f2 m/ j
  3. void Delay(__IO uint32_t nCount);0 [% D1 ]% Y( [3 M6 ]. j# H

  4.   P2 h% t; v& h# l) \  w
  5. void Delay(__IO uint32_t nCount). s7 v# L( l* e2 b; z1 Y4 {% l5 C
  6. {1 a# j8 G: r3 ^# z/ F. d1 R
  7.         while(nCount--){}* Y, l3 X0 C$ N, y( ~
  8. }
    ) |4 Y4 E0 i5 x2 n
  9. int main(void)( t4 S) b- \# O" f1 M9 a; D
  10. {, l' @  K  \2 l$ y
  11.         GPIO_InitTypeDef GPIO_InitStructure;
    & {! z0 ~, t! b3 `% T" p: T2 m7 g
  12.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
    5 b$ n" J. I1 p; L& B
  13.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
    ! X) _2 b% @) V7 z" \; k3 i
  14.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;0 I& I" L! y6 O- x" G& n6 H
  15.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    % `' U- u( m9 \
  16.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;+ F' G; q2 f& n" I! c5 x* R$ Z
  17.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;" Q4 z* \$ j" Q
  18.         GPIO_Init(GPIOF, &GPIO_InitStructure);( r. t4 r' T  m" R% _, f
  19.         + W+ t- a8 ]3 Y
  20.         while(1): F/ k( s' A3 ^1 O+ |' S
  21.         {3 \* E0 }0 h! E( Y' f
  22.                 GPIO_SetBits(GPIOF,GPIO_Pin_9|GPIO_Pin_10);2 [1 V. r* g* T3 A
  23.                 Delay(0x7FFFFF);# j. x  g* v) N/ Q
  24.                 GPIO_ResetBits(GPIOF,GPIO_Pin_9|GPIO_Pin_10);0 \% F( {. @% R  i% y: o7 u
  25.                 Delay(0x7FFFFF);' r) `. Z: @* I  Z7 F! f
  26.         }5 k$ n+ u# Y9 f
  27. }* _5 [4 C  I+ I
复制代码
6 j5 i0 W! I) G! ]" v+ b
与此将 同时,我们要将 USER 分组下面的 stm32f4xx_it.c 。 文件内容清空。的 或者删掉其中的 32 行对main.h 头文件的引入以及 144 行 行 SysTick_Handler 函数内容," \: ]% k# q9 b9 i) [
" u3 Z  H% Y0 A6 T+ T" `3 }
2.18 编译工程+ y- H* Q: u' Z( k( i- n
3 n+ m/ {6 V$ t2 C5 B: q$ H  g5 B
可以看到工程编译通过没有任何错误和警告。! S  }7 P- ]% U8 Q" r! i2 T$ [. Q4 J
2 U, p2 ~6 M2 l
FBF3Y~IAMT4{F4VRAVUX}YS.png - ^$ S3 w$ U- M% _. u

& {0 B6 ?, ^9 P! L: J到这里,一个基于固件库 V1.8 的工程模板就建立完成,同时在工程的 OBJ 目录下面生成了对应的 hex 文件。
  H$ y2 A) ~. e1 P5 Z
$ U7 d5 V' \2 ?4 ^  {03. 系统时钟配置% \7 B. i8 D% y1 S" K4 p
我们要修改 System_stm32f4xx.c 文件,把 PLL 第一级分频系数 M 修改为 8,这样达到主时钟频率为 168MHz。
# k0 c0 I; H% X# p
  ?- a' Y" B5 G+ t
  1. /************************* PLL Parameters *************************************/; d$ p5 E" c9 d& T9 j7 A
  2. #if defined(STM32F40_41xxx) || defined(STM32F427_437xx) || defined(STM32F429_439xx) || defined(STM32F401xx) || defined(STM32F469_479xx)" U& Q  a1 O0 u) b* J5 ^
  3. /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */$ x* Q* u$ w3 g  Y% D6 U
  4. #define PLL_M      8        //之前是25
    8 x$ I1 V* a" M7 F" Q  k
  5. #elif defined(STM32F412xG) || defined(STM32F413_423xx) || defined (STM32F446xx)
    1 F7 F  c. E5 a
  6. #define PLL_M      8- O7 u' A$ L5 K5 G1 n
  7. #elif defined (STM32F410xx) || defined (STM32F411xE)5 G! u* Y& S% q! |! R( T" E
  8. #if defined(USE_HSE_BYPASS)
      k1 a% I) Q4 D" k7 {: k8 W% f8 ~
  9.   #define PLL_M      8    # u; ?- z' A# @3 |, b
  10. #else /* !USE_HSE_BYPASS */
    # s3 W" M& X0 |, I. a
  11.   #define PLL_M      16: _6 U: \' N8 |  q! b. }! C
  12. #endif /* USE_HSE_BYPASS */
    * ?7 r& E3 v- p$ |6 G5 \
  13. #else  x5 h  m$ W% W& R* d
  14. #endif /* STM32F40_41xxx || STM32F427_437xx || STM32F429_439xx || STM32F401xx || STM32F469_479xx */  
复制代码
' H: i( s/ P7 F9 M
同时,我们要在 stm32f4xx.h 里面修改外部时钟 HSE_VALUE 值为 8MHz,因为我们的外部高速时钟用的晶振为 8M,具体修改方法如下:0 @8 m# c) U: w. y

  `4 ?3 X, `$ ]' A9 s) Q
  1. #if !defined  (HSE_VALUE) " f+ n+ e2 |0 d- f, R
  2.   #define HSE_VALUE    ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */7 j: d. _9 u$ \6 ~, R( Y( @) K
  3. #endif /* HSE_VALUE */
复制代码
$ t4 F  |3 g3 _, f
一定要在对应的配置文件中,找到相应的代码行,修改为符合我们硬件的值即可。
0 E4 Q/ V7 A% A* J* w0 F9 C; c( x  g) ?% ]( {% O2 d
04. 添加其他功能函数
% c1 ]1 j5 l# {9 a1 A5 _# D
可以看到有一个 SYSTEM 文件夹,进入 SYSTEM 文件夹,里面有三个子文件夹分别为delay,sys,usart,每个子文件夹下面都有相应的.c 文件和.h 文件。 我们将 SYSTEM 文件夹 和 里面的三个子文件夹复制到我们工程根目录中。 如下图。我们接下来要将这三个目录下面的源文件加入到我们工程,同时将头文件路径加入到 PATH 中
# ?: |# \% ]) q: Y
6 o+ P4 I  l. h- c1 O# p; P I`FK~K(RGY}AVM]7DGZAU5S.png 6 ~, g) ^: a" A8 X) r4 K
* V" X: Y7 o6 G6 [9 U% n3 p
然后点击“OK”之后可以看到工程中多了一个 SYSTEM 组,下面有 3 个.c 文件。
  r6 o& A. `5 X9 }9 n" B; @, b3 ]
& g% X; R% k2 p& X7 X; Q接下来我们将对应的三个目录(sys,usart,delay)加入到 PATH 中去,因为每个目录下面都有相应的.h 头文件。9 R; u# j8 }* q9 M( H' Q

, D: P# f2 \- F. O (92R]SAJ}C)UA8G81U63.png
) o3 `' q& W6 O1 o1 ?: V
3 d- v, F9 O, L0 ^9 L( U" D修改主函数如下" w) L8 P9 y. o. v" B

- ?, s  |; W+ N0 P+ V6 u
  1. #include "stm32f4xx.h"
    " @4 P/ {5 @0 d2 M8 J* L8 r1 V4 o
  2. #include "usart.h"/ l1 t+ s- I' \2 [6 o0 r* T+ p
  3. #include "delay.h"
    6 h* z5 F3 U7 a

  4. 4 Y( C6 u1 g* S  w% s6 u! U
  5. int main(void)0 ]3 g& @) ?0 E; Q; h
  6. {: a- d. b; b! f) {, M
  7.         u32 t=0;
    9 D# {! t! g1 w
  8.         uart_init(115200);
    $ P- E) `" v7 m
  9.         delay_init(84);( N: l" Z( D+ X" ]/ s
  10.         while(1)
    : v3 M7 v3 U. R* V' \
  11.         {
    % \9 D. M- K* z4 M# o5 ]
  12.                 printf("t:%d\r\n",t);
    4 S; ]% J1 Y& U
  13.                 delay_ms(500);
    & d/ j4 F2 t' z! @% x. ^
  14.                 t++;
    $ m9 m9 \, v3 r3 v
  15.         }: l- n! Z0 d8 ^% Y% u
  16. }
复制代码

$ c* P( M/ W" l( S编译结果1 H  R6 k, W) a- q" p

3 w# w* D% J4 {  E3 h9 }) v5 V RX~AnYA4)HSQ[LD$FO`}X.png
: ^% Q6 ~" L! u- }
+ t0 ]! T. b! i, R, {. k/ _1 L# V* D$ X, i$ |6 m

* \9 f5 x- U; W
5 G$ E- {- C0 @6 S. p) y
( c0 p- n/ T# i# O. }3 U
收藏 评论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 手机版