【Keil Pack】SVD文件之同一个外设的不同实例怎么搞
SVD要描述的情况
一个device会集成同一个外设的不同实例,除外设地址和终端号其它信息都一样。
下文以Timer为例,同一个Timer外设有三个实例TIM0、TIM1、TIM2.
以前遇到的问题
之前遇到这种情况会先描述一个TIM0,然后derivedFrom出TIM1和TIM2:
<!--TIMER-->
<peripheral>
<name>TIM0</name>
<baseAddress>0x10000000</baseAddress>
<interrupt>
<name>TIM0</name>
<value>0</value>
</interrupt>
<addressBlock>
<offset>0x0</offset>
<size>0x100</size>
<usage>registers</usage>
</addressBlock>
<registers>
......
</registers>
</peripheral>
<peripheral derivedFrom="TIM0">
<name>TIM1</name>
<baseAddress>0x10000100</baseAddress>
<interrupt>
<name>TIM1</name>
<value>1</value>
</interrupt>
</peripheral>
<peripheral derivedFrom="TIM0">
<name>TIM2</name>
<baseAddress>0x10000200</baseAddress>
<interrupt>
<name>TIM2</name>
<value>2</value>
</interrupt>
</peripheral>
这样生成的头文件里面关于Timer的实例的描述如下:
/**
* @brief TIM0 (TIM0)
*/
typedef struct { /*!< (@ 0x10000000) TIM0 Structure */
......
} TIM0_Type; /*!< Size = 0x100 */
......
#define TIM0 ((TIM0_Type*) TIM0_BASE)
#define TIM1 ((TIM0_Type*) TIM1_BASE)
#define TIM2 ((TIM0_Type*) TIM2_BASE)
o( ̄▽ ̄)o
所以看到TIM1、TIM2都是TIM0_Type,这个就让程序员们非常不爽的喂~~~
以前的解决办法
为了解决这个问题,几个同事讨论后,觉得解决办法非常简单,写个python脚本把类型重命名一遍就好了。的确也这么干了。为了调这个脚本前后合在一起总也用了一两天的时间。
新发现
由于一次偶然的机会,仔细的看了一遍peripheral的Element,竟然发现了一个element天然可以直接解决这个问题。就是
headerStructName:Specify the base name of C structures. The headerfile generator uses the name of a peripheral as the base name for the C structure type. If <headerStructName> element is specfied, then this string is used instead of the peripheral name; useful when multiple peripherals get derived and a generic type name should be used.
完美解决
于是svd文件改写,增加一行代码:
<!--TIMER-->
......
<peripheral>
<name>TIM0</name>
<headerStructName>TIM</headerStructName>
<baseAddress>0x10000000</baseAddress>
<interrupt>
......
输出的h文件:
/**
* @brief TIM0 (TIM0)
*/
typedef struct { /*!< (@ 0x10000000) TIM0 Structure */
......
} TIM_Type; /*!< Size = 0x100 */
#define TIM0 ((TIM_Type*) TIM0_BASE)
#define TIM1 ((TIM_Type*) TIM1_BASE)
#define TIM2 ((TIM_Type*) TIM2_BASE)
一行代码,以后不用维护那个多余的脚本了,完美~~~~~
官方文档还是要仔细研究啊:官方关于peripheral的element说明