/*************************************************************************! * 技术讨论:QQ群 123763203 * 官网 :www.navota.com * * @file bos.h * @brief 位操作存储模块(BOS)函数库 * @author Navota * @date 2017-1-1 ***************************************************************************/ /****************************************************************************** ******************************************************************************/ #ifndef __BOS_H #define __BOS_H #ifdef __cplusplus extern "C" { #endif /****************************************************************************** * * BOS 操作码(opcode) * *******************************************************************************/ #define BOS_OPCODE_AND 1 /*!< AND 操作码 */ #define BOS_OPCODE_OR 2 /*!< OR 操作码 */ #define BOS_OPCODE_XOR 3 /*!< XOR 操作码 */ #define BOS_OPCODE_BITFIELD 4 /*!< 位字段操作码 */ #define BOS_OPCODE_BIT_CLEAR 2 /*!< 位清零操作码 */ #define BOS_OPCODE_BIT_SET 3 /*!< 置位操作码 */ /****************************************************************************** * * BOS宏定义,用来生成BOS硬件编码地址 * *******************************************************************************/ /****************************************************************************** * 宏定义,用于生成逻辑与硬件编码地址. * *******************************************************************************/ /*****************************************************************************//*! * * @brief 生成BOS位操作逻辑与操作地址(32位硬件编码地址) * * @param[in] ADDR 32位地址. * * @return hardcoded 32位地址. * * *****************************************************************************/ #define BOS_AND(ADDR) (*(volatile uint32_t *)(((uint32_t)ADDR) | (BOS_OPCODE_AND<<26))) /****************************************************************************** * 宏定义,用于生成逻辑或硬件编码地址. * *******************************************************************************/ /*****************************************************************************//*! * * @brief 生成BOS位操作逻辑或操作地址(32位硬件编码地址) * * @param[in] ADDR 32位地址. * * @return hardcoded 32位地址. * *****************************************************************************/ #define BOS_OR(ADDR) (*(volatile uint32_t *)(((uint32_t)ADDR) | (BOS_OPCODE_OR<<26))) /****************************************************************************** * 宏定义,用于生成逻辑异或硬件编码地址. * *******************************************************************************/ /*****************************************************************************//*! * * @brief 生成BOS位操作逻辑或操作地址(32位硬件编码地址) * * @param[in] ADDR 32位地址. * * @return hardcoded 32位地址. * *****************************************************************************/ #define BOS_XOR(ADDR) (*(volatile uint32_t *)(((uint32_t)ADDR) | (BOS_OPCODE_XOR<<26))) #if !defined(BOS_SANITY_CHECK) /*! * @brief This is fastest way for BOS without sanity check. */ /****************************************************************************** * 宏定义,用于生成一位加载-清零(LAC1)硬件编码地址. * *******************************************************************************/ /*****************************************************************************//*! * * @brief 生成BOS位操作:1位加载清零操作地址(32位硬件编码地址) * * @param[in] ADDR 32位地址 * @param[in] bit 要清零的位, 0-based. * * @return hardcoded 32-bit address. * *****************************************************************************/ #define BOS_BIT_CLEAR(ADDR,bit) (*(volatile uint32_t *)(((uint32_t)ADDR) \ | (BOS_OPCODE_BIT_CLEAR <<26) \ | ((bit)<<21))) /****************************************************************************** * 宏定义,用于生成一位加载-置位(LAS1)硬件编码地址. * *******************************************************************************/ /*****************************************************************************//*! * * @brief 生成BOS位操作:1位加载置位操作地址(32位硬件编码地址) * * @param[in] ADDR 32位地址. * @param[in] bit 要置1的位, 0-based. * * @return hardcoded 32-bit address. * *****************************************************************************/ #define BOS_BIT_SET(ADDR,bit) (*(volatile uint32_t *)(((uint32_t)ADDR) \ | (BOS_OPCODE_BIT_SET <<26) \ | ((bit)<<21))) /****************************************************************************** *宏定义,用于生成位操作存储字段插入(BFI)硬件编码地址. * *******************************************************************************/ /*****************************************************************************//*! * * @brief 生成BOS位操作存储字段插入硬件编码地址 (32位硬件编码地址). * * @param[in] ADDR 32位地址 * @param[in] bit 插入字段的起始位, 0-based. * @param[in] width 插入字段的宽度, 1-based. * * @return hardcoded 32-bit address. * *****************************************************************************/ #define BOS_BITFIELD_INSERT(ADDR,bit,width) (*(volatile uint32_t *)(((uint32_t)ADDR) \ | (BOS_OPCODE_BITFIELD <<26) \ | ((bit)<<23) | ((width-1))<<19)) /****************************************************************************** * *宏定义,用于生位操作存储加载无符号字段提取(UBFX)硬件编码地址 . * *******************************************************************************/ /*****************************************************************************//*! * * @brief 用于生位操作存储加载无符号字段提取(UBFX)操作地址 (32位硬件编码地址). * * @param[in] ADDR 32位地址. * @param[in] bit 读取起始位, 0-based. * @param[in] width 读取字段宽度, 1-based. * * @return hardcoded 32-bit address. * *****************************************************************************/ #define BOS_BITFIELD_EXTRACT(ADDR,bit,width) (*(volatile uint32_t *)(((uint32_t)ADDR) \ | (BOS_OPCODE_BITFIELD <<26) \ | ((bit)<<23) | ((width-1))<<19)) #else /*! * @brief This is slow way for BOS as it has sanity check. */ /****************************************************************************** * 宏定义,用于生成一位加载-清零(LAC1)地址. * *******************************************************************************/ #define BOS_BIT_CLEAR(ADDR,bit) (*(volatile uint32_t *)(((uint32_t)ADDR) \ | (BOS_OPCODE_BIT_CLEAR <<26) \ | ((bit & 0x1F)<<21))) /*!< 位清零操作 */ /***************************************************************************** * 宏定义,用于生成一位加载-置位(LAS1)硬件编码地址. * *******************************************************************************/ #define BOS_BIT_SET(ADDR,bit) (*(volatile uint32_t *)(((uint32_t)ADDR) \ | (BOS_OPCODE_BIT_SET <<26) \ | ((bit & 0x1F)<<21))) /*!< 置位操作 */ /****************************************************************************** *宏定义,用于生成位操作存储字段插入(BFI)硬件编码地址. * *******************************************************************************/ #define BOS_BITFIELD_INSERT(ADDR,bit,width) (*(volatile uint32_t *)(((uint32_t)ADDR) \ | (BOS_OPCODE_BITFIELD <<26) \ | ((bit & 0x1F)<<23) | ((width-1) & 0xF)<<19)) /*!< 字段插入操作 */ /****************************************************************************** *宏定义,用于生位操作存储加载无符号字段提取(UBFX)硬件编码地址 * *******************************************************************************/ #define BOS_BITFIELD_EXTRACT(ADDR,bit,width) (*(volatile uint32_t *)(((uint32_t)ADDR) \ | (BOS_OPCODE_BITFIELD <<26) \ | ((bit & 0x1F)<<23) | ((width-1) & 0xF)<<19)) /*!< 字段提取操作 */ #endif /****************************************************************************** * BOS宏定义,用来生成BOS硬件编码地址(8位地址) * *******************************************************************************/ /****************************************************************************** * 宏定义,用于生成逻辑或硬件编码地址.(8位地址) * *******************************************************************************/ /*****************************************************************************//*! * * @brief 生成BOS位操作逻辑与(AND)操作地址(32位硬件编码地址),对8位数据进行与操作 * * @param[in] ADDR 32位地址. * * @return hardcoded 32-bit address. * *****************************************************************************/ #define BOS_AND_8b(ADDR) (*(volatile uint8_t *)(((uint32_t)ADDR) | (BOS_OPCODE_AND<<26))) /****************************************************************************** * 宏定义,用于生成逻辑或硬件编码地址. * *******************************************************************************/ /*****************************************************************************//*! * * @brief 生成BOS位操作逻辑或(OR)操作地址(32位硬件编码地址),对8位数据进行或操作. * * @param[in] ADDR 32位地址. * * @return hardcoded 32位地址. * *****************************************************************************/ #define BOS_OR_8b(ADDR) (*(volatile uint8_t *)(((uint32_t)ADDR) | (BOS_OPCODE_OR<<26))) /****************************************************************************** * 宏定义,用于生成逻辑异或硬件编码地址. * *******************************************************************************/ /*****************************************************************************//*! * * @brief 生成BOS位操作逻辑异或(XOR)操作地址(32位硬件编码地址),对8位数据进行异或操作.. * * @param[in] ADDR 32位地址. * * @return hardcoded 32位地址. * *****************************************************************************/ #define BOS_XOR_8b(ADDR) (*(volatile uint8_t *)(((uint32_t)ADDR) | (BOS_OPCODE_XOR<<26))) #if !defined(BOS_SANITY_CHECK) /*! * @brief This is fastest way for BOS without sanity check. */ /****************************************************************************** * 宏定义用于生成 1位加载清零(LAC1)硬件编码地址 * *******************************************************************************/ /*****************************************************************************//*! * * @brief 生成BOS位操作:1位加载清零操作地址(32位硬件编码地址)用于8位数据操作. * * @param[in] ADDR 32位地址 * @param[in] bit 要清零的位, 0-based. * * @return hardcoded 32位地址. * *****************************************************************************/ #define BOS_BIT_CLEAR_8b(ADDR,bit) (*(volatile uint8_t *)(((uint32_t)ADDR) \ | (BOS_OPCODE_BIT_CLEAR <<26) \ | ((bit)<<21))) /****************************************************************************** * 宏定义用于生成 1位加载置1(LAS1)硬件编码地址 * *******************************************************************************/ /*****************************************************************************//*! * * @brief 生成BOS位操作1位加载置1(LAS1)操作码(32位硬件编码地址)用于8位数据操作 * * @param[in] ADDR 32位地址 * @param[in] bit 要置1的位, 0-based. * * @return hardcoded 32位地址. * *****************************************************************************/ #define BOS_BIT_SET_8b(ADDR,bit) (*(volatile uint8_t *)(((uint32_t)ADDR) \ | (BOS_OPCODE_BIT_SET <<26) \ | ((bit)<<21))) /****************************************************************************** *宏定义,用于生成位操作存储字段插入(BFI)硬件编码地址. * *******************************************************************************/ /*****************************************************************************//*! * * @brief 生成BOS位操作存储字段插入硬件编码地址 (32位硬件编码地址).用于8位数据操作 * * @param[in] ADDR 32位地址 * @param[in] bit 插入字段的起始位, 0-based. * @param[in] width 插入字段的宽度, 1-based. * * @return hardcoded 32位地址. * *****************************************************************************/ #define BOS_BITFIELD_INSERT_8b(ADDR,bit,width) (*(volatile uint8_t *)(((uint32_t)ADDR) \ | (BOS_OPCODE_BITFIELD <<26) \ | ((bit)<<23) | ((width-1))<<19)) /****************************************************************************** *宏定义,用于生位操作存储加载无符号字段提取(UBFX)硬件编码地址 . * *******************************************************************************/ /*****************************************************************************//*! * * @brief 用于生位操作存储加载无符号字段提取(UBFX)操作地址 (32位硬件编码地址).用于8位操作 * * @param[in] ADDR 32位地址. * @param[in] bit 读取起始位, 0-based. * @param[in] width 读取字段宽度, 1-based. * * @return hardcoded 32-bit address. * *****************************************************************************/ #define BOS_BITFIELD_EXTRACT_8b(ADDR,bit,width) (*(volatile uint8_t *)(((uint32_t)ADDR) \ | (BOS_OPCODE_BITFIELD <<26) \ | ((bit<<23) | ((width-1))<<19)) #else /*! * @brief This is slow way for BOS as it has sanity check. */ /****************************************************************************** * 宏定义,用于生成一位加载-清零(LAC1)地址. * *******************************************************************************/ #define BOS_BIT_CLEAR_8b(ADDR,bit) (*(volatile uint8_t *)(((uint32_t)ADDR) \ | (BOS_OPCODE_BIT_CLEAR <<26) \ | ((bit & 0x1F)<<21))) /*!< 位清零操作,8位模式*/ /****************************************************************************** * 宏定义,用于生成一位加载-置位(LAS1)硬件编码地址. * *******************************************************************************/ #define BOS_BIT_SET_8b(ADDR,bit) (*(volatile uint8_t *)(((uint32_t)ADDR) \ | (BOS_OPCODE_BIT_SET <<26) \ | ((bit & 0x1F)<<21))) /*!< 位置1操作,8位模式*/ /****************************************************************************** * 宏定义,用于生成位操作存储字段插入(BFI)硬件编码地址. * *******************************************************************************/ #define BOS_BITFIELD_INSERT_8b(ADDR,bit,width) (*(volatile uint8_t *)(((uint32_t)ADDR) \ | (BOS_OPCODE_BITFIELD <<26) \ | ((bit & 0x1F)<<23) | ((width-1) & 0xF)<<19)) /*!< 字段插入操作,8位模式 */ /****************************************************************************** *宏定义,用于生位操作存储加载无符号字段提取(UBFX)硬件编码地址 *******************************************************************************/ #define BOS_BITFIELD_EXTRACT_8b(ADDR,bit,width) (*(volatile uint8_t *)(((uint32_t)ADDR) \ | (BOS_OPCODE_BITFIELD <<26) \ | ((bit & 0x1F)<<23) | ((width-1) & 0xF)<<19)) /*!< 字段提取操作,8位 */ #endif /****************************************************************************** * BOS宏定义,用来生成BOS硬件编码地址(16位地址) * *******************************************************************************/ /****************************************************************************** * 宏定义,用于生成逻辑或硬件编码地址.(16位地址) * *******************************************************************************/ /*****************************************************************************//*! * * @brief 生成BOS位操作逻辑与(AND)操作地址(32位硬件编码地址),对8位数据进行与操作 * * @param[in] ADDR 32位地址. * * @return hardcoded 32-bit address. * *****************************************************************************/ #define BOS_AND_16b(ADDR) (*(volatile uint16_t *)(((uint32_t)ADDR) | (BOS_OPCODE_AND<<26))) /****************************************************************************** * 宏定义,用于生成逻辑或硬件编码地址. * *******************************************************************************/ /*****************************************************************************//*! * * @brief 生成BOS位操作逻辑或(OR)操作地址(32位硬件编码地址),对8位数据进行或操作. * * @param[in] ADDR 32位地址. * * @return hardcoded 32位地址. * *****************************************************************************/ #define BOS_OR_16b(ADDR) (*(volatile uint16_t *)(((uint32_t)ADDR) | (BOS_OPCODE_OR<<26))) /****************************************************************************** * 宏定义,用于生成逻辑异或硬件编码地址. * *******************************************************************************/ /*****************************************************************************//*! * * @brief 生成BOS位操作逻辑异或(XOR)操作地址(32位硬件编码地址),对8位数据进行异或操作.. * * @param[in] ADDR 32位地址. * * @return hardcoded 32位地址. * ***************************************************************************/ #define BOS_XOR_16b(ADDR) (*(volatile uint16_t *)(((uint32_t)ADDR) | (BOS_OPCODE_XOR<<26))) #if !defined(BOS_SANITY_CHECK) /*! * @brief This is fastest way for BOS without sanity check. */ /****************************************************************************** * 宏定义用于生成 1位加载清零(LAC1)硬件编码地址 * *******************************************************************************/ /*****************************************************************************//*! * * @brief 生成BOS位操作:1位加载清零操作地址(32位硬件编码地址)用于16位数据操作. * * @param[in] ADDR 32位地址 * @param[in] bit 要清零的位, 0-based. * * @return hardcoded 32位地址. * ****************************************************************************/ #define BOS_BIT_CLEAR_16b(ADDR,bit) (*(volatile uint16_t *)(((uint32_t)ADDR) \ | (BOS_OPCODE_BIT_CLEAR <<26) \ | ((bit)<<21))) /****************************************************************************** * 宏定义用于生成 1位加载置1(LAS1)硬件编码地址 * *******************************************************************************/ /*****************************************************************************//*! * * @brief 生成BOS位操作1位加载置1(LAS1)操作码(32位硬件编码地址)用于8位数据操作 * * @param[in] ADDR 32位地址 * @param[in] bit 要置1的位, 0-based. * * @return hardcoded 32位地址. * *****************************************************************************/ #define BOS_BIT_SET_16b(ADDR,bit) (*(volatile uint16_t *)(((uint32_t)ADDR) \ | (BOS_OPCODE_BIT_SET <<26) \ | ((bit)<<21))) /****************************************************************************** *宏定义,用于生成位操作存储字段插入(BFI)硬件编码地址. * *******************************************************************************/ /*****************************************************************************//*! * * @brief 生成BOS位操作存储字段插入硬件编码地址 (32位硬件编码地址).用于16位数据操作 * * @param[in] ADDR 32位地址 * @param[in] bit 插入字段的起始位, 0-based. * @param[in] width 插入字段的宽度, 1-based. * * @return hardcoded 32位地址. * *****************************************************************************/ #define BOS_BITFIELD_INSERT_16b(ADDR,bit,width) (*(volatile uint16_t *)(((uint32_t)ADDR) \ | (BOS_OPCODE_BITFIELD <<26) \ | ((bit)<<23) | ((width-1))<<19)) /****************************************************************************** *宏定义,用于生位操作存储加载无符号字段提取(UBFX)硬件编码地址 . * *******************************************************************************/ /*****************************************************************************//*! * * @brief 用于生位操作存储加载无符号字段提取(UBFX)操作地址 (32位硬件编码地址).用于16位操作 * * @param[in] ADDR 32位地址. * @param[in] bit 读取起始位, 0-based. * @param[in] width 读取字段宽度, 1-based. * * @return hardcoded 32-bit address. * *****************************************************************************/ #define BOS_BITFIELD_EXTRACT_16b(ADDR,bit,width) (*(volatile uint16_t *)(((uint32_t)ADDR) \ | (BOS_OPCODE_BITFIELD <<26) \ | ((bit)<<23) | ((width-1))<<19)) #else /*! * @brief This is slow way for BOS as it has sanity check. */ /****************************************************************************** * 宏定义,用于生成一位加载-清零(LAC1)地址. * *******************************************************************************/ #define BOS_BIT_CLEAR_16b(ADDR,bit) (*(volatile uint16_t *)(((uint32_t)ADDR) \ | (BOS_OPCODE_BIT_CLEAR <<26) \ | ((bit & 0x1F)<<21))) /*!< 位清零操作,16位模式*/ /****************************************************************************** * 宏定义,用于生成一位加载-置位(LAS1)硬件编码地址. * *******************************************************************************/ #define BOS_BIT_SET_16b(ADDR,bit) (*(volatile uint16_t *)(((uint32_t)ADDR) \ | (BOS_OPCODE_BIT_SET <<26) \ | ((bit & 0x1F)<<21))) /*!< 位置1操作,16位模式*/ /****************************************************************************** * 宏定义,用于生成位操作存储字段插入(BFI)硬件编码地址. * *******************************************************************************/ #define BOS_BITFIELD_INSERT_16b(ADDR,bit,width) (*(volatile uint16_t *)(((uint32_t)ADDR) \ | (BOS_OPCODE_BITFIELD <<26) \ | ((bit & 0x1F)<<23) | ((width-1) & 0xF)<<19)) /*!< 字段插入操作,16位模式 */ /****************************************************************************** *宏定义,用于生位操作存储加载无符号字段提取(UBFX)硬件编码地址 *******************************************************************************/ #define BOS_BITFIELD_EXTRACT_16b(ADDR,bit,width) (*(volatile uint16_t *)(((uint32_t)ADDR) \ | (BOS_OPCODE_BITFIELD <<26) \ | ((bit & 0x1F)<<23) | ((width-1) & 0xF)<<19)) /*!< 字段提取操作,16位 */ #endif #ifdef __cplusplus } #endif #endif