在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

寄存器操作方法_對(duì)寄存器操作的通用方法總結(jié)

h1654155282.3538 ? 來源:網(wǎng)絡(luò)整理 ? 2018-05-22 15:53 ? 次閱讀

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

一、寄存器操作

1、#define方法

1)寄存器地址的定義:

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

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

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

2)寄存器讀寫操作:

UART_THR = ch; /* 發(fā)送數(shù)據(jù) */

ch = UART_RHR; /* 接收數(shù)據(jù) */

也可采用定義帶參數(shù)宏實(shí)現(xiàn)

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

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

3)對(duì)寄存器相應(yīng)位的操作方法:

定義寄存器

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

定義寄存器相應(yīng)位的值

#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 */

定義寄存器相應(yīng)位的值另一種方法

#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 */

對(duì)寄存器操作只需對(duì)相應(yīng)位或賦值

UART_LCR = CHAR_LEN_8 | ONE_STOP | PARITY_NONE; /* 設(shè)置 8位數(shù)據(jù)位,1位停止位,無校驗(yàn)位 */

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

對(duì)某一寄存器第7位置位

XX_CRTL |= 1〈〈7;

XX_CRTL &= ~(1〈〈7);

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

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

5 判斷寄存器某一位是否置位或?yàn)?的方法

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

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

當(dāng)UART_LSR的第0位為1時(shí)結(jié)束循環(huán)

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

2、共用體結(jié)構(gòu)體位域的應(yīng)用實(shí)例

【例】設(shè)count 是一個(gè)16 位的無符號(hào)整型計(jì)數(shù)器,最大計(jì)數(shù)為十六進(jìn)制0xffff,要求將這個(gè)計(jì)數(shù)值以十六進(jìn)制半字節(jié)的形式分解出來。

對(duì)于上述實(shí)例通常采用移位的方法求解,而采用共用體結(jié)構(gòu)體位域的方法不需要通過移位運(yùn)算。以下,對(duì)CCS 在頭文件中大量使用的共用體結(jié)構(gòu)體位域進(jìn)行注解。

先定義一個(gè)共用體結(jié)構(gòu)體位域:

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

cont=0xfedc; //對(duì)cont 賦值

union //共用體類型定義

{ Uint16 i; //定義i 為16 位無符號(hào)整型變量

struct //結(jié)構(gòu)體類型定義

{

Uint16 low:4; //最低4 位在前。從最低4 位開始,取每4 位構(gòu)成半字節(jié)

Uint16 mid0:4;

Uint16 mid1:4;

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

}HalfByte; //HalfByte 為具有所定義的結(jié)構(gòu)體類型的變量

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

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

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

Count.i = cont; //對(duì)共用體類型成員i 進(jìn)行賦值

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

通過共用體結(jié)構(gòu)體定義,當(dāng)對(duì)共用體類型成員i 進(jìn)行賦值時(shí),由于結(jié)構(gòu)體類型變量HalfByte 與i 占用同一個(gè)內(nèi)存單元,因此,也就完成了對(duì)HalfByte 的各成員的賦值。

C 語言的共用體結(jié)構(gòu)體位域定義,可以完成對(duì)寄存器位域的訪問。至于被訪問的位域在內(nèi)存中的具體位置則由編譯器安排,編程者可以不必關(guān)注。

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

先建立一個(gè)共用體結(jié)構(gòu)體位域定義,將某個(gè)寄存器的16 位,從最低位到最高位分別

定義為Bit1,Bit2,…,Bit16。

union //共用體類型定義

{ Uint16 all; //定義all 為16 位無符號(hào)整型變量

struct //結(jié)構(gòu)體類型定義

{

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為具有所定義的結(jié)構(gòu)體類型的變量

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

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

方法一:

CtrlBit.bit.Bit4 = 1;

CtrlBit.bit.Bit8 = 1;

CtrlBit.bit.Bit12 = 1;

CtrlBit.bit.Bit16 = 1;

二、對(duì)寄存器操作的通用方法總結(jié)

對(duì)寄存器的操作有時(shí)候要考慮對(duì)其不同的位進(jìn)行先后順序不同的設(shè)置,但是對(duì)寄存器操作的方法是固定的。

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

對(duì)寄存器的操作使用的是位運(yùn)算符,

邏輯運(yùn)算符一般用于在程序中判斷邏輯中使用。

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

1)對(duì)單個(gè)的位進(jìn)行賦值

(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) );

該段總結(jié)如下:

將某位置1,移位后使用位運(yùn)算“|” ;

將某位清0,移位取反后,使用位運(yùn)算“&”

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”,等價(jià)于temp &= ~0x01

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

REG = temp;

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5363

