/EmbeddedModules

STM32 Embedded Modules

Primary LanguageC

嵌入式STM32软件模块集

采用统一上层头文件来统一动态内存/时间/延时函数,并实现可视化参数配置

Important

主要是给stm32项目用的,部分模块依赖hal库

模块仓库文件结构

Note

* 的为自己写的模块,标 x 为非开源第三方库,其他修改自开源库,来源地址已列出

根目录文件 /
根目录文件 功能
.clang-format 格式化配置文件
modules.h 模块统一头文件
tool.py 模块配置工具
算法模块 /algorithm
Algorithm 算法 src 备注 SHA
cmsis_dsp CMSIS-DSP(Src) link 源码形式 03fa0e5
libcrc CRC计算库 link abe136a
pid 通用PID控制器 *
quaternion 四元数和IMU姿态估计 link 未测试 bd77afd
通信模块 /communication
Communication 通信 src 备注 SHA
CherryUSB Cherry USB link 9cb992b
lwpkt 轻量级数据包 link 6a82dab
minmea GPS NMEA解析器 link 450ad08
modbus Modbus协议 link 0745519
TinyFrame 另一个轻量级数据包 link a29167a
xymodem X/YMODEM协议 link f7b988d
数据结构模块 /datastruct
DataStruct 数据结构 src 备注 SHA
btree B树 link c0cfc4e
cstring C字符串 link 88e021b
ctl 类型安全C模板容器库 link d314c08
dlist 双向链表 link 23faa20
fifofast 纯头文件快速FIFO link 196edda
hashmap 哈希表 link 1c13992
json JSON解析 link 3d0e877
lfbb 二分无锁缓冲区 link 8c24b34
lfifo 通用环形缓冲区 * 比lwrb更高效
linux_list Linux-like链表 link 452262e
lwrb 轻量环形缓冲区 link b32c645
pqueue 优先队列 link 2bb5600
sds 简单动态字符串 link a9a03bb
struct2json C结构体与JSON快速互转库 link 4f1fdc9
udict 通用哈希字典 * 基于uthash
ulist 通用内存连续列表 *
uthash 基于宏的可嵌入哈希表 link 619fe95
调试模块 /debug
Debug 调试 src 备注 SHA
benchmark CoreMark基准测试 link d5fad6b
cm_backtrace hardfault堆栈回溯 link 6013293
RTT Segger-RTT 调试模块 link
log 纯头文件日志库 *
minctest 简易单元测试 link 0ab5834
驱动模块 /driver
Driver 驱动 src 备注 SHA
bq25890 BQ2589x充电芯片 link ade0e3c
ee24 24xx EEPROM库 link 92816a7
key 通用按键驱动 * 支持多种事件
motor 直流电机闭环驱动 *
paj7620u2 PAJ7620U2手势识别 *
sc7a20 SC7A20加速度计 *
sh2 SH2 Sensorhub协议 link b514b1e
spif SPI Flash通用驱动 link c0f3ba2
stepper 步进电机驱动 *
vl53l0x VL53L0X激光测距 link 非官方库 04891c2
ws2812_spi WS2812灯带DMA-SPI驱动 *
图形模块 /graphics
Graphics 图形 src 备注 SHA
easy_ui 单色屏UI库 link 大幅魔改 691bdb4
hagl HAL图形库 link 8281a8a
lvgl LittlevGL图形库 link 3aac8cc
lvgl_gaussian_blur LVGL高斯模糊效果 link cpp->c
lvgl_pm LVGL页面管理器 link 825df21
u8g2 U8g2图形库 link 3e86287
ugui uGUI图形库 link ce0bccb
virtual_lcd 虚拟LCD * 包含上位机
神经网络模块 /nn
NN 神经网络 src 备注 SHA
genann 简单前馈神经网络 link 4f72209
外设模块 /peripheral
Peripheral 外设 src 备注 SHA
board_i2c 板级I2C包装层 *
board_led 板级LED包装层 *
ee 内置flash读写库 link 0b39520
i2c_salve LL库I2C从机 *
ll_i2c LL库I2C * 包含中断/轮询
mr_library 轻量级设备读写接口 link
sw_i2c 软件I2C link c595a39
sw_spi 软件SPI x
uni_io 数据通信功能包 *
存储模块 /storage
Storage 存储 src 备注 SHA
easyflash 轻量级Flash数据库 link a67fffc
littlefs LittleFS link d01280e
MiniFlashDB 轻量级Flash数据库 link 魔改 99bf7aa
系统模块 /system
System 系统 src 备注 SHA
dalloc 动态指针管理内存分配器 link da14f0f
heap4 FreeRTOS堆4 link
klite 基础实时内核 link 轻量高性能,推荐
lwmem 轻量级内存管理 link 性能远不如heap4 2b08317
rtthread_nano RT-Thread Nano link 9177e3e
s_task 精简的协程实现 link 需要实现栈切换 609835c
scheduler 多功能任务调度器 * 内有使用说明
scheduler_lite 轻量级任务调度器 *
工具模块 /utility
Utility 工具 src 备注 SHA
cot_menu 轻量级菜单框架 link 抽象菜单
embedded_cli 嵌入式命令行 link 魔改 8734a57
lwprintf 轻量级无缓冲区printf link 1d3ad53
perf_counter PerfCounter性能统计/时基库 link 必备品 82a80d9
ryu 浮点数转字符串 link 5056abc
term_table 动态终端表格工具 * 仅debug使用
TimeLib UNIX时间库 link 8bdf963
xv 类JavaScript的字符串解析器 link b46851f
tiny_regex 简易正则解析器 link 无捕获组 9d5f5d8
incbin.h 二进制文件嵌入 link 6e576ca
macro.h 通用宏 *

