厂家提供了S32K14X系列的寄存器定义,如: #define CAN_MCR_HALT_MASK 0x10000000u #define CAN_MCR_HALT_SHIFT 28u #define CAN_MCR_HALT_WIDTH 1u #define CAN_MCR_HALT(x) (((uint32_t)(((uint32_t)(x))<<CAN_MCR_HALT_SHIFT))&CAN;_MCR_HALT_MASK) #define CAN_MCR_RFEN_MASK 0x20000000u #define CAN_MCR_RFEN_SHIFT 29u #define CAN_MCR_RFEN_WIDTH 1u #define CAN_MCR_RFEN(x) (((uint32_t)(((uint32_t)(x))<<CAN_MCR_RFEN_SHIFT))&CAN;_MCR_RFEN_MASK) #define CAN_MCR_FRZ_MASK 0x40000000u #define CAN_MCR_FRZ_SHIFT 30u #define CAN_MCR_FRZ_WIDTH 1u #define CAN_MCR_FRZ(x) (((uint32_t)(((uint32_t)(x))<<CAN_MCR_FRZ_SHIFT))&CAN;_MCR_FRZ_MASK) #define CAN_MCR_MDIS_MASK 0x80000000u #define CAN_MCR_MDIS_SHIFT 31u #define CAN_MCR_MDIS_WIDTH 1u #define CAN_MCR_MDIS(x) (((uint32_t)(((uint32_t)(x))<<CAN_MCR_MDIS_SHIFT))&CAN;_MCR_MDIS_MASK) 使用时方便,比如: base->MCR = (base->MCR & ~CAN_MCR_HALT_MASK) | CAN_MCR_HALT(0U); base->MCR = (base->MCR & ~CAN_MCR_FRZ_MASK) | CAN_MCR_FRZ(0U); 但是,在想要获取寄存器中某些位段的值时,需要使用寄存器的掩码和移位,比如: while (((base->MCR & CAN_MCR_LPMACK_MASK) >> CAN_MCR_LPMACK_SHIFT) != 0U) {} 于是,想扩展以下格式的宏: #define CAN_MCR_LPMACK_GET(r) (((r) & CAN_MCR_LPMACK_MASK) >> CAN_MCR_LPMACK_SHIFT) 这样,使用的时候只需要写 while(CAN_MCR_LPMACK_GET(base->MCR) != 0) {} 【解决办法】 在MATLAB中写一个脚本,自动从原始头文件中提取相关的定义,并生成全部GET宏。 脚本文件为: S32K14X_CreateGetMacro.m 生成结果为: S32K144_get.h
- 1
- 粉丝: 1084
- 资源: 77
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助