衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

寄存器操作方法_對寄存器操作的通用方法總結

h1654155282.3538 ? 來源:網絡整理 ? 2018-05-22 15:53 ? 次閱讀

寄存器,是集成電路中非常重要的一種存儲單元,通常由觸發器組成。在集成電路設計中,寄存器可分為電路內部使用的寄存器和充當內外部接口的寄存器這兩類。內部寄存器不能被外部電路或軟件訪問,只是為內部電路的實現存儲功能或滿足電路的時序要求。而接口寄存器可以同時被內部電路和外部電路或軟件訪問,CPU中的寄存器就是其中一種,作為軟硬件的接口,為廣泛的通用編程用戶所熟知。本文主要詳解寄存器操作方法以及對寄存器操作的通用方法總結,具體的跟隨小編來了解一下。

一、寄存器操作

1、#define方法

1)寄存器地址的定義:

#define UART_BASE_ADRS (0x10000000) /* 串口的基地址 */

#define UART_RHR *(volatile unsigned char *)(UART_BASE_ADRS + 0) /* 數據接受寄存器 */

#define UART_THR *(volatile unsigned char *)(UART_BASE_ADRS + 0) /* 數據發送寄存器 */

2)寄存器讀寫操作:

UART_THR = ch; /* 發送數據 */

ch = UART_RHR; /* 接收數據 */

也可采用定義帶參數宏實現

#define WRITE_REG(addr, ch) *(volatile unsigned char *)(addr) = ch

#define READ_REG(addr, ch) ch = *(volatile unsigned char *)(addr)

3)對寄存器相應位的操作方法:

定義寄存器

#define UART_LCR *(volatile unsigned char *)(UART_BASE_ADRS + 3) /* 線控制寄存器 */

定義寄存器相應位的值

#define CHAR_LEN_5 0x00

#define CHAR_LEN_6 0x01

#define CHAR_LEN_7 0x02

#define CHAR_LEN_8 0x03 /* 8 data bit */

#define LCR_STB 0x04 /* Stop bit control */

#define ONE_STOP 0x00 /* One stop bit! */

#define LCR_PEN 0x08 /* Parity Enable */

#define PARITY_NONE 0x00

#define LCR_EPS 0x10 /* Even Parity Select */

#define LCR_SP 0x20 /* Force Parity */

#define LCR_SBRK 0x40 /* Start Break */

#define LCR_DLAB 0x80 /* Divisor Latch Access Bit */

定義寄存器相應位的值另一種方法

#define CHAR_LEN_5 0〈〈0

#define CHAR_LEN_6 1〈〈0

#define CHAR_LEN_7 1〈〈1

#define CHAR_LEN_8 (1〈〈0)|(1〈〈1) /* 8 data bit */

#define LCR_STB 1〈〈2 /* Stop bit control */

#define ONE_STOP 0〈〈2 /* One stop bit! */

#define LCR_PEN 1〈〈3 /* Parity Enable */

#define PARITY_NONE 0〈〈3

#define LCR_EPS 1〈〈4 /* Even Parity Select */

#define LCR_SP 1〈〈5 /* Force Parity */

#define LCR_SBRK 1〈〈6 /* Start Break */

#define LCR_DLAB 1〈〈7 /* Divisor Latch Access Bit */

對寄存器操作只需對相應位或賦值

UART_LCR = CHAR_LEN_8 | ONE_STOP | PARITY_NONE; /* 設置 8位數據位,1位停止位,無校驗位 */

4)對寄存器某一位置位與清零

對某一寄存器第7位置位

XX_CRTL |= 1〈〈7;

XX_CRTL &= ~(1〈〈7);

UART_LCR |= LCR_DLAB; /* 時鐘分頻器鎖存使能 */

UART_LCR &= ~(LCR_DLAB); /* 禁止時鐘分頻器鎖存 */

5 判斷寄存器某一位是否置位或為0的方法

#define UART_LSR *(volatile unsigned char *)(UART_BASE_ADRS + 5) /* 線狀態寄存器 */

#define LSR_DR 1〈〈0 /* Data Ready */

當UART_LSR的第0位為1時結束循環

