寄存器

阅读 / 问答 / 标签

BIU 和EU 跟 运算器、控制器和寄存器组是什么关系啊?

微处理器主要由3部分组成,它们分别是:(1)运算器 包括算术逻辑单元(ALU),用来对数据进行算术和逻辑运算,运算结果的一些特征由标志寄存器储存。(2)控制器 包括指令寄存器、指令译码器以及定时与控制电路。根据指令译码的结果,以一定时序发出相应的控制信号,用来控制指令的执行。(3)寄存器阵列 包括一组通用寄存器和专用寄存器。通用寄存器组用来临时存放参与运算的数据,专用寄存器通常有指令指针IP(或程序计数器PC)和堆栈指针SP等。8086 CPU由指令执行单元EU和总线接口单元BIU组成。(1)指令执行单元EU指令执行单元EU由算术逻辑运算单元ALU、1个16位标志寄存器FLAGS、1个数据暂存寄器、8个通用16位寄存器组和EU控制器等4个部件组成。其主要功能是执行指令。1)算术逻辑运算单元ALU 可完成16位或8位的二进制运算,运算结果可通过内部总线送到通用寄存器,或者送往组成BIU的内部寄存器中,等待写入存储器。2)16位暂存器 它协助ALU完成运算,用来暂存参加运算的操作数。3)标志寄存器(FLAGS) 它是1个16位的寄存器,它用来反映经ALU运算后的结果特征,并置入标志寄存器FLAGS中保存。4)通用寄存器组 它包括4个16位数据寄存器AX、BX、CX、DX和4个16位指针与变址寄存器SP、BP、SI、DI,用来存放程序计算处理的数据和地址。 5)EU控制器 负责从BIU的指令队列中取指令,并对指令译码,根据指令要求向EU内部各部件发出控制命令以实现各条指令的功能。(2)总线接口单元BIU总线接口单元BIU是由1个20位地址加法器、专用寄存器组(段寄存器和指令指针寄存器等)、指令队列和总线控制逻辑等4个部件组成。其主要功能是形成访问存储器的物理地址、访问存储器取得指令并暂存到指令队列中等待执行,访问存储器或I/O端口以读取操作数参与EU运算或存放运算结果等。1)地址加法器 EU主要完成逻辑地址到物理地址的转换,即将16位“段基址”左移四位与16位“偏移地址”(段内地址)在地址加法器相加形成20物理地址。从而使可寻址的存储空间达到1MB。2)总线控制逻辑 总线控制逻辑主要是负责8086/8088 CPU的内部总线与CPU引脚所连接的外部系统总线交换数据的控制。3)专用寄存器 包括4个16位段寄存器CS、DS、SS、ES,1个16位指令指针寄存IP和内部暂存器,段寄存器用来存放16位“段基址”,指令指针寄存IP用来存放当前正在执行指令的偏移量地址。4)指令队列 当EU正在执行指令中,且不需占用总线时,BIU会自动地进行预取指令操作,将所取得的指令按先后次序存入指令队列寄存器中,该队列按“先进先出”的方式工作,并按顺序提供给EU执行。谢谢你看完我的回答

8086 8088的标志寄存器FLAGS中设置控制标志位的作用是什么?有哪些控制标志位?若要开放中断,应如何来控制?

【答案】:控制标志位用来控制CPU的操作,由程序设置或清除。有方向标志DF、中断允许标志IF与跟踪(陷阱)标志TF这3个控制标志位。若要开放中断,只需要用STI指令将IF置1,表示允许CPU接受外部从INTR引脚上发来的可屏蔽中断请求信号。

flags是8086机型中的什么寄存器.of分别表示什么?

是标志寄存器,也称PSW,它有6个状态位,3个控制位,你上面描述的of是溢出标志,在运算过程中带符号数超过范围就会使这个标志置1,除此之外还有cf,zf,pf,af,sf等标志

编写一个程序,将BX寄存器中16位带符号数按十进制形式显示在计算机的屏幕上

data segment num dw -28971 decasc db 6 dup("0")endsstack segment para stack dw 128 dup(0)endscode segmentstart: mov ax, data mov ds, ax mov bx,num and bx,bx jns next1 ;判断正负 mov decasc,"-" neg bx ;是负数,则求其相反数next1:mov si,5 ;将二进制数转换成十进制数的ASCII码 mov ax,bx mov cx,5 mov di,10 next2:xor dx,dx div di or dl,30h mov decasc[si],dl dec si loop next2 mov cx,5 mov si,0 mov dl,decasc[si] cmp dl,"-" ;若是负数,则显示负号,正数不显示符号 jne next3 mov ah,02h int 21hnext3: ;跳过前导0 inc si mov dl,decasc[si] cmp dl,"0" jne next4 loop next3next4:mov ah,02h ;显示有效数字,若BX为0,则只显示0 int 21h inc si mov dl,decasc[si] jcxz next5 loop next4next5: mov ax, 4c00h ; exit to operating system. int 21h endsend start

MPLLCON是什么寄存器?

MPLLCON的配置是用来确定FCLK频率参考http://blog.csdn.net/jjunjoe/article/details/6387966

串口编程的MCR(+4寄存器)设置有什么用?

