STM32提供的标准库是ST单片机开发工程师应该非常熟悉的,在工程中调用标准库函数也是非常高效的开发方式,但是每次创建工程都需要将标准库文件源码和头文件添加到工程中,是不是觉得很麻烦呢,而且每次编译的时候,如果全编译,会花费很多不必要的时间,所以这里提供一个可提高stm32标准库开发效率和编译速度的方法:stm32静态库编译及调用测试,不仅标准库可以编译成lib文件调用,自己封装的通用的算法,也可以编译成lib,如果不想把算法泄漏给别人,这种方式是非常有效的哦。
最近使用的STM3L15x系列单片机,因为发现编译的时候,速度有点慢,则想用静态编译将标准库编译好,直接调用即可大大加快编译速度。
1,标准库编译工程建立
我用keil5新建立一个名为stm32l15xlib的工程,这个名称最后用于产生lib文件的名字,工程目录如下:
将标准库源码和头问价复制到新建工程目录下,按如下图方式加载到lib库工程中:
至此所有需要添加的文件在工程中。
2,库工程配置
工程要能生成库文件,需要将这个工程正常编译后才行,这时需要对新建的工程进行一些配置:
(1)头文件路径指定包含,配置预编译选项
(2)配置生成lib
配置生成lib的名称和路径。
编译工程,生成lib文件。
lib生成的路径。
3,lib文件调用及工程测试
(1)新建应用工程,选取芯片型号,加载启动文件
加载启动文件,在keil中这个是比较方便的,keil支持器件的启动文件加载,只要包含keil器件支持包:
(2)添加库文件,新建测试main.c
加载库文件和main.c文件都在Manage Projiect Items界面进行添加,同样需要配置工程编译的头文件依赖路径,这里不再赘述。
下面是main.c的程序源码,实现led使用GPIOB_PIN0端口控制周期闪烁:
#include "stm32l1xx.h"
#include "stm32l1xx_gpio.h"
#include "stm32l1xx_rcc.h"
#define LED1 GPIO_Pin_0
void Init_LEDs(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = LED1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void DELAY_Ms(unsigned int n)
{
unsigned int j = 0;
while (n--)
{
j = 8000;
while(j--);
}
}
void ToggleLEDs(uint16_t GPIO_Pin)
{
GPIO_ToggleBits(GPIOB,GPIO_Pin);
}
int main(void)
{
Init_LEDs();
while(1)
{
GPIO_ResetBits(GPIOB,LED1);
DELAY_Ms(20);
GPIO_SetBits(GPIOB,LED1);
DELAY_Ms(20);
}
}
按照这个方式,我们可以把自己实现的算法,封装成库供第三方使用,最好还是使用标准库函数进行算法的实现,这样一个算法只需在标准库环境下就能正常使用,可移植性会比较好。
可参考:http://www.eeworld.com.cn/mcu/2018/ic-news100541474.html