新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 寄存器操作的方法

        寄存器操作的方法

        作者: 時間:2016-11-09 來源:網絡 收藏
        一, 寄存器設置操作特性

        1,一個寄存器的每個位有其不同的意義,進行不同的設置會使硬件產生不同的效果和功能;

        本文引用地址:http://www.104case.com/article/201611/318035.htm

        2,有些情況下需要對一個寄存器進行連續的不同的甚至完全相反的設置;

        3,有些情況下需要對一個寄存器中的某一位或一位進行連續的不同的甚至完全相反的設置,而其余的位要保持不變;

        4,有時,對一個寄存器進行設置時,對其不同的位進行先后順序不同的設置,即對其各個位有先后設置的順序的要求,使硬件產生的結果也不同;

        5,有時,對于一個寄存器要求必須一次賦值,若對其某些位賦值先后順序不同,便達不到預期的效果和功能。

        二,寄存器的賦值操作方法

        為說明方便,定義如下3個8位的寄存器:

        #define REG 0xFFFFFF10

        1,對單個的位進行賦值

        (1) 將寄存器REG的第5位置“1”

        REG |= (1 << 5);

        (2) 將寄存器REG的第5位清零

        REG &= ~(1 << 5);

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

        REG |= (1 << 5) | (1 << 3);

        (4) 將寄存器REG的第3、5位清零

        REG &= ~( (1 << 5) | (1 << 3) );

        2,直接賦值

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

        REG = 0x5F;

        (即給寄存器REG1賦值為1010 1111,這種方法多在初始化中使用)

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

        uint32 temp;

        tmep = REG;

        temp &= ~0x01;//??????????????

        temp |= (1 << 1);

        temp &= ~(1 << 2);

        temp |= (1 << 3);

        temp |= (1 << 5);

        temp |= (1 << 7);

        REG = temp;

        ----------------------------------------------------------------------------------------------

        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)) /* 等待數據接收完 */



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 都兰县| 丰城市| 广水市| 鄢陵县| 华蓥市| 龙陵县| 原平市| 钟山县| 双桥区| 垣曲县| 天等县| 金华市| 光泽县| 巴南区| 共和县| 达拉特旗| 黄龙县| 比如县| 旺苍县| 江陵县| 通海县| 湖北省| 永城市| 湘阴县| 嘉荫县| 沙田区| 郑州市| 连山| 洛南县| 齐齐哈尔市| 吉林市| 儋州市| 平泉县| 明光市| 渭源县| 汾西县| 商城县| 涪陵区| 美姑县| 合作市| 阿克|