Warning

可能会对自己编写的模块进行较大的API变动以满足个人需求, 不保证向后兼容

配置文件

  • Kconfig - Kconfig配置文件, 用于配置代码的宏定义, 开关和设置各种功能, 遵循Linux内核的Kconfig规范
  • Mconfig - 基于Kconfig的配置, 描述生成项目的模块文件夹时所需复制的模块文件, 如不存在则复制完整文件夹
Mconfig 语法

Mconfig文件实际上是一个python脚本, 继承完整的tool.py运行环境

其中有四个特殊变量和三个特殊函数:

  • CONFIG - 从Kconfig配置结果中解析的配置项目, 访问不存在的项目将返回False
  • IGNORES - 复制该模块的文件时忽略的项目, 使用glob匹配
  • DST_PATH - 本模块文件夹的目标路径
  • SRC_PATH - 本模块文件夹的源路径
  • def DEBUG(msg: str) - 输出调试信息 (--debug)
  • def WARNING(msg: str) - 输出警告信息
  • def ERROR(msg: str) - 输出错误信息并退出

下面是一个简单的例子:

if CONFIG.DISABLE_MODULE_A: # 也支持.get()方法来定义不存在时的默认返回值
    IGNORES += "module_a.*"
if CONFIG.DISABLE_SUB_MODULES:
    DEBUG(f"SUB_MODULES: {CONFIG.SUB_MODULES}")
    if "B" in CONFIG.SUB_MODULES:
        IGNORES += ["module_b1.*", "module_b2.*"]
    IGNORES += "module_c*.*"
IGNORES += "test_*_module.*"

配置工具 tool.py

Ellu@ELLU  /home/ellu/git/EmbeddedModules   master ≣ +0 ~0 -0
❯ python ./tool.py --help

usage: tool.py [-p PROJECT_DIR] [-m] [-s] [-n] [-u] [-d MODULE_DIRNAME] [--debug]

optional arguments:
  -h, --help            show this help message and exit
  -p PROJECT_DIR, --project-dir PROJECT_DIR
                        Specify the directory for working project, default is current directory
  -m, --menuconfig      Run menuconfig in project dir
  -g, --guiconfig       Run menuconfig with GUI
  -s, --sync            Sync latest module files without menuconfig
  -rs, --reverse-sync   Sync newer files from project to module repo
  -ns, --no-sync        Skip syncing latest module files after menuconfig
  -n, --newmodule       Create a new module
  -u, --update          Pull the latest version of this toolset from github
  -a, --analyze         Analyze module dependencies
  -c, --check           Check for updates of modules
  -d MODULE_DIRNAME, --module-dirname MODULE_DIRNAME
                        Specify the directory name for generated modules, default is 'Modules'
  -fc, --force-copy     Force copy files even if destination is newer
  -gm, --gen-makefile   Generate makefile for source files
  --debug               Enable debug output
  • 在命令行中配置并更新项目模块文件夹

    python tool.py -p /path/to/project -m
  • 在GUI中配置并更新项目模块文件夹 (需要Python环境支持tkinter)

    python tool.py -p /path/to/project -g
  • 使用已有配置从仓库同步最新模块文件

    python tool.py -p /path/to/project -u -s
  • 在仓库中创建新模块

    python tool.py -n
  • 列出所有模块的依赖关系 (可用于辅助编写Kconfig)

    python tool.py -a
  • 检查所有模块的更新情况 (比较本文件记录的SHA和仓库中最新提交的SHA)

    python tool.py -c
  • 冻结生成文件夹中的某个模块 (如针对项目修改了模块源码时)

    在生成文件夹 (如Modules) 的根目录创建一个.Mfreeze文件, 写入要冻结的模块文件夹名, 每行一个

  • 有效的环境变量

    • MOD_PROJECT_DIR - 指定项目目录 (命令参数优先)
    • MOD_MODULE_DIRNAME - 指定生成模块文件夹的目录名 (命令参数优先)

TODO

  • 用kconfig替代modules_conf.template.h
  • 配置工具自动复制模块文件夹
  • 允许配置Mconfig来指定添加项目
  • 为所有自己写的模块编写README

LICENSE

MIT (For self-written modules only)