控制寄存器

嵌入式Linux内核I2C子系统详解

萝らか妹 提交于 2019-12-31 19:44:41
1.1 I2C总线知识 1.1.1 I2C总线物理拓扑结构 I2C总线在物理连接上非常简单,分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成。通信原理是通过对SCL和SDA线高低电平时序的控制,来产生I2C总线协议所需要的信号进行数据的传递。在总线空闲状态时,这两根线一般被上面所接的上拉电阻拉高,保持着高电平。 1.1.2 I2C总线特征 I2C总线上的每一个设备都可以作为主设备或者从设备,而且每一个设备都会对应一个唯一的地址(可以从I2C器件的数据手册得知),主从设备之间就通过这个地址来确定与哪个器件进行通信,在通常的应用中,我们把CPU带I2C总线接口的模块作为主设备,把挂接在总线上的其他设备都作为从设备。 I2C总线上可挂接的设备数量受总线的最大电容400pF 限制,如果所挂接的是相同型号的器件,则还受器件地址位的限制。 I2C总线数据传输速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,高速模式下可达3.4Mbit/s。一般通过I2C总线接口可编程时钟来实现传输速率的调整,同时也跟所接的上拉电阻的阻值有关。 I2C总线上的主设备与从设备之间以字节(8位)为单位进行双向的数据传输。 1.1.3 I2C总线协议 I2C协议规定,总线上数据的传输必须以一个起始信号作为开始条件,以一个结束信号作为传输的停止条件。起始和结束信号总是由主设备产生

算术运算单元ALU的设计与实现

拟墨画扇 提交于 2019-12-30 13:10:27
算术运算单元ALU的设计与实现 这是2018年大三时的一个课程设计,在这里把相关技术和用到的知识分享给大家。(由于编者水平有限可能存在错误的地方,欢迎大家指正)题目给出的要求如下: 一、设计题目及要求 要求: 1.进行两个四位二进制数的运算。 2.算术运算:A+B,A-B,A+1,A-1 3.逻辑运算:A and B,A or B,A not, A xor B 注意:从整体考虑设计方案,优化资源的利用 二、设计过程及内容 2.1总体设计 ALU算术运算单元由以下几个部分构成: 图1 ALU运算单元系统结构图 为了尽可能减少资源的使用(或以相同的资源增加更多的功能),在此系统的基础上,增加基于寄存器的分时复用输入模块进行改进。 图2 基于分时复用方法的ALU运算单元结构 ①输入模块 该模块用于两个四位二进制数的输入。通过使用实验箱的拨码开关,输入高低电平,表示二进制的 1和0,四组拨码开关组合可以表示一个四位二进制数。 ②逻辑运算单元 该模块用于两个四位二级制数的逻辑运算。通过列出一位二进制数逻辑运算的真值表(含有四种不同的逻辑运算功能),得出了一位二进制数逻辑运算单元的表达式(已使用卡诺图化简)。将按照逻辑表达式连接好的多个一位二进制逻辑运算单元进行组合,可得到多位二进制数逻辑运算单元。 通过使用“真值表+卡诺图”的方法将所有的逻辑运算的表达式融合在一起进行化简

单片机实现寄存器点亮LED实验

风流意气都作罢 提交于 2019-12-26 13:56:39
为了顺利过渡到库开发,在STM32编程的开始,我们对照51点亮一个LED的方法,给大家演示一下STM32如何用操作寄存器的方法点亮一个LED,然后再慢慢讲解到底什么是库,让大家知道库跟寄存器的关系。 1. 用51点亮一个LED   在用STM32点亮一个LED之前,我们先来复习下用51如何点亮一个LED。 硬件上我们假设51单片机的P0口的第0位接了一个LED,负逻辑亮。如果我们要点亮这个LED,代码上我们会这么写: P0 = 0XFE;//总线操作点亮 LED 这时候我们就把LED点亮了,如果要关掉LED ,则是: P0 = 0XFF;//总线操作关闭 LED 这里面我们用的是总线操作的方法,即是对P0口的8个IO同时操作,但起作用的只是P0^0。 除了这种总线操作的方法,我们还学习过位操作,利用51编译器的关键字sbit,我们可以定义一个位变量: sbit LED = P0^0; 那么LED = 0,就点亮了LED; LED = 1,就关闭了 LED。 为了让程序看起来见名知义,我们定义两个宏: #define ON 0 #define OFF 1 点亮和关闭LED的代码就变成了: LED = ON;//位操作点亮LED LED = OFF;//位操作关闭LED 稍微整理一下代码,整体效果就是: //假设51单片机的PO~0口接LED,负逻辑点亮 #define ON 0

vxworks下gmac调试的总结

