STM32G0 MCAL 0.0.1
Tiny MCAL for educational purpose.
Loading...
Searching...
No Matches
Bfx_32bits.h
Go to the documentation of this file.
1
10#include "Std_Types.h"
11
22static inline void Bfx_SetBit_u32u8( uint32 *Data, uint8 BitPn )
23{
24 *Data |= ( 0x01 << BitPn );
25}
26
38static inline void Bfx_ClrBit_u32u8( uint32 *Data, uint8 BitPn )
39{
40 *Data &= ~( 0x01 << BitPn );
41}
42
55static inline boolean Bfx_GetBit_u32u8_u8( uint32 Data, uint8 BitPn )
56{
57 boolean Result;
58
59 Result = ( Data >> BitPn ) & 1u;
60 return Result;
61}
62
76static inline void Bfx_SetBits_u32u8u8u8( uint32 *Data, uint8 BitStartPn, uint8 BitLn, uint8 Status )
77{
78 uint32 Mask = ( ( 1u << BitLn ) - 1 ) << BitStartPn;
79
80 if( Status == 0 )
81 {
82 *Data &= ~Mask;
83 }
84 else if( Status == 1 )
85 {
86 *Data |= Mask;
87 }
88}
89
104static inline uint32 Bfx_GetBits_u32u8u8_u32( uint32 Data, uint8 BitStartPn, uint8 BitLn )
105{
106 uint32 Result;
107
108 Result = ( Data >> BitStartPn ) & ( ( 1u << BitLn ) - 1u );
109 return Result;
110}
111
123static inline void Bfx_SetBitMask_u32u32( uint32 *Data, uint32 Mask )
124{
125 *Data |= Mask;
126}
127
139static inline void Bfx_ClrBitMask_u32u32( uint32 *Data, uint32 Mask )
140{
141 *Data &= ~Mask;
142}
143
157static inline boolean Bfx_TstBitMask_u32u32_u8( uint32 Data, uint32 Mask )
158{
159 boolean Result;
160
161 Result = ( Data & Mask ) == Mask;
162 return Result;
163}
164
178static inline boolean Bfx_TstBitLnMask_u32u32_u8( uint32 Data, uint32 Mask )
179{
180 boolean Result;
181
182 Result = ( Data & Mask ) > 0;
183 return Result;
184}
185
198static inline boolean Bfx_TstParityEven_u32_u8( uint32 Data )
199{
200 boolean parity = FALSE;
201 boolean Result;
202
203 while( Data > 0 )
204 {
205 parity = !parity;
206 Data &= ( Data - 1 );
207 }
208 Result = !parity;
209 return Result;
210}
211
221static inline void Bfx_ToggleBits_u32( uint32 *Data )
222{
223 *Data = ~*Data;
224}
225
237static inline void Bfx_ToggleBitMask_u32u32( uint32 *Data, uint32 Mask )
238{
239 *Data ^= Mask;
240}
241
254static inline void Bfx_ShiftBitRt_u32u8( uint32 *Data, uint8 ShiftCnt )
255{
256 *Data >>= ShiftCnt;
257}
258
271static inline void Bfx_ShiftBitLt_u32u8( uint32 *Data, uint8 ShiftCnt )
272{
273 *Data <<= ShiftCnt;
274}
275
287static inline void Bfx_RotBitRt_u32u8( uint32 *Data, uint8 ShiftCnt )
288{
289 *Data = ( *Data >> ShiftCnt ) | ( *Data << ( 32 - ShiftCnt ) );
290}
291
303static inline void Bfx_RotBitLt_u32u8( uint32 *Data, uint8 ShiftCnt )
304{
305 *Data = ( *Data << ShiftCnt ) | ( *Data >> ( 32 - ShiftCnt ) );
306}
307
321static inline void Bfx_CopyBit_u32u8u32u8( uint32 *DestinationData, uint8 DestinationPosition, uint32 SourceData, uint8 SourcePosition )
322{
323 boolean Buffer;
324
325 Buffer = ( ( SourceData & ( 0x01 << SourcePosition ) ) != 0 ) ? TRUE : FALSE;
326 if( Buffer == FALSE )
327 {
328 *DestinationData = ( *DestinationData & ~( 0x01 << DestinationPosition ) );
329 }
330 else
331 {
332 *DestinationData = *DestinationData | ( 0x01 << DestinationPosition );
333 }
334}
335
349static inline void Bfx_PutBits_u32u8u8u32( uint32 *Data, uint8 BitStartPn, uint8 BitLn, uint32 Pattern )
350{
351 uint32 Mask = ( ( 1u << BitLn ) - 1u ) << BitStartPn;
352 *Data = ( *Data & ~Mask ) | ( ( Pattern << BitStartPn ) & Mask );
353}
354
367static inline void Bfx_PutBitsMask_u32u32u32( uint32 *Data, uint32 Pattern, uint32 Mask )
368{
369 *Data = ( *Data & ~Mask ) | ( Pattern & Mask );
370}
371
384static inline void Bfx_PutBit_u32u8u8( uint32 *Data, uint8 BitPn, boolean Status )
385{
386 if( Status == FALSE )
387 {
388 *Data &= ~( 0x01 << BitPn );
389 }
390 else
391 {
392 *Data |= 0x01 << BitPn;
393 }
394}
395
409{
410 uint8 Counter = 0;
411
412 for( uint8 i = 32; i > 0; i-- )
413 {
414 if( ( Data & ( 0x01 << ( i - 1 ) ) ) != 0 )
415 {
416 Counter++;
417 }
418 else
419 {
420 i = 1;
421 }
422 }
423 return Counter;
424}
425
439{
440 uint8 Counter = 0;
441
442 for( uint8 i = 32; i > 0; i-- )
443 {
444 if( ( Data & ( 0x01 << ( i - 1 ) ) ) != 0 )
445 {
446 i = 1;
447 }
448 else
449 {
450 Counter++;
451 }
452 }
453 return Counter;
454}
455
470{
471 uint8 Count = 0;
472 sint32 Mask = 0x80000000;
473
474 if( Data >= 0 )
475 {
476 while( ( Data & Mask ) == 0 )
477 {
478 Count++;
479 Mask >>= 1;
480 }
481 }
482 else
483 {
484 while( ( Data & Mask ) == Mask )
485 {
486 Count++;
487 Mask >>= 1;
488 }
489 }
490 Data = Count - 1;
491 return Data;
492}
493
512static inline sint32 Bfx_ShiftBitSat_s32s8_s32( sint8 ShiftCnt, sint32 Data )
513{
514 uint32 Mask = 0x80000000;
515 boolean DataIsNegative = ( Data < 0 );
516
517 if( ShiftCnt >= 0 )
518 {
519 Data <<= ShiftCnt;
520 if( ( DataIsNegative == FALSE ) && ( Data < 0 ) )
521 {
522 Data = 0x7FFFFFFF;
523 }
524 else if( ( DataIsNegative == TRUE ) && ( Data >= 0 ) )
525 {
526 Data = 0xFFFFFFFF;
527 }
528 }
529 else
530 {
531 ShiftCnt *= -1;
532 if( Data > 0 )
533 {
534 Data >>= ShiftCnt;
535 }
536 else
537 {
538 Data >>= ShiftCnt;
539 for( uint8 i = 0; i < ShiftCnt; i++ )
540 {
541 Data |= Mask;
542 Mask >>= 1;
543 }
544 }
545 }
546 return Data;
547}
548
567static inline uint32 Bfx_ShiftBitSat_u32s8_u32( sint8 ShiftCnt, uint32 Data )
568{
569 uint32 Mask = 0x80000000;
570 uint8 MaxShiftLeft = 0;
571
572 while( ( Data & Mask ) == 0 )
573 {
574 MaxShiftLeft++;
575 Mask >>= 1;
576 }
577 if( ShiftCnt >= 0 )
578 {
579 if( ShiftCnt > MaxShiftLeft )
580 {
581 Data = 0xFFFFFFFF;
582 }
583 else
584 {
585 Data <<= ShiftCnt;
586 }
587 }
588 else
589 {
590 ShiftCnt *= -1;
591 Data >>= ShiftCnt;
592 }
593 return Data;
594}
static void Bfx_ShiftBitRt_u32u8(uint32 *Data, uint8 ShiftCnt)
Shifts a unsigned integer to the right acourding to ShiftCnt
Definition Bfx_32bits.h:254
static void Bfx_CopyBit_u32u8u32u8(uint32 *DestinationData, uint8 DestinationPosition, uint32 SourceData, uint8 SourcePosition)
Copies a bit from an integer to another
Definition Bfx_32bits.h:321
static void Bfx_ClrBitMask_u32u32(uint32 *Data, uint32 Mask)
Using a mask to clear bits
Definition Bfx_32bits.h:139
static uint8 Bfx_CountLeadingZeros_u32(uint32 Data)
Counts consecutive zeros
Definition Bfx_32bits.h:438
static void Bfx_PutBitsMask_u32u32u32(uint32 *Data, uint32 Pattern, uint32 Mask)
Takes a pattern and a mask and puts it in an unsigned integer
Definition Bfx_32bits.h:367
static uint32 Bfx_GetBits_u32u8u8_u32(uint32 Data, uint8 BitStartPn, uint8 BitLn)
Obtains consecutive bits from an unsigned integer
Definition Bfx_32bits.h:104
static void Bfx_ShiftBitLt_u32u8(uint32 *Data, uint8 ShiftCnt)
Shifts a unsigned integer to the left acourding to ShiftCnt
Definition Bfx_32bits.h:271
static boolean Bfx_GetBit_u32u8_u8(uint32 Data, uint8 BitPn)
Obtain one bit especified
Definition Bfx_32bits.h:55
static void Bfx_PutBits_u32u8u8u32(uint32 *Data, uint8 BitStartPn, uint8 BitLn, uint32 Pattern)
Takes a pattern and puts it in an unsigned integer
Definition Bfx_32bits.h:349
static void Bfx_ToggleBits_u32(uint32 *Data)
Changes the value of every bit of an unsigned integer
Definition Bfx_32bits.h:221
static uint8 Bfx_CountLeadingSigns_s32(sint32 Data)
Counts leading signs
Definition Bfx_32bits.h:469
static boolean Bfx_TstBitLnMask_u32u32_u8(uint32 Data, uint32 Mask)
Compare any bit of a mask with a seccion of an unsigned integer
Definition Bfx_32bits.h:178
static void Bfx_SetBit_u32u8(uint32 *Data, uint8 BitPn)
Set a single bit in Data pointer
Definition Bfx_32bits.h:22
static uint8 Bfx_CountLeadingOnes_u32(uint32 Data)
Counts consecutive ones
Definition Bfx_32bits.h:408
static void Bfx_SetBitMask_u32u32(uint32 *Data, uint32 Mask)
Using a mask to set bits
Definition Bfx_32bits.h:123
static boolean Bfx_TstParityEven_u32_u8(uint32 Data)
Determines if an unsigned integer has even parity
Definition Bfx_32bits.h:198
static boolean Bfx_TstBitMask_u32u32_u8(uint32 Data, uint32 Mask)
Compare a mask with a seccion of an unsigned integer
Definition Bfx_32bits.h:157
static uint32 Bfx_ShiftBitSat_u32s8_u32(sint8 ShiftCnt, uint32 Data)
Arithmetic shift with saturation
Definition Bfx_32bits.h:567
static void Bfx_RotBitRt_u32u8(uint32 *Data, uint8 ShiftCnt)
Rotates a unsigned integer to the right acourding to ShiftCnt
Definition Bfx_32bits.h:287
static void Bfx_PutBit_u32u8u8(uint32 *Data, uint8 BitPn, boolean Status)
Sets the bit of an unsigned integer according to Status
Definition Bfx_32bits.h:384
static void Bfx_ClrBit_u32u8(uint32 *Data, uint8 BitPn)
Clears a single bit in Data pointer
Definition Bfx_32bits.h:38
static void Bfx_SetBits_u32u8u8u8(uint32 *Data, uint8 BitStartPn, uint8 BitLn, uint8 Status)
Modifies consecutive bits acording to status
Definition Bfx_32bits.h:76
static void Bfx_ToggleBitMask_u32u32(uint32 *Data, uint32 Mask)
Using a mask to toggle bits
Definition Bfx_32bits.h:237
static sint32 Bfx_ShiftBitSat_s32s8_s32(sint8 ShiftCnt, sint32 Data)
Arithmetic shift with saturation
Definition Bfx_32bits.h:512
static void Bfx_RotBitLt_u32u8(uint32 *Data, uint8 ShiftCnt)
Rotates a unsigned integer to the left acourding to ShiftCnt
Definition Bfx_32bits.h:303
signed int sint32
Definition Platform_Types.h:116
unsigned int uint32
Definition Platform_Types.h:98
signed char sint8
Definition Platform_Types.h:112
#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