#define MODIFY_REG(REG, CLEARMASK, SETMASK) WRITE_REG((REG), (((READ_REG(REG)) & (~(CLEARMASK))) | (SETMASK)))
这个宏 MODIFY_REG 是在嵌入式编程中,它用于修改一个寄存器的特定位,而不影响其他位。这个宏接受三个参数:
REG:要修改的寄存器的地址。
CLEARMASK:要清除的位掩码(即,设置为0的位)。
SETMASK:要设置的位掩码(即,设置为1的位)。
宏的工作原理如下:
1.READ_REG(REG):首先读取当前寄存器的值。
2.& (~(CLEARMASK)):然后,使用按位非操作(~)来反转CLEARMASK中的所有位,并通过按位与操作(&)来清除REG中由CLEARMASK指定的位。
3.|:接着,使用按位或操作(|)来设置REG中由SETMASK指定的位。
4.WRITE_REG((REG), ...):最后,将修改后的值写回REG寄存器。
这个过程通常称为位域操作或位掩码操作,是底层硬件编程中非常常见的技术。
-------------------------------
这里有一个使用此宏的示例:
// 假设我们有一个名为FLASH_CR的寄存器,我们想要修改其中的PG位和SER位。
// PG位是第6位,SER位是第5位。
// 我们想要清除PG位(将其设置为0),并设置SER位(将其设置为1)。\
// 定义位掩码
#define FLASH_CR_PG_CLEAR_MASK (1 << 6)// 清除PG位(将其设置为0)
#define FLASH_CR_SER_SET_MASK (1 << 5)// 设置SER位(将其设置为1)
// 使用MODIFY_REG宏来修改寄存器
MODIFY_REG(FLASH->CR, FLASH_CR_PG_CLEAR_MASK, FLASH_CR_SER_SET_MASK);
-------------------在STM32程序(keil)中应用截图:
AHB分频寄存器配置:
// 定义要清除的位掩码7:4设1: 0xF<<4-----11110000
//设置的位掩码 7:4的值