//创建一个串口通讯SerialPort CurrentPort = null;CurrentPort = new SerialPort(); CurrentPort.ReadBufferSize = 128; CurrentPort.PortName = comName; //端口号 CurrentPort.BaudRate = bandRate; //比特率 CurrentPort.Parity =parity;//奇偶校验 CurrentPort.StopBits = stop;//停止位 CurrentPort.DataBits = databit;//数据位 CurrentPort.ReadTimeout = 1000; //读超时,即在1000内未读到数据就引起超时异常 //绑定数据接收事件,因为发送是被动的,所以你无法主动去获取别人发送的代码,只能通过这个事件来处理 CurrentPort.DataReceived += Sp_DataReceived; CurrentPort.Open();定义一个变量 byte[] receiveStr; //绑定的事件处理函数 private static void Sp_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { SerialPort sp = sender as SerialPort; if (sp == null) return; byte[] readBuffer = new byte[sp.ReadBufferSize]; sp.Read(readBuffer, 0, readBuffer.Length); //赋值 receiveStr=readBuffer;//当然你可以通过转换将byte[]转换为字符串。 }//你要求的按钮事件可以这么写 private void button1_Click(object sender, EventArgs e) { if(receiveStr!=null) { 变量 xxx=receiveStr; } }

读引脚和读寄存器有什么区别?为什么要区分?

对于CPU来说引脚其实也可以看做一种特殊寄存器,你可以在reg25.h这个头文件找中找到P0~P3各个引脚的地址。总体而言CPU的读操作目的都是一样的——不管是读引脚还是寄存器基本都是为了获取数据或者是控制信号。一般在工程实际中,读引脚是为了取得单片机和外设之间的通信信号或者获取数据传输的内容,比方说:在51单片机和ADC0809的通信中有一种是中断式连接,单片机的CPU可以通过读取和AD的EOC引脚相连的引脚的高地电平判定AD是否转换完成,进而进行下一步工作。这仅仅是简单的例子,实际中可能比这复杂得多。另外,由于单片机引脚一般和外设相连,所以有可能独处的数据会变化(取决于你是否有采样保持电路或者程序中的读取方式等等因素)。所以体现在程序中就有一个读引脚的时间问题。这个情况太多,只能具体问题具体分析。最后,如果你用的是C语言编程,读引脚和读寄存器的指令是一样的。如果你用的是汇编,读引脚是有专门的指令的,这点要注意。

三菱Q系列PLC中各个特殊寄存器的意义

安装个编程软件 到帮助里就能看到详细的寄存器说明

SJA1000发送数据的波形总是只有一个低起始,后面就是高电平,FPGA配置,读写寄存器都没问题

