BitManipulations.h
Go to the documentation of this file.
1 /*
2  * BitManipulations.h
3  *
4  * Created on: 03 ����. 2015 �.
5  * Author: Anakonda
6  */
7 
8 #pragma once
9 
10 #define _BV(bit) (1 << (unsigned)(bit))
11 
12 #define bit(x) _BV(x)
13 #define setBits(x, y) ((x) |= (y))
14 #define clearBits(x, y) ((x) &= (~(y)))
15 #define bitsSet(x, y) (((x) & (y)) == (y))
16 #define bitsClear(x, y) (((x) & (y)) == 0)
17 
18 #define bitRead(value, bit) (((value) >> (unsigned)(bit)) & 0x01)
19 #define bitSet(value, bit) ((value) |= (1UL << (unsigned)(bit)))
20 #define bitClear(value, bit) ((value) &= ~(1UL << (unsigned)(bit)))
21 #define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit))
22 
23 #define _SFR_MEM_ADDR(sfr) ((uint32_t) & (sfr)) // 32 Bit!
24 #define _SFR_ADDR(sfr) _SFR_MEM_ADDR(sfr)
25 
26 #define _MMIO_BYTE(mem_addr) (*(volatile uint8_t*)(mem_addr))
27 #define _MMIO_WORD(mem_addr) (*(volatile uint16_t*)(mem_addr))
28 #define _MMIO_DWORD(mem_addr) (*(volatile uint32_t*)(mem_addr))
29 
30 #ifndef _SFR_BYTE
31 #define _SFR_BYTE(sfr) _MMIO_BYTE(_SFR_ADDR(sfr))
32 #endif
33 #define _SFR_WORD(sfr) _MMIO_WORD(_SFR_ADDR(sfr))
34 #define _SFR_DWORD(sfr) _MMIO_DWORD(_SFR_ADDR(sfr))
35 
36 #define _SFR_MEM8(mem_addr) _MMIO_BYTE(mem_addr)
37 #define _SFR_MEM16(mem_addr) _MMIO_WORD(mem_addr)
38 #define _SFR_MEM32(mem_addr) _MMIO_DWORD(mem_addr)
39 
40 #define bit_is_set(sfr, bit) (_SFR_BYTE(sfr) & _BV(bit))
41 #define bit_is_clear(sfr, bit) (!(_SFR_BYTE(sfr) & _BV(bit)))
42 #define loop_until_bit_is_set(sfr, bit) \
43  do { \
44  } while(bit_is_clear(sfr, bit))
45 #define loop_until_bit_is_clear(sfr, bit) \
46  do { \
47  } while(bit_is_set(sfr, bit))