Update README.md

This commit is contained in:
Aadi Desai 2023-03-06 16:52:51 +00:00 committed by GitHub
parent 04dce84fff
commit c4bed497d1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -1,55 +1,69 @@
# svd2cpp # svd2cpp
Zero-cost abstraction register library generator. Zero-cost abstraction register library generator.
## What is *svd2cpp*? ## 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. *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 ### 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. - **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 wrong value (i.e. 0b1011 to 3-bit field) to register. - You won't be able to write to wrong register.
* You can't read from write-only or write to read-only register. - You won't be able to write wrong value (i.e. 0b1011 to 3-bit field) to register.
Any attempt to do something wrong will succeed in error at **compile-time** - no more runtime debugging to find out misspelling errors! - 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. - **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. - **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*? ## 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 Clone the repository, get submodules, compile.
Download precompiled parser. ```bash
~$ git clone https://github.com/supleed2/svd2cpp.git
~$ cd svd2cpp
~/svd2cpp$ git submodule init && git submodule update
~/svd2cpp$ mkdir build && cd build
~/svd2cpp/build$ cmake ..
~/svd2cpp/build$ make
```
## How to use *svd2cpp*? ## How to use *svd2cpp*?
That's super easy:
```console ```bash
./svd2cpp -i svdFile.svd -o generatedHeader.hpp ./svd2cpp -i svdFile.svd -o generatedHeader.hpp
``` ```
## How to use generated header? ## How to use generated header?
After including header in your code, you can use all features such as *set*, *reset*, *read*. After including header in your code, you can use all features such as *set*, *reset*, *read*.
Syntax is quite simple and easy to use: Syntax is quite simple and easy to use:
```cpp ```cpp
operation<PERIPHERAL::REGISTER::FIELD>(); operation<PERIPHERAL::REGISTER::FIELD>();
``` ```
### Examples: ### Examples:
In peripheral USART1: Set bit UE(USART enable) in CR1(Control Register 1): In peripheral USART1: Set bit UE(USART enable) in CR1(Control Register 1):
```cpp ```cpp
set<USART1::CR1::UE>(); set<USART1::CR1::UE>();
``` ```
In peripheral USART1: Reset bit UE(USART enable) in CR1(Control Register 1): In peripheral USART1: Reset bit UE(USART enable) in CR1(Control Register 1):
```cpp ```cpp
reset<USART1::CR1::UE>(); reset<USART1::CR1::UE>();
``` ```
In peripheral DMA1: Read TCIF1(Channel 1 Transfer Complete flag) in ISR: In peripheral DMA1: Read TCIF1(Channel 1 Transfer Complete flag) in ISR:
```cpp ```cpp
bool transferComplete = read<DMA1::ISR::TCIF1>(); bool transferComplete = read<DMA1::ISR::TCIF1>();
``` ```
In peripheral DMA1: Set MA(Memory address) for CMAR2(DMA channel 2 memory address register): In peripheral DMA1: Set MA(Memory address) for CMAR2(DMA channel 2 memory address register):
```cpp ```cpp
set<DMA1::CMAR2::MA>(0xDEADBEEF); set<DMA1::CMAR2::MA>(0xDEADBEEF);
``` ```