SJAl000是一种独立的CAN总线控制器,主要应用于工业环境中的区域网络控制。随着FPGA的广泛应用,CAN总线与FPGA的应用日益加强。文章从状态机的角度,介绍SJAl000内部寄存器的硬件语言读写时序的实现和应用,详细描述状态机的工作原理和相应的VHDL代码。关键词 SJAlOOO CAN总线FPGA状态机VHDL时序中图分类号TP393DesignandApplicationofVHDLRead—writeonSJAI000InternalRegisterYueKui LiuShaojun HuangDaoping(CollegeofAutomationScienceandEngineering,SouthChinaUniversityofTechnology,Guangzhou 510640)/M岭tmet SJAl000asindependentCANbuscontroller,mostlyapplyinindustrialenvironmentcontrolareanet.work.AsFPGAwidelyused,theapplicationofCANbusandFPGAbecomeincreasing.Thepaper,fromaspectofstatus-machine。mainlyintroducedthedesignandapplicationof VHDLRead-WriteonSJAl000internalregister,detailedde-scribestatus-machine"SprincipleandrelatedYHDLcode.Keywords sJAl000,CANbus,FPGA,status-machine,VHDL,timingClassNumber TP3931引言在20世纪80年代初,德国的BOSCH公司提出了用CAN总线(ControllerAreaNetwork,控制器局域网)来解决汽车内部的复杂硬件信号接线。CAN总线以其低成本、高可靠性、实时性、抗干扰能力强等特点,其应用范围扩展到了机械工业、纺织工业、农用机械、机器人、数控机床、医疗器械、家用电器及传感器等各种工业现场,CAN总线已经形成国际标准,并被公认为最有前途的现场总线之 一。SJAl000是Philips半导体公司推出的一款独立的CAN总线控制器,具有BasicCAN和Peli— CAN两种操作模式,PeliCAN模式支持具有很多新功能的CAN2.0B协议L1J。现场可编程门阵列(FPGA)已成为许多电子运动控制应用的重要平台。FPGA的发展迅猛,在许多应用领域中替代了特定用途集成电路(ASIC)。非易失性FPGA是具成本效益的ASIC替代方案,不存在采用ASIC时涉及开发成本高和开发时间长的问题。而且,利用FPGA替代固定 的逻辑,设计人员无论在设计阶段还是在应用现场,都可以高效、可靠地实现产品升级及定制功能。近年来,Altera、Xilinx等公司推出了内部嵌入存储器、微处理器的FPGA器件,使得这种器件的应用更显优越性。因此本文设计的CAN总线控制器SJAl000内部寄存器的硬件语言读写实现,正是基于FPGA具有CAN总线接口的广泛应用前景,使CAN总 99 收稿日期:2009年5月31日,修回日期:2009年6月24日作者简介:岳奎,男,硕士研究生,研究方向:FPGA相关设计,USB驱动设计,CAN总线,PCI总线等。刘少君,男,硕士,讲师,研究方向:数控系统设计与研究。黄道平,男,博士生导师,教授,研究方向:智能检测与智能控制等。万方数据176 岳奎等:SJAl000内寄存器的VHDI。语言读写设计与应用 第37卷线技术更好地应用到FPGA设计的系统中。2 CAN控制器SJAl000接口信号和时序〔2〕CAN控制器SJAlooo提供的微处理器的接口信号主要有多路地址/数据总线ADo~AD7、地址锁存信号ALE、片选信号/cs、微处理器的读使AD7t0AD0ALE(引脚ALE/AS)WR能信号/RD、微处理器的写使能信号/WR、复位输入/RST信号、模式选择MODE信号和中断输出INT信号,其中MODE为接口方式选择信号,可选用INTEL方式或MODTOROLA方式。出于普遍性的考虑,本文以下的接1=1设计是基于Intel模式的,其接口读时序如图1、写时序如图2和时序参数如表1。)l(A7toA0 》 (D7toDO狱L二‘。。。,—. 。kmz_(‰。二\99 -一tue000a.ev-99 " rLIm、 ,\ / ● 一 。WfRlfcL赳.—...一 - ‰_亡 Ⅵ 少读周期时序图:Intel模式)|(A7toA0 》 (D7toDO》× 一L=“一 h一气^L舢 ._k∞x。(=\ r一 , I 一fDⅧ ‘wHLH 。、\ /气m。。_一 99 一‰ 。 L—twncH五 \写周期时序图.Intel模式图1 SJAl000读写周期时序图;Intel模式3CAN控制器SJAl000接口读写时序的硬件语言实现目前应用最广的两种硬件语言是VHDL和Verilog,本文采用的硬件描述语言是VHDL,微处理器是CycloneEPlC6Q240C8FPGA,时钟为25MHz,通过4分频使其与SJAl000传输周期为160ns。sJAl000的数据和地址信号为分时复用,而FPGA中不存在地址的概念,设计的关键就是要把SJAl000中的寄存器地址当作数据写入。本文把对寄存器的读写程序设计为一个子程序,为了方便上层程序调用该程序,在设计中设置了一个输入控制信号start和读写选择信号PWR,该程序在设计中采用状态机的方式,如图2所示。图2 sJAl000接口读写时序的状态机流程图在IDLE状态,对接口信号进行初始化,其中地址锁存信号ALE为低电平、微处理器的写使能信号/WR为高电平、微处理器的读使能信号/RD为高电平"、片选信号/cs为高电平、地址数据复用 总线AD为高阻态(AD<一”ZZZZZZZZ”)、Wok和R-ok为低电平(W—ok为高电平表示一个写时序的完成,R—ok为高电平表示一个读时序的完肿蝎 一班 一R丐 一盎而l|帆西A引EI盆I删西脚 g万方数据第37卷(2009)第10期 计算机与数字工程177成)。另外用一个控制信号start,当start为高电平"时跳出IDI,E状态进入address状态,反之继续在IDLE状态循环。控制信号start设置主要是为了方便上层程序调用该子程序。在上层程序中要使用该子程序只需给start信号一个高电平,一个时钟后拉低电平就可以了。表1 SJAl000接口读写时序参数表符号 参数 最小最大单位值 值fosc振荡器频率24 MI-Iztsu(A-AL)对ALE/AS低电平的地址8 ns建立时间th(AL-A) ALE为低的保持时间 2 nstW(AL)AU影AS的脉冲宽度8 nstRI皿V /RD为低输出有效数据 50 nstRHDZ/RD为高数据悬空 30 I"IStDVWH/WR为高输入数据有效8 nstWHDX /WR为高后的数据保持时间8 nstWHLH /WR为高到下—个√虹正高15 nstIJM, ALE低到/WR低 10 IIStIJRI,√蛆正低到/RD低 10 11stW(W) /WR脉冲宽度 20 I"IStW(R) /RD脉冲宽度40 IIStCLWL/cs低到/WR低0 nstWHCH /WR高到/CS高0 璐tRHCH /RD高到/CS高0 nstW(RST) /l礤b-q”脉冲宽度 100 as在address状态,』6此拉高电平同时给地址数据复用总线地址(瞅一伽)D麟),另外用一个输入选择信号PWR,当PWR为高电平时跳出ad— dress状态进入SJA_W1状态;而当PWR为低电平时跳出address状态进入SJA._R1状态。信号PWR 的作用是为了判断对寄存器的操作是读还是写。当对寄存器写的时候跳转到SJA—Wl状态,/AI。E拉低电平,跳出该状态进入SJA_W2状态;在SJA—W2状态,/WR拉低电平,/cs拉低电平同时给地址数据复用总线数据(AD<=DATA),跳出该状态进入SJA—W3状态;在SJAW3状态,/WR拉高电平,/cs拉高电平,跳出该状态进入IDLE状态。至此是一个完整的寄存器写操作。当对寄存器读的时候跳转到SJA—R1状态,ALE拉低电平,地址数据复用总线AD为高阻态(AD<一”ZZZZZZZZ”),跳出该状态进入sJAR2状态;在SJA-R2状态,/RD拉低电平,/cs拉低电平,跳出该状态进入SJA—R3状态;在SJA—R3状态,读取地址数据复用总线的数据(DATA—R<=AD),跳出该状态到SJA—R4状态;在SJA—R4状态,/cs拉高电平,/RD拉高电平,跳出该状态到I— DLE状态。至此是一个完整的寄存器读操作。在上述通过状态机来实现SJAl000寄存器的 硬件语言读写,在设计中每个状态占用的时间是一 个周期,即160ns。从表1可以看到SJAl000接口读写时序参数,其中设计的关键时在读寄存器操作时,从读使能信号/RD低电平到到输出有效数据最大为50ns。设计中,在SJA—R2状态将/RD拉低电平,在SJA—R3状态读取总线上的数据,即经过了160ns(大于50ns),符合时序要求。其他的时序设计都是严格按照时序表参数来设计中的。4SJAl000内部寄存器读写硬件描述语言的应用CAN总线节点的软件设计主要包括CAN节点初始化、报文发送、报文接收三个部分。这三个部分 的实现主要是对SJAl000中相应的寄存器进行读写。因此用VHDL设计Q气N总线节点的软件的关键就是对SJAl000内部特定寄存器读写〔3 ̄4〕。ifRsr=‘1"thenif(clock"eventandclock=‘1")thencasestateISWHENLDLE=>start<=‘0";state<::=MODE)WHENMODE一>start<=‘l":PWR<=‘1";ADDRESS<=X“00”:dataout<=X”09”;smte<=STOPMODE)whenSTOPMODE=>start<=‘0":if(W-ok=‘1")thenstate<=SR)elsestate<=STOPMODE)endif)whenSTOPSR=>start<=‘1";PWR<一‘0":ADDRESS<=X“02”:state<=STOPSRwhenSr()PSR=>start<一‘0":ifR_ok=‘l"thenstate99 <=stop)万方数据178 岳奎等:SJAl000内寄存器的VHDL语言读写设计与应用 第37卷elsestate<=STOPST;ENDIF;CAN总线节点的主程序中调用子程序,以写模式寄存器和读状态寄存器为例说明该子程序在主程序的应用,如上面程序所示:IDLE状态使start为低电平,在MODE状态start为1,同时给地址和数据,在这个状态子程序进入了address状态并根据PWR的值进行写寄存器操作,一个时钟以后start为低电平,并根据w—ok是否为高电平判断写寄存器是否完成;读状态寄存器SR时,start拉为高电平,同时给地址数据总线寄存器SR地址,一个时钟后,start拉低电平,并根据R—ok是 否为高电平判断读寄存器是否完成。5 结语CAN总线接口由硬件语言VHDL描述,可读性好,便于修改和测试。在处理器FPGACycloneEPlC6Q240C8处理器与CAN控制器SJAl000及PCA82C250组成的通信模块下,利用本文设计SJAl000内部寄存器的硬件语言读写时序实现来设计CAN总线节点软件,可在不同节点间实现数据传输,传输速率可达1Mbit/s,提高了系统的实时性和可靠性。因此该设计具有广泛的应用前景。参考文献〔1〕饶运涛,邹继军,王进宏,等.现场总线CAN原理与应用〔M〕.北京:北京航天航空大学出版社,2007:17~18〔2〕PHILIPS DATASHEETSJ『A1000 stand-aloneCANcontroller〔Z〕.PhilipsSemiconductors,2000Jan04〔3〕吴繁红.基于AT89C51和SJAI000控制器实现CAN总线接口〔J〕.电子技术应用,2003,29(7):51~52〔4〕张伟,霍建振.基于SJAlOOO的CAN总线通信模块〔刀.自动化技术与应用,2007,26(12):26~29也带%诞珠勘斛坏勘斛绵她恭黜开池乖出裆看池科带翰过钸出磷场姓珠幽带场过稀出希出秘坏出带场}蛳延,庥姥乖出希出带出希出裆彳}逆绵也乔断出吊妲币÷幺矛出带延;尔出牢(上接第170页)学员可利用评估功能可对教学过程进行评价,以便改进教学活动。5 结语此项目是应新疆党员干部现代远程教育管理中心的需求而研发,已通过中组部全国远程办的实地考察验收。系统不仅可用于农村党员远程培训、农业科普讲座,还可作为主会场,召开网络视频会议。此系统的实施为西部农村地区的远程教育发展提供了有力支持,同时对培养新型农民、活跃农村文化生活以及新农村建设也具有相当重要的意义。参考文献〔1〕韩志坚,封昌权.现代教育技术〔M〕.北京:人民邮电出版社,2004,1〔2〕李学明,李继,魏芳.远程教育系统及其实现〔M〕.北京:人民邮电出版社,2000.11〔3〕王阿木,赵喜明.视频会议系统及其在远程中的应用〔J〕.现代远距离教育,2003,(2):49~51〔4〕陈张健,蒋莉.交互式多点视频会议解决方案〔J〕.ComputerEra,2003,(2):34~35〔5〕李崇荣,张轩.基于IP/multicast视频会议技术在远程教育中的应用〔J〕.清华大学学报(自然科学版),2003,(1):34~37〔6〕Michael 13.Ciocco,Neil Toporski,MichaelDorris.DevelopingaSynchronousWebSeminarApplica— tion for OnlineLearning〔C〕.the33rd annual ACMSIGUCⅪSconfereneeonUserservices,Monterey,Califor— nia,USA,NewYork:ACMPress,2005:36~39万方数据 SJA1000内寄存器的VHDL语言读写设计与应用作者: 岳奎, 刘少君, 黄道平, Yue Kui, Liu Shaojun, Huang Daoping 作者单位: 华南理工大学自动化科学与工程学院,广州,510640 刊名:计算机与数字工程英文刊名: COMPUTER AND DIGITAL ENGINEERING 年,卷(期): 2009,37(10) 被引用次数: 0次 参考文献(4条) 1.饶运涛.邹继军.王进宏 现场总线CAN原理与应用 2007 2.PHILIPS DATA SHEET SJA1000 stand-alone CAN controller 2000 3.吴繁红 基于AT89C51和SJA1000控制器实现CAN总线接口 2003(07) 4.张伟.霍建振 基于SJA1000的CAN总线通信模块 2007(12) 相似文献(10条) 1.期刊论文 罗雪梅 基于SJA1000的CAN总线接口电路的设计与实现 -贵州工业大学学报(自然科学版)2003,32(4) 介绍了基于SJA1000的CAN总线接口电路的软硬件设计方法,给出了CAN总线接口电路、SJA1000初始化程序、接收及发送数据程序的框图. 2.期刊论文 郭慧玲.刘羽.魏文.GUO Hui-ling.LIU Yu.WEI Wen 基于SJA1000的CAN总线双机通讯技术的研究 -仪表技术与传感器2008,""(9) 介绍了CAN总线的发展趋势以及通讯控制器SJA1000的系统结构,针对双机通讯的特点,以通讯控制器SJA1000为核心设计了双机通讯的硬件电路,详细分析了通讯控制器SJA1000的初始化,数据发送和数据接收的工作机理,给出了硬件连接方式并编写了通讯程序,最后对抗干扰技术进行了探索,双机通讯系统获得了较好的可靠性和稳定性. 3.期刊论文 陈萍.姜秀杰.Chen Ping.Jiang Xiujie 基于FPGA的CAN总线通信系统 -计算机测量与控制2009,17(12) 为了克服单片机固有的缺陷,满足航天控制的需求,文章提出了如何利用FPGA采用查询的方式控制CAN控制器SJA1000,从而实现CAN总线数据通信的方法;介绍了该系统的硬件构成、芯片选择和组成原理,对FPGA的控制程序进行了分析和设计;实验结果表明,系统完全满足CAN总线通信要求,与以往基于单片机的CAN总线通信系统相比较,降低了体积、重量和功耗,具有优越性;该设计已成功应用于星载电场仪的地面检测设备中. 4.期刊论文 韩星.高剑.Han Xing.Gao Jian 基于SJA1000的CAN总线抗干扰技术研究 -火控雷达技术2008,37(3) 分析某车载武器系统CAN总线干扰产生的原因,给出基于SJA1000控制器构成的CAN总线节点的软、硬件抗干扰措施,有效解决了CAN节点的通信干扰问题. 5.期刊论文 李传艺.陈舜儿.黄红斌.刘敏.刘伟平.Li Chuanyi.Chen Shuner.Huang Hongbin.Liu Min.Liu Weiping 基于SJA1000的CAN总线系统节点仿真平台的实现 -广东自动化与信息工程2005,26(4) 文章设计了一个控制器局域网CAN总线系统节点的仿真平台,通过选用兼容扩展性及检错纠错能力强的SJA1000芯片作为CAN控制器核心,利用普通PC机仿真传感器、执行器和人机接口,实现的仿真平台具有灵活通用、简单可靠、性价比高及良好的开放性和扩展性等特点,为CAN总线系统在汽车及其它多种不同领域的自动控制系统中推广应用,提供了方便的研究开发条件. 6.期刊论文 潘计辉.张小林.Pan Jihui.Zhang Xiaolin 双CAN总线的机载网络控制器设计 -计算机测量与控制 2010,18(1) 基于航空电子综合化的要求,提出一种新的航电互联方案,结合小型飞行器多传感器和小数据量特点设计一种机载共享式网络.采用DSP作为处理器 ,SJA1000进行双CAN扩展,使州6N137进行信号隔离,并使用PCA82C250作为CAN控制器接口芯片,进行网络控制器的硬件设计;网络通讯协议采用应答式交换数据,在此基础上,对软件流程和代码进行设计;半物理仿真实验结果表明该系统运行良好,能够满足小型飞行器控制网络的实时性与多结点要求;同时系统具有可靠性高与开放性等特点. 7.期刊论文 张伟.霍建振.ZHANG Wei.HUO Jian-zhen 基于SJA1000的CAN总线通信模块设计 -自动化技术与应用 2007,26(12) 本文初步阐述了基于SJA1000的CAN总线通信模块的实现,采用PHILIPS的PCA82C250作为通信模块的总线收发器,网络控制器则采用PHILIPS的SJA1000,采用TAMEL的AT89C52单片机,基于这些芯片实现CAN通信的基本功能这主要包括EPP-CAN接口板的实现和下位机即单片机与CAN通信模块的连接及实现.系统达到完成CAN通信所需要的指标,可基本满足CAN通信的各项要求. 8.期刊论文 李云.王宝良.丁在田.王延伟 基于SJA1000的CAN总线控制节点的设计与实现 -空军工程大学学报(自然科学版)2003,4(3) 介绍了CAN总线的特点以及一种新型的独立CAN控制器SJA1000的主要功能,给出了一种基于SJA1000的CAN控制节点的硬件电路及软件设计,并对设计中应注意的问题进行了较详细的说明. 9.期刊论文 潘国峰.何平.田丰.孙以材 基于CAN总线的分布式测温报警系统 -河北工业大学学报2010,39(1) 研制了一种基于CAN总线的分布式温度检测系统.给出了CAN总线节点的硬件构成及温度检测、数据传送、接收的软件实现方法.系统可实现分布式温度测量、到限报警、故障诊断等功能,特别适用于工业现场及物资储存等环境的分布式温度实时监控. 10.期刊论文 付亮.王星.FU Liang.Wang Xing 基于SJA1000的CAN总线控制系统的开发与设计 -汽车电器 2007,""(5) 介绍PHILIPS公司推出的独立CAN总线控制器SJA1000的特点和内部结构,并对其内部寄存器及其地址分配进行了说明,最后给出它的典型的CAN总线节点电路图及其软件设计

