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

如何将STM32F4的标准库编译成lib?

[复制链接]
攻城狮Melo 发布时间:2023-4-2 13:13
以前一直使用STM32的标准库,需要一步步地将代码加进去,将编译选项设置好,然后再编译整个工程。
这个编译过程是一个相当慢的过程!完全编译大约需要一支烟的时间。每次建立工程都这么编译,是一个相当浪费时间和香烟的过程。
于是,我有了将库编译成lib文件的想法。本博文就是我将STM32F4的标准库编译成lib文件并在工程中使用的过程。

5 N" ~& t* k- z8 I4 a  ]' R+ g
适用对象:
1、熟悉库,不想再看库里边代码
2、有稳定的库,库文件更新不频繁
3、库文件多,每次编译时间长

; I2 n6 o& {. k3 Z# [6 r0 @
下面是我将STM32F4的标准库编译成lib并在工程中使用的过程:
使用工具链:MDK4.70A。其实各个工具链几乎是一样的
1、建立创建lib的工程
2、将库文件拷贝到工程目录:
将库里边目录\STM32F4xx_StdPeriph_lib v1.0.2\STM32F4xx_StdPeriph_Driver下的inc和src两个文件夹拷贝到预创建工程的目录。
我计划在目录E:\学习\ARM\库\stm32f4-2中创建库。于是我将两个文件夹拷贝到了这里。
3、选择芯片:STM32F407VG

% n' ~8 Z3 u* P1 s* B6 C! X
14180116-05b7196977694bacbb591fb0a78f00b8.png

  X/ x0 r7 Z5 v5 w" H% L0 E6 p$ H
4、选择NO。因为这不是可运行的程序,这里不需要加入启动文件。
# `2 R0 P3 s. C
14180127-28c3a139924145dfb814650c2de62cbb.png

3 a; k1 D( ]( D% U
5、创建完工程后,工程结构如图:
7 [1 j8 t' q  `
14180135-696a1a8aeb42476ebfc59cda62389ae4.png
" s, n" \/ _+ G7 T1 M/ N  v
6、MDK中点击工具栏上的设置工程结构,并将库文件加入工程:
为了通用,我将库中所有的C文件都加入了工程
+ ]' a- J! s+ _7 N* @
14180201-2af7e5d0474e47c6880f59e9d9cbab36.png
* X" e# u/ K+ U4 C4 X
7、完成后MDK下的目录结构:

9 w: J2 @$ r  O3 z+ M# G1 ~- o* ]
14180212-21a5d5903a3646ee9daf800906ee513c.png
. E+ `* W9 B$ ?7 \1 A6 q" ]
8、MDK下设置输出选项:
工程选项中设置输出,选择输出lib到目录E:\学习\ARM\库\stm32f4-2\lib\:

, Z. q4 Z- y2 W0 h3 N. ?3 [
14180218-b709259396664572b698310eff4ac626.png

4 F9 o, q" y: V8 x9 W! Z. v- n2 w
9、设置C语言预编译宏和引用目录:
  因为要使用STM32F4标准库,预编译选项设置:USE_STDPERIPH_DRIVER,STM32F4XX
  将刚才拷贝的inc和工程根目录文件夹加入引用:

0 m# P. ^& I4 l, T
14180230-8371a8f02bff4dab8537807909fd2bfc.png

9 D0 q, F, J$ s. S3 A) }) @0 u( @3 H
10、设置完成后:

9 I& O# l$ s) p: V% }
14180240-11c7a4034f924880a18bde8edb1fbe85.png

! ^. U0 p$ M5 v: X+ v: Z
11、将stm32f4xx_conf.h文件拷贝到工程:
这个文件需要在标准库提供的示例工程中找:
我使用的是\STM32F4-Discovery_FW_V1.1.0\Project\Peripheral_Examples\ADC3_DMA\stm32f4xx_conf.h
这个文件引用了库文件中所有的头文件。因为不包含在库中,我将这个文件拷贝到E:\学习\ARM\库\stm32f4-2文件夹。
7 i0 ]0 k/ M* C9 g, c6 u+ K' Y0 D4 j
12、到此,工程设置完成。按F7编译,经过一支烟的时间即可生成库的lib。
生成完成后,MDK工程中:

/ x( o4 l8 t/ {( ^
14180246-8a1bafd4165c417c9d3bf2c9ad73e5b9.png

4 r1 o; Y+ c+ `/ x
13、工程输出目录:

1 N4 v1 G4 C9 {& l" x+ F, S
14180254-61f2a649c50b4bbb99948330ef3f7a32.png
9 ~# Z) h% c) d. ?
文件stm32f4lib.lib就是我们生成的lib文件

# }  H6 V! z, z0 O4 g4 @0 X, ~
14、将库文件加入该工程
15、新建工程,我命名成stm32f4use,处理器依旧选择STM32F407VG。
9 Z* n7 J6 E6 d* P. \/ I
14180304-9952401f7163486**3169e4d3477b1.png

. b# }1 Q3 h* h4 P% h
16、这是选择yes,因为这是一个可执行的工程:

8 D1 M% M7 w6 _, F1 Q9 u6 E
14180307-82b670cfdf6548e58620ac216d5921b0.png
9 B) x+ G, t4 A+ ?/ d0 {
17、将标准库示例工程的\STM32F4-Discovery_FW_V1.1.0\Project\Peripheral_Examples\ADC3_DMA中的system_stm32f4xx.c拷贝到工程目录(E:\学习\ARM\库\stm32f4-2)中
8 @3 W& D$ e( r! \' T' Y
18、再次点击菜单上的设置工程目录结构,将刚才生成的lib库加入到工程中:

6 `, V3 O" ]8 K+ a1 S# N3 I
14180318-1239e69b3d0744bab24a74345cf9c4ec.png

* w. @8 M( S- U
19、将示例工程\STM32F4-Discovery_FW_V1.1.0\Project\Peripheral_Examples\ADC3_DMA中的system_stm32f4xx.c拷贝到工程目录。
20、将main.c和 system_stm32f4xx.c 加入到工程
3 f7 C- e3 g* q9 h1 j
14180333-13348eaeb18949e5854d591f6129a029.png

7 ]+ D2 t  H9 i% |' J4 I9 ]9 Q
21、完成后的目录结构:

9 v0 w; `9 y, q6 [# M  E
14180337-4fd44a95044a4d328714b13d33669807.png
* Y& @! }- n8 p& w
22、加入编译选项
与上边生成lib相似,预编译选项设置:USE_STDPERIPH_DRIVER,STM32F4XX
引用目录:.\inc;..\stm32f4-2  (这里的.\inc;..文件夹就是刚才建立库时候的文件夹)
输出可执行文件:

6 T5 _8 y6 A; z$ n4 k4 @
14180342-624acd56f444439f91db70f8e001d1f3.png
4 u8 x% |9 K* u6 d; c7 i+ p
23、添加几行简单的代码
  1. //点亮一个LED
    , q+ D2 k. q( f
  2. #include <stm32f4xx.h>
    ' g  w4 m8 ]/ N/ K
  3. #include "stm32f4xx_conf.h"0 _3 k0 A' ^: o  V) u
  4. #include "stm32f4xx_tim.h"
    & q5 ?, e" \5 S& F4 Q; P6 V' I
  5. int main()- @5 e! j3 \" A1 A
  6. {
    4 e" M+ f2 K$ D# I6 e% \; i- m
  7.     GPIO_InitTypeDef GPIO_InitStructure;
    ; m+ i& `0 T$ @- W1 s5 ~: z7 j, A
  8.     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
    - ^0 X$ S6 e1 Z; t% z
  9.         
    8 z9 L2 w5 v2 j# V$ o; V
  10.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    . g* R6 P& @5 n' N# Q' b2 v
  11.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;0 \  r5 a! ~0 ?9 J6 g$ Z6 m; s
  12.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;: x4 b) h8 K# }0 J  h0 j# r
  13.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;$ @7 r2 H/ M- \% W
  14.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;3 e0 m* G% D2 x* `! }# u
  15.     GPIO_Init(GPIOD,&GPIO_InitStructure);
    ( i! D* ?+ d1 q! a& z! e* {! h  X: k
  16.     GPIO_SetBits(GPIOD,GPIO_Pin_12);/ D' Q9 c& ?! _  e
  17.     while(1);
    & m' k( o3 h% M7 [4 O
  18. }
复制代码
9 ]% X4 u1 Q7 q! }
24、工程设置完成,按F7试试。现在编译速度快起来了,点个烟的时间就编译完了
1 {- l3 z/ W2 i5 U- E% \
转载自:哐哐哐 Quan7 ^+ v  `  J. ~5 y) m5 e* i. z' b4 F- N
赞 收藏 评论0 发布时间:2023-4-2 13:13

举报

0个回答

所属标签

相似技术帖

官网相关资源

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