while (!(UART_LSR & LSR_DR)) /* 等待數據接收完 */

2、共用體結構體位域的應用實例

【例】設count 是一個16 位的無符號整型計數器,最大計數為十六進制0xffff,要求將這個計數值以十六進制半字節的形式分解出來。

對于上述實例通常采用移位的方法求解,而采用共用體結構體位域的方法不需要通過移位運算。以下,對CCS 在頭文件中大量使用的共用體結構體位域進行注解。

先定義一個共用體結構體位域:

Uint16 cont,g,s,b,q; //16 位無符號整型變量定義

cont=0xfedc; //對cont 賦值

union //共用體類型定義

{ Uint16 i; //定義i 為16 位無符號整型變量

struct //結構體類型定義

{

Uint16 low:4; //最低4 位在前。從最低4 位開始,取每4 位構成半字節

Uint16 mid0:4;

Uint16 mid1:4;

Uint16 high:4; //最高4 位在后

}HalfByte; //HalfByte 為具有所定義的結構體類型的變量

}Count; //Count為具有所定義的共用體類型的變量

union 定義一個共用體類型,它包含兩個成員:一個是16 位無符號整型變量i,另一個是包含4 個半字節變量(low,mid0,mid1,high)的結構體類型。它們占用同一個內存單元,通過對i(Count.i)進行賦值,可以完成對結構體4 個變量的賦值。

上面的程序,在定義共用體類型和結構體類型的同時,直接完成了這兩個類型變量的定義,而未定義共用體和結構體類型名。即HalfByte 是一個具有所定義的結構體類型的變量,Count 是一個具有所定義的共用體類型的變量。理解了共用體與結構體之間的關系,下面的賦值指令就清楚了。

Count.i = cont; //對共用體類型成員i 進行賦值

g = Count.HalfByte.low; //將cont 的0~3 位賦值給g,g=0x000c

s = Count.HalfByte.mid0; //將cont 的4~7 位賦值給s,s=0x000d

b = Count.HalfByte.mid1; //將cont 的8~11 位賦值給b,b=0x000e

q = Count.HalfByte.high; //將cont 的12~15 位賦值給q,q=0x000f

通過共用體結構體定義,當對共用體類型成員i 進行賦值時,由于結構體類型變量HalfByte 與i 占用同一個內存單元,因此,也就完成了對HalfByte 的各成員的賦值。

C 語言的共用體結構體位域定義,可以完成對寄存器位域的訪問。至于被訪問的位域在內存中的具體位置則由編譯器安排,編程者可以不必關注。

下面是一個訪問寄存器位域的例子,供讀者參考。

先建立一個共用體結構體位域定義,將某個寄存器的16 位,從最低位到最高位分別

定義為Bit1,Bit2,…,Bit16。

union //共用體類型定義

{ Uint16 all; //定義all 為16 位無符號整型變量

struct //結構體類型定義

{

Uint16 Bit1:1; //0 位Bit1 取寄存器最低位0 位,以下順序取1 位直到最高位

Uint16 Bit2:1; //1

Uint16 Bit3:1; //2

Uint16 Bit4:1; //3

Uint16 Bit5:1; //4

Uint16 Bit6:1; //5

Uint16 Bit7:1; //6

Uint16 Bit8:1; //7

Uint16 Bit9:1; //8

Uint16 Bit10:1; //9

Uint16 Bit11:1; //10

Uint16 Bit12:1; //11

Uint16 Bit13:1; //12

Uint16 Bit14:1; //13

Uint16 Bit15:1; //14

Uint16 Bit16:1; //15

}bit; //bit為具有所定義的結構體類型的變量

}CtrlBit; //CtrlBit 為具有所定義的共用體類型的變量

有了上面的定義之后,要訪問某一個位或某些位就很容易了。比如要置Bit4,Bit8,Bit12 及Bit16 為1,可用兩種方法進行:

方法一:

CtrlBit.bit.Bit4 = 1;

CtrlBit.bit.Bit8 = 1;

CtrlBit.bit.Bit12 = 1;

CtrlBit.bit.Bit16 = 1;

二、對寄存器操作的通用方法總結

對寄存器的操作有時候要考慮對其不同的位進行先后順序不同的設置,但是對寄存器操作的方法是固定的。

