STM32G0 MCAL 0.0.1
Tiny MCAL for educational purpose.
Loading...
Searching...
No Matches
Bfx_16bits.h
Go to the documentation of this file.
1
10#include "Std_Types.h"
11
15#define MAX_VALUE 32767
16#define MIN_VALUE -32768
17#define MAX_VALUE_USIGNED 0xFFFF
20
31static inline void Bfx_SetBit_u16u8( uint16 *Data, uint8 BitPn )
32{
33 *Data |= ( 0x01 << BitPn );
34}
35
47static inline void Bfx_ClrBit_u16u8( uint16 *Data, uint8 BitPn )
48{
49 *Data &= ~( 0x01 << BitPn );
50}
51
64static inline boolean Bfx_GetBit_u16u8_u8( uint16 Data, uint8 BitPn )
65{
66 boolean Result;
67
68 Result = ( Data >> BitPn ) & 1u;
69 return Result;
70}
71
85static inline void Bfx_SetBits_u16u8u8u8( uint16 *Data, uint8 BitStartPn, uint8 BitLn, uint8 Status )
86{
87 uint16 Mask = ( ( 1u << BitLn ) - 1 ) << BitStartPn;
88
89 if( Status == 0 )
90 {
91 *Data &= ~Mask;
92 }
93 else if( Status == 1 )
94 {
95 *Data |= Mask;
96 }
97}
98
113static inline uint8 Bfx_GetBits_u16u8u8_u16( uint16 Data, uint8 BitStartPn, uint8 BitLn )
114{
115 uint16 Result;
116
117 Result = ( Data >> BitStartPn ) & ( ( 1u << BitLn ) - 1u );
118 return Result;
119}
120
132static inline void Bfx_SetBitMask_u16u16( uint16 *Data, uint16 Mask )
133{
134 *Data |= Mask;
135}
136
148static inline void Bfx_ClrBitMask_u16u16( uint16 *Data, uint16 Mask )
149{
150 *Data &= ~Mask;
151}
152
166static inline boolean Bfx_TstBitMask_u16u16_u8( uint16 Data, uint16 Mask )
167{
168 boolean Result;
169
170 Result = ( Data & Mask ) == Mask;
171 return Result;
172}
173
187static inline boolean Bfx_TstBitLnMask_u16u16_u8( uint16 Data, uint16 Mask )
188{
189 boolean Result;
190
191 Result = ( Data & Mask ) > 0;
192 return Result;
193}
194
207static inline boolean Bfx_TstParityEven_u16_u8( uint16 Data )
208{
209 boolean parity = FALSE;
210 boolean Result;
211
212 while( Data > 0 )
213 {
214 parity = !parity;
215 Data &= ( Data - 1 );
216 }
217 Result = !parity;
218 return Result;
219}
220
230static inline void Bfx_ToggleBits_u16( uint16 *Data )
231{
232 *Data = ~*Data;
233}
234
246static inline void Bfx_ToggleBitMask_u16u16( uint16 *Data, uint16 Mask )
247{
248 *Data ^= Mask;
249}
250
263static inline void Bfx_ShiftBitRt_u16u8( uint16 *Data, uint8 ShiftCnt )
264{
265 *Data >>= ShiftCnt;
266}
267
280static inline void Bfx_ShiftBitLt_u16u8( uint16 *Data, uint8 ShiftCnt )
281{
282 *Data <<= ShiftCnt;
283}
284
296static inline void Bfx_RotBitRt_u16u8( uint16 *Data, uint8 ShiftCnt )
297{
298 *Data = ( *Data >> ShiftCnt ) | ( *Data << ( 16 - ShiftCnt ) );
299}
300
312static inline void Bfx_RotBitLt_u16u8( uint16 *Data, uint8 ShiftCnt )
313{
314 *Data = ( *Data << ShiftCnt ) | ( *Data >> ( 16 - ShiftCnt ) );
315}
316
330static inline void Bfx_CopyBit_u16u8u16u8( uint16 *DestinationData, uint8 DestinationPosition, uint16 SourceData, uint8 SourcePosition )
331{
332 boolean Buffer;
333
334 Buffer = ( ( SourceData & ( 0x01 << SourcePosition ) ) != 0 ) ? TRUE : FALSE;
335 if( Buffer == FALSE )
336 {
337 *DestinationData = ( *DestinationData & ~( 0x01 << DestinationPosition ) );
338 }
339 else
340 {
341 *DestinationData = *DestinationData | ( 0x01 << DestinationPosition );
342 }
343}
344
358static inline void Bfx_PutBits_u16u8u8u16( uint16 *Data, uint8 BitStartPn, uint8 BitLn, uint16 Pattern )
359{
360 uint16 Mask = ( ( 1u << BitLn ) - 1u ) << BitStartPn;
361 *Data = ( *Data & ~Mask ) | ( ( Pattern << BitStartPn ) & Mask );
362}
363
376static inline void Bfx_PutBitsMask_u16u16u16( uint16 *Data, uint16 Pattern, uint16 Mask )
377{
378 *Data = ( *Data & ~Mask ) | ( Pattern & Mask );
379}
380
393static inline void Bfx_PutBit_u16u8u8( uint16 *Data, uint8 BitPn, boolean Status )
394{
395 if( Status == FALSE )
396 {
397 *Data &= ~( 0x01 << BitPn );
398 }
399 else
400 {
401 *Data |= 0x01 << BitPn;
402 }
403}
404
418{
419 uint8 Counter = 0;
420
421 for( uint8 i = 16; i > 0; i-- )
422 {
423 if( ( Data & ( 0x01 << ( i - 1 ) ) ) != 0 )
424 {
425 Counter++;
426 }
427 else
428 {
429 i = 1;
430 }
431 }
432 return Counter;
433}
434
448{
449 uint8 Counter = 0;
450
451 for( uint8 i = 16; i > 0; i-- )
452 {
453 if( ( Data & ( 0x01 << ( i - 1 ) ) ) != 0 )
454 {
455 i = 1;
456 }
457 else
458 {
459 Counter++;
460 }
461 }
462 return Counter;
463}
464
479{
480 uint8 Count = 0;
481 sint16 Mask = 32767;
482
483 if( Data >= 0 )
484 {
485 while( ( Data & Mask ) == 0 )
486 {
487 Count++;
488 Mask >>= 1;
489 }
490 }
491 else
492 {
493 while( ( Data & Mask ) == Mask )
494 {
495 Count++;
496 Mask >>= 1;
497 }
498 }
499 Data = Count - 1;
500 return Data;
501}
502
521static inline sint16 Bfx_ShiftBitSat_s16s8_s16( sint8 ShiftCnt, sint16 Data )
522{
523 uint16 Mask = 0x8000;
524 boolean DataIsNegative = ( Data < 0 );
525
526 if( ShiftCnt >= 0 )
527 {
528 Data <<= ShiftCnt;
529 if( ( DataIsNegative == FALSE ) && ( Data < 0 ) )
530 {
531 Data = MAX_VALUE;
532 }
533 else if( ( DataIsNegative == TRUE ) && ( Data >= 0 ) )
534 {
535 Data = MIN_VALUE;
536 }
537 }
538 else
539 {
540 ShiftCnt *= -1;
541 if( Data > 0 )
542 {
543 Data >>= ShiftCnt;
544 }
545 else
546 {
547 Data >>= ShiftCnt;
548 for( uint8 i = 0; i < ShiftCnt; i++ )
549 {
550 Data |= Mask;
551 Mask >>= 1;
552 }
553 }
554 }
555 return Data;
556}
557
576static inline uint16 Bfx_ShiftBitSat_u16s8_u16( sint8 ShiftCnt, uint16 Data )
577{
578 uint16 Mask = 0x8000;
579 uint8 MaxShiftLeft = 0;
580
581 while( ( Data & Mask ) == 0 )
582 {
583 MaxShiftLeft++;
584 Mask >>= 1;
585 }
586 if( ShiftCnt >= 0 )
587 {
588 if( ShiftCnt > MaxShiftLeft )
589 {
590 Data = MAX_VALUE_USIGNED;
591 }
592 else
593 {
594 Data <<= ShiftCnt;
595 }
596 }
597 else
598 {
599 ShiftCnt *= -1;
600 Data >>= ShiftCnt;
601 }
602 return Data;
603}
static void Bfx_ShiftBitRt_u16u8(uint16 *Data, uint8 ShiftCnt)
Shifts a unsigned integer to the right acourding to ShiftCnt
Definition Bfx_16bits.h:263
static void Bfx_ToggleBitMask_u16u16(uint16 *Data, uint16 Mask)
Using a mask to toggle bits
Definition Bfx_16bits.h:246
static void Bfx_ToggleBits_u16(uint16 *Data)
Changes the value of every bit of an unsigned integer
Definition Bfx_16bits.h:230
static void Bfx_SetBits_u16u8u8u8(uint16 *Data, uint8 BitStartPn, uint8 BitLn, uint8 Status)
Modifies consecutive bits acording to status
Definition Bfx_16bits.h:85
static boolean Bfx_TstBitLnMask_u16u16_u8(uint16 Data, uint16 Mask)
Compare any bit of a mask with a seccion of an unsigned integer
Definition Bfx_16bits.h:187
static void Bfx_PutBitsMask_u16u16u16(uint16 *Data, uint16 Pattern, uint16 Mask)
Takes a pattern and a mask and puts it in an unsigned integer
Definition Bfx_16bits.h:376
static void Bfx_SetBitMask_u16u16(uint16 *Data, uint16 Mask)
Using a mask to set bits
Definition Bfx_16bits.h:132
static void Bfx_CopyBit_u16u8u16u8(uint16 *DestinationData, uint8 DestinationPosition, uint16 SourceData, uint8 SourcePosition)
Copies a bit from an integer to another
Definition Bfx_16bits.h:330
static uint8 Bfx_CountLeadingZeros_u16(uint16 Data)
Counts consecutive zeros
Definition Bfx_16bits.h:447
static boolean Bfx_GetBit_u16u8_u8(uint16 Data, uint8 BitPn)
Obtain one bit especified
Definition Bfx_16bits.h:64
static boolean Bfx_TstBitMask_u16u16_u8(uint16 Data, uint16 Mask)
Compare a mask with a seccion of an unsigned integer
Definition Bfx_16bits.h:166
static void Bfx_SetBit_u16u8(uint16 *Data, uint8 BitPn)
Set a single bit in Data pointer
Definition Bfx_16bits.h:31
static uint8 Bfx_GetBits_u16u8u8_u16(uint16 Data, uint8 BitStartPn, uint8 BitLn)
Obtains consecutive bits from an unsigned integer
Definition Bfx_16bits.h:113
static uint8 Bfx_CountLeadingSigns_s16(sint16 Data)
Counts leading signs
Definition Bfx_16bits.h:478
static void Bfx_ShiftBitLt_u16u8(uint16 *Data, uint8 ShiftCnt)
Shifts a unsigned integer to the left acourding to ShiftCnt
Definition Bfx_16bits.h:280
static sint16 Bfx_ShiftBitSat_s16s8_s16(sint8 ShiftCnt, sint16 Data)
Arithmetic shift with saturation
Definition Bfx_16bits.h:521
static void Bfx_PutBit_u16u8u8(uint16 *Data, uint8 BitPn, boolean Status)
Sets the bit of an unsigned integer according to Status
Definition Bfx_16bits.h:393
static void Bfx_ClrBit_u16u8(uint16 *Data, uint8 BitPn)
Clears a single bit in Data pointer
Definition Bfx_16bits.h:47
static void Bfx_RotBitRt_u16u8(uint16 *Data, uint8 ShiftCnt)
Rotates a unsigned integer to the right acourding to ShiftCnt
Definition Bfx_16bits.h:296
static boolean Bfx_TstParityEven_u16_u8(uint16 Data)
Determines if an unsigned integer has even parity
Definition Bfx_16bits.h:207
static uint16 Bfx_ShiftBitSat_u16s8_u16(sint8 ShiftCnt, uint16 Data)
Arithmetic shift with saturation
Definition Bfx_16bits.h:576
static void Bfx_RotBitLt_u16u8(uint16 *Data, uint8 ShiftCnt)
Rotates a unsigned integer to the left acourding to ShiftCnt
Definition Bfx_16bits.h:312
static void Bfx_PutBits_u16u8u8u16(uint16 *Data, uint8 BitStartPn, uint8 BitLn, uint16 Pattern)
Takes a pattern and puts it in an unsigned integer
Definition Bfx_16bits.h:358
static void Bfx_ClrBitMask_u16u16(uint16 *Data, uint16 Mask)
Using a mask to clear bits
Definition Bfx_16bits.h:148
static uint8 Bfx_CountLeadingOnes_u16(uint16 Data)
Counts consecutive ones
Definition Bfx_16bits.h:417
unsigned short uint16
Definition Platform_Types.h:96
signed char sint8
Definition Platform_Types.h:112
signed short sint16
Definition Platform_Types.h:114
#define TRUE
Definition Platform_Types.h:76
#define FALSE
Definition Platform_Types.h:80
unsigned char uint8
Definition Platform_Types.h:94
Specification of Standard Types
#define MAX_VALUE
Definition Bfx_16bits.h:15
#define MAX_VALUE_USIGNED
Definition Bfx_16bits.h:17
#define MIN_VALUE
Definition Bfx_16bits.h:16