MyLibs 1.0
Расширенные библиотеки для STM32
Loading...
Searching...
No Matches
bit_access.h
Go to the documentation of this file.
1/**
2**************************************************************************
3* @file bit_access.h
4* @brief Заголочный файл для дефайнов битового доступа.
5**************************************************************************
6* @defgroup BIT_ACCESS_DEFINES Bit access defines
7* @ingroup MYLIBS_DEFINES
8* @brief Макросы и typedef'ы для работы с битами в unsigned типах.
9* @details
10В этом файле определены макросы для получения значения конкретного бита^
11- @ref uint8_bit
12- @ref uint16_bit
13- @ref uint32_bit
14- @ref uint64_bit
15
16Особенности использования:
17- Индекс бита должен быть **константой на этапе компиляции**.
18 Пример верного использования:
19 @code
20 uint8_t val = 0x05;
21 uint8_t b2 = uint8_bit(val, 2); // Получить бит 2
22 uint8_bit(val, 6) = 1; // Записать бит 6
23 @endcode
24- Нельзя использовать переменные в качестве индекса:
25 @code
26 uint8_t i = 2;
27 uint8_bit(val, i); // Не сработает!
28 @endcode
29- Макросы возвращают 0 или 1.
30- Доступ реализован через приведение к `union` с битовыми полями, поэтому это
31 безопасный способ работы с отдельными битами без ручного сдвига и маскирования.
32* @{
33*************************************************************************/
34#ifndef __BIT_ACCESS_H_
35#define __BIT_ACCESS_H_
36#include "mylibs_defs.h"
37
38
39typedef union
40{
41 uint8_t all;
42 struct
43 {
44 unsigned bit0:1;
45 unsigned bit1:1;
46 unsigned bit2:1;
47 unsigned bit3:1;
48 unsigned bit4:1;
49 unsigned bit5:1;
50 unsigned bit6:1;
51 unsigned bit7:1;
52 }bit;
54
55typedef union
56{
57 uint16_t all;
58 struct
59 {
60 unsigned bit0:1;
61 unsigned bit1:1;
62 unsigned bit2:1;
63 unsigned bit3:1;
64 unsigned bit4:1;
65 unsigned bit5:1;
66 unsigned bit6:1;
67 unsigned bit7:1;
68 unsigned bit8:1;
69 unsigned bit9:1;
70 unsigned bit10:1;
71 unsigned bit11:1;
72 unsigned bit12:1;
73 unsigned bit13:1;
74 unsigned bit14:1;
75 unsigned bit15:1;
76 }bit;
78
79
80typedef union
81{
82 uint32_t all;
83 struct
84 {
85 unsigned bit0:1; unsigned bit1:1; unsigned bit2:1; unsigned bit3:1;
86 unsigned bit4:1; unsigned bit5:1; unsigned bit6:1; unsigned bit7:1;
87 unsigned bit8:1; unsigned bit9:1; unsigned bit10:1; unsigned bit11:1;
88 unsigned bit12:1; unsigned bit13:1; unsigned bit14:1; unsigned bit15:1;
89 unsigned bit16:1; unsigned bit17:1; unsigned bit18:1; unsigned bit19:1;
90 unsigned bit20:1; unsigned bit21:1; unsigned bit22:1; unsigned bit23:1;
91 unsigned bit24:1; unsigned bit25:1; unsigned bit26:1; unsigned bit27:1;
92 unsigned bit28:1; unsigned bit29:1; unsigned bit30:1; unsigned bit31:1;
93 }bit;
95
96
97typedef union
98{
99 uint64_t all;
100 struct
101 {
102 unsigned bit0:1; unsigned bit1:1; unsigned bit2:1; unsigned bit3:1;
103 unsigned bit4:1; unsigned bit5:1; unsigned bit6:1; unsigned bit7:1;
104 unsigned bit8:1; unsigned bit9:1; unsigned bit10:1; unsigned bit11:1;
105 unsigned bit12:1; unsigned bit13:1; unsigned bit14:1; unsigned bit15:1;
106 unsigned bit16:1; unsigned bit17:1; unsigned bit18:1; unsigned bit19:1;
107 unsigned bit20:1; unsigned bit21:1; unsigned bit22:1; unsigned bit23:1;
108 unsigned bit24:1; unsigned bit25:1; unsigned bit26:1; unsigned bit27:1;
109 unsigned bit28:1; unsigned bit29:1; unsigned bit30:1; unsigned bit31:1;
110 unsigned bit32:1; unsigned bit33:1; unsigned bit34:1; unsigned bit35:1;
111 unsigned bit36:1; unsigned bit37:1; unsigned bit38:1; unsigned bit39:1;
112 unsigned bit40:1; unsigned bit41:1; unsigned bit42:1; unsigned bit43:1;
113 unsigned bit44:1; unsigned bit45:1; unsigned bit46:1; unsigned bit47:1;
114 unsigned bit48:1; unsigned bit49:1; unsigned bit50:1; unsigned bit51:1;
115 unsigned bit52:1; unsigned bit53:1; unsigned bit54:1; unsigned bit55:1;
116 unsigned bit56:1; unsigned bit57:1; unsigned bit58:1; unsigned bit59:1;
117 unsigned bit60:1; unsigned bit61:1; unsigned bit62:1; unsigned bit63:1;
118 }bit;
120
121
122/**
123 * @brief Получить n-й бит из uint8_t
124 * @param _uint8_ Переменная типа uint8_t
125 * @param _bit_ Константный номер бита (0..7)
126 * @return Значение выбранного бита (0 или 1)
127 * @note Индекс бита должен быть известен на этапе компиляции!
128 */
129#define uint8_bit(_uint8_, _bit_) (*(uint8_BitTypeDef *)(&(_uint8_))).bit.bit##_bit_
130/**
131 * @brief Получить n-й бит из uint16_t
132 * @param _uint16_ Переменная типа uint16_t
133 * @param _bit_ Константный номер бита (0..15)
134 * @return Значение выбранного бита (0 или 1)
135 * @note Индекс бита должен быть известен на этапе компиляции!
136 */
137#define uint16_bit(_uint8_, _bit_) (*(uint16_BitTypeDef *)(&(_uint8_))).bit.bit##_bit_
138/**
139 * @brief Получить n-й бит из uint32_t
140 * @param _uint32_ Переменная типа uint32_t
141 * @param _bit_ Константный номер бита (0..31)
142 * @return Значение выбранного бита (0 или 1)
143 * @note Индекс бита должен быть известен на этапе компиляции!
144 */
145#define uint32_bit(_uint8_, _bit_) (*(uint32_BitTypeDef *)(&(_uint8_))).bit.bit##_bit_
146/**
147 * @brief Получить n-й бит из uint64_t
148 * @param _uint64_ Переменная типа uint64_t
149 * @param _bit_ Константный номер бита (0..63)
150 * @return Значение выбранного бита (0 или 1)
151 * @note Индекс бита должен быть известен на этапе компиляции!
152 */
153#define uint64_bit(_uint8_, _bit_) (*(uint64_BitTypeDef *)(&(_uint8_))).bit.bit##_bit_
154
155#endif //__BIT_ACCESS_H_
156
157/** BIT_ACCESS_DEFINES
158 * @}
159 */
Заголочный файл для дефайнов библиотеки MyLibsGeneral.