当前位置:首页 > 寄存器
  • 澜起科技入选JEDEC董事会

    近日,澜起科技入选了全球微电子行业标准制定机构JEDEC固态技术协会董事会。澜起科技美国公司战略技术副总裁Christopher Cox先生作为公司代表加入JEDEC董事会。 JEDEC固态技术协会(简称“JEDEC”)是微电子行业开放标准制定的全球领导者,其使命是通过创建、发布和推广全球通用性标准,以及举办行业前沿技术交流论坛,为微电子技术和产业的创新、发展服务。JEDEC由300多家会员公司组成,在全球有100多个委员会、分会。如今,其标准和出版物已被广泛应用于全球主流半导体存储电路和相关存储设备中。JEDEC董事会在准备、审阅和批准行业标准方面发挥着关键作用,以应对微电子产业不断演化的技术挑战以及全球制造商、供应商日益增长的标准制定和更新需求。 自2004年开始,澜起科技一直在JEDEC的DRAM(动态随机存取存储器)、寄存器和缓冲器工作组中发挥着积极的作用,致力于促进DDR(双倍数据速率)技术的标准化。此次,澜起科技入选JEDEC董事会,体现出全球微电子行业对公司业界地位及在行业标准制定方面所做贡献的认可。 目前,澜起科技在JEDEC下属的三个委员会及分会中担任主席职位,深度参与JEDEC的标准制定。2020年1月,公司董事长兼首席执行官杨崇和博士被JEDEC授予“杰出管理领袖奖”,成为该奖项的全球首位获奖者,JEDEC在评奖公示中表示:杨崇和博士及澜起科技是JEDEC内存标准的积极贡献者;杨崇和博士还是“1 + 9”分布式缓冲架构的发明者之一,基于该架构,JEDEC制定了高密度DDR4内存模组的标准,并且它也是即将推出的JEDEC标准DDR5内存模组的基础。 杨崇和博士表示:“很高兴能加入JEDEC董事会,多年来,我们的团队一直在积极参与JEDEC内存标准的构建,在加入JEDEC董事会后,我们期待着为进一步推动JEDEC开放标准的发展、增强行业的国际交流与合作而不断努力。”

    时间:2021-04-20 关键词: 动态随机存取存储器 寄存器 缓冲器

  • 单片机中写1清0和写0清0,有什么区别?

    单片机文档的时候一般寄存器是rw类型,还有一些是r或者w。对于一些特殊寄存器的置1是由硬件自动实现的,比如标志位flag、中断int;但清0还是需要通过软件进行操作。清0方式有两种,写1清0、写0清0。这两种方式有什么区别呢?在硬件实现上有什么不同? 单片机是可以进行位操作的,一个8位的寄存器,我们可以只针对其中一个位或者某些位进行操作,将寄存器相应的位赋值1(高电平)为置位,相反赋值0(低电平)为清零。这是一种比较容易理解的方式。 1)从电路角度去看,对某位写1,即输入一个高电平,使内部的一个三极管导通接地,电容放电进行清0。 2)写1是在硬件上产生一个复位脉冲。能写0清除就很可能也可以写1进去,而这与功能要求不符。如要控制只能写0而不能写1,则硬件比较复杂。 3)从应用便捷性角度来说,读了寄存器数据以后,照着写回去就可以清0,不用再更改一次数据。

    时间:2021-04-10 关键词: 单片机 寄存器

  • 干货 | 嵌入式开发常见问题解决方法

    链接:https://www.cnblogs.com/jozochen/p/8541714.html 一、问题复现 稳定复现问题才能正确的对问题进行定位、解决以及验证。一般来说,越容易复现的问题越容易解决。 1.1 模拟复现条件 有的问题存在于特定的条件下,只需要模拟出现问题的条件即可复现。对于依赖外部输入的条件,如果条件比较复杂难以模拟可以考虑程序里预设直接进入对应状态。 1.2 提高相关任务执行频率 例如某个任务长时间运行才出现异常则可以提高该任务的执行频率。 1.3 增大测试样本量 程序长时间运行后出现异常,问题难以复现,可以搭建测试环境多套设备同时进行测试。 二、问题定位 缩小排查范围,确认引入问题的任务、函数、语句。 2.1 打印LOG 根据问题的现象,在抱有疑问的代码处增加LOG输出,以此来追踪程序执行流程以及关键变量的值,观察是否与预期相符。 2.2 在线调试 在线调试可以起到和打印LOG类似的作用,另外此方法特别适合排查程序崩溃类的BUG,当程序陷入异常中断(HardFault,看门狗中断等)的时候可以直接STOP查看call stack以及内核寄存器的值,快速定位问题点。 2.3 版本回退 使用版本管理工具时可以通过不断回退版本并测试验证来定位首次引入该问题的版本,之后可以围绕该版本增改的代码进行排查。 2.4 二分注释 二分注释即以类似二分查找法的方式注释掉部分代码,以此判断问题是否由注释掉的这部分代码引起。 具体方法为将与问题不相干的部分代码注释掉一半,看问题是否解决,未解决则注释另一半,如果解决则继续将注释范围缩小一半,以此类推逐渐缩小问题的范围。 2.5 保存内核寄存器快照 Cortex M内核陷入异常中断时会将几个内核寄存器的值压入栈中,如下图: 我们可以在陷入异常中断时将栈上的内核寄存器值写入RAM的一段复位后保留默认值的区域内,执行复位操作后再从RAM将该信息读出并分析,通过PC、LR确认当时执行的函数,通过R0-R3分析当时处理的变量是否异常,通过SP分析是否可能出现栈溢出等。 三、问题分析处理 结合问题现象以及定位的问题代码位置分析造成问题的原因。 3.1 程序继续运行 3.1.1 数值异常 3.1.1.1 软件问题 1、数组越界 写数组时下标超出数组长度,导致对应地址内容被修改。如下: 此类问题通常需要结合map文件进行分析,通过map文件观察被篡改变量地址附近的数组,查看对该数组的写入操作是否存在如上图所示不安全的代码,将其修改为安全的代码。 2、栈溢出 0x20001ff8 g_val 0x20002000 栈底 ………… 栈空间 0x20002200 栈顶 如上图,此类问题也需要结合map文件进行分析。假设栈从高地址往低地址增长,如果发生栈溢出,则g_val的值会被栈上的值覆盖。 出现栈溢出时要分析栈的最大使用情况,函数调用层数过多,中断服务函数内进行函数调用,函数内部申明了较大的临时变量等都有可能导致栈溢出。 解决此类问题有以下方法: 在设计阶段应该合理分配内存资源,为栈设置合适的大小; 将函数内较大的临时变量加”static”关键字转化为静态变量,或者使用malloc()动态分配,将其放到堆上; 改变函数调用方式,降低调用层数。 3、判断语句条件写错 判断语句的条件容易把相等运算符“==”写成赋值运算符“=”导致被判断的变量值被更改,该类错误编译期不会报错且总是返回真。 建议将要判断的变量写到运算符的右边,这样错写为赋值运算符时会在编译期报错。还可以使用一些静态代码检查工具来发现此类问题。 4、同步问题 例如操作队列时,出队操作执行的过程中发生中断(任务切换),并且在中断(切换后的任务)中执行入队操作则可能破坏队列结构,对于这类情况应该操作时关中断(使用互斥锁同步)。 5、优化问题 如上图程序,本意是等待irq中断之后不再执行foo()函数,但被编译器优化之后,实际运行过程中flg可能被装入寄存器并且每次都判断寄存器内的值而不重新从ram里读取flg的值,导致即使irq中断发生foo()也一直运行,此处需要在flg的申明前加“volatile”关键字,强制每次都从ram里获取flg的值。 3.1.1.2 硬件问题 1、芯片BUG 芯片本身存在BUG,在某些特定情况下给单片机返回一个错误的值,需要程序对读回的值进行判断,过滤异常值。 2、通信时序错误 例如电源管理芯片Isl78600,假设现在两片级联,当同时读取两片的电压采样数据时,高端芯片会以固定周期通过菊花链将数据传送到低端芯片,而低端芯片上只有一个缓存区. 如果单片机不在规定时间内将低端芯片上的数据读走那么新的数据到来时将会覆盖当前数据,导致数据丢失。此类问题需要仔细分析芯片的数据手册,严格满足芯片通信的时序要求。 3.1.2 动作异常 3.1.2.1 软件问题 1、设计问题 设计中存在错误或者疏漏,需要重新评审设计文档。 2、实现与设计不符 代码的实现与设计文档不相符需要增加单元测试覆盖所有条件分支,进行代码交叉review。 3、状态变量异常 例如记录状态机当前状态的变量被篡改,分析该类问题的方法同前文数值异常部分。 3.1.2.2 硬件问题 1、硬件失效 目标IC失效,接收控制指令后不动作,需要排查硬件。 2、通信异常 与目标IC通信错误,无法正确执行控制命令,需要使用示波器或逻辑分析仪去观察通信时序,分析是否发出的信号不对或者受到外部干扰。 3.2 程序崩溃 3.2.1 停止运行 3.2.1.1 软件问题 1、HardFault 以下情况会造成HardFault: 在外设时钟门未使能的情况下操作该外设的寄存器; 跳转函数地址越界,通常发生在函数指针被篡改,排查方法同数值异常; 解引用指针时出现对齐问题: 以小端序为例,如果我们声明了一个强制对齐的结构体如下: 地址 0x00000000 0x00000001 0x00000002 0x00000003 变量名 Val0 Val1_low Val1_high Val2 值 0x12 0x56 0x34 0x78 此时a.val1的地址为0x00000001,如果以uint16_t类型去解引用此地址则会因为对齐问题进入HardFault,如果一定要用指针方式操作该变量则应当使用memcpy()。 2、中断服务函数中未清除中断标志 中断服务函数退出前不正确清除中断标志,当程序执行从中断服务函数内退出后又会立刻进入中断服务函数,表现出程序的“假死”现象。 3、NMI中断 调试时曾遇到SPI的MISO引脚复用NMI功能,当通过SPI连接的外设损坏时MISO被拉高,导致单片机复位后在把NMI引脚配置成SPI功能之前就直接进入NMI中断,程序挂死在NMI中断中。这种情况可以在NMI的中断服务函数内禁用NMI功能来使其退出NMI中断。 3.2.1.2 硬件问题 1、晶振未起振 2、供电电压不足 3、复位引脚拉低 3.2 .2 复位 3.2.2.1 软件问题 1、看门狗复位 除了喂狗超时导致的复位以外,还要注意看门狗配置的特殊要求,以Freescale KEA单片机为例,该单片机看门狗在配置时需要执行解锁序列(向其寄存器连续写入两个不同的值),该解锁序列必须在16个总线时钟内完成,超时则会引起看门狗复位。此类问题只能熟读单片机数据手册,注意类似的细节问题。 3.2.2.2 硬件问题 1、供电电压不稳 2、电源带载能力不足 四、回归测试 问题解决后需要进行回归测试,一方面确认问题是否不再复现,另一方面要确认修改不会引入其他问题。 五、经验总结 总结本次问题产生的原因及解决问题的方法,思考类似问题今后如何防范,对相同平台产品是否值得借鉴,做到举一反三,从失败中吸取经验。 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

    时间:2021-03-09 关键词: 嵌入式 数组 寄存器

  • 计算机的工作原理:RAM系列-八位寄存器

    前面说过的是1位寄存器,我们可以很容易扩展到8位,数据输入端i是相互独立的,“写”信号s并在一起,对8位信号输入统一控制: 也就是说,当s=1时,o=i;当s=0时,o处于保持状态。 8bit=1byte,可以把上面电路抽象成: 我们知道,每一位都有0和1两个状态,对于8位锁存器,有2^8=256个状态。 前面我们已经搞定如何控制将8位数据“写入”,那如何控制数据的“读出”呢?——很简单,再增加一个“使能器”: 组成很简单,8个与门,当e=1时,o=i;e=0时,o=0;可以抽象成: s相当于“写”的使能端,e相当于“读”的使能端。放在一起就是一个8位寄存器了,抽象如下: 其中R表示register。顾名思义,存储器的作用就是存储信息,并且能通过使能端控制信息的写入和读出。 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

    时间:2021-03-02 关键词: 工作原理 计算机 寄存器

  • 想为汽车类触觉应用找一款触觉驱动器?这一款应该不错哦

    想为汽车类触觉应用找一款触觉驱动器?这一款应该不错哦

    以下内容中,小编将对TI DRV2510-Q1 触觉驱动器的相关内容进行着重介绍和阐述,希望本文能帮您增进对该触觉驱动器的了解,和小编一起来看看吧。 一、DRV2510-Q1触觉驱动器概述 首先,在对DRV2510-Q1触觉驱动器进行展开描述之前,我们先来看看DRV2510-Q1触觉驱动器的一些基本信息。 DRV2510-Q1 器件是一款专为感性负载(例如,螺线管和音圈)而设计的大电流触觉驱动器。输出级含一个完整 H 桥,能够提供 3A 峰值电流。DRV2510-Q1 器件提供欠压闭锁、过流保护和过热保护等多种保护功能。DRV2510-Q1 触觉驱动器器件符合汽车类产品标准。集成的突降保护可降低外部电压钳位组件的成本和尺寸,板载负载诊断会通过数字接口报告致动器状态。 二、DRV2510-Q1触觉驱动器详述 在通用I2C操作方面,I2C总线使用两个信号SDA(数据)和SCL(时钟)在系统中的集成电路之间进行通信。总线串行传输数据,一次一位。 8位地址和数据字节首先以最高有效位(MSB)进行传输。另外,总线上传输的每个字节都由接收设备用一个确认位来确认。每个传输操作都以主设备驱动总线上的开始条件开始,并以主设备驱动总线上的停止条件结束。当时钟为逻辑高电平时,总线使用数据引脚(SDA)上的跳变指示启动和停止条件。 SDA信号从高到低的跳变表示开始,从低到高的跳变表示停止。正常的数据位转换必须在时钟周期的低电平时间内发生。主设备生成7位从设备地址和读写(R / W)位以开始与从设备的通信。然后,主设备等待确认条件。从设备在确认时钟周期内将SDA信号保持为低电平,以指示确认。发生确认时,主机发送序列的下一个字节。每个设备都有一个唯一的7位从机地址和一个R / W位(1个字节)寻址。所有兼容的设备都使用有线与连接通过双向总线共享相同的信号。在开始和停止条件之间可以传输的字节数不受限制。当最后一个字传输时,主机产生停止条件以释放总线。对SDA和SCL信号使用外部上拉电阻来设置总线的逻辑高电平。建议上拉电阻在660Ω和4.7kΩ之间。不允许SDA和SCL电压超过DRV2510-Q1触觉驱动器电源电压VDD。DRV2510-Q1触觉驱动器器件可作为I2C从器件1.8V逻辑阈值运行,但可以在VDD电压下运行,器件地址为0x5A(7位),或二进制1011010相当于0xB4(8位))用于写入,0xB5(8位)用于读取。 在单字节和多字节传输方面,串行控制接口支持所有寄存器的单字节和多字节R / W操作。在多字节读取操作期间,DRV2510-Q1触觉驱动器器件一次以一个字节响应数据,并从有符号寄存器开始。只要主设备继续以确认响应,设备就会做出响应。 DRV2510-Q1触觉驱动器支持顺序I2C寻址。 对于写事务,如果发布了一个寄存器,然后是该寄存器的数据以及随后的其余寄存器,则会发生顺序的I2C写事务。 对于I2C顺序写事务,然后将发出的寄存器用作起点,并且在发送停止或开始之前随后发送的数据量决定要写入多少个寄存器。 在单字节写方面,单字节数据写传输始于主设备发送起始条件,然后是I2C设备地址和读写位。读写位确定数据传输的方向。对于写数据传输,必须将读写位设置为0。在接收到正确的I2C设备地址和读写位之后,DRV2510-Q1触觉驱动器会以一个确认位进行响应。接下来,主机发送与所访问的DRV2510-Q1触觉驱动器内部存储器地址相对应的寄存器字节。收到寄存器字节后,设备再次以确认位响应。最后,主设备发送停止条件以完成单字节数据写入传输。 以上就是小编这次想要和大家分享的有关TI DRV2510-Q1触觉驱动器内容,希望大家对本次分享的内容已经具有一定的了解。如果您想要看不同类别的文章,可以在网页顶部选择相应的频道哦。

    时间:2021-02-23 关键词: 触觉驱动器 DRV2510-Q1 寄存器

  • 在学习低功耗设计?看看如何解决寄存器传输功耗问题

    在学习低功耗设计?看看如何解决寄存器传输功耗问题

    器件中的高功耗虽然是可以容忍的,但是在设计过程中,我们往往都在追求低功耗实现。上篇文章中,小编对MCU的低功耗设计有所解读。为增进大家对功耗的了解程度,本文将对寄存器传输级低功耗设计方法予以介绍。如果你对功耗、低功耗等内容具有兴趣,不妨继续往下阅读哦。 除了芯片的速度和面积等,人们对低功耗的期望也越来越高,因而在IC设计中加入低功耗设计非常必要。寄存器传输级的低功耗设计对降低整个芯片的功耗作用非常显著,本文讨论的三种寄存器传输级低功耗设计方法,经验证对动态功耗的降低很有效。 自集成电路问世以来,设计者在单个芯片上集成的晶体管的数量呈现出令人惊讶的增长速度。近30年,集成电路的发展一直遵循着“摩尔定律”:集成在芯片上的晶体管的数量每18个月就翻一番,芯片成本也相应下降。 图1:CMOS电路功耗的主要来源是动态功耗,由开关电流和短路电流造成。 在半导体工艺水平不断进步的同时,以电池供电的手持设备和膝上电脑也迅速普及,系统的功耗有时已经成为系统设计首要考虑的因素,因此,低功耗设计成为发展移动系统必然要解决的问题。 集成电路的低功耗设计分为系统级、寄存器传输级、门级、电路级四个层次,而在这其中,寄存器传输级的低功耗设计对优化整个系统功耗的贡献达到20%-50%,这是非常巨大的比例。因而,在寄存器传输级进行低功耗设计是非常值得,也是很有必要的。 集成电路中功耗的来源 目前,CMOS工艺在集成电路特别是数字IC中应用得很普遍。由于CMOS电路在输入稳定的时候总有一个管子截止,所以它的静态功耗在理想情况下应该是零,但这并不代表静态功耗真的为零,实际上CMOS电路的静态功耗就是指电路中的漏电流(这里不考虑亚阈值电流)。 CMOS电路功耗的主要来源是动态功耗,它由两部分组成:开关电流和短路电流。 所以,整个CMOS电路的功耗为:其中,PTurn是开关电流ITurn产生的动态功耗;Pshort是动态情况下P管和N管同时导通时的短路电流Ishort产生的动态功耗;而Pleakage 是由扩散区和衬底之间的反向偏置漏电流Ileakage产生的静态功耗。如图1所示。 图2a:传统的设计。图2b:增加了门控时钟的设计。 在这三项中PTurn大约占电路功耗的80% ,因而这里就只考虑开关电流ITurn所产生的动态功耗PTurn。ITurn是这样产生的:在CMOS电路,当输入为“0”时,PMOS导通,电源通过PMOS向负载电容充电;而当电路输入为“1” 时,负载电容又会通过NMOS向地放电。ITurn就是不断对负载电容充放电所产生的开关电流。 一个CMOS反相器由开关电流引起的平均动态功耗是:PTurn=CLVDD2f其中,CL是负载电容,VDD是电路的电压,f是时钟频率。所以,要想降低电路的功耗就应该降低电路的电压和频率。 寄存器传输级的低功耗设计 图3a:最基本的加法器设计。图3b:采用操作数隔离方法设计的加法器。 寄存器传输级的低功耗设计方法有很多种,本文只列举三种最为常用的设计方法:门时钟、操作数隔离及存储器分区访问。 1.门控时钟 从上面的讨论知道,CMOS电路的功耗是和频率有着密切关系的,因此动态的关闭处于空闲状态的时钟具有明显的节电效果。 图2a是传统的设计:系统的时钟直接接到D触发器的时钟输入端,不管什么情况,只要输入的Clock翻转,触发器就会工作,整个系统也一直不断的运行。而图2b是增加了门控时钟的设计:当系统正常工作时,译码出来的En信号为高,则触发器可以正常锁存数据;当系统处于空闲状态时,把En信号清零,这样,由于给触发器的Clock一直保持零,不会发生翻转,所以触发器不会锁存新的数据,整个系统被挂起,系统将进入低功耗模式。 在电路中加入门控时钟很容易,可以用Verilog直接在描述中加入,也可以通过Synopsys的工具PowerCompile自动加入。通过加入门控时钟,系统可以有选择的停止不相关模块的时钟,以最大程度的节省动态功耗。 2.操作数隔离 这种方法主要是对系统中的算术、逻辑运算模块进行低功耗设计,其主要思想就是:在不进行算术、逻辑运算的时候,使这些模块的输入保持“0”,不让操作数进来,输出结果不会翻转;而如果进行这方面的运算时,再将它们打开。 图4:存储器分块访问实例。 这种方法在很多人看来是理所当然的,认为就应该是这样设计。然而在实际中,设计者一方面关心模块的功能,另一方面迫于设计时间的压力,所以很多设计中的细节没有考虑。如图3a,一个加法器的两个输入端没有经过任何逻辑直接进入加法器,系统不管是否需要加法运算,加法器都一直工作着,输出不断翻转着,这对系统的动态功耗是很大的浪费,而且数据总线越宽浪费的功耗越多;图3b 则用操作数隔离的方法进行设计:当系统不需要加法运算的时候,Adder_en信号为“0”,则加法器的两个输入端都保持“0”, 其输出不会发生任何翻转,不会产生动态功耗,而如果需要进行加法运算时,Adder_en变成“1”,加法器正常工作。 当对系统里所有的算术、逻辑运算单元都用上这种方法必然会对系统的动态功耗有很大的优化,在芯片面积方面,如图3b所示的,所增加的逻辑仅仅是几个多路器而已。 3.存储器分块访问 一个系统里少不了存储器,存储器的功耗在整个系统里所占的比例不可忽视。因而降低存储器的功耗,对于整个芯片系统的功耗优化很有帮助。 这里提出一种叫做存储器分块访问的方法来降低存储器的功耗。主要思想是:将系统所需要一定容量的存储器分成两块,然后用高位地址线进行片选译码。结合下面的实例: 假设一个系统需要128K的RAM,如图4所示,我们选用两块64KB的RAM。CPU给出了17位地址线,其中低16位地址线直接提供给两个RAM,最高位地址线接到下面RAM的片选端CS,而这根地址线经过一个反相器接到另一个RAM的片选端。通过这种方法,不管从CPU 出来的什么样的地址,则每次只会选中一个64KB的RAM。如果采用单块128KB的RAM,则每次都要选中一块128KB的RAM。众所周知,一块64KB RAM的功耗要远小于一块128KB RAM的功耗。这样从存储器这一方面,又为系统节省了功耗。 表1:一款SIM卡芯片设计优化前后功耗及芯片面积的对比。 功耗和面积永远是相矛盾的,如果想要降低系统的功耗,必然要加上一些控制逻辑来进行功耗优化,而这部分逻辑会增加芯片的面积,所以在功耗和面积之间就要有个折衷。上面的三种寄存器传输级的低功耗设计,不会增加很多逻辑,因而对芯片面积的影响不大。而经过了这三种低功耗设计,使整个系统动态功耗的改善很明显。例如,使用功耗仿真工具powermill对一款SIM卡芯片设计进行管级功耗仿真,这里采用的是华杰的0.25um的标准单元库,表1是优化前后功耗及芯片面积的对比。 从表1可以看到,经过低功耗设计后的芯片平均动态电流比优化前降了16%,然而优化前后芯片的面积没有发生改变,因而,上面的三种设计方法对于降低系统动态功耗是非常有效的。 以上便是此次小编带来的“功耗”相关内容,通过本文,希望大家对寄存器传输级低功耗设计具备一定的了解。如果你喜欢本文,不妨持续关注我们网站哦,小编将于后期带来更多精彩内容。最后,十分感谢大家的阅读,have a nice day!

    时间:2021-02-09 关键词: 功耗 指数 寄存器

  • 爱了爱了,这篇寄存器讲的有点意思

    点击蓝色“程序员cxuan ”关注我哟 加个“星标”,欢迎来撩 这是程序员cxuan的第 41期原创分享 下面我们就来介绍一下关于寄存器的相关内容。我们知道,寄存器是 CPU 内部的构造,它主要用于信息的存储。除此之外,CPU 内部还有运算器,负责处理数据;控制器控制其他组件;外部总线连接 CPU 和各种部件,进行数据传输;内部总线负责 CPU 内部各种组件的数据处理。 那么对于我们所了解的汇编语言来说,我们的主要关注点就是 寄存器。 为什么会出现寄存器?因为我们知道,程序在内存中装载,由 CPU 来运行,CPU 的主要职责就是用来处理数据。那么这个过程势必涉及到从存储器中读取和写入数据,因为它涉及通过控制总线发送数据请求并进入存储器存储单元,通过同一通道获取数据,这个过程非常的繁琐并且会涉及到大量的内存占用,而且有一些常用的内存页存在,其实是没有必要的,因此出现了寄存器,存储在 CPU 内部。 认识寄存器 寄存器的官方叫法有很多,Wiki 上面的叫法是 Processing Register, 也可以称为 CPU Register,计算机中经常有一个东西多种叫法的情况,反正你知道都说的是寄存器就可以了。 认识寄存器之前,我们首先先来看一下 CPU 内部的构造。 CPU 从逻辑上可以分为 3 个模块,分别是控制单元、运算单元和存储单元,这三部分由 CPU 内部总线连接起来。 几乎所有的冯·诺伊曼型计算机的 CPU,其工作都可以分为5个阶段:「取指令、指令译码、执行指令、访存取数、结果写回」。 取指令阶段是将内存中的指令读取到 CPU 中寄存器的过程,程序寄存器用于存储下一条指令所在的地址 指令译码阶段,在取指令完成后,立马进入指令译码阶段,在指令译码阶段,指令译码器按照预定的指令格式,对取回的指令进行拆分和解释,识别区分出不同的指令类别以及各种获取操作数的方法。 执行指令阶段,译码完成后,就需要执行这一条指令了,此阶段的任务是完成指令所规定的各种操作,具体实现指令的功能。 访问取数阶段,根据指令的需要,有可能需要从内存中提取数据,此阶段的任务是:根据指令地址码,得到操作数在主存中的地址,并从主存中读取该操作数用于运算。 结果写回阶段,作为最后一个阶段,结果写回(Write Back,WB)阶段把执行指令阶段的运行结果数据写回到 CPU 的内部寄存器中,以便被后续的指令快速地存取; 计算机架构中的寄存器 寄存器是一块速度非常快的计算机内存,下面是现代计算机中具有存储功能的部件比对,可以看到,寄存器的速度是最快的,同时也是造价最高昂的。 我们以 intel 8086 处理器为例来进行探讨,8086 处理器是 x86 架构的前身。在 8086 后面又衍生出来了 8088 。 在 8086 CPU 中,地址总线达到 20 根,因此最大寻址能力是 2^20 次幂也就是 1MB 的寻址能力,8088 也是如此。 在 8086 架构中,所有的内部寄存器、内部以及外部总线都是 16 位宽,可以存储两个字节,因为是完全的 16 位微处理器。8086 处理器有 14 个寄存器,每个寄存器都有一个特有的名称,即 「AX,BX,CX,DX,SP,BP,SI,DI,IP,FLAG,CS,DS,SS,ES」 这 14 个寄存器有可能进行具体的划分,按照功能可以分为三种 通用寄存器 控制寄存器 段寄存器 下面我们分别介绍一下这几种寄存器 通用寄存器 通用寄存器主要有四种 ,即 「AX、BX、CX、DX」 同样的,这四个寄存器也是 16 位的,能存放两个字节。AX、BX、CX、DX 这四个寄存器一般用来存放数据,也被称为 数据寄存器。它们的结构如下 8086 CPU 的上一代寄存器是 8080 ,它是一类 8 位的 CPU,为了保证兼容性,8086 在 8080 上做了很小的修改,8086 中的通用寄存器 AX、BX、CX、DX 都可以独立使用两个 8 位寄存器来使用。 在细节方面,AX、BX、CX、DX 可以再向下进行划分 AX(Accumulator Register) :累加寄存器,它主要用于输入/输出和大规模的指令运算。 BX(Base Register):基址寄存器,用来存储基础访问地址 CX(Count Register):计数寄存器,CX 寄存器在迭代的操作中会循环计数 DX(data Register):数据寄存器,它也用于输入/输出操作。它还与 AX 寄存器以及 DX 一起使用,用于涉及大数值的乘法和除法运算。 这四种寄存器可以分为上半部分和下半部分,用作八个 8 位数据寄存器 「AX 寄存器可以分为两个独立的 8 位的 AH 和 AL 寄存器;」 「BX 寄存器可以分为两个独立的 8 位的 BH 和 BL 寄存器;」 「CX 寄存器可以分为两个独立的 8 位的 CH 和 CL 寄存器;」 「DX 寄存器可以分为两个独立的 8 位的 DH 和 DL 寄存器;」 除了上面 AX、BX、CX、DX 寄存器以外,其他寄存器均不可以分为两个独立的 8 位寄存器 如下图所示。 合起来就是 AX 的低位(0 - 7)位构成了 AL 寄存器,高 8 位(8 - 15)位构成了 AH 寄存器。AH 和 AL 寄存器是可以使用的 8 位寄存器,其他同理。 在认识了寄存器之后,我们通过一个示例来看一下数据的具体存储方式。 比如数据 19 ,它在 16 位存储器中所存储的表示如下 寄存器的存储方式是先存储低位,如果低位满足不了就存储高位,如果低位能够满足,高位用 0 补全,在其他低位能满足的情况下,其余位也用 0 补全。 8086 CPU 可以一次存储两种类型的数据 字节(byte):一个字节由 8 bit 组成,这是一种恒定不变的存储方式 字(word):字是由指令集或处理器硬件作为单元处理的固定大小的数据,对于 intel 来说,一个字长就是两个字节,字是计算机一个非常重要的特征,针对不同的指令集架构来说,计算机一次处理的数据也是不同的。也就是说,针对不同指令集的机器,一次能处理不用的字长,有字、双字(32位)、四字(64位)等。 AX 寄存器 我们上面探讨过,AX 的另外一个名字叫做累加寄存器或者简称为累加器,其可以分为 2 个独立的 8 位寄存器 AH 和 AL;在编写汇编程序中,AX 寄存器可以说是使用频率最高的寄存器。 下面是几段汇编代码 mov ax,20 /* 将 20 送入寄存器 AX*/mov ah,80 /* 将 80 送入寄存器 AH*/add ax,10 /* 将寄存器 AX 中的数值加上 8 */ 这里注意下:上面代码中出现的是 ax、ah ,而注释中确是 AX、AH ,其实含义是一样的,不区分大小写。 AX 相比于其他通用寄存器来说,有一点比较特殊,AX 具有一种特殊功能的使用,那就是使用 DIV 和 MUL 指令式使用。 DIV 是 8086 CPU 中的除法指令。 MUL 是 8086 CPU 中的乘法指令。 BX 寄存器 BX 被称为数据寄存器,即表明其能够暂存一般数据。同样为了适应以前的 8 位 CPU ,而可以将 BX 当做两个独立的 8 位寄存器使用,即有 BH 和 BL。BX 除了具有暂存数据的功能外,还用于 寻址,即寻找物理内存地址。BX 寄存器中存放的数据一般是用来作为偏移地址 使用的,因为偏移地址当然是在基址地址上的偏移了。偏移地址是在段寄存器中存储的,关于段寄存器的介绍,我们后面再说。 CX 寄存器 CX 也是数据寄存器,能够暂存一般性数据。同样为了适应以前的 8 位 CPU ,而可以将 CX 当做两个独立的 8 位寄存器使用,即有 CH 和 CL。除此之外,CX 也是有其专门的用途的,CX 中的 C 被翻译为 Counting 也就是计数器的功能。当在汇编指令中使用循环 LOOP 指令时,可以通过 CX 来指定需要循环的次数,每次执行循环 LOOP 时候,CPU 会做两件事 一件事是计数器自动减 1 还有一件就是判断 CX 中的值,如果 CX 中的值为 0 则会跳出循环,而继续执行循环下面的指令, 当然如果 CX 中的值不为 0 ,则会继续执行循环中所指定的指令 。 DX 寄存器 DX 也是数据寄存器,能够暂存一般性数据。同样为了适应以前的 8 位 CPU ,DX 的用途其实在前面介绍 AX 寄存器时便已经有所介绍了,那就是支持 MUL 和 DIV 指令。同时也支持数值溢出等。 段寄存器 CPU 包含四个段寄存器,用作程序指令,数据或栈的基础位置。实际上,对 IBM PC 上所有内存的引用都包含一个段寄存器作为基本位置。 段寄存器主要包含 CS(Code Segment) :代码寄存器,程序代码的基础位置 DS(Data Segment):数据寄存器,变量的基本位置 SS(Stack Segment):栈寄存器,栈的基础位置 ES(Extra Segment):其他寄存器,内存中变量的其他基本位置。 索引寄存器 索引寄存器主要包含段地址的偏移量,索引寄存器主要分为 BP(Base Pointer):基础指针,它是栈寄存器上的偏移量,用来定位栈上变量 SP(Stack Pointer): 栈指针,它是栈寄存器上的偏移量,用来定位栈顶 SI(Source Index): 变址寄存器,用来拷贝源字符串 DI(Destination Index): 目标变址寄存器,用来复制到目标字符串 状态和控制寄存器 就剩下两种寄存器还没聊了,这两种寄存器是指令指针寄存器和标志寄存器: IP(Instruction Pointer):指令指针寄存器,它是从 Code Segment 代码寄存器处的偏移来存储执行的下一条指令 FLAG : Flag 寄存器用于存储当前进程的状态,这些状态有 位置 (Direction):用于数据块的传输方向,是向上传输还是向下传输 中断标志位 (Interrupt) :1 - 允许;0 - 禁止 陷入位 (Trap) :确定每条指令执行完成后,CPU 是否应该停止。1 - 开启,0 - 关闭 进位 (Carry) : 设置最后一个无符号算术运算是否带有进位 溢出 (Overflow) : 设置最后一个有符号运算是否溢出 符号 (Sign) : 如果最后一次算术运算为负,则设置  1 =负,0 =正 零位 (Zero) : 如果最后一次算术运算结果为零,1 = 零 辅助进位 (Aux Carry) :用于第三位到第四位的进位 奇偶校验 (Parity) : 用于奇偶校验 物理地址 我们大家都知道, CPU 访问内存时,需要知道访问内存的具体地址,内存单元是内存的基本单位,每一个内存单元在内存中都有唯一的地址,这个地址即是 物理地址。而 CPU 和内存之间的交互有三条总线,即数据总线、控制总线和地址总线。 CPU 通过地址总线将物理地址送入存储器,那么 CPU 是如何形成的物理地址呢?这将是我们接下来的讨论重点。 现在,我们先来讨论一下和 8086 CPU 有关的结构问题。 cxuan 和你聊了这么久,你应该知道 8086 CPU 是 16 位的 CPU 了,那么,什么是 16 位的 CPU 呢? 你可能大致听过这个回答,16 位 CPU 指的是 CPU 一次能处理的数据是 16 位的,能回答这个问题代表你的底层还不错,但是不够全面,其实,16 位的 CPU 指的是 CPU 内部的运算器一次最多能处理 16 位的数据 运算器其实就是 ALU,运算控制单元,它是 CPU 内部的三大核心器件之一,主要负责数据的运算。 寄存器的最大宽度为 16 位 这个寄存器的最大宽度值就是通用寄存器能处理的二进制数的最大位数 寄存器和运算器之间的通路为 16 位 这个指的是寄存器和运算器之间的总线,一次能传输 16 位的数据 好了,现在你应该知道为什么叫做 16 位 CPU 了吧。 在你知道上面这个问题的答案之后,我们下面就来聊一聊如何计算物理地址。 8086 CPU 有 20 位地址总线,每一条总线都可以传输一位的地址,所以 8086 CPU 可以传送 20 位地址,也就是说,8086 CPU 可以达到 2^20 次幂的寻址能力,也就是 1MB。8086 CPU 又是 16 位的结构,从 8086 CPU 的结构看,它只能传输 16 位的地址,也就是 2^16 次幂也就是 64 KB,那么它如何达到 1MB 的寻址能力呢? 原来,8086 CPU 的内部采用两个 16 位地址合成的方式来传输一个 20 位的物理地址,如下图所示 叙述一下上图描述的过程 CPU 相关组件提供两个地址:段地址和偏移地址,这两个地址都是 16 位的,他们经由地址加法器变为 20 位的物理地址,这个地址即是输入输出控制电路传递给内存的物理地址,由此完成物理地址的转换。 地址加法器采用 「物理地址 = 段地址 * 16 + 偏移地址」 的方法用段地址和偏移地址合成物理地址。 下面是地址加法器的工作流程 其实段地址 * 16 ,就是左移 4 位。在上面的叙述中,物理地址 = 段地址 * 16 + 偏移地址,其实就是「基础地址 + 偏移地址 = 物理地址」 寻址模式的一种具体实现方案。基础地址其实就等于段地址 * 16。 你可能不太清楚 段 的概念,下面我们就来探讨一下。 什么是段 段这个概念经常出现在操作系统中,比如在内存管理中,操作系统会把不同的数据分成 段来存储,比如 「代码段、数据段、bss 段、rodata 段」 等。 但是这些的划分并不是内存干的,cxuan 告诉你是谁干的,这其实是幕后 Boss CPU 搞的,内存当作了声讨的对象。 其实,内存没有进行分段,分段完全是由 CPU 搞的,上面聊过的通过基础地址 + 偏移地址 = 物理地址的方式给出内存单元的物理地址,使得我们可以分段管理 CPU。 如图所示 这是两个 16 KB 的程序分别被装载进内存的示意图,可以看到,这两个程序的段地址的大小都是 16380。 这里需要注意一点, 8086 CPU 段地址的计算方式是段地址 * 16,所以,16 位的寻址能力是 2^16 次方,所以一个段的长度是 64 KB。 段寄存器 cxuan 在上面只是简单为你介绍了一下段寄存器的概念,介绍的有些浅,而且介绍段寄存器不介绍段也有「不知庐山真面目」的感觉,现在为你详细的介绍一下,相信看完上面的段的概念之后,段寄存器也是手到擒来。 我们在合成物理地址的那张图提到了 相关部件 的概念,这个相关部件其实就是段寄存器,即 「CS、DS、SS、ES」 。8086 的 CPU 在访问内存时,由这四个寄存器提供内存单元的段地址。 CS 寄存器 要聊 CS 寄存器,那么 IP 寄存器是你绕不过去的曾经。CS 和 IP 都是 8086 CPU 非常重要的寄存器,它们指出了 CPU 当前需要读取指令的地址。 CS 的全称是 Code Segment,即代码寄存器;而 IP 的全称是 Instruction Pointer ,即指令指针。现在知道这两个为什么一起出现了吧! 在 8086 CPU 中,由 CS:IP 指向的内容当作指令执行。如下图所示 说明一下上图 在 CPU 内部,由 CS、IP 提供段地址,由加法器负责转换为物理地址,输入输出控制电路负责输入/输出数据,指令缓冲器负责缓冲指令,指令执行器负责执行指令。在内存中有一段连续存储的区域,区域内部存储的是机器码、外面是地址和汇编指令。 上面这幅图的段地址和偏移地址分别是 2000 和 0000,当这两个地址进入地址加法器后,会由地址加法器负责将这两个地址转换为物理地址 然后地址加法器负责将指令输送到输入输出控制电路中 输入输出控制电路将 20 位的地址总线送到内存中。 然后取出对应的数据,也就是 「B8、23、01」,图中的 B8、BB 都是操作数。 控制输入/输出电路会将 B8 23 01 送入指令缓存器中。 此时这个指令就已经具备执行条件,此时 IP 也就是指令指针会自动增加。我们上面说到 IP 其实就是从 Code Segment 也就是 CS 处偏移的地址,也就是偏移地址。它会知道下一个需要读取指令的地址,如下图所示 在这之后,指令执行执行取出的 B8 23 01 这条指令。 然后下面再把 2000 和 0003 送到地址加法器中再进行后续指令的读取。后面的指令读取过程和我们上面探讨的如出一辙,这里 cxuan 就不再赘述啦。 通过对上面的描述,我们能总结一下 8086 CPU 的工作过程 段寄存器提供段地址和偏移地址给地址加法器 由地址加法器计算出物理地址通过输入输出控制电路将物理地址送到内存中 提取物理地址对应的指令,经由控制电路取回并送到指令缓存器中 IP 继续指向下一条指令的地址,同时指令执行器执行指令缓冲器中的指令 什么是 Code Segment Code Segment 即代码段,它就是我们上面聊到就是 CS 寄存器中存储的基础地址,也就是段地址,段地址其本质上就是一组内存单元的地址,例如上面的 「mov ax,0123H 、mov bx, 0003H」。我们可以将长度为 N 的一组代码,存放在一组连续地址、其实地址为 16 的倍数的内存单元中,我们可以认为,这段内存就是用来存放代码的。 DS 寄存器 CPU 在读写一个内存单元的时候,需要知道这个内存单元的地址。在 8086 CPU 中,有一个 DS 寄存器,通常用来存放访问数据的段地址。如果你想要读取一个 10000H 的数据,你可能会需要下面这段代码 mov bx,10000Hmov ds,bxmov a1,[0] 上面这三条指令就把 10000H 读取到了 a1 中。 在上面汇编代码中,mov 指令有两种传送方式 一种是把数据直接送入寄存器 一种是将一个寄存器的内容送入另一个寄存器 但是不仅仅如此,mov 指令还具有下面这几种表达方式 描述 举例 mov 寄存器,数据 比如:mov ax,8 mov 寄存器,寄存器 比如:mov ax,bx mov 寄存器,内存单元 比如:mov ax,[0] mov 内存单元,寄存器 比如:mov[0], ax mov 段寄存器,寄存器 比如:mov ds,ax 栈 栈我相信大部分小伙伴已经非常熟悉了,栈是一种具有特殊的访问方式的存储空间。它的特殊性就在于,先进入栈的元素,最后才出去,也就是我们常说的 先入后出。 它就像一个大的收纳箱,你可以往里面放相同类型的东西,比如书,最先放进收纳箱的书在最下面,最后放进收纳箱的书在最上面,如果你想拿书的话, 必须从最上面开始取,否则是无法取出最下面的书籍的。 栈的数据结构就是这样,你把书籍压入收纳箱的操作叫做压入(push),你把书籍从收纳箱取出的操作叫做弹出(pop),它的模型图大概是这样 入栈相当于是增加操作,出栈相当于是删除操作,只不过叫法不一样。栈和内存不同,它不需要指定元素的地址。它的大概使用如下 // 压入数据Push(123);Push(456);Push(789);// 弹出数据j = Pop();k = Pop();l = Pop(); 在栈中,LIFO 方式表示栈的数组中所保存的最后面的数据(Last In)会被最先读取出来(First Out)。 栈和 SS 寄存器 下面我们就通过一段汇编代码来描述一下栈的压入弹出的过程 8086 CPU 提供入栈和出栈指令,最基本的两个是 PUSH(入栈) 和 POP(出栈)。比如 push ax 会把 ax 寄存器中的数据压入栈中,pop ax 表示从栈顶取出数据送入 ax 寄存器中。 这里注意一点:8086 CPU 中的入栈和出栈都是以字为单位进行的。 我这里首先有一个初始的栈,没有任何指令和数据。 然后我们向栈中 push 数据后,栈中数据如下 涉及的指令有 mov ax,2345Hpush ax 注意,数据会用两个单元存放,高地址单元存放高 8 位地址,低地址单元存放低 8 位。 再向栈中 push 数据 其中涉及的指令有 mov bx,0132Hpush bx 现在栈中有两条数据,现在我们执行出栈操作 其中涉及的指令有 pop ax/* ax = 0132H */ 再继续取出数据 涉及的指令有 pop bx/* bx = */ 完整的 push 和 pop 过程如下 现在 cxuan 问你一个问题,我们上面描述的是 10000H ~ 1000FH 这段空间来作为 push 和 pop 指令的存取单元。但是,你怎么知道这个栈单元就是 10000H ~ 1000FH 呢?也就是说,你如何选择指定的栈单元进行存取? 事实上,8086 CPU 有一组关于栈的寄存器 SS 和 SP。SS 是段寄存器,它存储的是栈的基础位置,也就是栈顶的位置,而 SP 是栈指针,它存储的是偏移地址。在任意时刻,SS:SP 都指向栈顶元素。push 和 pop 指令执行时,CPU 从 SS 和 SP 中得到栈顶的地址。 现在,我们可以完整的描述一下 push 和 pop 过程了,下面 cxuan 就给你推导一下这个过程。 上面这个过程主要涉及到的关键变化如下。 当使用 「PUSH」 指令向栈中压入 1 个字节单元时,SP = SP - 1;即栈顶元素会发生变化; 而当使用 「PUSH」 指令向栈中压入 2 个字节的字单元时,SP = SP – 2 ;即栈顶元素也要发生变化; 当使用 「POP」 指令从栈中弹出 1 个字节单元时, SP = SP + 1;即栈顶元素会发生变化; 当使用 「POP」 指令从栈中弹出 2 个字节单元的字单元时, SP = SP + 2 ;即栈顶元素会发生变化; 栈顶越界问题 现在我们知道,8086 CPU 可以使用 SS 和 SP 指示栈顶的地址,并且提供 PUSH 和 POP 指令实现入栈和出栈,所以,你现在知道了如何能够找到栈顶位置,但是你如何能保证栈顶的位置不会越界呢?栈顶越界会产生什么影响呢? 比如如下是一个栈顶越界的示意图 第一开始,SS:SP 寄存器指向了栈顶,然后向栈空间 push 一定数量的元素后,SS:SP 位于栈空间顶部,此时再向栈空间内部 push 元素,就会出现栈顶越界问题。 栈顶越界是危险的,因为我们既然将一块区域空间安排为栈,那么在栈空间外部也可能存放了其他指令和数据,这些指令和数据有可能是其他程序的,所以如此操作会让计算机懵逼。 我们希望 8086 CPU 能自己解决问题,毕竟 8086 CPU 已经是个成熟的 CPU 了,要学会自己解决问题了。 然鹅(故意的),这对于 8086 CPU 来说,这可能是它一辈子的 夙愿 了,真实情况是,8086 CPU 不会保证栈顶越界问题,也就是说 8086 CPU 只会告诉你栈顶在哪,并不会知道栈空间有多大,所以需要程序员自己手动去保证。。。 往期推荐 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

    时间:2020-12-02 关键词: 嵌入式 寄存器

  • LCD驱动的移植及其GUI仿真如何进行,LCD数模转换现实原理及其源代码

    LCD驱动的移植及其GUI仿真如何进行,LCD数模转换现实原理及其源代码

      LCD字模显示程序如何设计?   系统中显示部分的子程序与字模数据结构互相关联,这里将ASCII字符显示子程序和单独显示汉字字模的子程序列出来,根据这两个子程序也可以看出显示部分的显示程序实现原理。   在这个子程序中,x指的是汉字行,只能是0~3共4行;y指的是半角字符列,只能是0~15共16列,因而可以在屏幕任何一个半角字符位置上显示一个ASCII半角字符。在处理汉字时是将汉字当作两个半角字符来处理的,显示时将一个汉字分左上、左下、右上、右下4个部分顺序显示出来,从下面的显示汉字字模子程序中可以看出这一点。   从程序中可以看出,当j=0时写的是第工个汉字的左上和左下,然后在j的循环过程中依次显示的是第一个汉字的右上、右下,第二个汉字的左上、左下,第二个汉字的右上、右下。实际上LCD的起始页,表示起始显示的8行,也就是表示一个半角字符的上半部分。这就是显示部分汉字的显示过程。   S3C2410 LCD 驱动程序移植及GUI程序编写:   1. 为了不让大家觉枯燥,让朋友们更好的理解,我以一个实例来叙述 S3C2410 下一个驱动程序的编写(本文的初始化源码以华恒公司提供的 s3c2410fb.c 为基础)及简单的 GUI程序的编写。   2. 拿到一块 LCD,首先要将 LCD的各个控制线与 S3C2410 的 LCD控制信号相接,当然,电源也一定要接入了,否则不亮可别找我。另外需要注意以下几点:   1) 背光:对于大部分的彩色 LCD一定要接背光,我们才能看到屏上的内容;   2) 控制信号:不同的 LCD 厂商对于控制信号有不同的叫法,S3C2410 芯片手册也给出了一个信号的多个名称(图一),这就要看你们硬件工程师的功底了,   图一 S3C2410 手册上给出的控制信号的名称及解释   这里我做一个简单的介绍:   VFRAME:LCD 控制器和 LCD 驱动器之间的帧同步信号。该信号告诉 LCD屏的新的一帧开始了。LCD 控制器在一个完整帧显示完成后立即插入一个VFRAME 信号,开始新一帧的显示;   VLINE:LCD控制器和 LCD驱动器之间的线同步脉冲信号,该信号用于 LCD驱动器将水平线(行)移位寄存器的内容传送给 LCD 屏显示。LCD 控制器在整个水平线(整行)数据移入 LCD驱动器后,插入一个 VLINE 信号;   VCLK:LCD控制器和 LCD驱动器之间的像素时钟信号,由 LCD控制器送出的数据在 VCLK的上升沿处送出,在 VCLK的下降沿处被 LCD驱动器采样;   VM:LCD驱动器的 AC 信号。VM 信号被 LCD驱动器用于改变行和列的电压极性,从而控制像素点的显示或熄灭。VM 信号可以与每个帧同步,也可以与可变数量的 VLINE 信号同步。   3) 数据线:也就是我们说的 RGB 信号线,S3C2410 芯片手册上都有详细的说明,由于篇幅关系,在此不一一摘录,不过需要与硬件工程是配合的是他采用了哪种接线方法,24 位 16 位或其它。对于 16 位 TFT 屏又有两种方式,在写驱动前你要清楚是 5:6:5还是 5:5:5:I,这些与驱动的编写都有关系   4) 要注意一下 LCD 的电源电压,对于手持设备来说一般都为 5V 或 3.3V,或同时支持 5V和 3.3V,如果 LCD的需要的电源电压是 5V,那就要注意了,S3C2410 的逻辑输出电压只有 3.3V,此时一定要让你们的硬件工程师帮忙把 S3C2410 的逻辑输出电压提高到 5V,否则你可能能将屏点亮,但显示的图像要等到太阳从西边出来的那一天才能正常,呵呵,我可吃过苦头的哦!   5) 3.3V逻辑电压转变成 5V逻辑电压电路图   6) 最后还有一个问题,有些 LCD 屏还需要一颗伴侣芯片,就是 S3C2410 手册中的那颗 LPC3600。这可能在 LCD 的手册中都有论述吧,我没有遇到过这样的屏,所以也不是很清楚。那么是不是所有的屏与 S3C2410相接都需要那个讨厌的家伙呢?这是好多人(包括我)在最开始都会有的疑问,不过现在的大部分 LCD 屏应该都不需要这个讨厌的家伙了,屏的控制信号直接与 S3C2410 的控制信号相接就可以了,至少我还没有遇到过。   7) 还得提醒大家一下,S3C2410到 LCD屏的连线千万千万别超过 0.5 米,否则会给你带来麻烦,我也是吃过苦头的,LCD屏上面的部分显示任何信息都是正确的,而只有屏的底部会有时正确有时错误,折腾了好一阵,才知道是连线太长的缘故!   3. 好了,在硬件工程师的帮助下,硬件接好了,那就该我们做软件的干活了,编写驱动吧   1) 让我们首先看一下 RGB数据结构的定义   在 s3c2410fb.c 中找到如下信息   staTIc struct s3c2410fb_rgb xxx_tft_rgb_16 = {   red: {offset:11, length:5,},   green: {offset:5, length:6,},   blue: {offset:0, length:5,},   transp: {offset:0, length:0,},   };   这是对 16 位色的 RGB 颜色进行定义,R:G:B:I = 5:6:5:0,即我们常说的565 显示方式。呵呵,为了让有些朋友更好的理解,我多罗嗦几句,我们随便写一个 16 位数据的颜色数据(为了分析的方便,我把它写成二进制)   RGB = 10101101 10111001   根据上面的结构定义我们来分析一下 RGB 各是多少(因为没有透明色,我们不去分析)   a) blue: {offset: 0, length: 5} 偏移量为 0,长度为 5,我们从那个 RGB 中提取出来便是“11001”   b) green:{offset: 5, length: 6} 偏移量为 5,长度为 6,我们从那个 RGB 中提取出来便是 101 101   c) red: {offset: 11, length: 5 } 偏移量为 11,长度为 5,我们从那个 RGB 中提取出来便是 10101   d) 我们得到了一个 RGB 值为 13:45:200,就是这个颜色   e) 那么反过来,有了 RGB的值我们该如何,因为 RGB 的有效位数都不足一个字节(8 位),那我们只能忍痛割爱了,舍弃掉低位数据,代码如下   r=(rDat&0xF8);   g=(gDat&0xFC);   b=(bDat&0xF8);   hight=r|(g《《5);   low=(g》》3)|(b《《3);   color=(hight》》8)|low;   记住,这段代码在 GUI 程序中是有用的   2) 对于 8 位色(256 色)的数据结构定义   staTIc struct s3c2410fb_rgb rgb_8 = {   red: {offset:0, length:4,},   green: {offset:0, length:4,},   blue: {offset:0, length:4,},   transp: {offset:0, length:0,},   };   这是原程序中给出的定义,我感觉有些错误,我认为应该为 R:G:B = 3:3:2   staTIc struct s3c2410fb_rgb rgb_8 = {   red: {offset:5, length:3,},   green: {offset:2, length:3,},   blue: {offset:0, length:2,},   transp: {offset:0, length:0,},   };   因为没有亲自去调试,所以没有什么发言权,希望做过这方面的朋友给我一个答案。   3) 对于 CSTN 屏,一般都能达到 12 位色(4096 色)的,S3C2410 这颗芯片也是支持的,但是在软件方面要做的工作比较大,因为从原有的代码,我们找不到任何 12位色显示的迹象,另外 Linux 本身好像也不支持 12 位色的,如果你要作的事情比较简单,那你就自己写代码吧。我在此给出 12位色的数据结构定义   staTIc struct s3c2410fb_rgb xxx_stn_rgb_12 = {   red: {offset:8, length:4,},   green: {offset:4, length:4,},   blue: {offset:0, length:4,},   transp: {offset:0, length:0,},   };   但是要完成 12 位色 CSTN 屏驱动程序的编写还有一些工作要做,稍后我会适当的向大家介绍。   4) 接着看下面的代码,其中要修改的部分已经用绿色标出,下面分别进行介绍。   a) 颜色位数   bpp:16   如果你的 LCD 屏是 TFT 的,那一般都可以达到 16 位色或 24 位色,这也要看硬件怎么连接了,根据情况进行设置即可;   如 果你的 LCD屏是 CSTN的,按照常规 LCD手册的介绍,一般都可以支持到8 位色(256色),而实际的 CSTN屏的显示效果都可以达到 12 位色(4096色),那可有很大的区别的,如果你要选择便宜的屏又要丰富的颜色,那就费点劲,完成 12 位色的驱动。   b) LCD屏的宽度和高度   xres: 240   yres: 320   这个就不用多说了,你的屏的分辨率是多少就设置成多少呗。   c) 寄存器的设置,这些也不困难。下面就让我们一起一口一口的将 S3C2410 的LCD寄存器统统吃掉! 首先介绍一下我这块屏,这是日立的一块 TFT 屏,大小为 640X240,可以支持到 16位色。 与驱动有关的一张表   图二 LCD屏资料   有了这些信息,让我们看一下 LCD寄存器的设置。   LCD控制器1   LINECNT --- 这是一个只读的数据,我们当然没有必要理它   CLKVAL --- 这可是一个很有用的参数,其实没必要管它后面的计算,我们可以通过实际的测试来得出一个有效的值,对于320x240 的屏一般设置为 7 就可以了,而对于 640x480 的屏,该值可以小一点。对于后面的计算公式及注释(STN: CLKVAL 《= 2,TFT: CLKVAL 《= 0),我不知道该如何去理解,因为在实际的应用中我点了一块 640X240 的CSTN 屏,当我的 CLKVAL = 1 时才达到了一个最佳的效果,这似乎与说明书相违背,我也解释不清为什么?!   PNRMODE --- 这个应该不用多做解释,大家一看都明白了,对于 TFT 屏,只能设置成 11,而对于 CSTN 屏,可能需要根据实际屏的信息去设置,我遇到的屏都设置成 10,即 8bit 单扫描模式。对于4bit单扫描、4bit 双扫描、8bit 单扫描的说明在 s3c2410 的手册中有详细的介绍,大家可以去参考一下。   BPPMODE --- 这个参数更不用多说了吧,就是设置屏的颜色位数喽。   这些参数的设置都很简单,我给出我这块屏的定义:   lcdcon1: LCD1_BPP_16T | LCD1_PNR_TFT | LCD1_CLKVAL(1),   同时,我也给出一块 CSTN 屏的寄存器参数信息   lcdcon1: LCD1_BPP_12S | LCD1_PNR_8S | LCD1_CLKVAL(9),   LCD控制器2   对于 TFT 屏必须要填,至于什么意思怎么翻译,相信大家都比我的水平强,自己翻译吧。我只说明从 LCD中如何将这个值“扣”出来。   很容易,看一下图二 LCD屏资料,对比一下得出如下信息:   LCD2_VBPD:   Vertical back porch 典型值为 7   LCD2_VFPD:   Vertical front porch 典型值为 4   LCD2_VSPW:   Vsync Valid width 典型值为 2   关于 LINEVAL 在程序的后面将会提到,此处不必理会。   经过分析,我们知道了如何设置 LCD2:   lcdcon2: LCD2_VBPD(7) | LCD2_VFPD(4) | LCD2_VSPW(2),   对于 STN(CSTN)屏,这个寄存器的设置最简单,将 VBPD、VFPD、VSPW 都设置成 Zero 就可以了。即   lcdcon2: LCD2_VBPD(0) | LCD2_VFPD(0) | LCD2_VSPW(0),   LCD控制器3   对于 TFT 屏,很容易将 HBPD 和 HFPD 找出来,如下   LCD3_HBPD:   Horizontal back porch 典型值为 37   LCD3_HFBD:   Horizontal back porch 典型值为 32   对于 HOZVAL 同样会在后面提到,此处暂时不管   经过分析,我们知道了如何设置 LCD3:   lcdcon3: LCD3_HBPD(37) | LCD3_HFPD(32) ,   对于(STN)CSTN屏,我没有很好的理解 WDLY 和 LINEBLANK 的真正涵义,通过改变这两个参数的值,我也没有得到特别明显的差异,我一般设置为:   lcdcon3: LCD3_WDLY_16 | 0x10 ,   LCD控制器4   对于 TFT 屏,需要设置 HSPW 的值,这个在 LCD 手册上也很容易得到   LCD4_HSPW:   Hsync Valid width 典型值为 5   至于 MVAL,我不知道是什么意思,有什么作用,我从来不动它,只取它最初的那个值 13   经过分析,我们知道了如何设置 LCD4:   lcdcon4: LCD4_HSPW(5) | LCD4_MVAL(13) ,   对于 STN(CSTN)屏,像 WDLY 一样,我通常不改变,因为改变了没有发现有什么作用,这是我驱动中的代码,好几块屏都一样的:   lcdcon4: LCD4_WLH(0) | LCD4_MVAL(13) ,   LCD控制器5   这个寄存器的看起来比较复杂,但是无外乎这几类:   只读信息:VSTATUS和 HSTATUS   只读的东东,设置它也没用,不必理会。   TFT 屏的颜色信息:BPP24BL、FRM565   TFT 屏的颜色信息,这个我们在 LCD的硬件连接时已经提到了,根据具体的接线方式,设置信息。   控制信号的极性   TFT/STN 屏控制信号的极性:INVVCLK、INVVLINE、INVVFRAME、INVVD、INVPWREN、PWREN   TFT 屏特有的控制信号的极性:INVVDEN、INVLEND、ENLEND   这些信息主要是使S3C2410的信号输出极性与LCD屏的输入极性的问题,需要根据具体的硬件进行设置,较为常见的是vline/hsync 、VFRAME/VSYNC脉冲的极性。   颜色信息的字节交换控制位:BSWP、HWSWP   这两位用来控制字节交换和半字交换,主要用来大小头的问题,如果输出到屏上的汉字左右互换了,或者输出到屏上的图花屏了,可以更改这个选项。具体涵义在 S3C2410芯片手册上有详细的说明。   我的这块 TFT 的信息设置如下:   lcdcon5: LCD5_FRM565 | LCD5_HWSWP | LCD5_PWREN ,   一块 CSTN屏的信息   lcdcon5: LCD5_BSWP | LCD5_PWREN ,   FrameBuffer 起始寄存器 1   这个寄存器的设置没有必要去修改(TFT/STN),都使用默认的代码即可:   FrameBuffer 起始寄存器 2 和 FrameBuffer 起始寄存器 3   这两个寄存器的设置比较重要,在此我给出 12 位色 CSTN 屏和 16 位色TFT 的设置代码:   前面提到的 LINEVAL 和 HOZVAL 以源码的形式给出,其中 CSTN 8 位色没有经过测试。   RGB Loopup Table Register   这三个寄存器的在驱动 256 色 CSTN 屏的时候需要使用,我在别的芯片上使用过,因为这颗芯片支持 12 位色,所以没有去调试,我给   出两组可能的值:   S3C44B0 上的   rREDLUT = 0xFCA86420;   rGREENLUT = 0xFCA86420;   rBLUELUT = 0xFFFFFA50;   Jupiter 上的   rREDLUT = 0xFEC85310   rGREENLUT = 0xFEC85310   rBLUELUT = 0xFB40   5) 好了,各个寄存器的设置完成了,最后在驱动 CSTN屏的时候需要提醒大家一句,CSTN的信号引脚中有一个叫VM/DISP的信号线,这个信号线的作用就是打开LCD的显示开关,让其进行显示,它 可以接到任何一个 GPIO 口上。S3C2410 中提供了一个 VM 信号,可以将 LCD的这个信号与 S3C2410 的 VM 信号相接即可,然后在驱动中一定要加上如下语句(蓝色选中部分):   否则你的 LCD可能没有任何显示哦(对于 TFT 屏不需要这个语句)   6) 关于 12 位色的 CSTN屏的驱动还需要做一些工作,我在这里简单介绍一下:   a) 首先要完成一个 fbcon-cfb12.c和 fbcon-cfb12.h 的编写,这两个文件很简单,在armLinux 中不是提供了 fbcon-cfb16.c 和 fbcon-cfb12.h 吗?简单修改一下就可以了;   b) 将 fbcon-cfb12.c 的编译加入 Config.in 中(不会的话去 google 搜一下,或者看一下我的另一篇文章《JFFS2 在 HHARM2410 上的实现》,里边有一些说明),并定义一个 FBCON_HAS_CFB12 参数(模仿 FBCON_HAS_CFB16 呗);   c) 另外,需要在 s3c2410fb.c 中的相应部分加上对 12位色的支持即可。呵,说起来简单,但实际做起来可能会有一些问题,给大家一个窍门:在程序中找到#ifdef FBCON_HAS_CFB16 之类的代码,简单理解一下加上对 12 位色的支持;   d) 我只给出函数 s3c2410fb_set_var中的改动,其他的应该都不是很困难,相信朋友们都能搞定。   e) 不要跟我要源码哦,否则老板会不高兴哦 。   4. 驱动写好了,重新 Make,下载就可以了。如果一切顺利,在 TFT 屏或 256 色的 CSTN屏上会有一个漂亮的小蜻蜓(应该是蜻蜓吧)出现。注意,并不是蜻蜓出现了就代表你的驱动 OK了,还要用 GUI 程序做进一步的测试,因为某一个或几个参数虽然不正确,但是仍然能够看到小蜻蜓的,但显示图形的时候就有问题了。另外,在驱动 CSTN到 12位色的时候,我们在屏上看不到小蜻蜓(我的 N块 CSTN屏上都没见到小蜻蜓),我想,可能是 armLinux 本身不支持 12 位色显示,或者我们某些地方没搞对的原因吧,但这不代表你的驱动有问题,用 GUI 程序写 FrameBuffer,看看能否的到正确的结果。   5. GUI 程序的编写   FrameBuffer 驱动写好了,那么怎么去使用,怎么在 LCD 上显示图像呢?这就是 GUI程序的任务了,其实要在 LCD 上显示图像,说白了就是把数据(包含颜色)写到FrameBuffer 中对应的位置就可以了。如果你使用如 Microwinow、MiniGui、Qt 之类的GUI,则没有必要关心 FrameBuffer与 LCD屏上的点如何进行映射了,但如果你在使用了 CSTN 屏,并且要显示效果好的照片,选择了 CSTN 的 12 位色(4096色 ),那你就要自己写 GUI 程序了,因为好像 armLinux(Linux)本身都不支持 12 位色的,听说 MiniGui支持 12 位色,但我在工作中的要求只是显示图形而已,没有去深入研究 MiniGui,所以自己写了。   另外请朋友们见谅的是我不能给出全部的源代码,因为我毕竟受雇于人,有些东东是可以 GPL 的,而有些东东暂时是不可以 GPL 的。   下面给出我的程序的部分代码,希望对朋友们有所帮助。   1) 全局变量的定义:   定义几个全局变量,用起来方便。   2) 初始化图形显示引擎,将 fb0与 GUI 的 buffer做个映射   用mmap函数使用户空间的一段地址关联到设备内存(FrameBuffer)上。无论何时,只要程序在分配的地址范围内进行读取或者写入,实际上就是对 设备的访问,使用 mmap 可以既快速又简单地访问显示卡的内存。对于象这样的性能要求比较严格的应用来说,直接访问能给我们提供很大不同。 不过我曾将帮一个网友调试了一个 S3C44B0 上的 GUI 程序,在他的 GUI 中 mmap 函数总会出错,因为没有拿到他的硬件和驱动源码,没有分析出其中的原因,所以只得用 write函数,直接向 fb0 写入数据,奇怪的是只写入一部分数据好像都不起任何作用,只得整屏数据写入才搞定了。这可就比较痛苦了,不过好在他只是写入的黑白数据,数据量还不是很 大,要是彩色的那可真的痛苦了 。   另外,我还想多啰嗦两句,FrameBuffer的像素点与LCD屏上的像素点的对应关系 ,深入了解一下对程序的理解可能会更清楚一点。我们知道黑白(2 色)颜色用 0 和 1 就可以表示了,也就是 1 位数据就可以了,那 1 个字节就可以表示 8 位数据,假如这个字节是10101010,FrameBuffer 的偏移地址为 0,则在 LCD 屏上便会显示出 4 个黑点,黑点中间会有 4 个白点出现(假如 1 是黑色);对于 4 色则用 00、01、10、11 就可以表示出四种颜色,即用两位数据可以表示一位数据,那同样是 10101010,则对应于 LCD 屏上则显示的   是颜色值为10,长度为4(8/2)的一条直线;同理,对于8位色(256色),则8位数据才能表示出一个点的颜色值,10101010在LCD屏上就只能显示为颜色值为10101010的点了。   有了上面的基础我们就可以很好的理解这个语句了:   screensize = vinfo.xres*vinfo.yres*vinfo.bits_per_pixel/8;   即FrameBuffer 的大小=LCD屏的宽度 * LCD屏的高度 * 每像素的位数 / 每字节的位数   例如,一个320*240的黑白平,FrameBuffer的大小为   320 * 240 * 1 / 8 = 9600 (字节)   而一个320 * 240的16位色LCD的 FrameBuffer的大小则为   320 * 240 * 16 / 8 = 153600(字节)   3) TFT 屏 16 位色的画点函数   有了画点函数,你还愁什么?图形汉字都可以搞定了吧!   4) CSTN屏 12位色的画点函数   注意,为了更便于代码书写,我在这个函数中将 fbp 定义为 static char * fbp,而在TFT 屏 16 位色的画点函数中 fbp 的定义为 U16 * fbp,你可以根据需要进行修改。   5) TFT 屏 16 位色下显示 24色位图函数   Bmp文件的格式可以参考网上的一些资料,如果需要也可以直接找我要。   6) CSTN屏 12位色下显示 24 色位图函数   7) 呵呵,别忘了关闭设备哦   void closegraph()   {   munmap(fbp,screensize);   close(fb);   }   收获:   1、LCD的电源电压,对于手持设备来说一般都为 5V 或 3.3V,或同时支持 5V和 3.3V,如果 LCD的需要的电源电压是 5V,那就要注意了,S3C2410 的逻辑输出电压只有 3.3V,此时一定要让你们的硬件工程师帮忙把 S3C2410 的逻辑输出电压提高到 5V,否则不能将屏点亮   2、S3C2410到 LCD屏的连线千万千万别超过 0.5 米,否则出现问题。如LCD屏上面的部分显示任何信息都是正确的,而只有屏的底部会有时正确有时错误。   3、8位色的数据结构定义:   static struct s3c2410fb_rgb rgb_8 = {   red: {offset:5, length:3,},   green: {offset:2, length:3,},   blue: {offset:0, length:2,},   transp: {offset:0, length:0,},   };   R:G:B = 3:3:2   4、CLKVAL的确定:   CLKVAL --- 这可是一个很有用的参数,其实没必要管它后面的计算,我们可以通过实际的测试来得出一个有效的值,对于320x240 的屏一般设置为 7 就可以了,而对于 640x480 的屏,该值可以小一点。   5、在设置LCDCON5时,通过 TFT/STN 屏控制信号的极性,使S3C2410的信号输出极性转换后与LCD屏的输入极性相一致

    时间:2020-08-11 关键词: LCD 芯片 寄存器

  • 什么是LED驱动时序?LCD背光驱动程序设计

    什么是LED驱动时序?LCD背光驱动程序设计

      LCD时序驱动是什么?它的特性又是什么?   外部引脚信号:   VSYNC: 帧同步信号,表示扫描1帧的开始,一帧也就是LCD显示的一个画面。   HSYNC: 行同步信号,表示扫描1行的开始。   VDEN:数据使能信号。   VD[23:0] : LCD像素数据输出端口。   VCLK:像素时钟信号。   寄存器参数:   VSPW:帧同步信号的脉宽,单位为1行(Line)的时间。   VFPD: 帧同步信号的前肩,单位为1行(Line)的时间。   VBPD: 帧同步信号的后肩,单位为1行(Line)的时间。   LINEVAL:帧显示尺寸-1,即屏行宽-1,对于800*480分配率的LCD屏,那么LINEVAL=480-1=479,请记住,是屏行宽,也就是LCD屏显示一帧数据所需要的行的数目。   HBPD:行同步信号的后肩,单位为1VCLK的时间。   HFPD:行同步信号的前肩,单位为1VCLK的时间。   HSPW:行同步信号的脉宽,单位为1VCLK的时间。   HOZVAL:行显示尺寸-1,即屏列宽-1,对于800*480分配率的LCD屏,那么HOZVAL=800-1=799,请记住,是屏列宽,也就是LCD屏显示一行数据所需要的像素(pixel)的数目。   由上图可知:   扫描一帧所需的时间:((VSPW+1)+(VBPD+1)+( LINEVAL+1)+(VFPD+1))个行时间。   扫描一行所所需的时间:((HSPW+1)+(HSPD+1)+(HFPD+1)+ (HOZVAL+1))个VCLK时间。   而一个VCLK时间由LCD寄存器VIDCON0内的CLKVAL决定: PCLK/(CLKVAL+1)   因此扫描一帧所需的时间:   T=[(VSPW+1)+(VBPD+1)+(LINEVAL+1)+(VFPD+1)]*[(HSPW+1)+(HSPD+1)+(HFPD+1)+ (HOZVAL+1)]* PCLK/ (CLKVAL+1)。   LCD背光驱动程序设计:   本次背光驱动开发对应的是IMX233下LCD背光灯设备,主要由三个部分组成:PWM、RT9284B15PJ6芯片 和 LCD背光灯。   PWM(Pulse-Width Modulator,脉冲宽度调制) 是 利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。   RT9284B15PJ6芯片是一个高效高度集成的LED驱动器,相当于一个LED开关。LCD背光灯电路原理图 如图一,LCD背光灯连接到RT9284B15PJ6芯片的两个引脚,而芯片的其中一个引脚连接到PWM。我们主要通过PWM的相关寄存器来产生不同效果的波形 从而间接控制背光灯的亮度,所以下面我们会主要介绍下PWM。   脉冲宽度调制(PWM)是利用微处理器的数字输出来对模拟电路进行控制,简而言之,PWM是一种对模拟信号电平进行数字编码的方法,这种通过以数字方式控制模拟电路的方法,可以大幅度降低系统的成本和功耗,所以广泛应用在从测量、通信到功率控制与变换的许多领域中。   在一个连接有电池(电压5V)、白炽灯泡和开关的简单电路当中,如果开关闭合50ms,灯泡将得到5V的电压,接着将开关断开50ms,接着灯泡将得到0V的电压。如果在1秒内,将上述的过程重复10次,灯泡将会被点亮,看到的效果和连接到一个4.5V的电池的效果一模一样,这种实验情况下,占空比为50%,调制频率为10Hz。图二是两种不同的PWM信号以及其对应的不同的模拟信号值,电压为5V,占空比分别为10%和50%,两种不同的PWM信号分别对应0.5V和2.5V的模拟信号值。   图二 两种不同的PWM信号和对应模拟信号   图三 电路图   图三为RT9284B15PJ6芯片的电路图,我们关心的是EN引脚。它的输入是PWM信号,从而芯片能控制LED输出与PWM信号相对应的亮度。在做背光驱动开发的时候涉及到硬件相关的部分主要是与LCD背光灯相对应的PWM寄存器,后面将做详细介绍。

    时间:2020-08-11 关键词: LCD pwm 寄存器

  • wince代码写入LCD驱动参考,数码产品怎样分别是不是LCD坏点

    wince代码写入LCD驱动参考,数码产品怎样分别是不是LCD坏点

      数码产品的坏点到底是不是LCD坏点?   一、什么是CCD/LCD坏点?坏点和亮点分别是什么?   我的一些顾客都在同时问两个问题:“能保证CCD和LCD没有坏点同时也没有亮点吗?”这里必须说明,所谓的“坏点”和“亮点”其实是一个概念。在术语上,应该叫“坏点”。   坏点就是CCD元件上不能成像的点。具体表现就是:每张照片的固定位置出现全白或全黑的斑点,就是CCD元件上不发光或者始终发光的点。这是一个比较严重的问题,严重影响了成像效果,一旦发现坏点是要坚决换机的。   同理,所谓LCD坏点,也是指LCD(显示屏)上不能成像的点。LCD上的坏点并不影响相机的实际成像效果,一般来说,LCD上有3个以上坏点才算质量问题,厂家才会同意换机。比如柯达公司就规定LCD有5个坏点才换屏。LCD坏点只是影响观瞻,影响心情吧,其实3个以下的坏点,肉眼基本是没有感觉的。   在我们实际销售的过程中,CCD坏点几率非常低,目前只遇到过一台。LCD坏点则遇到过7、8台,一般也都在发货前进行了调换。   二、如何界定、判断“坏点”?   关于这个问题,网上很多文章都在讲。我不想罗嗦了。只是想用通俗的语言给大家再讲一遍。   1、获得检测“坏点”的全黑照片。拿到相机后,预热几分钟,把相机的ISO(感光度)调节到最小值(一般是100),关闭闪光灯,设定曝光时间为1/60秒、光圈最大值,然后用镜头盖盖住镜头(没有镜头盖的,可在平坦的桌子上放张厚纸,将镜头扣在纸上拍摄,一定不能让光线进入到镜头里面,同时也不要太过用力),按下快门,拍摄一张全黑的照片。然后,把曝光时间设定为1秒,再拍摄一张全黑照片,这两张照片就是我们要检测“坏点”的证据。如果你购买的相机有自动降躁功能,那么也要注意关闭。   如果是全自动相机,则一般在默认模式、关闭闪光灯、ISO最低值的情况下,拍摄一张全黑照片就可以了。   有的专家把整个过程说的过分复杂了,在实际操作中,除非是专业级别的玩家对待专业级别的相机,普通家用相机和一般的摄影爱好者用这个通俗易懂的方式获得全黑照片就可以。   2、对全黑照片进行检测。使用Dead Pixel Test软件来进行检测的。设定超过60流明的点是噪点(hot),超过250流明的点为坏点(dead)。把全黑照片输入电脑,通过该软件进行测试,很快就会出来测试结果——有多少躁点、有没有坏点,结果很快就出来了。这个软件网上很多地方可以下载,是免费的软件,这个软件很容易上手,具体不再讲了。   3、用全黑照片测试LCD屏幕。用LCD屏幕来回放这一张全黑照片,就可以看出来LCD屏幕是否有坏点。一般来说,不超过3个都是合格的。当然,对于一个非常注重自己信誉的卖家来说,也许一个也不会放过。   WinCE的LCD驱动程序该如何编写?   本文以1024*768分辨率的TFT_16BPP真彩LCD为例,说明在WIN CE 4.2中驱动程序的修改事项,目标板的微处理器是S3C2410A。   该LCD的时序图如下图所示:   Note:LCD时序的参数和时钟相位因不同LCD而异,请参考相应LCD的datasheet.   在WIN CE 4.2中修改LCD驱动程序有五个相关文件,分别是:   1. …WINCE420PLATFORMSMDK2410INCs2410.h   2. …WINCE420PLATFORMSMDK2410KERNELHALcfw.c   3. …WINCE420PLATFORMSMDK2410DRIVERSDISPLAYS3C2410LCDs3c2410disp.cpp   4. …WINCE420PLATFORMSMDK2410FILESconfig.bib   5. … WINCE420PLATFORMSMDK2410FILESplatform.reg   1. s2410.h   …WINCE420PLATFORMSMDK2410INCs2410.h   主要有LCD控制器的寄存器定义、LCD控制器的工作时序定义、分辨率的定义等等。红色部分为修改后的内容:   #define LCDTYPE TFT16BPP   #define LCD_TYPE TFTxxx_xxx   #define SCR_XSIZE_TFT (1280)   #define SCR_YSIZE_TFT (960)   #define LCD_XSIZE_TFT (1024)   #define LCD_YSIZE_TFT (768)   #define VBPD ((2-1)&0xff)   #define VFPD ((2-1)&0xff)   #define VSPW ((2-1) &0x3f)   #define HBPD ((16-1)&0x7f)   #define HFPD ((200-1)&0xff)   #define HSPW ((16-1)&0xff)   #define CLKVAL_TFT (1) //这个值的定义在LCD初始化函数中并不用到,而是直接用数值表示。   2. cfw.c   …WINCE420PLATFORMSMDK2410KERNELHALcfw.c   红色部分为修改后的内容:   staTIc void InitDisplay()   {   ********   s2410LCD-》rLCDCON1=(1《《8)|(MVAL_USED《《7)|(3《《5)|(12《《1)|0;   // CLKVAL_TFT = 1 , HCLK = 100MHz -》 VCLK = 25MHz   //TFT LCD panel   //16 bpp for TFT   s2410LCD-》rLCDCON2=(VBPD《《24)|(LINEVAL_TFT《《14)|(VFPD《《6)|(VSPW);   s2410LCD-》rLCDCON3=(HBPD《《19)|(HOZVAL_TFT《《8)|(HFPD);   s2410LCD-》rLCDCON4=(MVAL《《8)|(HSPW);   s2410LCD-》rLCDCON5=   (1《《11)|(0《《10)|(0《《9)|(0《《8)|(0《《7)|(0《《6)|(0《《3)|(0《《1)|(1《《0);   //5:6:5 Format   //The video data is fetched at VCLK falling edge   //VLINE/HSYNC pulse polarity-Normal   //VFRAME/VSYNC pulse polarity-Normal   //VD (video data) pulse polarity-Normal   //VDEN signal polarity-Normal   //Disable PWREN signal   //Byte swap Disable   //Half-Word swap Enable   ********   }   红色部分为修改后的内容:   WORD TempBuffer[1025][768];   S3C2410DISP::S3C2410DISP (void)   {   ********   m_nScreenWidth = 1024;   m_nScreenHeight = 768;   *********   }   到此修改工作基本完成,但还要一个问题:1024*768分辨率占用的显示缓冲区大小是:1024*768*2 = 1536 K Bytes,因此要确认所分配的内存空间够不够,是在config.bib文件中定义的。如果以前定义的足够大,后面的步骤可以省略了。   4. config.bib   …WINCE420PLATFORMSMDK2410FILESconfig.bib   #define NKNAME NK   #define NKSTART 8C200000   #define NKLEN 01D00000   #define RAMSTART 8E000000   #define RAMLEN 01F00000   $(NKNAME) $(NKSTART) $(NKLEN) RAMIMAGE   RAM $(RAMSTART) $(RAMLEN) RAM   AUD_DMA 8c002000 00002000 RESERVED   DRV_GLB 8c010000 00010000 RESERVED   DBGSER_DMA 8c022000 00002000 RESERVED   SER_DMA 8c024000 00002000 RESERVED   IR_DMA 8c026000 00002000 RESERVED   SD_DMA 8c028000 00008000 RESERVED   EDBG 8c030000 00020000 RESERVED   CPXIPCHAIN 8c050000 00008000 RESERVED   SLEEP_BUFF 8c058000 00004000 RESERVED   DISPLAY 8c100000 00100000 RESERVED   DISPLAY   AUD_DMA 8c002000 00002000 RESERVED   DRV_GLB 8c010000 00010000 RESERVED   DBGSER_DMA 8c022000 00002000 RESERVED   SER_DMA 8c024000 00002000 RESERVED   IR_DMA 8c026000 00002000 RESERVED   SD_DMA 8c028000 00008000 RESERVED   EDBG 8c030000 00020000 RESERVED   CPXIPCHAIN 8c050000 00008000 RESERVED   SLEEP_BUFF 8c058000 00004000 RESERVED   ;DISPLAY 8c100000 00100000 RESERVED   DISPLAY 8c060000 001a0000 RESERVED   5.   在(4)中修改了DISPLAY显示缓冲区的开始地址,因此要在“s2410.h”中做相应的修改:   …WINCE420PLATFORMSMDK2410INCs2410.h   #define DMA_BUFFER_BASE 0xAC000000   #define DMA_PHYSICAL_BASE 0x30000000   //#define FRAMEBUF_BASE (DMA_BUFFER_BASE + 0x00100000)   //#define FRAMEBUF_DMA_BASE (DMA_PHYSICAL_BASE + 0x00100000)   #define FRAMEBUF_BASE (DMA_BUFFER_BASE + 0x00060000)   #define FRAMEBUF_DMA_BASE (DMA_PHYSICAL_BASE + 0x00060000)   6. 在(4)中修改了DISPLAY显示缓冲区的大小, 因此要在“s3c2410disp.cpp”中做相应的修改:   …WINCE420PLATFORMSMDK2410DRIVERSDISPLAYS3C2410LCDs3c2410disp.cpp   红色部分为修改后的内容:   void S3C2410DISP::IniTIalizeHardware (void)   {   *********   m_VirtualFrameBuffer = (DWORD)VirtualAlloc(0, (0x1A0000), MEM_RESERVE, PAGE_NOACCESS);   if (m_VirtualFrameBuffer == NULL)   {   RETAILMSG(0,(TEXT(“m_VirtualFrameBuffer is not allocated ”)));   return;   }   else if (!VirtualCopy((PVOID)m_VirtualFrameBuffer, (PVOID)gdwLCDVirtualFrameBase, (0x1A0000), PAGE_READWRITE | PAGE_NOCACHE))   {   RETAILMSG(0, (TEXT(“m_VirtualFrameBuffer is not mapped ”)));   VirtualFree((PVOID)m_VirtualFrameBuffer, 0, MEM_RELEASE);   return;   }   *********   }

    时间:2020-08-11 关键词: LCD 源代码 寄存器

  • 74hc595驱动led点阵原理及74HC595在8x8LED点阵中的应用

    74hc595驱动led点阵原理及74HC595在8x8LED点阵中的应用

    74HC595工作原理 只有1个移位寄存器,但有1+8个,共9个锁存器。其中第1个锁存器可以理解为中转前置锁存器,它并没有连接Q0-Q7,后面8个锁存器连接了Q0-Q7。 当第1次SCK和LCK时,移位寄存器中=第1位数据,前置锁存器=第1位数据。但是并没有进入到Q0-Q7所对应的锁存器当中去。Q0到Q7=NON。 当第2次SCK和LCK时,移位寄存器中=第2位数据,前置锁存器=第2位数据。同时前置锁存器把之前的第1位数据才更新到Q0对应的锁存器当中去。此时Q0=第1位。Q1到Q7=NON。 当第3次SCK和LCK时,移位寄存器中=第3位数据,前置锁存器=第3位数据。同时前置锁存器把之前的第2位数据才更新到Q0对应的锁存器当中去,Q0把之前的第1位数据给Q1,此时Q0=第2位。Q1=第1位。Q2到Q7=NON。 当循环8次后(给出8个SCK和8个LCK后),移位寄存器中=第8位数据,前置锁存器=第8位数据。但Q0-Q6里分别对应第7位-第1位数据,第8位数据并没有更新到Q0,同时Q7=NON。 这就是为什么给出循环8次的程序,总是不能显示第8位数据的原因。 因此要全部显示8位,需要再多给一次SCK和LCK。 那么问题来了,最后给这次SCK和LCK,全部显示8位了。但是:移位寄存器和前置锁存器中又锁定了8位之外的第9位无用数据。 那么我们就可以用到SCLR(10脚)了。 给SCLR一个下降沿就可以了。这个下降沿同时清空移位寄存器和前置锁存器。但并不立即生效!只有产生下一个SCK时,才生效。 所以,SCLR时,前置锁存器和Q0-Q7锁存器依然锁定的是原来的数据,直到下一个SCK之前,不会改变输出内容。 而等我们下一次再传送一个新的8位数据时,在第一个SCK的时候,SCLR生效之后才接收新数据,因为不会影响接收新数据。 这个过程我称之为“收口操作“。 74HC595在【8x8LED点阵】中的应用 每个灯就相当于坐标图中的一个点,具有唯一独特的坐标位置,这样就可以通过引脚的信号来控制每个灯的关和开 col管脚连接的是P0的八个引脚,row管脚连接的是595的八位并行输出端。 实验中采取的是逐列显示,通过P0控制八列每列逐列显示,其间通过595位移缓存器控制每列要亮的led灯。 74HC595是串入并出带有锁存功能移位寄存器.形象来说,14引脚是搬运工,11是进厂守门员,12是出厂守门员,11出现上升沿时,从14引脚输入一位数据,一共重复八次12引脚上升沿时,将之前进来的八位数据分别从1到7引脚输出OE为使能端,低电平时使输出有效。

    时间:2020-07-11 关键词: LED 寄存器

  • 实现高速,高分辨率模数转换的SAR ADC产品,你知道吗?

    实现高速,高分辨率模数转换的SAR ADC产品,你知道吗?

    什么是实现高速,高分辨率模数转换的SAR ADC产品?它有什么特点?Microchip Technology Inc.(美国微芯科技公司)今日宣布推出12款全新逐次逼近寄存器(SAR)模数转换器(ADC)以及专为新型SAR ADC产品系列设计的配套差分放大器,以满足应用市场对更高速度和更高分辨率模数转换的需求。 MCP331x1(D)-xx系列产品专为高温和高电磁工作环境而设计,其中包括业界唯一一款符合AEC-Q100标准且采样速率达每秒100万次(Msps)的16位SAR,可为汽车和工业应用提供必不可少的可靠性。MCP6D11差分放大器提供低失真、高精度接口,可在系统内实现ADC的全部性能。 MCP331x1(D)-xx系列产品分辨率范围包括12、14和16位,速度选项范围从每秒50万次采样(ksps)至1 Msps不等,可为开发人员提供适合其设计的ADC。该系列ADC能够在1.8V固定低模拟电源电压(AVDD)及低电流运行(1Msps下的典型有效电流为1.6 mA,500 ksps下为1.4 mA),同时具有超低功耗及满量程输入范围。 以上器件支持宽广的数字I/O接口电压(DVIO))范围(1.7V - 5.5V),可直接与Microchip PIC32、AVR®和基于Arm®的单片机和微处理器等大多数主器件连接,无需使用外部电压电平移位器。MCP331x1(D)-xx系列包含单端和差分输入电压测量选项,能够为系统实现两个任意波形之间的差异的转换。AEC-Q100认证系列在恶劣环境下依然能够提供可靠的性能,是高精度数据采集、电动汽车电池管理、电机控制和开关电源等应用的理想选择。 在不引入额外噪音和失真的情况下,将小模拟信号正确连接到高速、高分辨率ADC是一项巨大的挑战。 Microchip的MCP6D11差分放大器专为应对这一挑战而设计,为正确驱动ADC提供低失真和高精度的接口。 Microchip混合及线性信号产品部副总裁Bryan J. Liddiard表示:“ADC市场和应用的发展需要更高分辨率、更高速度和更高精度。此外,更低的功耗和更小的封装也非常重要,我们新推出的这些产品可满足以上全部需求。”以上就是实现高速,高分辨率模数转换的SAR ADC产品解析,希望能给大家帮助。

    时间:2020-07-02 关键词: 模数转换器 mcp331x1 寄存器

  • 你了解Analog Devices 16位AD7386 SAR ADC吗?

    你了解Analog Devices 16位AD7386 SAR ADC吗?

    你知道Analog Devices 16位AD7386 SAR ADC吗?它有什么作用?专注于引入新品并提供海量库存的电子元器件分销商贸泽电子 (Mouser Electronics) 即日起开始供应Analog Devices公司的AD7386 逐次逼近寄存器 (SAR) 模数转换器 (ADC)。 16位的AD7386为单端类型,功能与AD7380和AD7381 ADC兼容,吞吐速率高达4 MSPS,并采用 3 × 3 mm小巧尺寸的LFCSP封装。这款双路同步采样的高速ADC很适合用于电机控制、声呐、电源质量和数据采集应用。 作为授权分销商,贸泽致力于快速引入新产品与新技术,帮助客户设计出先进产品,并使客户产品更快走向市场。超过800家半导体和电子元器件生产商通过贸泽将自己的产品销往全球市场。贸泽只为客户提供通过全面认证的原厂产品,并提供全方位的制造商可追溯性。 贸泽供应的Analog Devices AD7386内含两个SAR ADC、一个多路复用器、一个序列发生器和一个带有两个独立数据输出引脚的串行接口。工程师可通过支持一或两个序列输出的串行接口访问设备上的数据。 此款ADC具备单端模拟输入,工作电压介于3.0V至3.6V之间,并具有带缓冲的内部2.5V参考电压(可供选择的外部参考电压最高达3.3V),典型漂移仅±1 ppm/°C。以上就是Analog Devices 16位AD7386 SAR ADC解析,希望能给大家帮助。

    时间:2020-06-25 关键词: 转换器 贸泽 寄存器

  • 如何实现自由口模式下PLC与计算机的通信方法概述

    如何实现自由口模式下PLC与计算机的通信方法概述

    概述 ----本例说明如何以自由协议实现计算机与S7-200的通信,计算机作为主站,可以实现对PLC从站各寄存器的读/写操作。 ----计算机通过COM口发送指令到PLC的PORT0(或PORT1)口,PLC通过RCV接收指令,然后对指令进行译码,译码后调用相应的读/写子程序实现指令要求的操作,并返回指令执行的状态信息。 通信协议 ----在自由口模式下,通信协议是由用户定义的。用户可以用梯形图程序调用接收中断、发送中断、发送指令(XMT)、接受指令(RCV)来控制通信操作。在自由口模式下,通信协议完全由梯形图程序控制。 指令格式定义 计算机每次发送一个33字节长的指令来实现一次读/写操作,指令格式见表1 说明: 起始字符 ----起始字符标志着指令的开始,在本例中被定义为ASCII码的“g”,不同的PLC从站可以定义不同的起始字符以接收真对该PLC的指令。 指令类型 ----该字节用来标志指令的类型,在本例中05H代表读操作,06H代表写操作。 目标PLC站地址 ----目标PLC站地址占用指令的B2、B3两个字节,以十六进制ASCII码的格式表示目标PLC的站地址。 目标寄存器地址 ----在PLC内部可以用4个字节来表示一个寄存器的地址(但不能表示一个位地址)。前两个字节表示寄存器类型,后两个字节表示寄存器号。 00 00(H): I寄存器区 01 00(H): Q寄存器区 02 00(H): M寄存器区 08 00(H): V寄存器区 例如: IB000的地址可表示为 00 00 00 00(H) VB100的地址可表示为 08 00 00 64(H) 读/写字节数M ----当读命令时,始终读回从目标寄存器开始的连续8个字节的数据(转换为十六进制ASCII码后占用16个字节),可以根据自己的需要取用,M可以任意写入。 ----当写命令时,M表示的是要写入数据的十六进制ASCII码所占用的字节数。例如要写入1个字节的数据,数据在指令中以十六进制ASCII码表示,它将占用2个字节,此时应向M中写入“02”。同理,如果要写入5个字节的数据,M中应写入“0A”。 要写入的数据 ----要写入的数据在指令中以十六进制ASCII码的格式表示,占用指令的B14-B29共16个字节。数据区必须填满,但只有前M个字节的数据会被写入目标寄存器。一条指令最多可以写入8个字节的数据(此时M中应写入“10”,代表十进制的16) BCC校验码 ----在传输过程中,指令有可能受到任何的干扰而使原来的数据信号发生扭曲,此时的指令当然是错误的,为了侦测指令在传输过程中发生的错误,接收方必须对指令作进一步的确认工作,以防止错误的指令被执行,最简单的方法就是使用校验码。BCC校验码的方法就是将要传送的字符串的ASCII码以字节为单位作异或和,并将此异或和作为指令的一部分传送出去;同样地,接收方在接到指令后,以相同的方式对接收到的字符串作异或和,并与传送方所送过来的值作对比,若其值相等,则代表接收到的指令是正确的,反之则是错误的。 ----在本例中,bcc为指令B1到B29的异或和,BCC为bcc的十六进制ASCII码。 ----bcc=B1 xor B2 xor B3 xor B4 xor …… xor B29 结束字符 ----结束字符标志着指令的结束,在本例中被定义为ASCII码的“G”,不同的PLC从站可以定义不同的结束字符以接收真对该PLC的指令。 PLC在接到上位机指令后,将发送一个21字节长反馈信息,格式见表2 说明: 起始字符 ----起始字符标志着反馈信息的开始,在本例中被定义为ASCII码的“g”,不同的PLC从站可以定义不同的起始字符,这样上位机可以根据信息的起始字符来判断反馈信息的来源。 状态信息 ----该字节包含指令执行的状态信息,在本例中 01H 代表 读取正确 02H 代表 写入正确 03H 代表 BCC校验码错误 04H 代表 指令不合法 数据区 ----反馈信息的B3到B18为读指令所要读取的数据,以十六进制ASCII码表示。 BCC校验码 ----与上位机指令中的BCC校验码类似,它是反馈信息B3到B18的异或和。 结束字符 ----结束字符标志着反馈信息的结束,在本例中被定义为26H。 指令中为何要使用ASCII码 ----一条指令除包含数据外,还包含必要的控制字(起始字符、结束字符、指令类型等)。如果指令中的数据直接以其原本的形式传输,则不可避免的会与指令中的控制字发生混淆。 ----例如本例中,指令的起始字符为“g”,其ASCII码值为67H,结束字符为“G”,其ASCII码值为47H。假设要写入的数据中也有47H,并且数据直接以其原本的形式传输,则PLC会因为接收到了数据中的47H而停止接收,这样PLC接收到的指令将是一个不完整的非法指令,很可能造成PLC的误动作。 ----为了避免这种情况的发生,可以用文本来传送二进制数据。通过以16进制ASCII码的格式描述数据,每个二进制的字节都可以表示成一对ASCII编码,这对编码表示这个字节的两个16进制字符。这种格式可以表示任何的数值,仅仅使用ASCII代码的30H到39H(表示0到9)和41H到46H(表示A到F)。ASCII码的其余部分可以用作控制字(起始标志、结束标志、指令类型等)。这样,数据中的47H以ASCII码的形式进行传送就变成了34H 37H 两个字节,从而避免了PLC因接收到数据中的47H而停止接收的错误。 PLC程序执行过程 ----PLC在第一次扫描时执行初始化子程序,对端口及RCV指令进行初始化。初始化完成后,运行RCV指令使端口处于接受状态。 ----RCV会将以“g”开头“G”结尾的指令保存到接收缓冲区,并同时产生接收完成中断。 ----RCVcomplete中断服务程序用来处理接收完成中断事件,它会将接收缓冲区中的十六进制ASCII码还原成数据并保存,同时置位Verify子程序的触发条件(M0.1)。 ----Verify子程序首先复位本身的触发条件以防止子程序被重复调用,然后求出接收缓冲区中指令的BCC校验码并与指令中的BCC校验码进行比对。如果相等则置BCC码校验正确的标志位(M0.0)为1;如果指令格式正确(指令的结束标志在接收缓冲区中特定的位置VB133)而BCC码不相等,则发送代表BCC校验码错误的反馈信息;如果指令格式不正确(VB133中不是指令的结束标志),则返回代表指令格式错误的反馈信息。 ----Read子程序的触发条件为:指令中的站地址与本机站地址相符、指令类型为读指令、BCC检验码正确。当条件满足时,Read子程序被执行。Read子程序首先禁止RCV,然后将指令所要读取的数据转换成十六进制ASCII码并写入发送缓冲区、计算BCC检验码、最后发送反馈信息。 ----Write子程序的触发条件为:指令中的站地址与本机站地址相符、指令类型为写指令、BCC检验码正确。当条件满足时,Write子程序被执行。Write子程序首先禁止RCV,然后将指令中的数据写入目标寄存器,最后发送代表写入正确的反馈信息。 ----PLC每接到一条指令后都会发送一条反馈信息,当反馈信息发送完成时,会产生发送完成中断,XMTcomplete中断服务程序用来处理发送完成中断事件。在XMTcomplete中断服务程序中所要执行的操作包括:复位BCC校验码正确的标志位(M0.0);允许RCV;bcc码寄存器清零;重新装入用于计算BCC校验码的地址指针;接收缓冲区中存放指令结束字符的字节VB133清零(用来判断下一条指令格式是否正确)。 PLC寄存器地址分配 ----此程序占用PLC寄存器的VB100-VB199,内部继电器占用M0.0和M0.1。寄存器地址分配见表3、表4、表5、表6。 程序清单 主程序: NETWORK 1 LDSM0.1//第一次扫描调用初始化子程序 CALLinitialize NETWORK 2 LDB=VB134, VB199 //指令中的站地址与本机站地址相符 AB=VB102, 5//指令类型为读指令 AM0.0//BCC码校验正确 CALLRead//调用读子程序 NETWORK 3 LDB=VB134, VB199//指令中的站地址与本机站地址相符 AB= VB102, 6//指令类型为写指令 AM0.0//BCC码校验正确 CALLWrite//调用写子程序 NETWORK 4 LDM0.1//指令接收完成后调用BCC码校验子程序 CALLVerify NETWORK 5 LDSM4.5//当端口空闲时启动RCV RCVVB100, 0 Read子程序: NETWORK 1 LDSM0.0//停止端口0的接收 RSM87.7, 1 RM0.0, 1 RCVVB100, 0 NETWORK 2 LDSM0.0//将数据写入发送缓冲区 MOVB 103, VB154 MOVB1, VB155 HTA*VD135, VB156, 16 MOVB26, VB174 MOVB21, VB153 NETWORK 3 LDSM0.0//计算BCC校验码 FORVW177, +1, +16 NETWORK 4 LDSM0.0 XORB*VD181, VB180 NETWORK 5 LDSM0.0 INCDVD181 NETWORK 6 NEXT NETWORK 7 LDSM0.0 HTAVB180, VB172, 2//BCC校验码写入发送缓冲区 NETWORK 8 LDSM4.5//发送反馈信息 XMTVB153, 0 Write子程序: NETWORK 1 LDSM0.0//停止端口0的接收 RSM87.7, 1 RM0.0, 1 RCVVB100, 0 NETWORK 2 LDSM0.0//装入要写如数据源的地址指针 MOVD&VB115, VD145 NETWORK 3 LDSM0.0//写入数据 ATH*VD145, *VD135, VB139 NETWORK 4 LDSM0.0//指令执行的反馈信息写入发送缓冲区 MOVB21, VB153 MOVB103, VB154 MOVB2, VB155 MOVB26, VB174 NETWORK 5 LDSM4.5//发送指令执行的反馈信息 XMTVB153, 0 Verify子程序: NETWORK 1 LDSM0.0 RM0.1, 1//复位verify子程序的执行条件 NETWORK 2 LDSM0.0//计算BCC码 FORVW175, +1, +29 NETWORK 3 LDSM0.0 XORB*VD149, VB179 NETWORK 4 LDSM0.0 INCDVD149 NETWORK 5 NEXT NETWORK 6 LDB=VB179, VB140//当BCC码校验正确时,M0.0置1 AB=VB133, 71 SM0.0, 1 NETWORK 7 LDB=VB133, 71//BCC码错误时发送反馈信息 AB《》VB179, VB140 MOVB21, VB153 MOVB103, VB154 MOVB3, VB155 MOVB26, VB174 RSM87.7, 1 RCVVB100, 0 XMTVB153, 0 NETWORK 8 LDB《》VB133, 71//指令格式错误或RCV超时时发送反馈信息 MOVB21, VB153 MOVB103, VB154 MOVB4, VB155 MOVB26, VB174 RSM87.7, 1 RCVVB100, 0 XMTVB153, 0 IniTIalize子程序: NETWORK 1 LDSM0.0 MOVB9, SMB30//0口“9600,N,8,1” NETWORK 2 LDSM0.0//RCV指令初始化 MOVB16#EC, SMB87 MOVB103, SMB88 MOVB71, SMB89 MOVB+1000, SMW92 MOVB35, SMB94 RSM87.2, 1 NETWORK 3 LDSM0.0 ATCHRCVcomplete, 23//连接口0接收完成的中断 NETWORK 4 LDSM0.0 ATCHXMTcomplete, 9//连接口0发送完成的中断 NETWORK 5 LDSM0.0 ENI //中断允许 NETWORK 6 LDSM0.0 MOVB2, VB199//将本机站地址装入寄存器 NETWORK 7 LDSM0.0 MOVB&VB102, VD149//装入地址指针 MOVB0, VB179//BCC码寄存器清零 MOVB&VB156, VD181//装入地址指针 MOVB0, VB180//BCC码寄存器清零 RCVcomplete中断程序 NETWORK 1 LDSM0.0 ATHVB103, VB134, 2//指令译码(ASCII码到十六进制) ATHVB105, VB135, 8 ATHVB113, VB139, 2 ATHVB131, VB140, 2 SM0.1, 1//置位Verify子程序的触发条件 MOVB0, VB179//BCC码寄存器清零 MOVD&VB102, VD149//装入地址指针 XMTcomplete中断程序 NETWORK 1 LDSM0.0 RM0.0, 1//复位BCC校验码正确的标志位 SSM87.7, 1//允许口0进行接收 MOVB0, VB179//BCC校验码寄存器清零 MOVB0, VB180//BCC校验码寄存器清零 MOVD&VB102, VD149//重新装入地址指针 MOVD&VB156, VD181 MOVB0, VB133 //接收缓冲区中存放指令结束字符的字节清零

    时间:2020-06-08 关键词: plc 寄存器

  • 基于μC/OS—III和CC1120的短距离窄带无线数传系统方案浅析

    基于μC/OS—III和CC1120的短距离窄带无线数传系统方案浅析

    引言 随着频率资源的日趋紧张,短距离无线通信按窄带化趋势发展。无线数传模块一般由微处理器和收发芯片组成,本文所设计的窄带数传模块的微处理器采用了STM32F103ZE芯片,收发芯片选用了TI公司新推出的CC1120,CC1120通过SPI串行总线协议与MCU相连接。同时,采用了可移植、可植入ROM、可裁剪、抢占式的实时多任务操作系统μC/OS—III作为软件平台。 1 系统硬件电路 1.1 CC1120的内部结构 CC1120是TI公司专为经济高效的无线系统在低功耗和低电压操作下,实现数据传输而设计的一款完全集成的单芯片无线收发器。该芯片主要应用于ISM(工业、科学和医疗)以及SRD(短程设备)频带。CC1120的主要特性有:体积小,超低功耗,可配置数据速率(1.2~200kbps),可编程控制输出功率(步长为0.5 dB,最高功率16 dBm),接收机灵敏度高(1.2 kbps数据速率下为123 dBm),还支持2FSK、2GFSK、4FSK、4GFSK、MSK、ASK、OOK及模拟FM多种调制方式等。 CC1120的内部结构框图如图1所示。CC1120具有一个低功耗IF接收机,低噪声放大器(LNA)将接收到的RF、信号放大,并在求积分(I和Q)过程中被降压转换至中频(IF)。在IF下,I/Q信号被ADC数字化。自动增益控制(AGC)、精确信道滤波和调制解调位/数据包同步均以数字方式完成。CC1120的发射器部分基于RF频率直接合成,频率合成器包括一个完全片上LC VCO和一个90°相位转换器,用来在接收模式下向降压转换混频器生成I和Q本振信号。一个4线SPI串行接口用于配置数据和缓冲区存取。数字基带包括了对信道配置、数据包处理以及数据缓冲的支持。 1.2 CC1120的配置特性 配置寄存器的读、写操作时序如图2所示。通过一个4线串行SPI兼容接口(SI、SO、SCLK和CSn)可对CC1120进行配置,该接口还可用于读取和写入缓冲数据。SPI接口上的所有数据传输均以最高位开始。 SPI接口上的所有事务均以一个报头字节作为开始,该字节包含一个R/W位、一个突发存取位(B)以及一个6位地址(A5~A0),报头字节帧格式如图3所示。在SPI总线上传输数据期间,CSn引脚必须保持低电平,否则传输就会被取消。拉低CSn电平时,在开始传输该报头字节以前,MCU必须等待,直到SO引脚变为低电平为止。这表明,芯片正在运行。除非芯片处在SLEEP或XOFF状态,否则SO引脚总会在CSn变为低电平以后立即变为低电平。 CC1120的寄存器空间主要作为CC1120的频率、数据速率、中频等大部分参数的配置。而扩展寄存器大部分为芯片配置辅助测试寄存器(只读),少部分为配置寄存器(可读写)。指令选通用于芯片状态切换和冲刷RX/TXFIFO。128字节TX FIFO和128字节RX FIFO均通过0x3F地址进行存取。当R/W位为0时,则TX FIFO被存取;当R/W位为1时,则RX FIFO被存取。其中,TXFIFO为只写,而RX FIFO为只读。寄存器地址映射如图4所示。 1.3 硬件连接关系 窄带无线数据传输系统的STM32F103ZE与无线收发芯片的硬件连接关系如图5所示。左侧为STM32F103ZE,它是一个32位、基于ARM Cort ex—M3内核的无线收发芯片。除了正常工作模式外,还支持睡眠、待机、停机工作模式,当所有外设都处于工作模式时消耗36 mA,待机时下降到2μA。CC1120内部集成的SPI接口的传输速率最高可达到18 Mbps。 右侧为无线收发芯片CC1120。CC1120的外部控制引脚主要有复位接口、SPI串行接口以及4个通用输出引脚GPIO0~GPIO3。其中,4个通用输出引脚在实际应用中,可以通过配置寄存器使它们为上层实时提供同步字或数据包收发状态等应用。在硬件平台上,CC1120的SPI串行接口(CSn、SCLK、SI、SO)分别连接到STM32F103ZE相应的4个SPI串行通信弓I脚(即SPI2_NSS、SPI2_SCLK、SPI2_MOSI、SPI2_ISO上)。通过这4根线,TM32F103ZE可以对CC1120进行参数配置、芯片状态切换以及RX/TX FIFO的读写。由于CC1120只有SPI从模式,因此TM32F103ZE采用SPI主模式。另外,本方案还采用了1个通用数字输出引脚GPIO0,用来实现数据包分组发送指示。同时,TM32F103ZE可以通过控制RESET引脚,复位无线收发芯片。 通信方式为SPI串行通信时,时钟源由STM32F103ZE提供,通过配置处理器寄存器,SPI的SCLK时钟频率为4.5 MHz。通过TM32F103ZE内部的8位移位寄存器,实现CC1120与STM32F103ZE的串行数据交换。CSn引脚主要用来控制数据通信的同步性,通信期间要始终保证CSn引脚的电平为低。但是,需要注意的是CC1120的CSn引脚的时序并未完全遵照SPI时序规范,因此,STM32F103ZE的SPI2_NSS引脚需要设置成普通GPIO接口模式,并采用软件控制方式。 2 软件平台 μC/OS—III实现了一个基于优先级调度的抢占式内核,并在这个内核之上提供了最基本的系统服务,例如信号量、邮箱、消息队列、内存管理、中断管理等,但它并不提供设备管理和文件系统管理。 信号量用于控制共享资源的访问,可用于中断服务子程序与任务间、任务与任务间的同步。本设计中采用信号量机制来管理两个共享资源,发送缓冲区和接收缓冲区。读任务、中断服务子程序和接收环形缓冲区之间的关系如图6所示。图中的共享资源为接收环形缓冲区,IN和OUT分别为入队和出队指针。当IN等于OUT时,则接收环形缓冲区为空,调用OSSemPend()阻塞读任务;当IN不等于OUT时,如果读任务被阻塞,则在中断服务子程序中调用OSSemPost()唤醒读任务。 3 CC1120驱动实现 本文参考了国内研究者提出的μC/OS下通用驱动框架模型,将CC1120驱动架构模型划分成上层访问抽象接口层、硬件设备驱动模块层和硬件设备接口操作层。其中,上层访问抽象接口层通过对硬件平台的抽象,可以在系统开发中向上层应用屏蔽硬件特征,从而实现软/硬件的分离;硬件设备驱动模块层是整个驱动框架的中间封装层,通过该层的封装,对上一层屏蔽了SPI硬件接口;而硬件设备接口操作层是实现对底层硬件SPI串行接口的功能操作,通过调用该层接口,可以实现CC1120提供的全部功能。 3.1 驱动体系结构 CC1120的驱动体系结构如图7所示。上层访问抽象接口层是驱动体系中的最高层,该模块主要实现了数据包发送与接收功能,并对无线收发芯片的状态进行控制和获取RSSI值。其中,perCC1120Init()接口主要完成CC1120的初始化、启动并配置芯片等功能;perCC1120Read()实现数据包的接收,以及对读缓冲区的管理;perCC1120Wrire()实现数据包的发送,以及对写缓冲区的管理;perCC1120Ioctl()实现了CC11 20的各个工作状态的切换(包括休眠和唤醒)和获取RSSI值。 硬件设备驱动模块层实现对上层访问抽象接口层操作,屏蔽了硬件SPI接口,提供了对CC1120的寄存器和FIFO的读写操作。其中,CC1120 SpiWriteReg()和CC1120SpiReadReg()分别提供了寄存器的写和读操作功能,屏蔽了8位和16位寄存器的区别;CC1120SpiWriteTxFifo()和CC1 120SpiReadRxFifo()提供了FIFO的连续写和读操作功能。 硬件设备接口操作层是对CC1120的硬件SPI接口的直接操作和软件表达,该层为整个驱动模块提供了SPI同步串行通信机制。其中,trx8 BitRegAccess()实现了8位寄存器的存取功能;trx16BitRegAccess()实现了16位寄存器的存取功能;trxSpiCmdStrobe()实现了芯片的指令选通功能,用于芯片工作状态切换。 本文结合CC1120驱动体系结构,简要介绍其主要功能,即数据包的收发。 应用层发送数据包之前,先调用perCC1120Ioctl()获取信道的RSSI值,当RSSI值低于信道忙碌的门限值时,则调用perCC1120Write()将需要发送的数据发送出去。perCC1120Write()的工作流程图如图8所示。本文使用了CC1120的通用GPIO0引脚,通过适当配置,该引脚电平会在发送或者接收完一个数据包时产生一个下降沿跳变。当上一包数据包发送完毕之后,GPIO0触发中断,STM32F103ZE进入中断处理程序,将会发送写缓冲区中的下一包数据包,直至发送缓冲区为空,再把CC1120置于空闲或休眠状态。 当上层不处于发送状态时,CC1120都将置于接收状态或增强型无线电唤醒状态,当接收到一个数据包时,GPIO0引脚产生一个下降沿中断,STM32F103ZE进入中断处理程序,调用CC1120SpiReadRxFifo(),从接收缓冲RXFIFO中读取数据包,并将其放入接收环形缓冲区中。如果接收环形缓冲区满时,将放弃当前接收到的数据包。上层通过调用perCC1120Read()接口读取接收到的数据包,当接收缓冲区为空时,将阻塞上层的读取进程。perCC1120Read()的工作流程图如图9所示。 3.2 CC1120的配置要点 (1)寄存器配置软件 针对CC1120的寄存器配置,TI公司提供了SmartRFStudio 7软件。通过这个软件可以对CC1120进行配置,以获得最佳寄存器设置以及性能和功能评估。配置软件根据用户输入的发射频率、晶振频率、符号速率等参数,生成相应的寄存器配置信息。 (2)数据包处理的硬件支持 CC1120内部支持的数据包处理方式有前导码、同步字、地址过滤、CRC、数据白化、状态字节、字节倒置等,同时,数据包长度类型支持固定长、可变长、无限长3种模式,可以通过手动配置PKT_CFG0~PKT_CFG2来实现。 (3)增强型无线电唤醒 在程序的实现过程中,当CC1120长时间没有接收到数据时,则开启增强型无线电唤醒功能(寄存器WOR_CFG0.RC_PD=0),并发送SWOR指令选通命令,将芯片工作状态切换到睡眠状态。CC1120将在MCU不干涉的前提下,周期性地从睡眠状态中唤醒并监听数据包的到来,从而降低系统的整体功耗。 (4)接收的信号强度指示 CC1120在接收状态下,能连续地从RSSI状态寄存器(RSSI0、RSSI1)中读取到RSSI值,直到检测到一个有效的同步字,其后RSSI读取值将被冻结。通过设置寄存器AGC_CFG1.AGC_SYNC_BEHAVIOR,可以解除RSSI值被冻结的状态。 (5)通用数字输出引脚(GPIO0~GPIO3) 在实际应用中,可以通过寄存器(IOCFG0~IOCFG3)配置,为上层实时提供信道或数据包状态等信息。本设计将寄存器IOCFG0的值设置为0x06,即利用了GPIO0引脚的电平跳变特点。当CC1120发送完或接收到一包数据包,触发MCU端口产生中断,并在中断服务程序中进行写入或读取缓冲区TX/RX FIFO等操作,使STM32F103ZE有更多时间处理其他事务或处于休眠状态,达到降低整个系统功耗的目的。 结语 基于μC/OS—III和CC1120的短距离窄带无线数传系统方案,可以实现低功耗、近距离、可靠的无线数据传输,具有成本低、可扩展性强、操作灵活简单的特点。通过对CC1120和STM32F103ZE进行适当的配置,硬件能在无数据收发的状态下,自动进入低功耗的睡眠或待机状态,可以大大降低硬件系统的整体功耗。大量测试结果表明,该窄带无线数据传输系统数据收发正常,整个系统运行稳定,具备RSSI检测、休眠唤醒等相关功能。

    时间:2020-06-05 关键词: 无线 寄存器

  • 为什么区块链如此重要

    为什么区块链如此重要

    新技术的快速发展有时有点太快,时不时会有一个革命性的话题悄无声息地溜过,却得不到应有的认可。最近一种特殊技术的情况就是如此,它有可能极大地改变企业之间的互动方式,从而改变整个商业和安全结构。 “区块链”这个词你可能在过去几年的新闻中见过,但可能没怎么想过。诚然,在我们知道它的含义之前,我们也没有。 美国的主要公司肯定在考虑这个问题,许多公司也在考虑实施这个方案的可能性。像沃尔玛、亚马逊、Facebook等巨头似乎都有一个类似的信念,即区块链有可能改变物流、银行、合同、安全等方面的一切。那么,它是什么,它能做什么? 消除中间商 把区块链想象成一个所有交易的大型公共簿总账。 在进行交易时,它们被捆绑在一起并存储在一个寄存器(或区块)中,然后分布在数千台计算机上。所有这些计算机一起工作来验证交易,并永久记录。在一个寄存器被关闭之后,它被标记并与之前的寄存器连接,形成一个寄存器链(区块链)。 有了这样一个系统,你将很难进行欺诈或更改交易,因为你必须对包含寄存器的每台机器进行修改——更不要说在找到你想修改的那个寄存器之前,都要倒着向后工作。基本上,这里不能偷偷摸摸的事情发生。要想在不被发现的情况下操作这些记录是不容易的,而且要进行任何类型的编辑都需要强大的计算能力。交易信息不能被更改,因此作为永久的、冗余的、被复制到数千台(或数百万台)计算机上的分类帐而存在。 没有电脑能控制这个分类帐。它不属于任何人。这提供了很大程度的透明度,因为任何人都可以查看区块链。 您可能会注意到,在交易过程中,一个关键的中间人被排除在交易过程之外:金融机构。这些交易不需要第三方。 隐私呢? 用户只能看到个人的用户名或数字签名,这在一定程度上保护了隐私。在这种不完全匿名的情况下,完整性通过参与计算机在被允许创建寄存器之前必须首先经过审查的方式来维护。计算机被要求执行“工作证明”,以验证它们是真实的,而不是执行恶意的交互。 这会如何影响商业? 除了区块链的财务方面,它背后的过程和方法可以扩展,以适应其他目的。区块链可以用来记录基本上任何有价值的信息。由于它是不可更改的时间戳记的数据记录,所以它可以用于任何需要保存数据完整性的内容: 投票 数字资产的保护 追踪所有权 不动产 加密通信 文件真实性 股票交易所 食品安全 所有权记录 任何东西的来源,尤其是目前的钻石 供应链质量保证 医疗记录和帐单 分布式云存储 去年,《福布斯》的作者撰写了目前最实用的软件应用程序,其中包括五个关键领域: · 合同管理和智能合约 · 付款流程及币种 · 供应链管理 · 资产保护 · 个人记录和密码管理 这五个例子本身几乎涉及任何行业的公司,特别是医疗、保险和制造业的公司。想象一下,如果实时状态更新可以在供应链上的每个点上共享,从而提高整个系统的安全性和效率,进而提高盈利能力。根据研究和市场的全球数据显示,预计从现在到2024年,区块链技术的复合年增长率预计将达到78%,这应该不足为奇。预计北美将在这一预期增长中占有最大份额。 大家都很兴奋 随着如此多的潜力近在眼前,在那些期待区块链有一天可能会改变商业结构的人们,兴奋是显而易见的。各大高校和公司都在投资这项技术,并在研究新的方法来利用它。这意味着区块链应用上的突破性进展很可能即将到来。 由于区块链的影响仍在显现,可以理解的是,许多人仍然不清楚它意味着什么,它可以做什么。不过有一点是肯定的,开发一种更好的存储、记录和跟踪数据的方法将对任何行业产生重大影响,无论好坏。对许多人来说,这甚至可能改变游戏规则。 来源: 区块网

    时间:2020-05-19 关键词: 区块链 寄存器

  • AVR单片机的学习思路,你需要收藏

    AVR单片机的学习思路,你需要收藏

    什么是AVR单片机?应该如何取学习?学习单片机的小伙伴都知道,衡量单片机性能好坏的指标主要有:可靠性好、功能强、高速度、低功耗和低价位,依靠这几点,作为单片机家族中性能较高的AVR,你真的能理解吗? AVR单片机产生背景 早期单片机主要由于工艺及设计水平不高、功耗高和抗干扰性能差等原因,采用较高的分频系数对时钟分频,使得指令周期长,执行速度慢。以后的 CMOS单片机虽然采用提高时钟频率和缩小分频系数等措施,但这种状态并未被彻底改观。 AVR单片机的推出,彻底打破这种旧设计格局,废除了机器周期,抛弃复杂指令计算机(CISC)追求指令完备的做法;采用精简指令集,以字作为指令长度单位,将内容丰富的操作数与操作码安排在一字之中(指令集中占大多数的单周期指令都是如此),取指周期短,又可预取指令,实现流水作业,故可高速执行指令。当然这种速度上的升跃,是以高可靠性为基础的。 AVR单片机结构 AVR单片机硬件结构采取8位机与16位机的折中策略,即采用局部寄存器存堆(32个寄存器文件)和单体高速输入/输出的方案(即输入捕获寄存器、输出比较匹配寄存器及相应控制逻辑)。提高了指令执行速度(1Mips/MHz),克服了瓶颈现象,增强了功能;同时又减少了对外设管理的开销,相对简化了硬件结构,降低了成本。故AVR单片机在软/硬件开销、速度、性能和成本诸多方面取得了优化平衡,是高性价比的单片机。 AVR单片机特性 ①哈佛结构,具备1MIPS / MHz的高速运行处理能力; ②超功能精简指令集(RISC),具有32个通用工作寄存器,克服了如8051 MCU采用单一ACC进行处理造成的瓶颈现象; ③快速的存取寄存器组、单周期指令系统,大大优化了目标代码的大小、执行效率,部分型号FLASH非常大,特别适用于使用高级语言进行开发; ④作输出时与PIC的HI/LOW相同,可输出40mA(单一输出),作输入时可设置为三态高阻抗输入或带上拉电阻输入,具备10mA-20mA灌电流的能力; ⑤片内集成多种频率的RC振荡器、上电自动复位、看门狗、启动延时等功能,外围电路更加简单,系统更加稳定可靠; ⑥大部分AVR片上资源丰富:带E2PROM,PWM,RTC,SPI,USART,TWI,ISP,AD,Analog Comparator,WDT等; 从上面介绍来看,性价比高、内置丰富、直插封装、支持仿真,值得大家在开发中使用,是目前性价比最高的芯片之一。以上就是AVR单片机的解析,希望能给大家帮助。

    时间:2020-05-13 关键词: AVR avr单片机 寄存器

  • 新欧洲指令对于区块链有怎样的影响

    新欧洲指令对于区块链有怎样的影响

    意大利央行(Bankitalia)最近在一份详细的文件中谈到了比特币、加密货币、区块链和分布式账本技术(DLT)等主题,并调查了新的欧洲指令对支付服务的影响,该指令也被称为支付服务指令2 (PSD2)。 本文截取了法律咨询的法律研究笔记,涉及主题349页,其中100页专门涉及与加密货币和区块链有关的所有配置文件,从反洗钱(AML)系统到税务档案,直到通过第三方进入付款档案,以及PSD2和加密货币之间的干扰。 区块链的好处 银行、金融和支付服务的世界最近受到技术创新发展和监管演变(特别是PSD2指令,No. 2015/2366 / EU)所引起的重大变化的影响。通过这些干预措施,PSD机制的边界已经扩展到涉及新受试者的场景(cc.dd)。第三方供应商)。 技术创新引入了区块链,一方面实现了加密货币的通用流通,与在用户之间分布的数字寄存器上记录的点对点(P2P)报告交换,另一方面,在使用由主管当局管理的集中寄存器方面,它可能使使用集中式寄存器变得毫无用处。 技术创新往往是通过引进先进的信息技术平台,利用一系列信息的算法,使流动性过剩的主体与寻求融资的主体相遇。 新的背景使人们得以受到监督经营者非中介化过程的影响,以及其安全只与所使用的技术特性有关,这些特性并不是固若金汤情况的:一方面,对经授权的中间人的控制有所增加,而另一方面,那些基本上不受控制的人却增加了,或许几乎不可能加以控制。 毫无疑问,为了有效地对新的中间人和他们所进行的新类型的活动保持警惕,必须与目前对“传统”经营者、改变手段和干预模式所采取的行动不同。 技术革命的影响 该文件还集中讨论了技术革命的影响,重点讨论了区块链的作用、功能和前景。区块链是一种多用途工具,可用于许多银行和金融服务,经常会歪曲其功能。 它还进一步研究了加密货币——从其性质开始,具体研究了财政和反洗钱方面、决策者的态度和监管模式,以及在“传统”银行和金融服务方面使用技术先进的工具的影响。 此外,它还试图确定银行、金融和支付服务的新结构所产生的新的和不同的风险,并提出更新的评估和遏制方法。

    时间:2020-05-11 关键词: 区块链 加密货币 寄存器

  • MAX7456结构、工作原理及实现视频分划瞄准系统的设计

    MAX7456结构、工作原理及实现视频分划瞄准系统的设计

    长期以来,部队执勤、反恐所使用的轻武器大部分使用机械瞄准,即三点一线,这种依靠射手目视估计运动目标的距离、方向、速度,判断瞄准位置的方式射击命中率低,射击人员暴露,对人身安全带来威胁。为了提高部队作战灵活性、昼夜作战能力以及自我保护能力,近年来单兵武器配备符合机动性要求的小型化(微光、热成像、可见光CCD)视频电子瞄具,已成为重要的发展方向。轻武器视频瞄准器是美军“地面勇士”系统中单兵作战头盔化夜视眼镜的基本载体。 视频字符叠加是在模拟视频信号中混入按照视频时序格式排列的字符点阵电压,实现把封装在存储器中的字符数据,按照像元位置与扫描时间的映射关系,通过模拟开关与原始视频图像信号切换,合成为新的标准视频信号输出,从而在屏幕的指定位置上显示出人为添加的字符信息。轻武器视频电子分划瞄准系统摒弃了传统的机械瞄准,将瞄准十字分划与视频图像信号进行电子叠加,用十字分划压住目标进行射击,瞄准精度较高,而且可根据环境温度、风速等因素改变瞄准分化,构成简易电子火控系统,提高射击的一次命中率。同时,这也能改变传统射击方式,真正实现人枪分离,提高官兵的自我保护能力。它与普通视频字符叠加系统的关键区别就是叠加分划线要进行可控二维满屏移动、叠加的字符具有实时显示更新功能、分划线位置精度要达到像素级水平。设计采用模块化方式,硬件系统可靠性强,集成度高,具有通用性,能与火控系统结为一体,也能与其他功能模块结合,形成能够自动测距、测速、调整放大倍率和修正偏差的全天候观、测、瞄合一的综合瞄准设备,提高了武器的作战效能,使单兵战斗武器具备全天候的精确射击能力。 1、 MAX7456结构及工作原理 MAX7456单通道单色随屏显示(OSD)发生器为本视频分划瞄准系统的核心,其内部结构和引脚如图1所示。它集成了产生用户定义的 OSD并加载到输出信号所需的全部功能。MAX7456能够接收NTSC制式或PAL制式复合视频信号。器件包括输入钳位、同步分离器、视频时序发生器、 OSD插入复用器、非易失字符存储器、显示存储器、OSD发生器、晶体振荡器以及读/写OSD数据的SPI兼容接口和视频驱动器等。此外,MAX 7456还为系统同步提供场同步、行同步和同步丢失输出信号。时钟输出信号支持多个器件的菊型链接。复合基带视频信号输入到芯片后,首先经过一个钳位电路,产生一个直流偏置电平,可方便片上同步检测和视频信号处理,同时还可以消除低频噪声。同步分离器可从视频信号中分离出行同步和场同步,并可用作字符叠加同步与失同步的检测。显示存储器中存储了480个字符地址,叠加的字符或图片信息根据这些地址被存到字符存储器中相应单元,字符存储器是一个256行 64 Byte宽度的非易失存储器,预装了256个字符和图形,用户可通过SPI兼容串行接口可以设置工作模式、显示存储器以及字符存储器。状态(STAT)寄存器、显示存储器数据输出(DMDO)寄存器和字符存储器数据输出(CNDO)寄存器都可读,可以对其进行写操作和读操作。每个字符由12行×18列像素点组成,每个像素点用2 Byte数据表示表示3种状态即白色、黑色和透明,因此每个字符需要54 bit像素数据来存储。另外,它还具有特殊的字符显示功能,例如:闪烁、反色、背景控制等。OSD发生器产生OSD点阵像素的状态和是否叠加的控制信号,OSD叠加器根据控制信号来选择输出视频信号还是输出OSD信号。补偿电路可以通过较小的输出耦合电容来降低线路失真。该器件的视频驱动器输出具有2 V/V增益,6 MHz的信号带宽,可以驱动两路150 Ω视频负载。 2 、系统总体设计 本主系统由CCD视频图像采集器、单片机、MAX7456视频叠加显示芯片、供电电路、显示器、键盘及相关电路系统组成,同时预留温度传感器、风速风向传感器、电子罗盘、激光测距仪接口,实现了叠加图像与场景图像同显、手动调节瞄准用十字分划位置。外接12 V锂电池供电,经7805转化为供单片机使用的5 V,系统设置提供掉电存储。其系统硬件设计原理框图如图2所示。 考虑到实现功能以及设计小型化的要求,系统采用STC12C5608单片机作为主控芯片,它采用了高性能的处理器结构,可以满足多方面的性能要求,高性能、低成本、低功耗、小体积特别适合于集成度要求高、充电不便的场合。同时,本款单片机同时具备SPI串行接口和UART串行接口,由于MAX7456视频叠加模块只有SPI兼容串行接口而没有UART接口,所以单片机不但充当上位机通过串口发送数据到MAX7456视频叠加芯片的中介,而且也作为十字分划线在键盘控制下实现全屏幕移动的主控芯片,以及传感器信息的处理器。 每个单片机控制一片视频叠加芯片,SPI通信方式采用单主机单从机的配置模式,在设计中,将单片机的4个引脚P1.4(\SS)、P1.5(N- OSI)、P1.6(MISO)、P1.7(SCLK)分别和MAX7456视频叠加芯片的对应端口相接。为了方便观察与调试,设置单片机电源指示灯,通电红指示灯亮。在单片机引脚上加了一个端口指示灯,当单片机下载程序时,指示灯红、绿灯闪烁。当单片机程序运行正常时,指示灯绿灯正常闪烁。图3所示给出的是MAX7456的硬件电路。 3、 系统软件设计 为适应对多种目标在各种环境下的瞄准射击,可用十字分划瞄准射击。轻武器视频电子枪瞄准叠加与普通视频字符叠加的关键区别就是,叠加分划线要进行可控二维满屏移动,分划线能在水平和垂直方向进行移动。在分划线移动时,由于图形是以字符的形式存储和显示,所以,为了实现分划线按像素移动,需特别注意软件的实现。设计主要包括:PC机的软件设计和单片机软件设计,它们共同完成十字分划瞄准线、相关字符提示信息以及传感器获取信息的叠加。PC机软件主要完成对MAX7456字库点阵信息的编码,字符信息的更改,字符、十字分划线位置的移动,以及对系统的管理。单片机程序是系统软件的重点,主要实现修改字符串、显示字符串、清除字符串、十字分划线的全屏移动等功能。如图4所示。 3.1 修改字符串 MAX7456芯片的字符存储器中存储256个字符信息,当需要更换叠加信息时,通过修改字符串程序,将PC机产生的字库点阵信息写到字符存储器中,写完后打开显示使能 } 3.2 十字分划线产生 视频叠加芯片MAX7456关于叠加图像点阵数据在字符存储器(E2PROM)中的存放采用的是“屏幕存储映射”方式,即屏幕上每一个像素点都和一个显示存储单元对应,分划线和字符在屏幕上显示的行列位置取决于它在显示存储区的存储位置。显示字符串程序通过对相应寄存器的设置,实现字符叠加及相应显示属性的定义。要产生十字符只要在把十字符信息存储到相应的显示存储器存储区。 3.3 十字分划线的全屏移动 芯片在对视频信号进行叠加的过程中,除了在需要叠加的地方叠加了字符信息之外,在不需叠加的地方并非没有叠加任何信息,而是叠加了透明字符块,只是表面上感到没有叠加信息。通过这一启示,本设计采用了写透明字符块来取代清屏的方法,从而既清除了原有的字符叠加信息,达到了叠加新字符的目的,同时又跳过了清屏这一操作,解决了将视频图像中的原有字符全部清掉,再把整屏需要叠加的信息送入芯片进行叠加而引起的闪屏和更新速度慢的问题。 视频电子枪瞄准叠加与普通视频字符叠加的关键区别就是叠加分划线要进行可控二维满屏移动,为了实现十字分划线的全屏移动,即当需要改变瞄准分划时,十字分划线通过PC机或者是按键的方式实现左右、上下移动,使十字分划线的中心位置就是轻武器射击时的弹着点。 4 、结束语 设计的视频分划瞄准系统以MAX7456视频叠加显示模块为基础,使用简单的外围电路,实现了相应功能。系统工作稳定性高,性价比高,体积小,采用按键方式改变视频电子分划位置,能实现视频分划按像素的全屏可控移动,设计操纵简单,便于在轻武器上安装使用,真正实现提高射击人员的射击精度,以及人枪分离下武器装备的全天候精确射击能力。

    时间:2020-04-26 关键词: 存储器 驱动器 寄存器

  • 将RS编码与CC连接在OFDM系统中的性能指标与应用分析

    将RS编码与CC连接在OFDM系统中的性能指标与应用分析

    引言 在频谱资源日益宝贵的今天,OFDM调制,以其较高的频谱利用率,广泛应用于多种无线通信系统之中,比如802.11a。 通信系统的另外一个重要指标就是系统的可靠性。高可靠性的系统需要高性能的信道编解码方案。到目前为止,信道编码主要形成了包括分组编码和卷积编码在内两大类编码体系。其中,分组码主要包括汉明码、RS(Reed-Solomon)码、BCH(Bose-Chaudhuri-Hoc-quenghem)码。最近提出的LDPC码也可以纳入分组码一类。卷积码包括CC(Convolutional-Coding)编码和以CC编码作为分量码的Turbo码。 RS码是一种多元BCH码,属于线性分组循环码,具有同时纠正突发错误和随机错误的能力,且结构相对简单,是应用最广的差错控制编码方式之一。卷积码中的维特比译码在编码增益和数据传输率方面都有较优异的性能。 基于以上的分析,本文将RS与CC通过交织器的连接,级联应用于OFDM系统之中。通过计算机仿真,具体分析其性能指标。 1 、设计原理 1.1 RS设计原理 1.1.1 编码 RS编码是一种定义在伽罗华域GF(2m)上的运算。(n=255,k=239)RS码可由GF(28)导出。k表示待编码的信息个数,n表示编码后的数据个数,n-k=16就是添加的冗余个数。(255,239)RS码能够检测16,纠正8个错误。 因为RS码是循环码,所以它的监督码元的生成由生成多项式决定。生成多项式的幂为监督码元数,可取本原元a的连续n-k=16次幂作为生成多项式的根。因此可以得到(255,239)RS码的生成多项式是: 由于RS码为循环码字,按照循环码的系统编码方法,可得到RS编码。信息多项式为m(X),监督多项式为p(X),商多项式为q(X),那么Xn-km(X)=q(X)g(X)+p(X)可表示为p(X)=Xn-km(X)modg(X),最终码的子多项式U(X)表示为:U(X)=p(X)+Xn-km(X)。在利用算法实现时,求余数多项式p(X)的过程太过于复杂,所以选用比较容易的LFSR移位编码作为编程实现,即(n-k)阶移位寄存器的系统编码。图1为(255,239)RS码的16阶位寄存器的系统编码框图。图1所示寄存器的每个状态具有8 b的码元。系数g0,g1,g2,…,g14,g15是生成多项式的系数。 (255,239)RS码的16阶位寄存器的系统编码形成系统码字的步骤如下: (1)开关1在开始的k个时钟周期内合上,使消息码元进入移位寄存器的(n-k)级。 (2)开关2在开始的k个时钟周期内处于下面的位置,使得消息码元同时直接传输到一个输出寄存器中。待第k个消息码元传输到输出寄存器,开关1断开,开关2移到上面位置。随后的(n-k)个时钟周期用于清除移位寄存器中的监督码元,这可以通过将其移到输出寄存器而完成。 全部的时钟周期数等于n,输出寄存器存储的内容就是码字多项式p(x)+Xn-km(X)。p(X)和m(X)分别表示监督码元和消息码元多项式形式。 1.1.2 译码 RS译码采用与编码相同的本原多项式,参数与编码器也相同。具体实现框图如图2所示。 由图2可见,RS解码主要分为错误检测和错误纠正两个步骤。具体可分为: (1)伴随多项式的计算; (2)确定错误位置多项式; (3)确定错误估值函数; (4)求解错误位置数和错误数值,并进行纠正。 1.2 CC设计原理 1.2.1 编码 卷积编码我们采用(2,1,7)卷积编码器,其X,Y状态转移多项式为(171,133)。每个时钟周期输入1个bit信息,输出2个bit信息。编码器结构如图3所示。 1.2.2 译码 Viterbi译码的框图如图4所示。 由图4可见,译码器主要分为三个步骤: (1)分支度量计算(bmg); (2)加比选计算(acs); (3)回溯输出译码结果(trace_back)。 1.3 交织器设计原理 OFDM系统中交织器的主要作用是抵抗信道的突发成片错误。交织器的设计目的就是把一组的成片错误分散到不同的分组之中。在这里选用实现较为简单的行列交织器。系统设计的时候,发射端,RS编码输出的数据按列写入交织器,CC编码器按行读取交织器内的数据;接收端,CC译码器按行向交织器写入译码后数据,RS译码器按列读取待译码数据。 2、 仿真与分析 OFDM系统仿真参数如下:使用1 024个子载波,其中,768个传输数据,256个空载波,数据子载波中有12个导频子载波,有效数据占736个子载波,(255,239)的RS编码,(2,1,7)卷积编码,QPSK调制,外交织为45×32,内交织均为23 x 32,限幅滤波器、上下采样滤波器的系数通过Matlab产生,信道采用cost207中的TU六径模型,理想同步,LS信道估计。每种信噪比条件下,误码率取1 000次仿真平均值。 通过计算机Matlab仿真,可以得到OFDM系统分别采用级联编码、RS编码、CC编码和无编码编码情况下的性能曲线,如图5所示。 通过曲线图可以看到,在同样的系统参数条件下,不同的编码增益具有较大的差异。其中,级联编码具有最好的性能。在中高误码率条件下,级联编码比RS和CC单独编码大约有2 dB编码增益,最大值可达4 dB左右。在中低误码率条件下,卷积码与级联码的性能相接近,这主要是因为在中低误码率条件下,RS码的性能减弱,中和了级联码的性能,使得主要的编码增益来自于卷积码。 3、 结论 通过Matlab环境,搭建出使用RS编码和卷积编码通过交织器级联作为信道编码方案的OFDM系统。仿真表明,级联编码的引入,使得OFDM系统性能具有显著的提高。

    时间:2020-04-26 关键词: 通信系统 ofdm 寄存器

首页  上一页  1 2 3 4 5 6 7 8 9 10 下一页 尾页
发布文章

技术子站