- максимально убрана зависимость от HAL - можно использовать и без него, чисто на cmsis - документирован uart - документирован spi - добавлены примеры использования в general_periph - всякие фиксы документации
159 lines
6.4 KiB
C
159 lines
6.4 KiB
C
/**
|
||
**************************************************************************
|
||
* @file bit_access.h
|
||
* @brief Заголочный файл для дефайнов битового доступа.
|
||
**************************************************************************
|
||
* @defgroup BIT_ACCESS_DEFINES Bit access defines
|
||
* @ingroup MYLIBS_DEFINES
|
||
* @brief Макросы и typedef'ы для работы с битами в unsigned типах.
|
||
* @details
|
||
В этом файле определены макросы для получения значения конкретного бита^
|
||
- @ref uint8_bit
|
||
- @ref uint16_bit
|
||
- @ref uint32_bit
|
||
- @ref uint64_bit
|
||
|
||
Особенности использования:
|
||
- Индекс бита должен быть **константой на этапе компиляции**.
|
||
Пример верного использования:
|
||
@code
|
||
uint8_t val = 0x05;
|
||
uint8_t b2 = uint8_bit(val, 2); // Получить бит 2
|
||
uint8_bit(val, 6) = 1; // Записать бит 6
|
||
@endcode
|
||
- Нельзя использовать переменные в качестве индекса:
|
||
@code
|
||
uint8_t i = 2;
|
||
uint8_bit(val, i); // Не сработает!
|
||
@endcode
|
||
- Макросы возвращают 0 или 1.
|
||
- Доступ реализован через приведение к `union` с битовыми полями, поэтому это
|
||
безопасный способ работы с отдельными битами без ручного сдвига и маскирования.
|
||
* @{
|
||
*************************************************************************/
|
||
#ifndef __BIT_ACCESS_H_
|
||
#define __BIT_ACCESS_H_
|
||
#include "mylibs_defs.h"
|
||
|
||
|
||
typedef union
|
||
{
|
||
uint8_t all;
|
||
struct
|
||
{
|
||
unsigned bit0:1;
|
||
unsigned bit1:1;
|
||
unsigned bit2:1;
|
||
unsigned bit3:1;
|
||
unsigned bit4:1;
|
||
unsigned bit5:1;
|
||
unsigned bit6:1;
|
||
unsigned bit7:1;
|
||
}bit;
|
||
}uint8_BitTypeDef;
|
||
|
||
typedef union
|
||
{
|
||
uint16_t all;
|
||
struct
|
||
{
|
||
unsigned bit0:1;
|
||
unsigned bit1:1;
|
||
unsigned bit2:1;
|
||
unsigned bit3:1;
|
||
unsigned bit4:1;
|
||
unsigned bit5:1;
|
||
unsigned bit6:1;
|
||
unsigned bit7:1;
|
||
unsigned bit8:1;
|
||
unsigned bit9:1;
|
||
unsigned bit10:1;
|
||
unsigned bit11:1;
|
||
unsigned bit12:1;
|
||
unsigned bit13:1;
|
||
unsigned bit14:1;
|
||
unsigned bit15:1;
|
||
}bit;
|
||
}uint16_BitTypeDef;
|
||
|
||
|
||
typedef union
|
||
{
|
||
uint32_t all;
|
||
struct
|
||
{
|
||
unsigned bit0:1; unsigned bit1:1; unsigned bit2:1; unsigned bit3:1;
|
||
unsigned bit4:1; unsigned bit5:1; unsigned bit6:1; unsigned bit7:1;
|
||
unsigned bit8:1; unsigned bit9:1; unsigned bit10:1; unsigned bit11:1;
|
||
unsigned bit12:1; unsigned bit13:1; unsigned bit14:1; unsigned bit15:1;
|
||
unsigned bit16:1; unsigned bit17:1; unsigned bit18:1; unsigned bit19:1;
|
||
unsigned bit20:1; unsigned bit21:1; unsigned bit22:1; unsigned bit23:1;
|
||
unsigned bit24:1; unsigned bit25:1; unsigned bit26:1; unsigned bit27:1;
|
||
unsigned bit28:1; unsigned bit29:1; unsigned bit30:1; unsigned bit31:1;
|
||
}bit;
|
||
}uint32_BitTypeDef;
|
||
|
||
|
||
typedef union
|
||
{
|
||
uint64_t all;
|
||
struct
|
||
{
|
||
unsigned bit0:1; unsigned bit1:1; unsigned bit2:1; unsigned bit3:1;
|
||
unsigned bit4:1; unsigned bit5:1; unsigned bit6:1; unsigned bit7:1;
|
||
unsigned bit8:1; unsigned bit9:1; unsigned bit10:1; unsigned bit11:1;
|
||
unsigned bit12:1; unsigned bit13:1; unsigned bit14:1; unsigned bit15:1;
|
||
unsigned bit16:1; unsigned bit17:1; unsigned bit18:1; unsigned bit19:1;
|
||
unsigned bit20:1; unsigned bit21:1; unsigned bit22:1; unsigned bit23:1;
|
||
unsigned bit24:1; unsigned bit25:1; unsigned bit26:1; unsigned bit27:1;
|
||
unsigned bit28:1; unsigned bit29:1; unsigned bit30:1; unsigned bit31:1;
|
||
unsigned bit32:1; unsigned bit33:1; unsigned bit34:1; unsigned bit35:1;
|
||
unsigned bit36:1; unsigned bit37:1; unsigned bit38:1; unsigned bit39:1;
|
||
unsigned bit40:1; unsigned bit41:1; unsigned bit42:1; unsigned bit43:1;
|
||
unsigned bit44:1; unsigned bit45:1; unsigned bit46:1; unsigned bit47:1;
|
||
unsigned bit48:1; unsigned bit49:1; unsigned bit50:1; unsigned bit51:1;
|
||
unsigned bit52:1; unsigned bit53:1; unsigned bit54:1; unsigned bit55:1;
|
||
unsigned bit56:1; unsigned bit57:1; unsigned bit58:1; unsigned bit59:1;
|
||
unsigned bit60:1; unsigned bit61:1; unsigned bit62:1; unsigned bit63:1;
|
||
}bit;
|
||
}uint64_BitTypeDef;
|
||
|
||
|
||
/**
|
||
* @brief Получить n-й бит из uint8_t
|
||
* @param _uint8_ Переменная типа uint8_t
|
||
* @param _bit_ Константный номер бита (0..7)
|
||
* @return Значение выбранного бита (0 или 1)
|
||
* @note Индекс бита должен быть известен на этапе компиляции!
|
||
*/
|
||
#define uint8_bit(_uint8_, _bit_) (*(uint8_BitTypeDef *)(&(_uint8_))).bit.bit##_bit_
|
||
/**
|
||
* @brief Получить n-й бит из uint16_t
|
||
* @param _uint16_ Переменная типа uint16_t
|
||
* @param _bit_ Константный номер бита (0..15)
|
||
* @return Значение выбранного бита (0 или 1)
|
||
* @note Индекс бита должен быть известен на этапе компиляции!
|
||
*/
|
||
#define uint16_bit(_uint8_, _bit_) (*(uint16_BitTypeDef *)(&(_uint8_))).bit.bit##_bit_
|
||
/**
|
||
* @brief Получить n-й бит из uint32_t
|
||
* @param _uint32_ Переменная типа uint32_t
|
||
* @param _bit_ Константный номер бита (0..31)
|
||
* @return Значение выбранного бита (0 или 1)
|
||
* @note Индекс бита должен быть известен на этапе компиляции!
|
||
*/
|
||
#define uint32_bit(_uint8_, _bit_) (*(uint32_BitTypeDef *)(&(_uint8_))).bit.bit##_bit_
|
||
/**
|
||
* @brief Получить n-й бит из uint64_t
|
||
* @param _uint64_ Переменная типа uint64_t
|
||
* @param _bit_ Константный номер бита (0..63)
|
||
* @return Значение выбранного бита (0 или 1)
|
||
* @note Индекс бита должен быть известен на этапе компиляции!
|
||
*/
|
||
#define uint64_bit(_uint8_, _bit_) (*(uint64_BitTypeDef *)(&(_uint8_))).bit.bit##_bit_
|
||
|
||
#endif //__BIT_ACCESS_H_
|
||
|
||
/** BIT_ACCESS_DEFINES
|
||
* @}
|
||
*/ |