こ雲淡風輕ζ 提交于 2019-12-25 05:28:21
1:3280芯片手册详解过程: MAC 控制器支持 DMA 接收和发送,内部在接收和发送方向各有一个 2048 字节的 FIFO作为缓存。由于 FIFO 深度所限,MAC 控制器不支持硬件自动流控机制。 模式和带宽的切换 1:在做 MII 和 RMII 之间的切换前,应该先掉电 2:上电后软件重新配置芯片系统控制模块中MAC 的工作接口模式寄存器,之后再启动 MAC 控制器 3:需要注意的是,在收发功能开启的状态下不能对双工模式或速率进行改变(先关掉Mac收发,这样可以避免出现大量的错包的情况) 1:所有的发送中断和接收中断触发的条件都是dma操作完成(dma完成数据搬运的操作); 2:较早发送和接收中断说明数据帧较大不是一个buffer发送; 芯片的寄存器空间: MAC 模块支持以太网 PHY 的 MII 接口和 RMII 接口。 CSR(Control & Status 寄存器)共占有 8KB 地址空间,分为两段:DMA CSR 和 MAC CSR。 AHB Master 接口为 DMA 模块与系统主机的接口。 APB 接口即 CSR 接口,用于读写访问 DMA CSR 和 MAC CSR。 DMA 模块有独立的发送和接收引擎,进行系统内存与 MAC 间的数据搬运,将 CPU 的 干预最小化,只在帧发送或接收结束以及其他一些条件(如发生错误)下中断 CPU。 DMA

系统控制空间SCS、系统控制模块SCB

北慕城南 提交于 2019-12-23 17:59:49
NVIC的一些可编程寄存器控制着中断管理功能,这些寄存器被映射到系统地址空间里,他们所处的区域被称为系统控制区间( SCC )。 除了NVIC,系统控制空间SCS中也包含了许多系统管理的寄存器,这些寄存器被称为系统控制模块( SCB )。 其中有些寄存器控制休眠模式和系统异常配置, 另外还有个寄存器中包含了处理器的识别代码(调试器可以利用该代码识别处理器的类型)。 来源: CSDN 作者: 那个苏轼回不来了丶 链接: https://blog.csdn.net/qq_45763093/article/details/103661105

数字SOC设计之低功耗设计入门(五)——RTL级低功耗设计(续)

≯℡__Kan透↙ 提交于 2019-12-20 17:33:03
二、RTL级低功耗设计(续)    前面一篇博文我记录了操作数隔离等低功耗设计,这里就主要介绍一下使用门控时钟进行低功耗设计。   (4)门控时钟   门控时钟在我的第一篇博客中有简单的描述,这里就进行比较详细的描述吧。我们主要学习门控时钟电路是什么、什么使用门控时钟、综合库里的门控时钟、如何使用门控时钟、对门控时钟的一些处理、手动插入门控时钟。我们重点介绍如何 使用门控时钟和门控时钟的处理 。 ①门控时钟概述   门控时钟有两种方案:一种直接针对寄存器的时钟进行门控,一种对模块级别的时钟进行门控。相比之下,直接对寄存器的时钟进行门控更为灵活。因为在很多时候,我们不能保证刚好将不需要门控的寄存器与需要门控的寄存器分配在不同的模块。因此我们主要介 绍寄存器级的门控时钟 。 ============================================================================= 下图是门控时钟的一个简单电路图:                上述电路图中,将 控制信号(EN) 直接与 时钟信号(CLK) 进行 与 操作,以完成门控。门控后的时钟信号GCLK送到寄存器阵列中。这样,当EN为0时,该时钟被关掉。相应的波形如下所示:          可以看出,如果EN信号不加控制,会导致门控时钟信号出现毛刺。时钟上的信号出现毛刺是非常危险的

数字SOC设计之低功耗设计入门(七)——门级电路低功耗设计优化(续)

只愿长相守 提交于 2019-12-20 17:25:48
前面讲解了门级功耗的优化方法,包括静动态和总体的功耗。现在来记录一下门级层次(有点书也说是在系统级)常用的一种低功耗方法—— 电源门控 。 ①电源门控概述与原理   电源门控是指芯片中某个区域的供电电源被关掉,即该区域内的逻辑电路的供电电源断开。电源门控(Power Gating)的设计如下图所示:              如果某一模块在一段时间内不工作,可以关掉它的供电电源(关掉供电电源可以使用MTCMOS开关,通常在使用后端工具进行布局布线时加入MTCMOS,这属于后端知识,这里不进行介绍)。断电后,设计进入睡眠模式,其漏电功率很小。唤醒时,为了使模块尽快恢复工作模式,需要保持关电前的状态。 保持寄存器 (retention register)可用于记忆状态。使用保持寄存器设计电源门控如下图所示:              下面来解释一下上面的设计:   ·在睡眠模式,寄存器的电源 Vdd2被切断 ,因此它的漏电功耗极小;这时候仅仅保持锁存器处于工作状态,寄存器的值保留在锁存器里。由于锁存器是用 高阈值电压 的晶体管组成,漏电功耗很低。   ·当Restore信号被激活时,寄存器的电源Vdd2被加上,保留在锁存器里的值被载入到寄存器。寄存器在工作(活跃)状态时,它作为一般的寄存器工作。 Save/Restore引脚也称为电源门控引脚(power gating pins)

