cmsis-svd-srcgen icon indicating copy to clipboard operation
cmsis-svd-srcgen copied to clipboard

Extensible ARM CMSIS SVD spec based, multi-language source code generator

  • cmsis-svd-srcgen

Convert ARM CMSIS SVD specs (processor peripherals, register & bitfields) into source code for different languages.

Currently supported target languages are: Asm (GCC flavor), C and Clojure. Other languages can be easily supported by defining a new XSLT stub file with language specific configuration/formatting.

Project inspired by: [[https://github.com/posborne/cmsis-svd][posborne/cmsis-svd]]

** Usage

#+BEGIN_SRC shell ./convert asm|c|clj svd-file > output-file

filtered output via "only" and "excl" params

only includes given peripheral IDs or excludes these

./convert lang svd only=PERIPH1,PERIPH2... > output ./convert lang svd excl=PERIPH1,PERIPH2... > output #+END_SRC

** Requirements

  • [[http://www.saxonica.com/download/opensource.xml][SAXON-HE 9.7+]] (or another XSLT2.0 capable processor)
  • Java 7+

You'll also need to download an SVD file for your CPU. A list of SVDs for all manufacturers is here (under CMSIS-SVD tab on that page, requires registration):

http://www.arm.com/products/processors/cortex-m/cortex-microcontroller-software-interface-standard.php

STM32 CPU specs can be found here:

https://cmsis.arm.com/vendor/stmicroelectronics/

** Output format

Depending on included details in SVD file, the following definitions are generated:

  • peripheral base registers
  • peripheral sub-registers (abs address and offset)
  • register reset value
  • register bitfield shift offset & mask

Some SVD specs define derived periphals. The extractor supports this feature and generates a replicated register set (with correct address offsets) for each derived definition.

*** Naming convention

The overall generate symbol formats follow these patterns (words prefixed with =$= are variable):

#+BEGIN_SRC $PERIPHERAL baseaddress $PERIPHERAL_$REGISTER baseaddress + registeroffset $PERIPHERAL_$REGISTER_OFFSET registeroffset $PERIPHERAL_$REGISTER_RESET resetvalue (if given) $PERIPHERAL_$REGISTER_$FIELD xx (absolute bit mask, e.g. "0xf << 24") $PERIPHERAL_$REGISTER_$FIELD_SHIFT xx (bit position) #+END_SRC

Because different symbols are defined for each bitfield item, the generated files can become quite large (10k+ lines). Use the device filtering options to reduce file size and only include the ones used for your project.

*** Example output **** C

#+BEGIN_SRC c /****************************************************************

  • STM32F401x SVD peripherals & registers
  • generated @ 2015-12-23 13:30:59
  • DO NOT EDIT! This file was autogenerated with:
  • http://github.com/postspectacular/cmsis-svd-srcgen ****************************************************************/

#ifndef _CMSIS_SVD_H #define _CMSIS_SVD_H

/****************************************************************

  • General-purpose I/Os (derived from GPIOH) ****************************************************************/ #define GPIOD 0x40020c00 #define GPIOD_MODER (GPIOD + 0x0) // GPIO port mode register #define GPIOD_MODER_OFFSET 0x0 #define GPIOD_MODER_RESET 0x00000000 #define GPIOD_MODER_MODER15 (0x3 << 30) #define GPIOD_MODER_MODER15_SHIFT 30 #define GPIOD_MODER_MODER14 (0x3 << 28) #define GPIOD_MODER_MODER14_SHIFT 28 ...

/****************************************************************

  • Nested Vectored Interrupt Controller ****************************************************************/ #define NVIC 0xe000e000 #define NVIC_ICTR (NVIC + 0x4) // Interrupt Controller Type Register #define NVIC_ICTR_OFFSET 0x4 #define NVIC_ICTR_RESET 0x00000000 #define NVIC_ICTR_INTLINESNUM 0xf #define NVIC_ICTR_INTLINESNUM_SHIFT 0 #define NVIC_STIR (NVIC + 0xf00) // Software Triggered Interrupt Register #define NVIC_STIR_OFFSET 0xf00 #define NVIC_STIR_RESET 0x00000000 #define NVIC_STIR_INTID 0x1ff #define NVIC_STIR_INTID_SHIFT 0 ... #+END_SRC

** Contributors

| Name | Role | Website | |-----------------+---------------------------------+-------------------------------------------| | [[mailto:[email protected]][Karsten Schmidt]] | initiator & principal developer | http://postspectacular.com, http://thi.ng |

** License

(c) 2015 Karsten Schmidt, this project is open source and licensed under the [[http://www.apache.org/licenses/LICENSE-2.0][Apache Software License 2.0]].