数据寄存器

TM4C123-Peripheral Driver Library

☆樱花仙子☆ 提交于 2020-02-25 00:42:06
本文主要是对TI的TivaWare™ Peripheral Driver Library USER’S GUIDE(spmu298d.pdf)文件的阅读摘录,是外设库的简介及对寄存器、库函数两种编程方式的认识。 本文重点是对支持寄存器访问方式的头文件中寄存器命名方式的理解。 一、外设库的简介 该库是一个访问外设的驱动集。 While they are not drivers in the pure operating system sense (that is, they do not have a common interface and do not connect into a global device driver infrastructure), they do provide a mechanism that makes it easy to use the device’s peripherals 虽然它们不是纯操作系统意义上的驱动,即它们没有统一的接口,不连接到全局设备驱动基础结构。 但它们的确使访问外设更加方便 Where possible, computations that can be performed at compile time are done there instead of at run time. 在编译时能完成的计算将在编译时完成 The

linux C 中的volatile使用

孤街醉人 提交于 2020-02-23 16:40:25
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子: 1). 并行设备的硬件寄存器(如:状态寄存器) 2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables) 3). 多线程应用中被几个任务共享的变量 回答不出这个问题的人是不会被雇佣的。我认为这是区分C程序员和嵌入式系统程序员的最基本的问题。嵌入式系统程序员经常同硬件、中断、RTOS等等打交道,所用这些都要求volatile变量。不懂得volatile内容将会带来灾难。 假设被面试者正确地回答了这是问题(嗯,怀疑这否会是这样),我将稍微深究一下,看一下这家伙是不是直正懂得volatile完全的重要性。 1). 一个参数既可以是const还可以是volatile吗?解释为什么。 2). 一个指针可以是volatile 吗?解释为什么。 3). 下面的函数有什么错误: int square(volatile int *ptr) { return *ptr * *ptr; } 下面是答案: 1). 是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变

SPI详解

江枫思渺然 提交于 2020-02-23 16:10:17
1、 SPI简介 SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议。 2、 SPI特点 2.1采用主-从模式(Master-Slave) 的控制方式 SPI 规定了两个 SPI 设备之间通信必须由主设备 (Master) 来控制次设备 (Slave). 一个 Master 设备可以通过提供 Clock 以及对 Slave 设备进行片选 (Slave Select) 来控制多个 Slave 设备, SPI 协议还规定 Slave 设备的 Clock 由 Master 设备通过 SCK 管脚提供给 Slave 设备, Slave 设备本身不能产生或控制 Clock, 没有 Clock 则 Slave 设备不能正常工作 2.2采用同步方式(Synchronous)传输数据 Master 设备会根据将要交换的数据来产生相应的时钟脉冲(Clock Pulse),

第五周学习总结

橙三吉。 提交于 2020-02-19 23:24:29
信息安全系统设计基础第六周学习总结 【学习时间: 6 小时】 一、学习过程 1.一个处理器支持的指令和指令的字节级编码称为它的指令集体系结构。 2.程序员可见的状态: Y86程序中的每条指令都会读取或者修改处理器状态中的某些部分。这称为程序员可见状态。 3.存储器:从概念上来说是一个很大的字节数组,保存着程序和数据。 4.程序状态的最后一个部分是状态码Stat,它表明程序执行的总体状态;它会指示是正常运行还是出现了某种异常。 5.Y86指令不允许从一个存储器地址到另一个存储器地址,也不允许从立即数到存储器。 6.halt指令停止指令的执行。并将状态码设置为HLT。 7.Y86利用绝对地址进行寻址,而且使用小端法编码。 8.指令集的一个重要性质就是字节编码必须有唯一的解释。 9.Stat包括四种状态,除了AOK表示正常执行外,其他状态都会导致处理器停止。在更完整的设计中,处理器通常都会调用一个异常处理程序。 10.Y86与IA32代码主要的区别就是,前者需要多条指令去执行一条IA32指令完成的功能。 11.以“.”开头的是汇编器命令,它们告诉汇编器调整地址,以便在那产生代码或者是插入一些数据。 12.指令模拟器YIS 目的是模拟Y86机器代码程序的执行,而不用试图去模拟任何具体处理器实现的行为。 13.将很多的逻辑门组合成一个网,就能构建计算块,称为组合电路。限制如下:

关于CPU的一点知识

