一种关于STM32工程文件结构的想法

虽然绝对有很多人比我先想出来了,但是对于这个想法,只要做的人数够多,那么库文件调用起来绝对比Arduino方便。

虽然我非常讨厌Arduino…
但是,我这个思路和文件结构是允许你浏览和修改库文件代码的,并且相当方便。
目前这个思路还是基于Keil,只要VSC的Keil插件一天不支持全功能调试,我就死守Keil一天。
还有,不喜欢Hal库 →_→

原理

众所周知,C语言的编译过程为:

大致过程也就是:
假设输入的有a.c a.h b.c b.h

  1. 预处理器先把#include <a.h>文件中所有代码复制到#include <a.h>的所在位置(a.c&a.h -> a.i)。
  2. 然后gcc程序会把C语言代码转换成对应汇编代码(a.c -> a.s)。
  3. 汇编编译器再把汇编文件转换为机器码(a.s -> a.obj,这也是你STM32工程下为啥这么多obj文件的原因)。
  4. 链接器最后把一些静态链接库、动态链接库链接到机器码中,并打包为可执行文件(a.obj&b.obj -> a.hex)。

上述的重点就是,

  1. .h头文件一般只保存函数/变量的声明以及一些宏定义等。这个.h头文件只是简单的代码复制粘贴而已。
  2. 多文件编译时,多个.c文件会被编译为.obj文件,然后链接器会把多余的没被调用过的部分删除,同时把多个.obj合并为一个最终文件。

需要补充的地方:

  1. #define stringa stringb 只是简单的文本替换,把关键词为stringa的代码替换为stringb。比如#define int char 之后 int a 会变成 char a;但是double intaaa不会变成double charaaa

那么,什么狗屁C/C++工程文件,其本质无非也就是帮编译器找到对应的.h.c文件而已。

那么,因为链接器会把多余的没被调用过的部分删除这一步的存在,不关你工程文件里面加了多少万行的代码,编译出来的文件是一样的。无非就是编译的时候会慢一点,但是只要把无关文件从工程中剔除的话,就不影响任何东西。甚至可以直接用宏定义来规避无关代码,减少编译时间。

所以我们不如把我们所有的传感器库,协议库,算法库,软件库都统统打包为一个Template工程文件,以后当需要推行一个新项目的时候,只需要 Ctrl+c Ctrl+v 生成一个新的Template即可。

虽然我STM32玩的并不是特别多,但是我还是攒了一点东西。
但是因为因为FreeRTOS,UCOS之类的系统间不兼容,以及部分库文件需要适配系统,所以我打算把Template分为三个版本,一个nonOS,也就是无系统版本,一个FreeRTOS版本,一个UCOS版本。
目前着手在做的是nonOS版本
目前的文件结构为:

Core:
这里存放STM32的官方启动文件和core文件。

Driver:
这里一般存放硬件和模块的库文件。

Hardware:
这里一般存放一些软件模拟的硬件协议,比如模拟I2C 模拟并行等等。

Project:
这里存放用户的main.c 以及工程文件

Software:
这里存放一些软件算法,上位机通信协议,以及原子哥必备三件套代码等等。

Stm32F10x_FWLIB:
这里存放STM32标准库文件。

目前已经支持的模块列表:

模块名称/库名称 硬件接口协议/软件分类 功能 备注
MPU6050 I2C 获取加速度等 代码来自原子哥
OLED12864 I2C 显示图像
nRF24L01 SPI 2.4Ghz 无线通信 代码来自官方
1.6寸半反半透屏 SPI 显示图像 代码来自官方
SD卡 SPI 储存 代码来自原子哥
SD卡 SDIO 高速储存 代码来自原子哥,STM32F103RC以下不支持,RC支持
SD卡+FAT32 SPI 文件储存系统 原子哥+FAT官方
SD卡+FAT32 SDIO 高速文件储存系统 原子哥+FAT官方,STM32F103RC以下不支持,RC支持
PID 控制算法 PID控制算法
ANO_tc 通信协议 匿名上位机通信协议 我还没写完
I2C 模拟接口 模拟I2C库
BlueRocker 通信协议 蓝牙摇杆app通信协议 代码来自于上位机作者
delay 软件 延时函数 代码来自原子哥
usart 通信协议 普通串口上位机协议 代码来自原子哥
Intel8080 模拟接口 模拟intel8080并口 我还没写完

造轮子真的是太爽了 (误)
有什么想要补充的库或者想让我加进去的库可以在本帖留言。
虽然大概率不会有…

Download

https://github.com/h13-0/STM32F1-Template

如何使用

结尾

当然了 其实只要略微玩过一点C/C++,写过几句printf("Hello,World!");之后,基本都会知道这个原理。所以产生这个想法的人数绝对是以数十万来记的。但是我觉得只要这个打包好的Template工程文件被足够多的大佬和玩家推广后,写起来绝对比Arduino还快。
虽然小白都去用HAL了,然后真正的大佬都去用寄存器版本的库了。。。但是就算用寄存器去操作模块,最后也是要封装为函数的。。
这个帖子也代表着我
http://www.h13studio.com/Stm32库文件合集/
这篇帖子的彻底完结。

By the way,
本篇原理部分大多数是林老师的功劳
林老师博客: https://uint128.com/