STM32自己的封装库

摘要:
以前一直使用STM32的标准库,需要一步步地将代码加进去,将编译选项设置好,然后再编译整个工程。本博文就是我将STM32F4的标准库编译成lib文件并在工程中使用的过程。我计划在目录E:学习ARM库stm32f4-2中创建库。生成完成后,MDK工程中:13、工程输出目录:文件stm32f4lib.lib就是我们生成的lib文件14、将库文件加入该工程15、新建工程,我命名成stm32f4use,处理器依旧选择STM32F407VG。

以前一直使用STM32的标准库,需要一步步地将代码加进去,将编译选项设置好,然后再编译整个工程。

这个编译过程是一个相当慢的过程!完全编译大约需要一支烟的时间。每次建立工程都这么编译,是一个相当浪费时间和香烟的过程。

于是,我有了将库编译成lib文件的想法。本博文就是我将STM32F4的标准库编译成lib文件并在工程中使用的过程。

适用对象:

1、熟悉库,不想再看库里边代码

2、有稳定的库,库文件更新不频繁

3、库文件多,每次编译时间长

下面是我将STM32F4的标准库编译成lib并在工程中使用的过程:

使用工具链:MDK4.70A。其实各个工具链几乎是一样的

1、建立创建lib的工程

2、将库文件拷贝到工程目录:

将库里边目录STM32F4xx_StdPeriph_lib v1.0.2STM32F4xx_StdPeriph_Driver下的inc和src两个文件夹拷贝到预创建工程的目录。

我计划在目录E:学习ARM库stm32f4-2中创建库。于是我将两个文件夹拷贝到了这里。

3、选择芯片:STM32F407VG

image

4、选择NO。因为这不是可运行的程序,这里不需要加入启动文件。

image

5、创建完工程后,工程结构如图:

image

6、MDK中点击工具栏上的image设置工程结构,并将库文件加入工程:

为了通用,我将库中所有的C文件都加入了工程

image

7、完成后MDK下的目录结构

image

8、MDK下设置输出选项:

工程选项中设置输出,选择输出lib到目录E:学习ARM库stm32f4-2lib:

image

9、设置C语言预编译宏和引用目录:

因为要使用STM32F4标准库,预编译选项设置:USE_STDPERIPH_DRIVER,STM32F4XX

将刚才拷贝的inc和工程根目录文件夹加入引用:

image

10、设置完成后:

image

11、将stm32f4xx_conf.h文件拷贝到工程:

这个文件需要在标准库提供的示例工程中找:

我使用的是STM32F4-Discovery_FW_V1.1.0ProjectPeripheral_ExamplesADC3_DMAstm32f4xx_conf.h

这个文件引用了库文件中所有的头文件。因为不包含在库中,我将这个文件拷贝到E:学习ARM库stm32f4-2文件夹。

12、到此,工程设置完成。按F7编译,经过一支烟的时间即可生成库的lib

生成完成后,MDK工程中:

image

13、工程输出目录:

image

文件stm32f4lib.lib就是我们生成的lib文件

14、将库文件加入该工程

15、新建工程,我命名成stm32f4use,处理器依旧选择STM32F407VG。

image

16、这是选择yes,因为这是一个可执行的工程:

image

17、将标准库示例工程的STM32F4-Discovery_FW_V1.1.0ProjectPeripheral_ExamplesADC3_DMA中的system_stm32f4xx.c拷贝到工程目录(E:学习ARM库stm32f4-2)中

18、再次点击菜单上的image设置工程目录结构,将刚才生成的lib库加入到工程中:

image

19、将示例工程STM32F4-Discovery_FW_V1.1.0ProjectPeripheral_ExamplesADC3_DMA中的system_stm32f4xx.c拷贝到工程目录。

20、将main.c和 system_stm32f4xx.c 加入到工程

image

21、完成后的目录结构:

image

22、加入编译选项

与上边生成lib相似,预编译选项设置:USE_STDPERIPH_DRIVER,STM32F4XX

引用目录:.inc;..stm32f4-2 (这里的.inc;..文件夹就是刚才建立库时候的文件夹)

输出可执行文件:

image

23、添加几行简单的代码

//点亮一个LED
#include <stm32f4xx.h>
#include "stm32f4xx_conf.h"
#include "stm32f4xx_tim.h"

int main()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOD,&GPIO_InitStructure);
GPIO_SetBits(GPIOD,GPIO_Pin_12);

while(1);
}

24、工程设置完成,按F7试试。现在编译速度快起来了,点个烟的时间就编译完了

免责声明:文章转载自《STM32自己的封装库》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇MongoDB---如何避免插入重复数据(pymongo)android共享内存下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Linux根文件系统分析之init和busybox

Hi,大家好!我是CrazyCatJack。今天给大家讲解Linux根文件系统的init进程和busybox的配置及编译。 先简单介绍一下,作为一个嵌入式系统,要想在硬件上正常使用的话。它的软件组成大概有这三部分:1)bootloader 2)嵌入式系统kernel 3)根文件系统 。这其实非常好理解,类比于PC上的操作系统,首先我们需要类似BIOS的东东...

Linux中通过/proc/stat等文件计算Cpu使用率

Linux平台Cpu使用率的计算 proc文件系统 /proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为内核与进程提供通信的接口。用户和应用程序可以通过/proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取/proc目录中的文件时,proc文件系统是动态从系统...

gdb 调试

昨天下班之间请教师父一个panic的解法,见他用gdb调试,真的很厉害,看到堆栈的东西,跟踪堆栈,定位报错的panic出错的具体汇编语句,很惊吓,感叹自己也是用gdb很久的人了,他的很多用法还不知道,特补充下vmlinux和gdb的相关知识在此作为笔记。 (gdb)list *0xc33310a0 (查看0xc33310a0地址所在的源代码段,常用来查看报...

智能客户端(SmartClient)

引文 http://dev.csdn.net/develop/article/16/16270.shtm  智能客户端(SmartClient)     本文主要讨论基于企业环境的客户端应用程序模型,由于本人曾经从事过传统的客户端/服务器两层结构应用程序和基于.net平台的多层结构应用程序的开发,因此本文将着重描述.net平台上的智能客户端应用程序模型,并...

基於tiny4412的Linux內核移植 --- 实例学习中断背后的知识(1)

作者:彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台tiny4412 ADK Linux-4.9   概述前面几篇博文列举了在有设备树的时候,gpio中断的用法示例。下面我们尝试分析一下Linux内核是如何做到的,如果哪写的有问题,欢迎大家批评指正,谢谢。 还是以GPIO中断为例分析,对于tiny4412,gpi...

Linux 中 cp 命令(文件复制)

cp命令用来将一个或多个源文件或者目录复制到指定的目的文件或目录。它可以将单个源文件复制成一个指定文件名的具体的文件或一个已经存在的目录下。cp命令还支持同时复制多个文件,当一次复制多个文件时,目标文件参数必须是一个已经存在的目录,否则将出现错误 语法 cp(选项)(参数) 选项 -a:此参数的效果和同时指定"-dpR"参数相同; -d:当复制符号连接时,...