首先要明白邏輯運算符(!,&&,||)和位運算符(〈〈,〉〉,~,|,^,&)的區別:

對寄存器的操作使用的是位運算符,

邏輯運算符一般用于在程序中判斷邏輯中使用。

例如 定義一個8位的寄存器(0xf0是寄存器的地址): #define REG 0xF0

1)對單個的位進行賦值

(1)將寄存器REG的第5位置“1”: REG |= (1 〈〈 5);

(2)將寄存器REG的第5位清“0”: REG &= ~(1 〈〈 5);

(3)將寄存器REG的第3和第5位置“1”:REG |= (1 〈〈 5) | (1 〈〈 3);

(4)將寄存器REG的第3和第5位清“0”:REG &= ~( (1 〈〈 5) | (1 〈〈 3) );

該段總結如下:

將某位置1,移位后使用位運算“|” ;

將某位清0,移位取反后,使用位運算“&”

2)直接賦值

(1)將寄存器REG的1、2、3、5、7位置“1”

REG = 0x5E; (即給寄存器REG1賦值為1010 1110,這種方法多在初始化中使用)

(2)分別將寄存器REG的1、3、5、7位置“1”;0、2位清“0”

u8 temp;

temp = REG;

temp |= (1 〈〈 1); //將第1位置“1”

temp |= (1 〈〈 3);

temp |= (1 〈〈 5);

temp |= (1 〈〈 7);

temp &= ~(1 〈〈 0) ; //將第0位清“0”,等價于temp &= ~0x01

temp &= ~(1 〈〈 2); //將第2位清“0”

REG = temp;

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 寄存器
    +關注

    關注

    31

    文章

    5363

    瀏覽量

    121155