醉酒当歌 提交于 2020-02-19 17:12:35
首先说一下,CPU是干啥的: CPU所负责的就是解释和运行最终转换成机器语言的程序内容 我们需要知道的CPU结构:重点需要关注寄存器 运算器 简单说就是负责运算从内存读取到寄存器中的数据,可以看作一个数据加工厂,就是对寄存器中的数据做运算,这些运算包含基本的算术和逻辑运算。 算术逻辑单元(ALU) 这个是运算器中重要的一个组成,主要负责的就是对数据的处理,从而实现对数据的算术和逻辑运算 累计寄存器(AC) 通常叫做累计器,是一个通用寄存器。当ALU处理完算术运算或者逻辑运算之后,会得到一个结果,这个结果就会保存在AC中。 数据缓冲寄存器(DR) 这个DR也是存放数据的,存放的主要是从内存读取过来的数据,会暂时存放在这个DR中,这里就相当于内存和CPU之间做数据传送的一个中转站。CPU和内存的速度是有很大差别的,中间引入一个DR,一定程度上起到了速度上的缓冲作用。 状态条件寄存器(PSW) 首先寄存器还是保存数据的,所以PSW自然也是保存某一类数据的。它保存的主要是由算术指令和逻辑指令运行或者测试的结果建立的各种条件码内容,一般分为状态标志和控制标志。 控制器 上面介绍的运算器只是起到了运算的功能,控制器是控制整个CPU的工作,对于控制器,一般要能够保证程序的正确执行以及能够处理异常事件。 指令寄存器(IR) 顾名思义,指令寄存器是用来保存指令的。也就是说,CPU要执行一条指令的话

新金宝

依然范特西╮ 提交于 2020-02-18 03:38:18
目前只实现了主设备模式,一般也只用到主设备模式,IIC如果不能使用硬件方式,读取大量数据的时候效率很大,由于只有1个字节的缓冲区,根本不能使用中断模式(实际使用过程中,IIC会造成100us以内间隔的中断,单片机根本扛不住的),所以建议数据少就直接阻塞,1个字节也就几十us,数据多直接用DMA,将线程阻塞,等待DMA传输完成,而不会阻塞CPU(上传的代码没有实现DMA部分,便于理解)。 目前已经做了完善的错误处理,读写操作前都会清除中断,遇到错误会软复位,所有位置均做了超时处理,防止程序卡死,目前只测试了几个字节的读写,大量的,长时间的读写均表现稳定,目前手上开发板没有eeprom,无法做大数据的连续读写,如果你在使用过程中遇到问题,欢迎指正。 下面是IIC读写的时序例子,可以先熟悉一下,这样比较容易上手,哪一个环节出了问题也要调试。 正在上传…重新上传取消 下面简要说明一下STM32F7硬件IIC的驱动设计方式(建议先百度学习一下IIC的时序要求): [基本的初始化] 1.初始化IIC时钟,IO(IIC IO必须设置为复用开漏输出,这个很重要)。 2.CR1先赋值为0,复位IIC. 3.除了TIMINGR寄存器需要自己计算设置好,其余寄存器全部复位为0 4.设置CR1使能IIC。 注意:上面说到,IIC的IO必须初始化为复用开漏输出,我之前初始化为复用推挽输出,测试很久

CPU中断的工作原理,从最底层讲起