正点原子精通stm32函数库与寄存器是不是一样的

首先,两个都是C语言。从51过渡过来的话,就先说寄存器操作。每个MCU都有自己的寄存器,51是功能比较简单的一种,相应的寄存器也比较少,我们常用的就那么几个,像P0 P1 SMOD TMOD之类的,这些存在于标准头文件reg.h里面,因为少,所以大家就直接这么去操作了,每一位对应的意义随便翻一下手册就看得到,甚至做几个小项目就记的很清楚了。所以做51开发的时候大多数都是直接操作寄存器。到了STM32,原理一样,也是有自己的寄存器,但是作为一款ARM内核的芯片,功能多了非常多,寄存器自然也就多了很多,STM32的手册有一千多页,这时候想去像51那样记住每个寄存器已经不现实了,所以ST的工程师就给大家提供了库函数这么一个东西。这是个神器。库函数里面把STM32的所有寄存器用结构体一一对应并且封装起来,而且提供了基本的配置函数。我们要去操作配置某个外设的时候不需要再去翻眼花缭乱的数据手册,直接找到库函数描述拿来就可以用,这样就能把精力放在逻辑代码的开发上,而不是去费力的研究一个芯片的外设要怎么配置寄存器才能驱动起来。简单讲就是这些了,库函数是为了让开发者从大量繁琐的寄存器操作中脱离出来的一个文件包,在使用一个外设的时候让开发者直接去调用相应的驱动函数而不是自己去翻手册一个一个配置寄存器。有人说用库函数掌握不到芯片的精髓,见仁见智了。熟悉一款芯片是在不断的开发使用中逐渐了解并掌握的,调试的过程中会遇到很多问题,会要求我们去跟踪相关寄存器的状态,在整个框架都已经建立起来的基础上再去对照手册做具体到寄存器每一位的分析,代码对照现象,很快就能积累起来经验,祝成功。

