首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

ARM 寄存器位操作技巧總結:置位、清零、讀取、掩碼操作

     編輯:關於C語言

ARM 嵌入式開發核心技能:寄存器位操作標準模式與技巧

ARM 寄存器通常整體讀寫,位操作需通過掩碼實現。本文總結置 1、清 0、讀取、組合操作的標準寫法與記憶口訣。

核心原理口訣

"|" 用來置 1 (OR)
"&" 用來清 0 (AND)
"<<<" 左移構建掩碼,1 從不變
清 0 要加 "~" 取反

基本操作模板

操作代碼模式示例:位 6
置 1reg |= (1 << n)reg |= (1 << 6)
清 0reg &= ~(1 << n)reg &= ~(1 << 6)
翻轉reg ^= (1 << n)reg ^= (1 << 6)
讀取(reg >> n) & 1(reg >> 6) & 1
判斷是否置 1reg & (1 << n)if (reg & (1 << 6)) ...

組合操作實戰

多位同時清零


// 清除位 2, 6, 7
reg &= ~( (1<<2) | (1<<6) | (1<<7) );
// 解析:構建掩碼 0b11000100 -> 取反 0b00111011 -> AND 清零

多位同時置一


// 置位 3, 5
reg |= (1<<3) | (1<<5);

域操作:修改連續位域


// 修改位 4-7 (4位域) 為值 val (0-15)
reg = (reg & ~(0xF << 4)) | ((val & 0xF) << 4);
// 步驟:清零目標域 -> 新值移位 -> OR 合成

實戰場景

  • GPIO 模式配置:MODER 寄存器 2 位/腳
  • 中斷控制:使能/屏蔽特定中斷位
  • 時鐘啟用:RCC_AHBENR 等總線時鐘位
  • 標誌位清除:寫 1 清零的狀態寄存器

調試技巧


// 打印寄存器二進制
void printReg(uint32_t reg) {
    for (int i = 31; i >= 0; i--)
        putchar((reg & (1<

常見錯誤避坑

  • 忘記 ~ 導致清零變置一
  • 掩碼類型不匹配(1 是 int,需 1U 或 1UL)
  • 移位超寬度(1 << 32 未定義行為)
  • 讀改寫非原子操作在中斷/多核下競態

熟練掌握位操作模板,是嵌入式寄存器級開發的基本功。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved