HWA is essentially a set of C definitions designed for bare metal programming of hardware with a generic, pleasant style.
To give you an idea, the following code blinks a LED connected to an STM32F103RBT6 using Systick interrupts and sleeping mode:
#include <hwa/stm32f103rbt6.h>
#define AHBHZ HW_DEVICE_HSIHZ // The HSI frequency (8 MHz)
#define LED (porta,2) // PA2
#define PERIOD 0.5 // Blinking period in seconds
HW_ISR(systick) {} // The IRQ is used only to wake the core up.
int main ( )
{
hwa( begin, reset ); // Record the configuration in a context
hwa( power, (LED,port), on ); // Power the LED port
hwa( commit ); // Write the context in the hardware
hwa( configure, LED, // Configure the LED pin
function, gpio, // Optional argument
mode, digital_output, // Mandatory argument
frequency, lowest ); // Optional argument
hwa( configure, systick, // Configure the system tick timer
clock, ahb/8, // Clock it at 1/8th the AHB frequency
reload, PERIOD/2*AHBHZ/8-1,
run, yes );
hwa( enable, (systick,irq) ); // Enable Systick IRQs (to wake the core up)
hwa( commit ); // Write all that into the hardware
for(;;) {
hw( wait, irq ); // wait event is OK too.
hw( toggle, LED ); // Toggle the LED at wake-up
}
}
This compiles to 94 bytes of application code.
Briefly, HWA provides:
- a set of objects that represent the hardware,
- a generic instruction,
hw(...)
, that acts on these objects using various types and numbers of mandatory and optionnal symbolic arguments, - a generic instruction,
hwa(...)
, that provides a transactional processing mechanism that allows further optimization of the binary code produced, - an error-checking mechanism that produces meaningful messages to help the developer quickly find a solution.
Any C compiler compatible with the C11 standard should be able to compile HWA code.
Being a header-only library, HWA helps the compiler to produce the most efficient machine code, as if the developer had himself written smart accesses to hardware registers.
HWA relies heavily on macro definitions to implement object-oriented generic instructions. As the C preprocessor can be used to parse assembly language code, a few features of HWA can be used for assembly programming. The implementation of a software UART for Atmel AVR microcontrollers and the Diabolo bootloader are examples of such a usage.
A set of commented examples is
provided. Example projects are store in vendor/architecture/examples/
directories (e.g. atmel/avr/examples/
). The documentation explains how to
compile the examples.
A ready-made documentation is available here. You can start with the Using HWA page or browse the examples.
Building your own copy of the documentation from the sources requires
Doxygen and Gnu Make. Run make doc
in
the HWA directory, then open the doxygen/html/index.html
page.
-
Atmel AVR:
- ATtinyX4: ATtiny24, ATtiny24A, ATtiny44, ATtiny44A, ATtiny84, ATtiny84A
- ATtinyX5: ATtiny25, ATtiny45, ATtiny85,
- ATmegaX8: ATmega328P
- Software-emulated devices:
- HW_SWUART Software UART
- HW_SWTWIMASTER Software TWI master
- Very partial support (old, must be rewritten):
- ATmega32U4: ATmega32U4
-
ST STM32:
-
Espressif
- ESP8266: ESP8266
-
External devices:
WARNING! The development of HWA is very chaotic and this project is subject to heavy changes of the code base.
HWA is hosted on Github.
Feedbacks will be greatly appreciated. For any bug report, question or suggestion, please open a new issue on Github, or use my gmail address (duparq) and put HWA in the object.
HWA is free software. See the license page for license information.