    瀏覽量

    121164
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    寄存器是什么?怎么操作寄存器點(diǎn)亮LED燈?

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

    寄存器操作

    ,即對(duì)其各個(gè)位有先后設(shè)置的順序的要求,使硬件產(chǎn)生的結(jié)果也不同;5,有時(shí),對(duì)于一個(gè)寄存器要求必須一次賦值,若對(duì)其某些位賦值先后順序不同,便達(dá)不到預(yù)期的效果和功能。二,寄存器的賦值操作方法為說明方便,定義
    發(fā)表于 10-23 18:23

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

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

    對(duì)寄存器操作方法的經(jīng)驗(yàn)和其總結(jié)

    不同的位進(jìn)行先后順序不同的設(shè)置,因?yàn)檫@樣可能達(dá)不到預(yù)期的效果,這個(gè)不太好總結(jié),但是對(duì)寄存器操作方法是固定的。
    的頭像 發(fā)表于 12-19 09:30 ?8799次閱讀
    對(duì)<b class='flag-5'>寄存器</b><b class='flag-5'>操作方法</b>的經(jīng)驗(yàn)和其<b class='flag-5'>總結(jié)</b>

    寄存器變量

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

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

    操作系統(tǒng)中硬件相關(guān)的部分集中體現(xiàn)在匯編指令和對(duì)寄存器操作中,因此我們對(duì)ARM體系結(jié)構(gòu)的介紹也圍繞ARMv8-A的匯編指令和寄存器來展開。
    的頭像 發(fā)表于 06-18 15:49 ?3752次閱讀

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

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

    C語言:寄存器操作

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

    STM32的寄存器操作

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

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

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

    ARM通用寄存器及狀態(tài)寄存器詳解

    筆者來聊聊ARM通用寄存器以及狀態(tài)寄存器的認(rèn)識(shí)與理解。
    的頭像 發(fā)表于 01-06 14:58 ?7393次閱讀

    RAL寄存器模型操作圖鑒

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

    RAL寄存器模型操作指南

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

    如何在shell中操作寄存器

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

    個(gè)人對(duì)STM32 SysTick的總結(jié)(寄存器操作)

    一、概述:SysTick是一個(gè)簡單的遞減24位計(jì)數(shù)。如果你不需要再應(yīng)用程序中嵌入操作系統(tǒng),SysTick可以作為簡單的延時(shí)和產(chǎn)生周期性的中斷。狀態(tài)控制寄存器的第0位可以使能計(jì)數(shù),當(dāng)
    的頭像 發(fā)表于 01-06 08:00 ?2069次閱讀
    個(gè)人對(duì)STM32 SysTick的<b class='flag-5'>總結(jié)</b>(<b class='flag-5'>寄存器</b><b class='flag-5'>操作</b>)
    主站蜘蛛池模板: 国产毛片农村妇女系列 | 啪视频免费 | 天天干天操 | 国产高清精品自在久久 | 久久国产午夜精品理论篇小说 | 欧美在线一级视频 | 亚洲丁香婷婷 | 色综合久久一区二区三区 | 毛茸茸成熟妇女亚洲人 | 亚洲欧美v视色一区二区 | 天堂在线观看视频观看www | 伊人久久大香线蕉观看 | 最新亚洲人成网站在线影院 | 五月婷婷激情五月 | 国产操比视频 | 人人爱爱| 天天操夜夜操狠狠操 | 亚洲免费影视 | 又粗又硬又大久久久 | 午夜精品久久久久久99热 | 成年女人毛片免费视频 | 四虎永久在线精品 | 奇米影视婷婷 | 色婷婷综合久久久久中文一区二区 | avhd101天天看新片 | 午夜爱爱免费视频 | 狠狠干免费视频 | 精品成人毛片一区二区视 | 免费公开视频人人人人人人人 | 成人在线亚洲 | bt种子搜索-bt天堂 | 四虎成人免费观看在线网址 | 欧亚激情偷乱人伦小说视频 | 激情视频综合网 | 久久夜视频 | 欧美777 | 夜夜操狠狠干 | 啪啪网站免费观看 | 999伊人| 人人插人人爽 | 国产黄色片一级 |