stm32寄存器版学习笔记01 GPIO口的配置(LED、按键)

≯℡__Kan透↙ 提交于 2019-12-19 02:18:20
  STM32的I/O口可以由软件配置成如下8种模式:输入浮空、输入上拉、输入下拉、模拟输入、开漏输出、推挽输出、推挽式复用功能及开漏复用功能。每个I/O口由7个寄存器来控制:配置模式的端口配置寄存器CRL和CRH(模式、速度);数据寄存器IDR和ODR;置位/复位寄存器BSRR;复位寄存器BRR;锁存寄存器LCKR。 I/O口模式: GPIO的8种模式 通用输出 推挽输出(Push-Pull) 可以输出高、低电平,连接数字器件 开漏输出(Open-Drain) 开漏引脚不连接外部的上拉电阻时,只能输出低电平;如果需要同时具备输出高电平的功能,则需要接上拉电阻 复用功能输出 复用功能推挽输出 片内外设功能(I2C的SCL,SDA) GPIO口被用作第二功能时的配置情况(即并非作为通用IO口使用) 复用功能开漏输出 片内外设功能(TX1,MOSI,MISO,SCK,SS) 输入 模拟输入 应用ADC模拟输入,或者低功耗下省电 浮空输入 可以做KEY识别,外部按键输入 IO的电平状态是不确定,完全由外部输入决定 下拉输入 IO内部下拉电阻输入 不确定信号->低电平 上拉输入 IO内部上拉电阻输入 不确定信号->高电平    1.GPIO口配置步骤 ①使能PORTx(x=A~G)   APB2外设时钟使能寄存器(RCC_APB2ENR) 置1开启。清0关闭。 8-2位使能GPIO G-A

STM32 GPIO口的配置和应用

*爱你&永不变心* 提交于 2019-12-14 09:33:31
STM32F103ZET6 一共有7组IO口(有FT的标识是可以识别5v的) 每组IO口有16个IO 一共16*7=112个IO 4种输入模式: (1) GPIO_Mode_AIN 模拟输入 (2) GPIO_Mode_IN_FLOATING 浮空输入 (3) GPIO_Mode_IPD 下拉输入 (4) GPIO_Mode_IPU 上拉输入 4种输出模式: (5) GPIO_Mode_Out_OD 开漏输出 (6) GPIO_Mode_Out_PP 推挽输出 (7) GPIO_Mode_AF_OD 复用开漏输出 (8) GPIO_Mode_AF_PP 复用推挽输出 四种输入模式: 1、一图记住上拉、下拉、浮空输入模式: 原理分析:图中箭头表示信号流动方向。从I/O引脚向左沿着箭头方向,首先遇到两个开关和电阻,与VDD相连的称为上拉电阻,与Vss相连的称为下拉电阻,再连接到施密特触发器(信号转换)把电压信号转化为0、1的数字信号,存储在输入数据寄存器(IDR)。然后通过设置配置寄存器(CRL、CRH)控制这两个开关,于是就可以得到GPIO的上拉输入、下拉输入模式和浮空输入模式,浮空就是既不接上拉也不接下拉。在上拉/下拉/浮空输入模式中,输出缓冲器被禁止(P-MOS和N-MOS),施密特触发器输入被激活,根据输入配置(上拉,下拉或浮动)的不同,弱上拉和下拉电阻被连接

STM32学习笔记(一)---基础知识

让人想犯罪 __ 提交于 2019-12-14 01:30:00
STM32学习笔记(一)—基础知识 知识点 1.所有芯片的引脚顺序都是逆序排列的 2.芯片主要由内核和片上外设组成。 3. volatile :在 C 语言中该关键字用于修饰易变的变量,要求编译器不要优化。 存储器映射 存储器本身不具有地址,给存储器分配地址的过程就称为 存储器映射 。 给存储器再分配一个地址的过程就叫做 存储器重映射 。 寄存器映射 设计片上外设时,以四个字节为一个单元,共32bit,每个单元对应不同的功能,我们控制这些单元就可以驱动外设工作。 根据每个单元的功能不同,以功能为名给这个内存单元起别名,这个别名就是寄存器。 给已经分配好地址的有特定功能的内存单元取别名的过程就叫做 寄存器映射 例子: GPIOF端口的输出数据寄存器ODR的内存地址为0x4002 1414(ODR寄存器32位,低16位有效,控制16个IO端口输出高低电平) 通过绝对地址访问内存单元: * ( unsigned int * ) 0x40021414 = 0xFFFF ; 通过寄存器方式访问内存单元 # define GPIOF_BASE 0x40021400 # define GPIOF_ODR (unsigned int *)(0x40021400 + 0x14) * GPIOF_ODR = 0xFFFF ; c语言封装寄存器 /* 外设基地址 */ # define PERIPH