如何解锁技嘉主板的MSR0xe2寄存器位数?

有些主板上有选项“CFG Lock”,其说明内容为”关闭或开启MSR 0xe2″,可以手动开关。当有一次我需要用到Hyper-V虚拟机的时候我发现了一个问题。打开CFG Lock以后CPU特性是支持HyperVisor 的,也就是说HyperV 可以完美运行,但有另外的许多VM特性会被关闭;而当关闭Lock的时候HyperVisor则没有了,另外一些特性则会开启,如图:原来CFGLock 的MSR 0xe2是Model Specific Register的一个寄存器位数锁定,开和不开自己根据需求看着办吧。当你需要在windows 8.x下使用HyperV时,则必须打开CFGLock,也就是锁定MSR 0xe2;当你需要使用黑苹果时,则必须解锁MSR 0xe2,否则无法使用原生电源管理。很多主板强制锁定了这个寄存器,所以得打补丁。MSR全称是Model Specific Register,特定模块寄存器,属于非标准寄存器,用来控制CPU的工作环境和读取工作状态,比如电压,温度,功耗等非程序性能指标。大多数UEFI主板厂家,锁定了MSR寄存器的第15位为只读,也就是MSR 0xE2 Locking。MSR寄存器主要用于电源管理,CPU的P-state、C-state就是放在MSR寄存器里的。MSR 0xE2被锁定为只读后,AppleIntelCPUPowernamegement一旦去写入数据,马上就核心崩溃,也就是你这样子。技嘉为啥被称为神板?正是因为技嘉没有锁定MSR寄存器,可以直接用原生电源管理。解决的办法:放入NullCPUPowerManagement.kext,这个最简单,但是会禁用电源管理,CPU不会再变频了,会一直以最高频运行。建议这方法只是在安装系统时用,待进入桌面后删除,并折腾电源管理。下面说说怎么折腾原生电源管理,这些方法的原理都一样,都是让AppleIntelCPUPowerManagement不要去写入MSR 0xE2。1. 对BIOS打电源补丁。下载PMPATCH或UEFI PATCH,给BIOS打补丁后刷回主板。这方法一劳永逸,但刷BIOS有风险。2. 用AICPUPM Patch for UEFI V2对AppleIntelCPUPowernamegement打补丁,下载AICPUPM Patch for UEFI V2运行一下就可以了。3. 如果是clover引导,可以打开Asus AICPUPM功能。这三个方法选一个就行了,我自己都试过的,都一样的效果。========转录。如果想要全文,请搜索一下其中的文字即可。

