The command line program mkhdr can generate a C/C++ header file from a crossworks memory map file.
For each register definition in the memory map file a corresponding #define is generated in the header file. The #define is named the same as the register name and is defined as a volatile pointer to the address. The type of the pointer is derived from the size of the register. A 4 byte register will generate an unsigned long pointer. A 2 byte register will generate an unsigned short pointer. A 1 byte register will generate an unsigned char pointer.
If a register definition in the memory map file has bitfields then #defines are generated for each bitfield. Each bitfield will have two #defines generated, one representing the mask and one defining the start bit position. The bitfield #define names are formed by prepending the register name to the bitfield name. The mask definition has _MASK appended to it and the start definition has _BIT appended to it.
For example given the following definitions in the the file memorymap.xml.
<RegisterGroup start="0xFFFFF000" name="AIC" > <Register start="+0x00" size="4" name="AIC_SMR0"> <BitField size="3" name="PRIOR" start="0" /> <BitField size="2" name="SRCTYPE" start="5" /> </Register> ...
The command line
mkhdr memorymap.xml memorymap.h
Will generate the following definitions in the file memorymap.h.
#define AIC_SMR0 (*(volatile unsigned long *)0xFFFFF000) #define AIC_SMR0_PRIOR_MASK 0x7 #define AIC_SMR0_PRIOR_BIT 0 #define AIC_SMR0_SRCTYPE_MASK 0x60 #define AIC_SMR0_SRCTYPE_BIT 5
These definitions can be used in the following way in a C/C++ program.
Reading from a register.
unsigned r = AIC_SMR0;
Writing to a register.
AIC_SMR0 = (priority << AIC_SMR0_PRIOR_BIT) | (srctype << AIC_SMR0_SRCTYPE_BIT);
Reading a bitfield.
unsigned srctype = (AIC_SMR0 & AIC_SMR0_SRCTYPE_MASK) >> AIC_SMR0_SRCTYPE_BIT;
Writing a bitfield.
AIC_SMR0 = (AIC_SMR0 & ~AIC_SMR0_SRCTYPE_MASK) | ((srctype & AIC_SMR0_SRCTYPE_MASK) << AIC_SMR0_SRCTYPE_BIT);
Usage:
mkhdr inputfile outputfile [targetname] [option]
Element | Description |
inputfile | The name of the source CrossWorks memory map file. |
outputfile | The name of the file to generated. |
-regbaseoffsets | Include offsets of registers from the peripheral base. |
-nobitfields | Do not generate any definitions for bitfields. |