用途
转换现有svd文件到 mculib4d 的芯片声明工具
代码
module svd;
import std.stdio;
import std.file;
import std.xml;
import std.string;
import std.regex;
struct tys
{
union{
uint i1;
ushort[2] s1;
ubyte[4] b1;
}
}
int main()
{
string svdfile = "STM32F401.svd";
if(!isFile(svdfile)){
return 0;
}
Etsvd(svdfile);
return 0;
}
struct mcuinfo
{
string name;
string mversion;
string description;
string addressUnitBits;
string width;
string size;
string resetValue;
string resetMask;
cpuinfo cpu;
}
struct cpuinfo
{
string name;
string revision;
string endian;
string mpuPresent;
string fpuPresent;
string nvicPrioBits;
string vendorSystickConfig;
}
struct peripheral
{
string name;
string desc;
string group;
string address;
addressBlock ablock;
interrupt[] inp;
register[] regs;
string ttext;
string derivedFrom;
}
struct addressBlock
{
string offs;
string ssize;
string usage;
}
struct interrupt
{
string name;
string description;
string val;
}
struct register
{
string name;
string display;
string description;
string addressOffset;
string msize;
string access;
string resetValue;
field[] fields;
}
struct field
{
string name;
string description;
string bitOffset;
string bitWidth;
string access;
}
void Etsvd(string fname)
{
string s = cast(string) std.file.read(fname);
//
try{
//check(s);
}catch (CheckException e)
{
writefln(e.msg);
}
peripheral[] pres;
mcuinfo info;
DocumentParser svdxml = new DocumentParser(s);
svdxml.onEndTag["name"] = (in Element e) {
info.name = e.text(); };
svdxml.onEndTag["version"] = (in Element e) {
info.mversion = e.text(); };
svdxml.onEndTag["description"] = (in Element e) {
info.description = e.text(); };
svdxml.onStartTag["cpu"] = (ElementParser cp){
cpuinfo mcup;
cp.onEndTag["name"] = (in Element e) {
mcup.name = e.text(); };
cp.onEndTag["revision"] = (in Element e) {
mcup.revision = e.text(); };
cp.onEndTag["endian"] = (in Element e) {
mcup.endian = e.text(); };
cp.onEndTag["mpuPresent"] = (in Element e) {
mcup.mpuPresent = e.text(); };
cp.onEndTag["fpuPresent"] = (in Element e) {
mcup.fpuPresent = e.text(); };
cp.onEndTag["nvicPrioBits"] = (in Element e) {
mcup.nvicPrioBits = e.text(); };
cp.onEndTag["vendorSystickConfig"] = (in Element e) {
mcup.vendorSystickConfig = e.text(); };
cp.parse();
info.cpu = mcup;
};
svdxml.onEndTag["addressUnitBits"] = (in Element e) {
info.addressUnitBits = e.text(); };
svdxml.onEndTag["width"] = (in Element e) {
info.width = e.text(); };
svdxml.onEndTag["size"] = (in Element e) {
info.size = e.text(); };
svdxml.onEndTag["resetValue"] = (in Element e) {
info.resetValue = e.text();
};
svdxml.onEndTag["resetMask"] = (in Element e) {
info.resetMask = e.text(); };
svdxml.onStartTag["peripheral"] = (ElementParser xml)
{
peripheral