三菱PLC数据寄存器D里面的数据用MUL指令时 第一个错误 第二个正确 什么原因

用双字存储区试试。重新分配一下

各位高手,我想求教汇编中MUL指令的用法,我的单片机寄存器是8位的,现在有两个16位的数相乘,

MUL 指令只有一种用法即:MUL AB 即累加器A与寄存器B相乘,结果保留到A和B中如果是两个16位相乘,那么需要编制一个小函数来实现了。双字节无符号数乘法程序 (R3R4*R6R7)=(R5R2R3R4);入口: R3,R4,R6,R7;占用资源: ACC,B;堆栈需求: 2字节;出口: R5,R2,R3,R4NMUL22 : MOV A,R4MOV B,R7MUL ABXCH A,R4MOV R5,BMOV B,R6MUL ABADD A,R5MOV R5,ACLR AADDC A,BMOV R2,AMOV A,R3MOV B,R7MUL ABADD A,R5MOV R5,AMOV A,BADDC A,R2MOV R2,ACLR AADDC A,#00HXCH A,R3MOV B,R6MUL ABADD A,R2MOV R2,AMOV A,BADDC A,R3XCH A,R5MOV R3,ACLR OVRET

各位高手,我想求教汇编中MUL指令的用法,我的单片机寄存器是8位的,现在有两个16位的数相乘,

mul指令是乘法指令。使用mul做乘法的时候:1) 两个相乘的数:两个相乘的数,要么都是8位,要么都是16位。如果是8位,一个默认放在AL中,另外一个存放在8为寄存器或字节内存单元中;如果是16位,一个默认在AX中,另外一个放在16为寄存器或内存寄存器字单元中。2) 结果:如果是8位乘法,结果默认放在AX中;如果是16位乘法,结果高位默认在DX中存放,低位在AX中存放。格式:mul regmul 内存单元内存单元可以用不同的寻址方式给出,比如:mul byte ptr ds:[0]含义:(ax) =(al)*((ds)*16+0);mul word ptr [bx+si+8]含义:(ax) =(ax)*((ds)*16+(si)+8)结果的低16位;(dx) =(ax)*((ds)*16+(si)+8)的结果的高16位。

