arduino_midi_player/Midi/music-box-nv32-master/nv32lib/drivers/bos/bos.h
2025-03-24 14:30:56 +08:00

560 lines
24 KiB
C
Raw Permalink 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位加载置1LAS1硬件编码地址
*
*******************************************************************************/
/*****************************************************************************//*!
*
* @brief 生成BOS位操作1位加载置1LAS1)操作码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位加载置1LAS1硬件编码地址
*
*******************************************************************************/
/*****************************************************************************//*!
*
* @brief 生成BOS位操作1位加载置1LAS1)操作码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