#define MODIFY_REG(REG, CLEARMASK, SETMASK)

2024-03-06 23:12

本文主要是介绍#define MODIFY_REG(REG, CLEARMASK, SETMASK),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 #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的值

 

这篇关于#define MODIFY_REG(REG, CLEARMASK, SETMASK)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/781666

相关文章

2、#include和#define

#include和#define 一、#include二、#define宏定义1、宏变量2、宏函数 一、#include #include是预处理指令,会将头文件直接替换到文件中。 // hello.hvoid foo() {int c = 0;int d = 1;}// hello.cpp#include "hello.h"int main() {int a =

const与#define的优缺点

1.define由预处理程序处理,const由编译程序处理 2.#define不分内存,因为它是预编译指令,编译前进行了宏替换。const 不一定?某种说法,Const常量是占有内存的被“冻结”了的变量 3.const定义常量是有数据类型的,这样const定义的常量编译器可以对其进行数据静态类型安全检查,而#define宏定义的常量却只是进行简单的字符替换,没有类型安全检查,且有时还会产生边际

【C++】define宏定义中的#,##,@#及\符号

一、# 名称:字符串化操作符 其作:将宏定义中的传入参数名转换成用一对双引号括起来参数名字符串。 使用条件:只能用于有传入参数的宏定义中,且必须置于宏定义体中的参数名前 举例: #define example1(instr) #instr string str=example1(abc); 将会展成:string str="abc"; 注意:对空格的处理 a、忽略传入参数名前面和后

nable to execute dex: Multiple dex files define Lcom/chinaCEB/cebActivity/R

用proguaid 只混淆Android项目的src下的包的话,如果出现了上面的问题: nable to execute dex: Multiple dex files define Lcom/chinaCEB/cebActivity/R 1.如果你想开发Androidsdk 首先把你的项目的src下面打一个包。 2.然后用proguaid混淆。混淆的时候,有时候老是不成功,然你解决上面的

宏__cplusplus/////ifnbsp;define…

在C与C++混合编写的代码中,我们常常会在头文件里看到如下的声明:   #ifdef __cplusplus //如果定义了表示是c++编译器extern "C" {  #endif  // 在这里写标准c程序   #ifdef __cplusplus  }  #endif   __cplusplus是c++编译器内部定义的宏,如果使用的c编译器__cplusplus不会被定义,所以它用来区分

#define和预处理指令的使用

今天再总结一点#define和预处理指令的使用。 预处理过程扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器。可见预处理过程先于编译器对源代码进行处理。 预处理指令是以#开头的代码行,#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符。正行语句构成了一条预处理指令,该指令酱紫啊编译器进行编译之前对源代码做某些转换,下面是一些常用的预处理指令, #    空指

汇编语言中出现#include, #define的问题

U_boot源文件中,一些 .S文件中出现了#include, #define,如board\smdk2410目录下的lowlevel_init.S文件: #include <config.h> #include <version.h> /* some parameters for the board */ /*  *  * Taken from linux/arch/arm/boot/co

关于#ifndef,#define,#end的说明

#ifndef,#define,#end 是宏定义的一种---条件编译 这样我直接举个例子好了:我定义两个相同的类A分别在single.h和singlenew.h    single.h: 1 #include <iostream> 2 using namespace std; 3 4 class A 5 { 6 public: 7 A() 8

SRL_STAGES_TO_REG_INPUT

寄存器级可以通过SLR输入拉出,也可以使用 SRL_STAGES_TO_REG_INPUT属性。 这提供了对流水线寄存器结构的控制,以在流水线下和流水线上寻址 SRL基元的输入侧。 架构支持 所有架构。 适用对象 •单元格(get_cell)作为叶级SRL实例。 价值观 •1:Vivado逻辑优化将从指定的SRL中提取寄存器 原始输入。 •-1:Vivado逻辑优化将把寄存器推入指定的SRL基元中

#define详解

#define的概念: #define命令是C/C++语言中的一个宏定义命令。宏定义将一个标识符定义为一个字符串,源程序中的该标识符均以指定的字符串来代替。预处理命令后通常不加分号。这并不是说所有的预处理命令后都不能有分号出现。由于宏定义只是用宏名对一个字符串进行简单的替换,因此如果在宏定义命令后加了分号,将会连同分号一起进行置换。 该命令有两种格式:一种是简单的宏定义,另一种是带参数的宏定义。