您的位置 首页 新能源

寄存器操作的办法

一,寄存器的设置和操作特性1,一个寄存器的每个位有其不同的意义,进行不同的设置会使硬件产生不同的效果和功能;2,有些情况下需要对一…

一, 寄存器设置操作特性

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

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/xinnengyuan/277420.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部