linux kernel 怎么读cpu写寄存器 inw

arm裸机下读写寄存器很容易,各个寄存器和内存的地址是单一地址空间,他们是用相同的指令进行读写操作的.而在linux下就要复杂很多,因为linux支持多个体系架构的CPU。比如arm和x86就不一样,具体的差别我暂时也说不上来,这个涉及到CPU体系的设计。目前我只关心:linux为了支持多个硬件体系,在IO访问上做了自己的接口。可以通过IO内存和IO端口这两种方式进行IO访问。在LED的例子上给出这两种方式的具体实现: 1.利用IO Port的方式:[cpp] view plain copy#include <linux/module.h> #include <linux/moduleparam.h> #include <linux/init.h> #include <linux/kernel.h> /* printk() */ #include <linux/slab.h> /* kmalloc() */ #include <linux/fs.h> /* everything... */ #include <linux/errno.h> /* error codes */ #include <linux/types.h> /* size_t */ #include <linux/proc_fs.h> #include <linux/fcntl.h> /* O_ACCMODE */ #include <linux/seq_file.h> #include <linux/cdev.h> #include <linux/ioport.h> #include <mach/regs-gpio.h> #include <asm/system.h> /* cli(), *_flags */ #include <asm/uaccess.h> /* copy_*_user */ #include <asm/io.h> #define LED_NUM 4 struct led_dev { struct cdev dev; unsigned port; unsigned long offset; }; struct led_dev led[4]; dev_t dev = 0; static struct resource *led_resource; int led_open(struct inode *inode, struct file *filp) { struct led_dev *led; /* device information */ led = container_of(inode->i_cdev, struct led_dev, dev); filp->private_data = led; /* for other methods */ return 0; /* success */ } int led_release(struct inode *inode, struct file *filp) { return 0; } ssize_t led_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos) { return 0; } ssize_t led_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos) { char data; struct led_dev *led; u32 value; printk(KERN_INFO "debug by baikal: led dev write "); led = (struct led_dev *)filp->private_data; copy_from_user(&data,buf,count); if(data == "0") { printk(KERN_INFO "debug by baikal: led off "); value = inl((unsigned)(S3C2410_GPBDAT)); outl(value | 1<<led->offset,(unsigned)(S3C2410_GPBDAT)); //value = ioread32(led->base); //iowrite32( value | 1<<led->offset, led->base); } else { printk(KERN_INFO "debug by baikal: led on "); value = inl((unsigned)(S3C2410_GPBDAT)); outl(value & ~(1<<led->offset),(unsigned)(S3C2410_GPBDAT)); //value = ioread32(led->base); //iowrite32( value & ~(1<<led->offset), led->base); } } struct file_operations led_fops = { .owner = THIS_MODULE, .read = led_read, .write = led_write, //.ioctl = led_ioctl, .open = led_open, .release = led_release, }; static int led_init(void) { int result, i; result = alloc_chrdev_region(&dev, 0, LED_NUM,"LED"); if (result < 0) { printk(KERN_WARNING "LED: can"t get major %d ", MAJOR(dev)); return result; } led_resource = request_region(0x56000014,0x4,"led"); if(led_resource == NULL) { printk(KERN_ERR " Unable to register LED I/O addresses "); return -1; } for(i = 0; i < LED_NUM; i++) { cdev_init( &led[i].dev, &led_fops); //led[i].port = ioport_map(0x56000014,0x4); //led[i].base = ioremap(0x56000014,0x4); led[i].offset = i + 5; //leds GPB5678 led[i].dev.owner = THIS_MODULE; led[i].dev.ops = &led_fops; result = cdev_add(&led[i].dev,MKDEV(MAJOR(dev),i),1); if(result < 0) { printk(KERN_ERR "LED: can"t add led%d ",i); return result; } } return 0; } static void led_exit(void) { int i; release_region(0x56000014,0x4); for( i = 0; i < LED_NUM; i++) { //iounmap(led[i].base); cdev_del(&led[i].dev); } unregister_chrdev_region(dev, LED_NUM); } module_init(led_init); module_exit(led_exit); MODULE_AUTHOR("Baikal"); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("Simple LED Driver"); 2.利用IO Mem的方式:[cpp] view plain copy#include <linux/module.h> #include <linux/moduleparam.h> #include <linux/init.h> #include <linux/kernel.h> /* printk() */ #include <linux/slab.h> /* kmalloc() */ #include <linux/fs.h> /* everything... */ #include <linux/errno.h> /* error codes */ #include <linux/types.h> /* size_t */ #include <linux/proc_fs.h> #include <linux/fcntl.h> /* O_ACCMODE */ #include <linux/seq_file.h> #include <linux/cdev.h> #include <linux/ioport.h> #include <asm/system.h> /* cli(), *_flags */ #include <asm/uaccess.h> /* copy_*_user */ #include <asm/io.h> #define LED_NUM 4 struct led_dev { struct cdev dev; void __iomem *base; unsigned long offset; }; struct led_dev led[4]; dev_t dev = 0; int led_open(struct inode *inode, struct file *filp) { struct led_dev *led; /* device information */ led = container_of(inode->i_cdev, struct led_dev, dev); filp->private_data = led; /* for other methods */ return 0; /* success */ } int led_release(struct inode *inode, struct file *filp) { return 0; } ssize_t led_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos) { return 0; } ssize_t led_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos) { char data; struct led_dev *led; u32 value; printk(KERN_INFO "debug by baikal: led dev write "); led = (struct led_dev *)filp->private_data; copy_from_user(&data,buf,count); if(data == "0") { printk(KERN_INFO "debug by baikal: led off "); value = ioread32(led->base); iowrite32( value | 1<<led->offset, led->base); } else { printk(KERN_INFO "debug by baikal: led on "); value = ioread32(led->base); iowrite32( value & ~(1<<led->offset), led->base); } } struct file_operations led_fops = { .owner = THIS_MODULE, .read = led_read, .write = led_write, //.ioctl = led_ioctl, .open = led_open, .release = led_release, }; static int led_init(void) { int result, i; result = alloc_chrdev_region(&dev, 0, LED_NUM,"LED"); if (result < 0) { printk(KERN_WARNING "LED: can"t get major %d ", MAJOR(dev)); return result; } for(i = 0; i < LED_NUM; i++) { cdev_init( &led[i].dev, &led_fops); request_mem_region(0x56000014,0x4,"led"); led[i].base = ioremap(0x56000014,0x4); led[i].offset = i + 5; //leds GPB5678 led[i].dev.owner = THIS_MODULE; led[i].dev.ops = &led_fops; result = cdev_add(&led[i].dev,MKDEV(MAJOR(dev),i),1); if(result < 0) { printk(KERN_ERR "LED: can"t add led%d ",i); return result; } } return 0; } static void led_exit(void) { int i; release_mem_region(0x56000014,0x4); for( i = 0; i < LED_NUM; i++) { iounmap(led[i].base); cdev_del(&led[i].dev); } unregister_chrdev_region(dev, LED_NUM); } module_init(led_init); module_exit(led_exit); MODULE_AUTHOR("Baikal"); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("Simple LED Driver");

