虽然绝对有很多人比我先想出来了,但是对于这个想法,只要做的人数够多,那么库文件调用起来绝对比Arduino方便。
虽然我非常讨厌Arduino…
但是,我这个思路和文件结构是允许你浏览和修改库文件代码的,并且相当方便。
目前这个思路还是基于Keil,只要VSC的Keil插件一天不支持全功能调试,我就死守Keil一天。
还有,不喜欢Hal库 →_→
原理
众所周知,C语言的编译过程为:
大致过程也就是:
假设输入的有a.c
a.h
b.c
b.h
- 预处理器先把
#include <a.h>
文件中所有代码复制到#include <a.h>
的所在位置(a.c&a.h -> a.i)。 - 然后gcc程序会把C语言代码转换成对应汇编代码(a.c -> a.s)。
- 汇编编译器再把汇编文件转换为机器码(a.s -> a.obj,这也是你STM32工程下为啥这么多obj文件的原因)。
- 链接器最后把一些静态链接库、动态链接库链接到机器码中,并打包为可执行文件(a.obj&b.obj -> a.hex)。
上述的重点就是,
.h
头文件一般只保存函数/变量的声明以及一些宏定义等。这个.h
头文件只是简单的代码复制粘贴而已。- 多文件编译时,多个
.c
文件会被编译为.obj
文件,然后链接器会把多余的没被调用过的部分删除,同时把多个.obj
合并为一个最终文件。
需要补充的地方:
#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/