# Reg-to-head **Repository Path**: lee8871/Reg-to-head ## Basic Information - **Project Name**: Reg-to-head - **Description**: 将寄存器定义文件转换为头文件的C#程序 - **Primary Language**: C# - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2022-09-12 - **Last Updated**: 2024-03-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 寄存器转C语言头文件 在一些单片机中可以看到寄存器表,比如这个: ![image](assets/image-20220913171210-m72ejoe.png)​ 但是可能这个单片机没有你习惯的头文件。 你可以用这个软件生成寄存器头文件。 ## 使用方法 首先把寄存器表复制到txt文件,大概这样: ```c P0 P0 端口 80H P07 P06 P05 P04 P03 P02 P01 P00 1111,1111 SP 堆栈指针 81H 0000,0111 DPL0 数据指针(低字节) 82H 0000,0000 DPH0 数据指针(高字节) 83H 0000,0000 S4CON 串口 4 控制寄存器 84H S4SM0 S4ST4 S4SM2 S4REN S4TB8 S4RB8 S4TI S4RI 0000,0000 S4BUF 串口 4 数据寄存器 85H 0000,0000 PCON 电源控制寄存器 87H SMOD SMOD0 LVDF POF GF1 GF0 PD IDL 0011,0000 TCON 定时器控制寄存器 88H TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 0000,0000 TMOD 定时器模式寄存器 89H GATE C/T M1 M0 GATE C/T M1 M0 0000,0000 TL0 定时器 0 低 8 位寄存器 8AH 0000,0000 TL1 定时器 1 低 8 位寄存器 8BH 0000,0000 TH0 定时器 0 高 8 位寄存器 8CH 0000,0000 TH1 定时器 1 高 8 位寄存器 8DH 0000,0000 ``` 然后,执行这个软件。执行后如果你复制的寄存器表有格式问题,软件会报错,这时候就需要你修改这些错误: ![image](assets/image-20220913173041-eyfcauv.png)​ 如果没有报错了,软件就会输出你想要的格式的寄存器表,比如这样: ```c //第1行: P0 P0 端口 80H P07 P06 P05 P04 P03 P02 P01 P00 1111,1111 //P0 端口,初始值为1111,1111 SFRBIT(P0 ,0x80 ,P00 ,P01 ,P02 ,P03 ,P04 ,P05 ,P06 ,P07 ) SFR_BIT_DIFF( _P00 ,0) SFR_BIT_DIFF( _P01 ,1) SFR_BIT_DIFF( _P02 ,2) SFR_BIT_DIFF( _P03 ,3) SFR_BIT_DIFF( _P04 ,4) SFR_BIT_DIFF( _P05 ,5) SFR_BIT_DIFF( _P06 ,6) SFR_BIT_DIFF( _P07 ,7) //第2行: SP 堆栈指针 81H 0000,0111 //堆栈指针,初始值为0000,0111 SFR(SP ,0x81) //第3行: DPL0 数据指针(低字节) 82H 0000,0000 //数据指针(低字节),初始值为0000,0000 SFR(DPL0 ,0x82) //第4行: DPH0 数据指针(高字节) 83H 0000,0000 //数据指针(高字节),初始值为0000,0000 SFR(DPH0 ,0x83) ``` 再配合一个头文件就可以将寄存器用在你的程序里面了。比如头文件可以这么写: ```c #define SFR(name,addr) __sfr __no_init volatile unsigned char name @ addr; #define SFRBIT(name, addr, bit0, bit1, bit2, bit3, bit4, bit5, bit6, bit7) \ __sfr __no_init volatile union \ { \ unsigned char name; \ struct { \ unsigned char bit0 : 1; \ unsigned char bit1 : 1; \ unsigned char bit2 : 1; \ unsigned char bit3 : 1; \ unsigned char bit4 : 1; \ unsigned char bit5 : 1; \ unsigned char bit6 : 1; \ unsigned char bit7 : 1; \ }; \ } @ addr; #define XSFR(_reg_name,addr) __no_init unsigned char volatile __xdata _reg_name @ addr; #define VECT(num,addr) addr #define XSFR(_reg_name,addr) __no_init unsigned char volatile __xdata _reg_name @ addr; #define SFR_BIT_DIFF(_reg_name,value) static const unsigned char _reg_name = value; ``` 如果想要STM32风格的寄存器表,简单的修改程序也能实现。 ## 程序说明 reg 是本程序的基本数据结构。他会记录一个8位寄存器的信息,包括位定义信息。 reg 用原始文本的字符串进行构造,然后使用 void Parse() 进行一次转换,如果输入正确,输入的文本将被填入reg的数据结构。 有了寄存器数据的定义,再转换为你喜欢的语言,就只剩下输出字符串的操作了。我使用void toIarDef(StringBuilder sb, Dictionary symbols)将寄存器数据转换成字符串。你也可以编写你喜欢的输出函数,输出符合你程序风格的寄存器定义。 ‍ ‍ ‍ ‍