14 #if defined(KINETISK) // Teensy 3.x 22 __attribute__((always_inline))
inline volatile T& bitband_address(
volatile T& reg, uint8_t bit) {
23 return (*(
volatile T*)(((uint32_t)® - 0x40000000)*32 + bit*4 + 0x42000000));
27 __attribute__((always_inline))
inline void setBit(
volatile T& reg, uint8_t bit) {
28 bitband_address(reg, bit) = 1;
31 __attribute__((always_inline))
inline void setBitFlag(
volatile T& reg, uint32_t flag) {
35 bitband_address(reg, 31-__builtin_clzl(flag)) = 1;
39 __attribute__((always_inline))
inline void clearBit(
volatile T& reg, uint8_t bit) {
40 bitband_address(reg, bit) = 0;
43 __attribute__((always_inline))
inline void clearBitFlag(
volatile T& reg, uint32_t flag) {
44 bitband_address(reg, 31-__builtin_clzl(flag)) = 0;
48 __attribute__((always_inline))
inline void changeBit(
volatile T& reg, uint8_t bit,
bool state) {
49 bitband_address(reg, bit) = state;
52 __attribute__((always_inline))
inline void changeBitFlag(
volatile T& reg, uint32_t flag,
bool state) {
53 bitband_address(reg, 31-__builtin_clzl(flag)) = state;
57 __attribute__((always_inline))
inline volatile bool getBit(
volatile T& reg, uint8_t bit) {
58 return (
volatile bool)bitband_address(reg, bit);
61 __attribute__((always_inline))
inline volatile bool getBitFlag(
volatile T& reg, uint32_t flag) {
62 return (
volatile bool)bitband_address(reg, 31-__builtin_clzl(flag));
65 #elif defined(KINETISL) // Teensy LC 71 __attribute__((always_inline))
inline void setBit(
volatile T& reg, uint8_t bit) {
73 *(
volatile T*)((uint32_t)(®) | (1<<27)) = 1<<bit;
76 __attribute__((always_inline))
inline void setBitFlag(
volatile T& reg, uint32_t flag) {
78 *(
volatile T*)((uint32_t)(®) | (1<<27)) = flag;
82 __attribute__((always_inline))
inline void clearBit(
volatile T& reg, uint8_t bit) {
84 *(
volatile T*)((uint32_t)(®) | (1<<26)) = ~(1<<bit);
87 __attribute__((always_inline))
inline void clearBitFlag(
volatile T& reg, uint32_t flag) {
89 *(
volatile T*)((uint32_t)(®) | (1<<26)) = ~flag;
93 __attribute__((always_inline))
inline void changeBit(
volatile T& reg, uint8_t bit,
bool state) {
95 state ? setBit(reg, bit) : clearBit(reg, bit);
98 __attribute__((always_inline))
inline void changeBitFlag(
volatile T& reg, uint32_t flag,
bool state) {
100 state ? setBitFlag(reg, flag) : clearBitFlag(reg, flag);
104 __attribute__((always_inline))
inline volatile bool getBit(
volatile T& reg, uint8_t bit) {
105 return (
volatile bool)*(
volatile T *)((uint32_t)(®) | (1<<28) | (bit<<23) );
108 __attribute__((always_inline))
inline volatile bool getBitFlag(
volatile T& reg, uint32_t flag) {
109 return (
volatile bool)*(
volatile T *)((uint32_t)(®) | (1<<28) | ((31-__builtin_clzl(flag))<<23) );
Atomic set, clear, change, or get bit in a register.
Definition: atomic.h:7