寄存器操作方法

news/2024/10/31 1:25:38/

一, 寄存器的设置和操作特性

1,一个寄存器的每个位有其不同的意义,进行不同的设置会使硬件产生不同的效果和功能;

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<<0)  将第0位清零       

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


http://www.ppmy.cn/news/148740.html

相关文章

SSD性能怎么测?看这一篇就够了!

转载自&#xff1a;https://www.sohu.com/a/390625596_505795 一、概述 自从很多年前开始做SSD方面的测试以来&#xff0c;我就和某些行业工作者产生了同感&#xff1a;存储性能测试基本是所有计算机硬件测试里最复杂困难的一项。存储系统的性能受到整个机器其他硬件甚至软件…

洛谷 P3203 [HNOI2010]BOUNCE 弹飞绵羊(分块)

题目描述 某天&#xff0c;Lostmonkey发明了一种超级弹力装置&#xff0c;为了在他的绵羊朋友面前显摆&#xff0c;他邀请小绵羊一起玩个游戏。游戏一开始&#xff0c;Lostmonkey在地上沿着一条直线摆上n个装置&#xff0c;每个装置设定初始弹力系数ki&#xff0c;当绵羊达到第…

使用U盘安装操作系统

前些天对门寝室朋友的电脑系统崩溃啦&#xff0c;让我过去帮忙弄一下。要是在平时我三两下就给他弄好啦&#xff0c;但是那天却把我给难住啦&#xff0c;为什么呢&#xff1f;那是因为他的光驱是坏的&#xff0c;⊙﹏⊙b汗&#xff0c;无法正常读取系统安装盘&#xff0c;是怎么…

Stack与Queue

Stack(栈) 堆栈&#xff08;Stack&#xff09;代表了一个后进先出的对象集合。当您需要对各项进行后进先出的访问时&#xff0c;则使用堆栈。当您在列表中添加一项&#xff0c;称为推入元素&#xff0c;当您从列表中移除一项时&#xff0c;称为弹出元素。 方法 Clear(); 从 S…

c语言程序设计P320,《C程序设计》作业内容

《《C程序设计》作业内容》由会员分享,可在线阅读,更多相关《《C程序设计》作业内容(11页珍藏版)》请在人人文库网上搜索。 1、实验一 C语言的运行环境的使用一、目的与要求1. 了解Windows系统下C语言的运行环境,熟悉C程序调试、运行的基本操作方法。2. 熟练掌握编辑、编译、…

第十章第十题(Queue类)(Queue class)

第十章第十题&#xff08;Queue类&#xff09;&#xff08;Queue class&#xff09; *10.10&#xff08;Queue类&#xff09;10.6节给出了一个Stack类。设计一个名为Queue的类用于存储整数。像栈一样&#xff0c;队列保存元素。在栈中&#xff0c;元素以“后进先出”的方式获取…

联想微型计算机急救方法,lenovo微型计算机电脑无法启动文件丢失怎么办

满意答案 pd_bzx236 2015.11.22 采纳率:53% 等级:9 已帮助:417人 1、使用Windows启动盘 如果启动问题是由于活动分区的启动记录或者操作系统启动所使用的文件被破坏造成的,启动盘就能够解决问题。具体方法如下: 创建Windows启动盘,找一台配置相似、工作正常的Windows …

Stack类、Queue类和Deque类常用方法(防止忘记)

Stack类 栈&#xff08;Stack&#xff09;是一种后进先出&#xff08;LIFO&#xff09;的数据结构&#xff0c;操作栈的元素的方法有&#xff1a; 把元素压栈&#xff1a;push(E) 把栈顶的元素“弹出”&#xff1a;pop(E) 取栈顶元素但不弹出&#xff1a;peek(E) 在Java中&am…