Files
arduino_midi_player/Midi/music-box-nv32-master/nv32lib/drivers/bos/bos.h
T

560 lines
24 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*************************************************************************!
* 技术讨论: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