verilog中寄存器信号能不能作为always语句的敏感信号

可以,举个例子,三段式状态机中的第二段就是将寄存器信号作为always语句的敏感信号!reg[3:0]current_state;reg[3:0]next_state;always@(posedgeclkornegedgerst_n)if(!RSTn)current_state<=IDLE;elsecurrent_state<=next_state;always@(current_state)//这里就是将寄存器信号作为always语句的敏感信号beginnext_state=x;case(current_state)S1:if(...)next_state=S2;....................纯手打,望采纳,欢迎追问~~~~

说明TRIS与PORT寄存器的功能与区别?

PORT是端口I/O寄存器(如PORTA、PORTB…)写 PORTx寄存du器就是将数据值写入该端口锁存器。读 PORTx寄存器就是读取I/O 引脚上的数据值。TRIS是端口I/O控制寄存器(又称为端口I/O数据方向寄存器,如TRIAS、TRISB…)。当某位的值为0时,置对应I/O口为输出;为1时,置I/O口为输入。编写PIC单片机程序,必须要对环境条件进行设置(Configuration Bits),比如WDT看门狗、晶振类型、代码保护、低压编程等等,每一种芯片的项目不一样,有多有少。正确设置非常重要,否则容易误烧芯片造成损失。  开发工具编译器一般都可以采用菜单方式设置,在编译程序时将设置字一并完成,烧写芯片同时完成CONFIG的烧入。然而,有时候编译的HEX文件并不包含CONFIG,因此,在程序代码中直接包含CONFIG设置是一种好习惯(这样编译的HEX就会包含CONFIG设置)。

寄存器里显示的AX是什么意思

就是寄存器EAX

reload寄存器是什么意思

自动重载数值寄存器。reload寄存器的意思是,自动重载数值寄存器,当SysTick的计数器递减到0的时候,RELOAD寄存器的值会重新赋值给SysTick的计数器,让SysTick可以重复计时。

寄存器传送语言(RTL)是如何表达指令功能的

FT:M→IR,PC→MAR;ST0:PC→MAR;ST1:M→MDR→C;ST2:PC+1→PC;ST3:C+R1→MAR;ST4:M→MDR→C;DT0:R0→MAR;DT1:R0+1→R0;ET0:R0→MAR,R0→MDR,C→R0,C→MDR;ET1:MDR→M;ET2:PC→MAR就那么多了。我看了两个小时终于做出来了。

51系列单片机 TCON寄存器里的IT1,IE1都是什么作用的?

搜一下:51系列单片机TCON寄存器里的IT1,IE1都是什么作用的?

51系列单片机 TCON寄存器里的IT1,IE1都是什么作用的?

分类: 资源共享 问题描述: 8051 TCON:定时器/计数器控制寄存器 解析: IE1指中断1边沿标志。当检测到外部中断1边沿/低电平时由硬件置位该标志。中断处理时由硬件清零,或通过软件清零。 IT1指中断1类型控制位,通过软件置位/清零该位来选择外部中断1以下降沿/低电平方式触发。

stm32的引脚PB6/PB7默认是什么,我想让他作为普通的i/o口,怎样配置寄存器

PB6/PB7是I2C1 的SCL和SDA端,如果作为普通的I/O口,就一般的配置就可以。GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; //设置速率 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//设置你要的模式GPIO_Init(GPIOB, &GPIO_InitStructure);

怎么读取sensor寄存器

一般都是I2C 装置,利用I2C Host 进行读取比如OV sensor, 一般 Device Address 0x48 (W) 0x49 (R)S 0x48 (要读的address) P S 0x49 D NA Pex: S(tart) 0x48 0x10 Sto(P) S(tart) 0x49 Return NA(ck) Sto(P)
 首页 上一页  1 2