寄存器位清0和置位函数实现
在 C 语言中,可以使用宏定义来创建用于清除(清零)或设置(置一)32位地址中特定位的函数。以下是两个宏定义的示例:
#define CLEAR_BIT(addr, bit) (*(volatile uint32_t *)(addr) &= ~(1UL << (bit)))
#define SET_BIT(addr, bit) (*(volatile uint32_t *)(addr) |= (1UL << (bit)))
这里的 addr
是指向目标32位地址的指针,bit
是需要操作的位的索引(从0开始计数)。
示例使用方式
假设要操作的是一个具有可读写属性的寄存器,它的地址为 0x40021000
,现在我们想要清除第3位,设置第5位:
#define REG_ADDRESS 0x40021000
// 清除第3位
CLEAR_BIT(REG_ADDRESS, 3);
// 设置第5位
SET_BIT(REG_ADDRESS, 5);
注意事项
-
这些宏定义假设
addr
是一个有效的32位寄存器地址。 -
使用
volatile
关键字确保每次访问寄存器时都会直接从内存读取,而不会使用缓存的值,这是访问硬件寄存器时的标准做法。 -
1UL
表示无符号长整型字面量,确保移位操作是在一个32位的值上执行的,以便正确地处理位操作。文章来源:https://www.toymoban.com/news/detail-842353.html -
在执行位清除操作时,首先使用
1UL << bit
创建一个只有目标位为1其余位为0的掩码,然后使用按位取反操作~
来反转掩码,最后使用按位与操作&=
来清除目标位。 5. 在执行位设置操作时,使用1UL << bit
创建掩码,然后使用按位或操作|=
来设置目标位。文章来源地址https://www.toymoban.com/news/detail-842353.html
到了这里,关于【ARM 嵌入式 C 入门及渐进 12 --寄存器位清0和置位函数实现】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!