Fork of czyzlukasz/svd2cpp with minor fixes for compilation, not maintained.
Go to file
2023-03-06 16:44:15 +00:00
cxxopts@073dd3e645 Added cxxopts 2019-11-14 08:18:00 +01:00
Sample Added error checking in XmlParser, added sample file 2019-11-14 13:38:04 +01:00
Src Remove OutputFile include 2023-03-06 16:44:15 +00:00
tinyxml2@ff61650517 Initial commit 2019-11-14 07:36:44 +01:00
.gitignore Updated .gitignore 2019-11-22 10:11:40 +01:00
.gitmodules Added cxxopts 2019-11-14 08:18:00 +01:00
CMakeLists.txt Remove OutputFile include 2023-03-06 16:44:15 +00:00
README.md Update README.md 2019-12-02 12:33:24 +01:00

svd2cpp

Zero-cost abstraction register library generator.

What is svd2cpp?

svd2cpp is a generator that parses .svd files provided by ARM chip vendor. It generates header file that allows for reading and writing to microcontroller's registers with zero overhead.

Benefits

  1. Compile-time checking. This is an aspect that is making this solution better than any other parser/pre-generated header.
    • You won't be able to write to wrong register.
    • You won't be able to write wrong value (i.e. 0b1011 to 3-bit field) to register.
    • You can't read from write-only or write to read-only register. Any attempt to do something wrong will succeed in error at compile-time - no more runtime debugging to find out misspelling errors!
  2. Zero-cost abstraction. Another strong aspect of headers generated by svd2cpp is that using it in code will result in zero overhead because all of the checking is done at compile-time.
  3. Portability. As long as manufacturer provides .svd files in CMSIS-SVD format (and most major manufacturers of Cortex-M based chips does), you can use it with this parser.

How to get svd2cpp?

Download source code and compile it. Note that this repo uses submodules thus do not forget to git submodule init and git submodule update after cloning.

OR

Download precompiled parser.

How to use svd2cpp?

That's super easy:

./svd2cpp -i svdFile.svd -o generatedHeader.hpp

How to use generated header?

After including header in your code, you can use all features such as set, reset, read.

Syntax is quite simple and easy to use:

operation<PERIPHERAL::REGISTER::FIELD>();

Examples:

In peripheral USART1: Set bit UE(USART enable) in CR1(Control Register 1):

set<USART1::CR1::UE>();

In peripheral USART1: Reset bit UE(USART enable) in CR1(Control Register 1):

reset<USART1::CR1::UE>();

In peripheral DMA1: Read TCIF1(Channel 1 Transfer Complete flag) in ISR:

bool transferComplete = read<DMA1::ISR::TCIF1>();

In peripheral DMA1: Set MA(Memory address) for CMAR2(DMA channel 2 memory address register):

set<DMA1::CMAR2::MA>(0xDEADBEEF);