STM32嵌入式学习笔记二:将功能封装为库文件来折腾小灯

    技术2025-07-24  19

    本文转载自https://www.cnblogs.com/isakovsky/p/11424183.html,笔者将展示如何把各个独立的功能封装为库文件以便主函数进行调用。 将所有的函数都堆在main.c文件里不是好的选择,庞大的代码文件会是你维护的障碍,明智的做法是,一种功能封装到一个库文件里。库文件就是你代码开始部分写的#include<xxxx.h>里面的xxxx.h。

    在窥视stdio.h文件后,我们发现文件中大部分是注释的废话,剩下的只有一堆宏命令和函数定义,一行具体实现也没有。 具体的实现被编译为二进制格式,并被封装为*.lib文件了,我们在调用时编译器会直接将我们调用的部分编译进我们的程序中,我们并不知道具体的代码是什么。

    我们自己封装库文件时不用如此复杂,直接将函数源代码留着。编译器编译其他代码,需要调用时,直接再编译一遍。

    实验四:将LED流水灯的功能封装进库文件中

    在led.h文件中,我们只需效仿stdio.h,声明所有用到的函数。

    #include <stm32f10x.h> #ifndef _LED_H #define _LED_H void Delay(int time); void LED_configer(void); void LED_blingbling(void); #endif //led.h

    注意,为了防止库函数被重复定义,我们要先判断,这个库函数对应的宏开关有没有打开,就是上文的_LED_H,如果打开了,我们就不应该再定义这个库中的函数。

    而具体的函数实现,我们放在led.c中

    #include <led.h> #include <stm32f10x.h> void Delay(int time){ for(int i=0;i<time;i++) for(int j=0;j<1000;j++); } void LED_configer(){ //led³õʼ»¯µÄº¯Êý RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitTypeDef GPIO_LED_INIT; GPIO_LED_INIT.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4; GPIO_LED_INIT.GPIO_Speed=GPIO_Speed_2MHz; GPIO_LED_INIT.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_Init(GPIOA,&GPIO_LED_INIT); } void LED_blingbling(){ while(1){ GPIO_SetBits(GPIOA,GPIO_Pin_1); Delay(500); GPIO_ResetBits(GPIOA,GPIO_Pin_1); GPIO_SetBits(GPIOA,GPIO_Pin_2); Delay(500); GPIO_ResetBits(GPIOA,GPIO_Pin_2); GPIO_SetBits(GPIOA,GPIO_Pin_3); Delay(500); GPIO_ResetBits(GPIOA,GPIO_Pin_3); GPIO_SetBits(GPIOA,GPIO_Pin_4); Delay(500); GPIO_ResetBits(GPIOA,GPIO_Pin_4); } } //led.c

    然后在main文件中,直接包含库,并调用库函数即可。如此,代码文件的可读性和可维护性便提高了很多。

    #include <stdio.h> #include <stm32f10x.h> #include <led.h> int main(){ LED_configer(); LED_blingbling(); return 0; } //main.c

    附:《STM32固件库使用手册》和《STM32参考手册》下载地址: https://blog.csdn.net/weixin_41561640/article/details/107124800

    Processed: 0.009, SQL: 9