收藏 人收藏

    評論

    相關推薦

    寄存器是什么?怎么操作寄存器點亮LED燈?

    寄存器,是集成電路中非常重要的一種存儲單元,通常由觸發組成。在集成電路設計中,寄存器可分為電路內部使用的寄存器和充當內外部接口的寄存器這兩
    的頭像 發表于 07-21 16:59 ?4124次閱讀
    <b class='flag-5'>寄存器</b>是什么?怎么<b class='flag-5'>操作</b><b class='flag-5'>寄存器</b>點亮LED燈?

    寄存器操作

    ,即對其各個位有先后設置的順序的要求,使硬件產生的結果也不同;5,有時,對于一個寄存器要求必須一次賦值,若對其某些位賦值先后順序不同,便達不到預期的效果和功能。二,寄存器的賦值操作方法為說明方便,定義
    發表于 10-23 18:23

    寄存器,寄存器是什么意思

    寄存器,寄存器是什么意思 寄存器定義  寄存器是中央處理內的組成部分。寄存器是有限存貯容量
    發表于 03-08 14:26 ?2.2w次閱讀

    寄存器操作方法的經驗和其總結

    不同的位進行先后順序不同的設置,因為這樣可能達不到預期的效果,這個不太好總結,但是對寄存器操作方法是固定的。
    的頭像 發表于 12-19 09:30 ?8799次閱讀
    對<b class='flag-5'>寄存器</b><b class='flag-5'>操作方法</b>的經驗和其<b class='flag-5'>總結</b>

    寄存器變量

    C語言中使用關鍵字register來聲明局部變量為寄存器變量。寄存器變量的值會被存放在CPU的寄存器中,每當需要使用它們時,CPU就可以直接使用,而無須再通過控制從內存中獲取。由于
    發表于 06-03 10:13 ?2422次閱讀

    使用寄存器的邏輯操作指令是什么?

    操作系統中硬件相關的部分集中體現在匯編指令和對寄存器操作中,因此我們對ARM體系結構的介紹也圍繞ARMv8-A的匯編指令和寄存器來展開。
    的頭像 發表于 06-18 15:49 ?3751次閱讀

    STM32單片機修改寄存器的位操作方法(全網最全)

    使用 C語言對寄存器賦值時,我們常常要求只修改該寄存器的某幾位的值,且其它的寄存器位不變,這個時候我們就需要用到 C 語言的位操作方法了。1. 把變量的某位清零此處我們以變量 a代表
    發表于 11-19 09:06 ?33次下載
    STM32單片機修改<b class='flag-5'>寄存器</b>的位<b class='flag-5'>操作方法</b>(全網最全)

    C語言:寄存器操作

    C語言:寄存器操作
    發表于 01-13 12:56 ?6次下載
    C語言:<b class='flag-5'>寄存器</b><b class='flag-5'>操作</b>

    STM32的寄存器操作

    操作。但是如果沒有找到能滿足你需求的庫函數,或者你需要操作寄存器比較少那么使用直接操作寄存器方法
    發表于 01-13 15:43 ?19次下載
    STM32的<b class='flag-5'>寄存器</b><b class='flag-5'>操作</b>

    C語言操作寄存器的常見手法

    使用C語言對寄存器賦值時,常常需要用到C語言的位操作方法。把寄存器某位清零 假設a代表寄存器,且其中本來已有值。如果要把其中某一位清零且其它位不變,代碼如下。
    的頭像 發表于 03-12 09:06 ?3431次閱讀

    ARM通用寄存器及狀態寄存器詳解

    筆者來聊聊ARM通用寄存器以及狀態寄存器的認識與理解。
    的頭像 發表于 01-06 14:58 ?7391次閱讀

    RAL寄存器模型操作圖鑒

    寄存器模型操作,指的是通過寄存器模型對RTL中寄存器進行讀寫訪問,或者同步寄存器模型與RTL中寄存器
    的頭像 發表于 05-17 09:01 ?1044次閱讀
    RAL<b class='flag-5'>寄存器</b>模型<b class='flag-5'>操作</b>圖鑒

    RAL寄存器模型操作指南

    寄存器模型操作,指的是通過寄存器模型對RTL中寄存器進行讀寫訪問,或者同步寄存器模型與RTL中寄存器
    的頭像 發表于 07-12 09:37 ?1143次閱讀
    RAL<b class='flag-5'>寄存器</b>模型<b class='flag-5'>操作</b>指南

    如何在shell中操作寄存器

    shell 中操作寄存器可以使用 devmem 命令. devmem 命令其實就是上述應用層操作寄存器生成的可執行文件,只不過busybox已經幫我們實現了。 devmem 命令格式:
    的頭像 發表于 09-26 16:39 ?1159次閱讀

    個人對STM32 SysTick的總結(寄存器操作)

    一、概述:SysTick是一個簡單的遞減24位計數。如果你不需要再應用程序中嵌入操作系統,SysTick可以作為簡單的延時和產生周期性的中斷。狀態控制寄存器的第0位可以使能計數,當
    的頭像 發表于 01-06 08:00 ?2068次閱讀
    個人對STM32 SysTick的<b class='flag-5'>總結</b>(<b class='flag-5'>寄存器</b><b class='flag-5'>操作</b>)
    百家乐官网精神| 网络真人赌场| 大发888娱乐城真钱游戏| 大发888倾家荡产| 360棋牌游戏大厅| 澳门顶级赌场手机在线登陆| 海王星国际娱乐| 亿酷棋牌世界官网| 大发888娱乐场 下载| 皇冠开户投注网| 百家乐官网有几种打法| 百家乐官网怎样玩的| 百家乐有方式赢钱吗| 百家乐真人游戏娱乐网| 永利高娱乐场| 柞水县| 百家乐官网群号| 澳门百家乐真人娱乐城| 线上百家乐平台| 大发888娱乐真钱游戏 官方| 保单百家乐官网技巧| 百家乐官网游戏规则玩法| 贵族百家乐官网的玩法技巧和规则| 什么叫百家乐的玩法技巧和规则 | 都江堰市| 风水24山读法| 老k百家乐游戏| 德州扑克教程| 波音百家乐官网现金网| 百家乐游戏机子| 上海博彩生物| 赌场百家乐官网视频| 澳门百家乐规律星期娱乐城博彩| 海立方娱乐| 百家乐官网b28博你| 百家乐博赌场| 百家乐官网代打是真的吗| 太阳城百家乐分析解码| 大发888组件下载| 百家乐官网必胜法技巧| 百家乐操作技巧|