a 夏天 提交于 2020-02-15 13:23:23
  前言   中断的概念属于硬件层。虽然我们在进行软件编程时不会直接使用中断,但理解它对我们来说依然重要。   我们在使用线程切换及状态管理、异常处理、硬件与处理器的交互、I/O操作等指令时,中断都在默默的为我们服务。   处理器基于硬件封装对外的指令集,底层语言封装指令集为我们提供更加简单的抽象,高级语言基于底层语言赋予程序更明确的语义。可以看到在这条关系链条中,下层的变动会牵一发而动全身影响上层。而上层想要提高效率,改变机制也必须得到下层的支持。   像 I/O 处理的不断演进,从占用CPU等待到通过中断阻塞等待到多路复用与异步,如果没有下层的支持上层是不可能实现的。而不了解下层的原理我们也很难真正理解一个机制的高效的原因。因此了解下层的原理对应用层工程师来说同样重要。   什么是中断   现代计算机具有多任务处理的能力,往往一台我们办公使用的普通计算机上都会同时运行着几十上百的任务(进程)。我们很难想象,我们点击一下鼠标,需要等待计算机的进程调度模块调度到鼠标处理任务后再给我们做出响应,这对我们来说是不可接受的。   现实是我们在点击鼠标或键盘时(正如我现在在做的事情),计算机会立即给我反馈处理结果,计算机与我们之间是在进行实时交互的。而实时性的实现便是依赖了中断,中断是为了顺应人们对实时性交互的需求而产生的技术。中断之所以有用,是因为它会立刻停下当前的程序(软件

FPGA基础知识关键点摘要

梦想与她 提交于 2020-02-15 09:19:03
FPGA基础知识关键点摘要 一.组合逻辑和时序逻辑的区别: 组合逻辑与输入直接实时相关,时序逻辑还必须在时钟上升沿出发后输出新值,有没有时钟输入是他们最大的区别! 组合时序容易出现竞争冒险现象出现亚稳态,时序逻辑不会出现,且更容易达到时序收敛 所以必须很好的掌握时序逻辑 设置不使用的 IO 为 为 in-tri 状态 RTL,Register Transfer Level,直译为寄存器转换级,顾名思义,也就是在这个级别下,要描述各级寄存器(时序逻辑中的寄存器),以及寄存器之间的信号的是如何转换的(时序逻辑中的组合逻辑)。 RTL 级代码 ︴ 综合 逻辑电路 ︴ 布局布线 ︴ 电路 可综合的语法就是那些可以在电路上实现的语法… 行为级语法就是不能够实现在电路里面,却可以作为仿真验证的高层次语法! reg型和wire型信号有什么本质的区别? 此问题较大,需常百度查查! 二.阻塞和非阻塞赋值: =,<= 区别与联系? 在输入输出GPIO口电路中,用到assign,它的详细用法如下: 1.被assign赋值的信号定义为wire型,被always@(*)结构块下的信号定义为reg型,值得注意的是,这里的reg并不是一个真正的触发器,只有敏感列表为上升沿触发的写法才会综合为触发器,在仿真时才具有触发器的特性。 2.另外一个区别则是更细微的差别:举个例子, wirea; regb;

Write your own operating system Day(1)

雨燕双飞 提交于 2020-02-13 05:27:44
工具准备: VirtualBox.exe是一个免费的轻巧的虚拟机 Bz.exe是二进制编辑器 NASM则是用来编译汇编语言的,具体使用方法自行百度 HZK16.fnt 中文GB2312的二进制点阵文件 QEMU软盘模拟器 加载BIOS程序到时候会用到 开发平台:windows 编写语言:C 和 汇编 操作系统开发中的困难 现在市面上众多的C编译器都是以开发Windows或Linux上的应用程序为前提而设计的,几乎从来没有人想过要用它们来开发其他的软件, 比如自己的操作系统。本次使用的也是Windows版的gcc为基础稍加改造而做成的,与gcc几乎没什么不同。或许也有为开发操作系统 而设计的C编译器,不过就算有,恐怕也只有开发操作系统的公司才会买,所以当然会很贵。这次我们用不了这么高价的软件。 因为这些原因, 我们只能靠开发应用程序用的C编译器想方设法编写出一个操作系统来。这实际上是在硬来,所以当中就会有很多不方便的地方。 就比如说printf{ “ hello\n” );吧,这个函数总是出现在C语言教科书的第一章,但我们现在就连它也无法使用。为什么呢?因为printf“这个函数是以操作系统提供的功能为前提编写的, 而我们最开始的操作系统可是什么功能都没有。因此,如果我们硬要执行这个函数的话,CPU会发生 一般保护性异常,直接罢工(蓝屏啦)。刚开始的时候不仅是printf,

汇编语言王爽第六部分(数据传输指令)

本小妞迷上赌 提交于 2020-02-11 19:38:38
数据传输指令 实现寄存器和内存,寄存器和寄存器之间的单个数据传送。 mov (1)MOV 寄存器 , 寄存器/内存单元/段寄存器/立即数 (2)MOV 内存单元 , 寄存器/段寄存器/立即数 (3)MOV 段寄存器, 寄存器/内存单元 非法指令 (1)操作数类型不一致,例如mov ax,bl ax是十六位寄存器,bl是8位寄存器 (2)不能修改cs段寄存器内容 (3)不能在内存之间直接传输数据 (4)不能用立即数修改DS push push ax表示将ax数据入栈,入栈以字单位进行。 push ax执行过程 (1)SP=SP-2 (2)将ax中的内容送入SS:SP指向的内存单元处,SS:SP指向新栈顶 pop pop ax表示从栈顶取出数据送入ax,出栈以字单位进行 pop ax执行过程 (1)将SS:SP指向的内存单元处的数据送入ax (2)SP=SP+2,以当前栈顶下面的单元为新的栈顶 pushf和popf (1)pushf是将标志寄存器的值压栈 (2)popf是从栈中弹出数据 (3)原理与push和pop类似 来源: CSDN 作者: 无名至尊 链接: https://blog.csdn.net/qq_41955402/article/details/104267260