【Keil Pack】SVD文件之同一个外设的不同实例怎么搞

2 篇文章 0 订阅
2 篇文章 0 订阅

【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说明

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值