
01. 前提条件' x% _0 h# f+ T7 Z; O) {/ E 1.1 官方标准固件库2 `" Q" m5 i6 e$ k r 文件名:STM32F4xx_DSP_StdPeriph_Lib_V1.8.0.zip! V: c( U7 l5 Z) f( n: m 技术博客:【STM32】 STM32官方标准固件库概述' O0 ^# [5 {9 }6 h0 Q+ F0 G8 j8 l( x K 0 S1 Q0 q7 X6 r+ n 下载地址:STM32F4xx_DSP_StdPeriph_Lib_V1.8.0.rar & m/ C7 b$ w# f. u0 o 1.2 MDK开发环境(5.30版本 其它版本也可以) 5 p! u h" M6 ]+ u2 A: H 文件名:MDK530 技术博客:【STM32】Keil5(MDK-ARM)安装教程详解 ; M0 X o+ V1 i3 t* J 下载地址:MDK530.rar 4 C2 ^" l. s, s$ r4 P 02. 创建工程步骤1 T* Y- y8 M7 G. e% t0 y 2.1 创建对应的文件夹 0 s6 @" ]' _ g. T* l2 F 新建下面 5 个子文件夹:CORE ,FWLIB,OBJ,SYSTEM,USER。至于这些文件夹名字,实际上是可以任取的,我们这样取名只是为了方便识别。对于这些文件夹用来存放什么文件,我们后面的步骤会一一提到。 ; d" U& c* G$ b) v4 p5 D0 H+ S ![]() $ _/ X0 @8 l" P. c3 Y 2.2 创建工程项目+ X+ X- \* {6 O% @) L$ a & ^# F4 o) Z! }5 z* Z) e/ I( d 打开 Keil,点击 Keil 的菜单:Project –>New Uvision Project ,然后将目录定位到刚才建立的文件夹 Template 之下的 USER 子目录,同时,工程取名为 01Test之后点击保存,我们的工程文件就都保存到 USER 文件夹下面。 8 L$ K, P5 ]/ Y ![]() 9 w) l" K8 s# |5 U1 h 2.3 保存工程文件名 工程取名为 01Test之后点击保存,我们的工程文件就都保存到 USER 文件夹下面。# ~6 L% v4 X& i, w( c" f' X& ^ ![]() 2.4 选择芯片型号 定位到STMicroelectronics 下面的 STM32F407ZG( 针对我们的 ExplorerSTM32 板子是这个型号)。这里我们选择 STMicroelectronics→STM32F4 Series→STM32F407→STM32F407ZG 4 t, H6 i, |& @6 v6 i: v& A ![]() 3 n3 g, y! D# Y( a# n: V. U7 P& ~, ^$ f 2.5 管理运行时环境 3 c. I; a! H; g6 I8 ^0 j7 E" ] MDK 会弹出 Manage Run-Time Environment 对话框,这是 MDK5 新增的一个功能,在这个界面,我们可以添加自己需要的组件,从而方便构建开发环境,我们直接点击 Cancel即可,取消之后得到的界面如下:* `! b3 o7 n9 c. I ![]() + V: v9 t) q0 f2 y0 w R 2.6 复制固件库源码文件6 A: k. v& t$ T* R! v7 j6 x" U" u/ F 打开官方固件库包,定位到我们之前准备好的固件库包的目录:\STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Libraries\STM32F4xx_StdPeriph_Driver 下面,将目录下面的 src,inc 文件夹 copy 到我们刚才建立的 FWLib 文件夹下面。 src 存放的是固件库的.c 文件,inc 存放的是对应的.h 文件,每个外设对应一个.c 文件和一个.h 头文件。 9 q" }) Z+ ^: T ![]() 2.7 复制启动文件 将固件库包里面相关的启动文件复制到我们的工程目录 CORE 之下。8 I6 F/ D' J E+ _/ S9 I' 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 文件夹下面的文件, . u2 j% g C, K9 d# r3 |: N ![]() 2.8 复制其它头文件和源文件$ ^4 o; x3 ~% L% Y: Z) l * l; W2 E2 Q$ M5 [/ M 首先定位到目录: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 目录下面。 - [/ _% u6 _3 P6 m6 m5 _ ![]() _ t( g8 f# v6 I& h 2.9 添加文件到工程中8 K7 Y5 l& s+ n9 q 前面几个步骤,我们将需要的固件库相关文件复制到了我们的工程目录下面,下面我们将这些文件加入我们的工程中去。右键点击Target1,选择 Manage Project Items, 8 j9 y' W( M4 d U1 P* B ![]() 2.10 设置项目结构 Project Targets一栏,我们将Target名字修改为01Test,然后在Groups一栏删掉一个SourceGroup1,建立三个 Groups:USER,CORE,FWLIB。然后点击 OK,可以看到我们的 Target名字以及 Groups 情况如下图:7 f( K+ e* h/ \" u" i& Z5 i( W . O" U4 L U# h) u0 i ![]() # C: `1 N. z3 \! W+ t 选择OK,出现如下界面:% ]4 X4 E2 s9 L+ u7 Y 4 i9 _) \2 r8 x* Y; P! x ![]() 2.11 添加FWLIB目录下的文件! L% z% l9 | H% I' q# A2 O7 t % B( |/ S) M- r/ q3 r 右键点击点击01Test,选择 Manage Project Items.然后选择需要添加文件的 Group,这里第一步我们选择 FWLIB,然后点击右边的 Add Files,定位到我们刚才建立的目录\FWLIB\src 下面,将里面所有的文件选中(Ctrl+A),然后点击 Add,然后 Close.可以看到 Files 列表下面包含我们添加的文件 6 y9 E" L" {4 T2 e ![]() 对于我们写代码,如果我们只用到了其中的某个外设,我们就可以不用添加没有用到的外设的库文件。例如我只用 GPIO,我可以只用添加 stm32f4xx_gpio.c 而其他的可以不用添加。这里我们全部添加进来是为了后面方便,不用每次添加,当然这样的坏处是工程太大,编译起来速度慢,用户可以自行选择。! Z6 S. z$ e1 W- ]' i - M- d! s/ z, o' y$ ~ 这里有个文件 stm32f4xx_fmc.c 比较特殊。这个文件是 STM32F42 和 STM32F43 系列才用到,所以我们这里要把它删掉(是 注意是 stm32f4xx_fmc.c 要删掉,不要删掉 stm32f4xx_fsmc.c)。 5 y+ t% t! m/ g# s2 Z1 ^8 q7 Z ![]() 5 B$ Y% B) D7 F! P# X$ t2 L 2.12 添加CORE目录下的文件 用同样的方法,将 Groups 定位到 CORE,添加需要的文件。这里我们的 CORE 下面需要添加的文件为 startup_stm32f40_41xxx.s( 注意,默认添加的时候文件类型为.c, 也就是添加 startup_stm32f40_41xxx.s 启动文件的时候,你需要选择文件类型为 All files件才能看得到这个文件),2 O. S9 J9 ]0 b4 E& ` " L- v& A& ] ]5 K- h( V8 H+ T2 v ![]() 2.13 添加USER目录下文件 0 O- t/ i* I: e% K8 f7 }& { USER 目录下面需要添加的文件为 main.c,stm32f4xx_it.c,system_stm32f4xx.c。 这样我们需要添加的文件已经添加到我们的工程去了,最后点击 OK,回到工程主界面。& B- x0 g6 q3 z5 M+ r. T5 C - l5 C3 }3 D9 ]0 j9 C/ r Q4 _ 1 h5 X' W3 z; B. D- L2 L 主界面如下:' b# `; P2 h& o # y! E4 A1 Z0 {' ]7 y ![]() " S; \$ X) k V0 a7 V8 e$ }* ]( b% w3 ^ 2.14 设置头文件路径. `# ~3 |# s) s {1 n) o# ] ) m8 B! v, l, D& e 我们要在 MDK 里面设置头文件存放路径。也就是告诉 MDK 到那些目录下面去寻找包含了的头文件。这一步骤非常重要。 如果没有设置头文件路径,那么工程会出现报错头文件路径找不到。 ![]() 这里我们需要添加的头文件路径包括:\CORE, \USER\以及\FWLIB\inc。这里大家务必要仔细,固件库存放的头文件子目录是\FWLIB\inc,不是 FWLIB\src。 ![]() 5 _" }8 g" J( Z/ C! _ 2.15 添加宏定义 接下来对于 STM32F40 系列的工程,还需要添加一个全局宏定义标识符。添加方法是点击魔术棒之后,进入 C/C++选项卡,然后在 Define 输入框连输入:STM32F40_41xxx,USE_STDPERIPH_DRIVER。注意这里是两个标识符 STM32F40_41xxx和USE_STDPERIPH_DRIVER, 他们之间是用逗号隔开的,请大家注意。+ D- R$ N' D% M9 E0 w( d & d% R) u6 e+ Q$ m% Q ![]() * [! w8 E5 P) _/ Q7 V. `0 Y$ g8 D( |( } 2.16 设置中间文件存放路径 ) j$ d' c, V& n6 O ^ 然后选择“Output”选项下面的“Select folder for objects…”,然后选择目录为我们上面的 新建的 OBJ 目录。同时将下方的三个选项框都勾上。0 ]7 N) I1 d- a0 z ![]() 4 ~% s" W! t8 I+ k: ~ Create HEX File 选项选上是要求编译之后生成 HEX 文件。Browse Information 选项选上是方便我们查看工程中的一些函数变量定义。, b% e. {* t! K! n! E% R [ / w9 X0 f& f! w3 `8 X& K/ I, }' j 2.17 修改主函数代码
与此将 同时,我们要将 USER 分组下面的 stm32f4xx_it.c 。 文件内容清空。的 或者删掉其中的 32 行对main.h 头文件的引入以及 144 行 行 SysTick_Handler 函数内容,: R a" R% m: j- ^% ~' L & z* o# N: B, O6 h. ~ 2.18 编译工程+ P6 d5 n! u8 Q) [. |. x, g 可以看到工程编译通过没有任何错误和警告。. q% |3 |0 B/ ?2 M. C) O ![]() ; |2 O& ~* H8 p+ b 到这里,一个基于固件库 V1.8 的工程模板就建立完成,同时在工程的 OBJ 目录下面生成了对应的 hex 文件。 / y( _; B, g, K U6 o 03. 系统时钟配置 我们要修改 System_stm32f4xx.c 文件,把 PLL 第一级分频系数 M 修改为 8,这样达到主时钟频率为 168MHz。( F' |" \9 q6 j5 m1 `! Q: O5 _ 0 Z! x: N6 q5 F+ I9 v+ g- M
同时,我们要在 stm32f4xx.h 里面修改外部时钟 HSE_VALUE 值为 8MHz,因为我们的外部高速时钟用的晶振为 8M,具体修改方法如下:' s) J% ^5 ~" Y 7 t$ G/ ~/ T+ r ~1 k7 }! |
一定要在对应的配置文件中,找到相应的代码行,修改为符合我们硬件的值即可。 ( q( z2 W1 d' E2 N 04. 添加其他功能函数- A4 [; h7 e" e6 T 可以看到有一个 SYSTEM 文件夹,进入 SYSTEM 文件夹,里面有三个子文件夹分别为delay,sys,usart,每个子文件夹下面都有相应的.c 文件和.h 文件。 我们将 SYSTEM 文件夹 和 里面的三个子文件夹复制到我们工程根目录中。 如下图。我们接下来要将这三个目录下面的源文件加入到我们工程,同时将头文件路径加入到 PATH 中 : J9 ^2 j9 u; h+ g% ~ ![]() [8 X: G$ S* N; K7 Q# l 然后点击“OK”之后可以看到工程中多了一个 SYSTEM 组,下面有 3 个.c 文件。) L" X4 C8 r+ h" P5 \ - h- j" Z6 V/ ]4 i; ~9 q/ h 接下来我们将对应的三个目录(sys,usart,delay)加入到 PATH 中去,因为每个目录下面都有相应的.h 头文件。 2 Q D' T4 F7 U- n/ |: u ![]() 修改主函数如下
编译结果 ![]() + A+ G! [; S" t* f - w9 |1 q& n$ z' o% y6 O |
STM32 ISP IQTune:真正零门槛的免费ISP调整软件
意法半导体MCU双供应链策略,打消中国客户后顾之忧
【经验分享】基于STM32使用HAL库实现USB组合设备CDC+MSC
2024意法半导体工业峰会:赋能智能电源和智能工业,构筑可持续未来
ST推出灵活、面向未来的智能电表通信解决方案,助力能源转型
意法半导体 x Qu-Bit Electronix:推动新一轮的数字声音合成革命
从STM32 MPU产品看嵌入式系统中微处理器的新变化
【Hot!】STM32全系列开发板都支持Arduino开发,你知道吗?
【经验分享】STM32 HAL库移植FreeModbus详细步骤
【STM32H7S78-DK评测】XIP模板问题处理与电机控制