# 自动化寄存器生成配置助手C **Repository Path**: waterguy/register-friend-by-c ## Basic Information - **Project Name**: 自动化寄存器生成配置助手C - **Description**: 高效率寄存器配置工具! 繁琐实验摸鱼快乐机! 快速自动生成 C语言的寄存器文件助手 - **Primary Language**: Python - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2024-12-04 - **Last Updated**: 2024-12-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #### 项目介绍 总结一句话: 高效率寄存器配置工具! 繁琐实验摸鱼快乐机! 本工程利用基于一个Markdown表格文件 通过一条简单的命令行方式, 快速自动生成对应的寄存器表和寄存器操作文件(C语言源文件) 进行读功能, 和写功能, 并且支持自动填补, 支持左移/右移/或运算, 支持配置使能, 支持重复写入, 支持空值不处理; 旨在快速实现寄存器操作, 并且减少用户的工作量, 可以更专注于业务逻辑的实现; 实现的代码也是很优雅的, 并且代码结构清晰, 容易阅读,杜绝宏污染; #### 开发原因 在本人写了几个芯片的寄存器驱动后, 发现现在流行的方法, 重复性工作太多,**不同人写的方式也五花八门. 不能统一管理.** 就算全自己做, 对单芯片的各种寄存器配置都做一边实验的话, 本身代码量也很大很重复, 所以开发了这个(摸鱼)工具, 可以快速生成头文件, 并且可以像stm32CubeMX一样操作更新; #### 理念Q&A Q: 对寄存器命名定义为什么不用宏定义而使用结构体? A: 因为我曾遇到过组合工程的时候出现宏定义冲突,结构体/数组的方式可以解决这个问题; Q:为什么用小数组组合的结构体而不用大数组? A:因为这样写写出来的代码可以看起来非常优雅; 目标是为了**实现更简单的寄存器操作, 并且减少开发者的工作量** #### 使用方法 1. 在 Register_Config.md 文件中, 填写配置表格 2. 表格介绍: Name 寄存器名称, Address 寄存器地址, Data 寄存器数据, W 写功能 R 读功能 WE/RE 配置使用 3. 然后运行程序, 将自动生成6个以上的文件,具体要read文件可以生成6组,每组对应一组运算函数 4. 其中一组文件为寄存器列表文件, 使用结构体表示,方便用户阅读 和查找 允许在Register_Config.md中重复出现,但地址必须唯一 5. 另一组文件为寄存器配置文件, 主要作用就是根据Register_Config.md列表去进行写操作 6. 还有一组是寄存器读取文件, 主要作用就是根据Register_Config.md列表去进行读操作 7. 因为要与底层协议做解耦合, 所以使用者需要自己实现底层读写函数, 并且在 对应的读文件和写文件中 包装一下 对应的读写函数 8. 然后开发者只需要在自己的main.c 中调用 (如果里名字定义成test)test_config() 函数即可实现寄存器写操作, 调用 test_read_x() 函数(x为你配置的序号)即可实现寄存器读操作,并且会返回你移位或运算配置的数据; 9. 如果需要修改寄存器配置, 只需要修改Register_Config.md文件即可, 然后重新运行程序即可; #### 项目效果 ##### 1.配置表文件&执行生成命令 #### **Start** | Name | Address | Data | Function | 描述 | |:----:| ------- |:----:| -------- | ----------- | | A | 0x01 | 0x12 | W | 为写入寄存器类 | | B | 0x02 | 0xF2 | WE | WE是写配置使能 | | A | 0x01 | 0x17 | WE | 允许重复编写 | | C | 0x12 | 33 | W | 自动填补成0x33 | | D | 0x04 | | R | 为读取寄存器类 | | E | 0x07 | <<24 | RE0 | RE0是读配置使能 | | F | 0x06 | <<16 | RE0 | 支持将数据左移/右移且或运算 | | G | 0x12 | | RE0 | 为空值时,不做移位处理或运算 | | E1 | 0x07 | <<24 | RE1 | RE1是读配置使能 | | F1 | 0x06 | <<16 | RE1 | 支持将数据左移/右移且或运算 | | G1 | 0x12 | | RE1 | 为空值时,不做移位处理或运算 | #### **End** #### **Formula_Start** RE0: data = 1.8*3/0; RE1: data = 1.8*3/1; RE2: data = 1.8*3/2; RE3: data = 1.8*3/3; RE4: data = 1.8*3/4; RE5: data = 1.8*3/5; #### **Formula_End** ``` 调用本程序可执行文件 + 本配置表地址 + "一个空格" + 想要生成的名字 例如: .\Register.exe .\Register_Config.md nice ``` ##### 2. 自动生成的寄存器表文件(样式,非配置表真实数据) ``` #ifndef __TEST_REGISTER_H__ #define __TEST_REGISTER_H__ struct test_register { unsigned char A[2]; unsigned char B[2]; unsigned char C[2]; unsigned char D[2]; unsigned char E[2]; unsigned char F[2]; unsigned char Q[2]; }; struct test_register init_test_register(void); #endif // __TEST_REGISTER_H__ ``` ``` #include "test_register.h" struct test_register init_test_register() { struct test_register regs = { .A = {0x01, 0x00}, .B = {0x02, 0x00}, .C = {0x12, 0x00}, .D = {0x04, 0x00}, .E = {0x07, 0x00}, .F = {0x06, 0x00}, .Q = {0x12, 0x00}, }; return regs; } ``` ##### 3. 自动生成的寄存器操作文件(样式,非配置表真实数据) ``` #ifndef __TEST_CONFIG_H__ #define __TEST_CONFIG_H__ extern struct test_register test; void test_config(void); #endif // __TEST_CONFIG_H__ ``` ``` #include "test_config.h" #include "test_register.h" struct test_register test; /**************testfree write begin**************/ void test_write(unsigned char *array) { } /**************testfree write end**************/ void test_config(void) { test = init_test_register(); test.B[1] = 0xf2; test_write(test.B); test.A[1] = 0x17; test_write(test.A); } // test_config_write end ``` ##### 4. 自动生成的读寄存器操作文件(样式,非配置表真实数据) ``` #ifndef __TEST_CONFIG_H__ #define __TEST_CONFIG_H__ extern struct test_register test; void test_config(void); #endif // __TEST_CONFIG_H__ ``` ``` #include "test_config.h" #include "test_register.h" struct test_register test; /**************testfree write begin**************/ void test_write(unsigned char *array) { } /**************testfree write end**************/ void test_config(void) { test = init_test_register(); test.B[1] = 0xf2; test_write(test.B); test.A[1] = 0x17; test_write(test.A); } // test_config_write end ``` #### 项目结构 read_md.py: 整个项目唯一源码文件 Register_Config.md: 示例配置文件, 填写寄存器配置信息 其他: 其他文件都是调试的临时文件不定期清理;