寄存器操作的方法

发布者:传邮万里最新更新时间:2016-06-15 来源: eefocus关键字:寄存器  设置  操作特性 手机看文章 扫描二维码
随时随地手机看文章
一, 寄存器的设置和操作特性

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

关键字:寄存器  设置  操作特性 引用地址:寄存器操作的方法

上一篇:串口中怎样接收一个完整数据包的解析
下一篇:步进电机的加减速控制芯片设计

推荐阅读最新更新时间:2024-03-16 14:57

变频器调试从正确设置参数开始
变频器的设定参数众多,每个参数均有一定的选择范围,使用中常常遇到因个别参数设置不当,导致变频器不能正常工作的现象。因此,变频器调试是从正确设置变频器参数开始的。 在这篇文章中,我们将总结基本变频器参数设置方法,供大家参考。这些参数包括控制方式、最低运行频率、最高运行频率、载波频率、电机参数、跳频、加减速时间、转矩提升、电子热过载保护、频率限制、偏置频率、频率设定信号增益、转矩限制、加减速模式选择、转矩矢量和节能控制。 首先,我们来谈谈控制方式。控制方式即速度控制、转距控制、PID控制或其他方式。采取控制方式后,一般要根据控制精度进行静态或动态辨识。 其次,我们来看看最低运行频率和最高运行频率。最低运行频率是指电机的最小
[嵌入式]
STM32的DMA知识
1、 下面代码是一个标准DMA设置,当然实际应用中可根据实际情况进行裁减: DMA_DeInit(DMA_Channel1); 上面这句是给DMA配置通道,根据ST提供的资料,STM3210Fx中DMA包含7个通道(CH1~CH7),也就是说可以为外设或memory提供7座“桥梁”(请允许我使用桥梁一词,我觉得更容易理解,哈哈,别“拍砖”呀!); DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; 上面语句中的DMA_InitStructure是一个DMA结构体,在库中有声明了,当然使用时就要先定义了;DMA_PeripheralBaseAddr是
[单片机]
STM8 时钟分频寄存器
STM8时钟分频寄存器(CLK_CKDIVR) 地址偏移值:0x06 复位值:0x18 位7:5 保留。始终为0。 位4:3 HSIDIV :高速内部时钟预分频器 由软件写入,用于指定HSI分频因子。 00:fHSI=fHSI RC输出 01:fHSI=fHSI RC输出/2 10:fHSI=fHSI RC输出/4 11:fHSI=fHSI RC输出/8 位2:0 CPUDIV :CPU时钟预分频器 由软件写入,用于指定CPU时钟预分频因子。 000:fCPU=fMASTER 001:fCPU=fMASTER/2 010:fCPU=fMASTER/4 011:fCPU=fMASTER/8 100:fCPU=fMASTER
[单片机]
STM8 时钟分频<font color='red'>寄存器</font>
ATmega32 I/O存储器
ATmega32 的I/O 空间定义见 P283“ 寄存器概述” 。 ATmega32所有的I/O及外设都被放置于I/O I/O位置都可以通过IN 与OUT指 令来访问,在32个通用工作寄存器和 I/O之间传输数据。 地址为0x00 - 0x1F 的I/O寄存 器还可用 SBI 和 CBI 指令直接进行位寻址,而 SBIS 和 SBIC 则用来检查某一位的值。更 多内容请参见指令集。使用 IN 和 OUT 指令时地址必须在 0x00 - 0x3F 之间。如果要象 SRAM 一样通过 LD 和 ST 指令访问 I/O 寄存器,相应的地址要加上 0x20。 为了与后续产品兼容,保留未用的未应写 0 ,而保留的I/O 寄存器则不应进行
[单片机]
TQ2440的FCLK,HCLK,PCLK,UCLK时钟频率设置
S3C2440有两个PLL(phase locked loop)一个是MPLL,一个是 UPLL 。MPLL用于CPU及其他外围器件,UPLL用于USB。用于产生 FCLK , HCLK, PCLK三种频率,这三种频率分别有不同的用途: FCLK是CPU提供的时钟信号。 HCLK是为AHB总线提供的时钟信号, Advanced High-performance Bus,主要用于高速外设,比如内存控制器,中断控制器,LCD控制器, DMA 等。 PCLK是提供给用于外设如WDT,IIS,I2C,PWM,MMC/SD,ADC,UART,GPIO,RTC,SPI的APB总线的时钟。 从S3C2440的 DATASHE
[单片机]
GPIO寄存器的地址怎么寻找
由上图知,GPIOC的地址就是在这个PERIPH_BASE地址的基础上偏移得到得。 我们可以一步一步的计算一下GPIOC的地址是多少。 0x40000000 + 0x10000 + 0x1000 == 0x4001 1000 我们的计算结果和参考手册上的一样。注意:这些都是芯片上面真实的物理地址。如果需要运行操作系统,由于在操作系统中,程序的地址对应的是虚拟内存,在操作系统中对GPIO进行操作时,需要将这个真实的物理地址映射到虚拟地址上面去,这样操作系统才能对GPIO进行操作。 这个是GPIO上的各个寄存器,它被装在一个结构体里面。 由这张图可知,这也就是为什么GPIO的寄存器仅通过偏移地址就可以能
[单片机]
PIC12LF1822配置位设置
基于MPLAB X IDE 配置位 配置字中最重要的配置选项就是: 看门狗配置 如:WDTE 1;0 ; 一般选择关闭看门狗 MCLRE复位脚的配置 如:MCLRE;一般选择复位脚作I/O 震荡器的选择: 如:FOSC 2:0 ;根据实际情况配置,我这里一般选择用 INTOSC 内部振荡器. 因为如果这三个没有配置好的话程序根本无法运行。其他配置可以看数据手册此不赘述。 MPLAB X IDE和MPLAB IDE 8不同。 MPLAB IDE 8 可以再界限中选择配置位就行。配置选项可以不写在代码中。 MPLAB X IDE 如果要配置的话必须在代码中写出配置。 实例介绍: 1.打开MPLAB X IDE 在菜单栏中 点击Win
[单片机]
PIC12LF1822配置位<font color='red'>设置</font>
基于CMX860的来电显示电话测试仪的设计
1 引 言      目前,随着电信部门电话主叫识别(来电显示)业务的普遍开通,具有主叫识别功能的电话机越来越普及。根据这个情况,我们设计了一台可以测试主叫识别功能的多功能电话测试仪,采用了CML(ConsumerMicrocircuit Limited)公司的CMX860作为其中来电显示测试电路的核心元件,单片机采用了SST89C58。 1.1 CMX860简介      CMX860是一块通用的低功耗电话机信令收发集成电路。CMX860包含DTMF编码解码器、V.23调制解调器,具有铃流检测、话机摘机检测等功能,它可以广泛应用于由线路提供电源的电话设备。      CMX860的主要特性有:(1)提供V.23 1200/7
[电源管理]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved