56 #if defined(KINETISK) // Teensy 3.x
64 __attribute__((always_inline))
inline volatile T& bitband_address(
volatile T& reg, uint8_t bit) {
65 return (*(
volatile T*)(((uint32_t)® - 0x40000000)*32 + bit*4 + 0x42000000));
69 __attribute__((always_inline))
inline void setBit(
volatile T& reg, uint8_t bit) {
70 bitband_address(reg, bit) = 1;
73 __attribute__((always_inline))
inline void setBitFlag(
volatile T& reg, T flag) {
77 bitband_address(reg, 31-__builtin_clzl(flag)) = 1;
78 if(__builtin_popcount(flag) > 1) {
80 bitband_address(reg, __builtin_ctzl(flag)) = 1;
85 __attribute__((always_inline))
inline void clearBit(
volatile T& reg, uint8_t bit) {
86 bitband_address(reg, bit) = 0;
89 __attribute__((always_inline))
inline void clearBitFlag(
volatile T& reg, T flag) {
90 bitband_address(reg, 31-__builtin_clzl(flag)) = 0;
91 if(__builtin_popcount(flag) > 1) {
92 bitband_address(reg, __builtin_ctzl(flag)) = 0;
97 __attribute__((always_inline))
inline void changeBit(
volatile T& reg, uint8_t bit,
bool state) {
98 bitband_address(reg, bit) = state;
101 __attribute__((always_inline))
inline void changeBitFlag(
volatile T& reg, T flag, T state) {
102 bitband_address(reg, __builtin_ctzl(flag)) = (state >> __builtin_ctzl(flag))&0x1;
103 if(__builtin_popcount(flag) > 1) {
104 bitband_address(reg, 31-__builtin_clzl(flag)) = (state >> (31-__builtin_clzl(flag)))&0x1;
109 __attribute__((always_inline))
inline volatile bool getBit(
volatile T& reg, uint8_t bit) {
110 return (
volatile bool)bitband_address(reg, bit);
113 __attribute__((always_inline))
inline volatile bool getBitFlag(
volatile T& reg, T flag) {
114 return (
volatile bool)bitband_address(reg, 31-__builtin_clzl(flag));
118 #elif defined(__IMXRT1062__) // Teensy 4
120 __attribute__((always_inline))
inline void setBitFlag(
volatile T& reg, T flag) {
127 __attribute__((always_inline))
inline void clearBitFlag(
volatile T& reg, T flag) {
134 __attribute__((always_inline))
inline void changeBitFlag(
volatile T& reg, T flag, T state) {
137 if(__builtin_popcount(flag) == 1) {
139 setBitFlag(reg, flag);
141 clearBitFlag(reg, flag);
145 if ((state >> __builtin_ctzl(flag))&0x1) {
146 setBitFlag(reg, (uint32_t)(1 << __builtin_ctzl(flag)));
148 clearBitFlag(reg, (uint32_t)(1 << __builtin_ctzl(flag)));
151 if ((state >> (31-__builtin_clzl(flag)))&0x1) {
152 setBitFlag(reg, (uint32_t)(1 << (31-__builtin_clzl(flag))));
154 clearBitFlag(reg, (uint32_t)(1 << (31-__builtin_clzl(flag))));
161 __attribute__((always_inline))
inline volatile bool getBitFlag(
volatile T& reg, T flag) {
162 return (
volatile bool)((reg) & flag) >> (31-__builtin_clzl(flag));
167 #elif defined(KINETISL) // Teensy LC
171 __attribute__((always_inline))
inline void setBit(
volatile T& reg, uint8_t bit) {
173 *(
volatile T*)((uint32_t)(®) | (1<<27)) = 1<<bit;
176 __attribute__((always_inline))
inline void setBitFlag(
volatile T& reg, uint32_t flag) {
177 *(
volatile T*)((uint32_t)® | (1<<27)) = flag;
181 __attribute__((always_inline))
inline void clearBit(
volatile T& reg, uint8_t bit) {
183 *(
volatile T*)((uint32_t)(®) | (1<<26)) = ~(1<<bit);
186 __attribute__((always_inline))
inline void clearBitFlag(
volatile T& reg, uint32_t flag) {
188 *(
volatile T*)((uint32_t)(®) | (1<<26)) = ~flag;
192 __attribute__((always_inline))
inline void changeBit(
volatile T& reg, uint8_t bit,
bool state) {
194 state ? setBit(reg, bit) : clearBit(reg, bit);
197 __attribute__((always_inline))
inline void changeBitFlag(
volatile T& reg, T flag, T state) {
200 *(
volatile T*)((uint32_t)(®) | (1<<28) | (__builtin_ctzl(flag)<<23) | ((__builtin_popcount(flag)-1)<<19)) = state;
204 __attribute__((always_inline))
inline volatile bool getBit(
volatile T& reg, uint8_t bit) {
205 return (
volatile bool)*(
volatile T *)((uint32_t)(®) | (1<<28) | (bit<<23) );
208 __attribute__((always_inline))
inline volatile bool getBitFlag(
volatile T& reg, T flag) {
209 return (
volatile bool)*(
volatile T *)((uint32_t)(®) | (1<<28) | ((31-__builtin_clzl(flag))<<23) );
216 #endif // ADC_ATOMIC_H