嵌入式软件开发人员 硬件常识_第1页
嵌入式软件开发人员 硬件常识_第2页
嵌入式软件开发人员 硬件常识_第3页
嵌入式软件开发人员 硬件常识_第4页
嵌入式软件开发人员 硬件常识_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、嵌入式软件开发人员,硬件常识具备硬件开发知识本节内容 .硬件开发流程硬件识图软件控制硬件方法嵌入式 C 语言硬件开发知识大致清楚硬件的设计和生产流程.清楚自已工作中常用的硬件器件的工作原理.要有看懂硬件原理图的能力.主要涉及影响到编程的关键的连线和管脚的一定要看懂.,和常见任务的处理流程软件相关能力要知道如何用编程语言(主要是C,和少量的汇编)去控制硬件.还要熟悉底层软件与操作系统的接口 .象同一款硬件,原始的控制代码是基本上一样的,但是各个操作系统对驱动与OS 的接口 ,完全不一样.Windows 系列的驱动接口远比 Linux 复杂得多.各个操作系统也提供了不同底层函数接口用于开发,这些都

2、需要熟练掌握的.具有调试底层软件的能力 ,除了常用的软件调试手段,(如单步 DEBUG ,查看输出信息 .) 有时可能需要动用软件,和硬件检测设备来调试如网络调试 ,可能需要抓包软件,基于硬件的流量测试仪基于硬件的电路的仪器,如万用电表,显波器和逻辑分析仪基于无线的设备,可能需要无线信号发生器或基站模拟设备在底层软件开发领域,还有一些非标准CPU 的分支开发领域,由于采用接近于CPU 的复杂结构 ,因此必须用的需要常握其中一种工具常用数据处理,如音频,加密,视频影像处理的DSP,都会有自已独立的开发环境,有的是接近汇编级的语法代码,更高级是类似于C 的编程语言.常见的 DSP 开发环境有TI的

3、 CCP.在网络流量很大的地方 ,如核心路由器,大型的防火墙,网关,等,这一些设备有时用软件已经无法处理.往往采用基于网络处理器的的方案, 网络处理器会在硬件直接处理网络包,这些网络处理器也有独立的开发环境用于开发.如 Intel 的 IXP 系列 .FPGA,CPLD (VHDL) 用类似于 Basic 或 C 语言的开发语言去设计硬件,如 MaxPlus IIlabView 虚拟仪器 .硬件产品设计流程与软件不同,一个硬件产品的从最基本的器件到最终产品的出产,是一个全球化高度合作的结果.牵涉一个完整的产业链的方方面面.因此必须需要高度工程化的管理和生产技术.否则不可能生产出合格产品.以一台

4、 生产而言.它的技术标准和研发可能是在欧美的大公司或大学的研究机制进行.如Nokia和爱立信,高通等来进行研发的.当技术成熟后,可能在美国的IC设计公司(如TI) 设计出可以满足实际产品的集成电路,这个集成电路的生产,出厂测试等流程可能是在台湾新竹的台积电,联电的IC生产工厂代工.单独的IC并不能形成产品,必须要焊接在电路板上,和其它电件组成完整的硬件电路和 底层软件的设计,甚至是应用程序的开发,这大大降低了生产厂家的门槛.象设计里最有名的是MTK(联发科技),它提供底层的IC到硬件电路方案,+软件方案的全套设计.这样很多小厂 也能直接生产.号称是黑之父,这几年的大量的上市,它功不可没.也造就

5、它成为台湾股市的股王.在低端MP3,MP4领域里,采用相同策略是位于珠海的炬力,它也推出MP3和MP4播放器从IC到硬件设计方案,软件的全套设计方案.造成现在MP3,MP4市场大规模爆发.如果是从元器件开始设计一个电子产品 .第一阶段是硬件工程师要根据参考方案和文档,设计出一个硬件原理图产否能正常正确,确定硬件的连线等工作.类似于产品硬件设计模型 . 这一项工作一般是由一个公司最有经验的工程师来完成.原理图都是一个逻辑表示,比方元器件用示意图表示,连线也不会跟最终产品的走线一模一样 .在一个缚有一层导电金属层的绝缘板用化学方法“刻一根一根的导线.然后再焊接上去.这种板就称为PCB(Printe

6、r Circuit Board).这种方法有很多优点,节约空间,防止干扰,焊接点小,并且牢固.集成度 高,因此现代的电子元件互联完全采用PCB板来制作.因此硬件设计第二阶段就要是把原理图设计成供生产的PCB图.类似于建筑施工图,里面的设计布局将会跟实际产品开发一规一模.PCB也是取决于设计经险,但很多是重复劳动,在很多小的公司往往采用外包的方式让专业的PCB公司来代为设计,深圳就有大量公司或工作室来代人完成 PCB设计.原理图设计,和PCB设计都需要专用软件来完成 .现在有设计软件从几十 W到几W的软 件都是,象常用的Prototel ,PowerLogic/PowerPCB是比较流行的硬件设

7、计.可以完成二阶段设 计.高端设计软件有 Cadence.当完成PCB设计后,一方面准备制作 PCB板了 .由于PCB的制作设备非常昂贵.一般是 由专门PCB生产厂家来代工.深圳是中国以及世界上最集中 PCB产业地,拥有大量PCB制作 厂家.另一方面由PCB图导出BOM (元器件清单)交由采购部门进行采购.现代的IC的管脚已经越来越复杂,采用手工焊接效率低,失败高,往往需要专门焊接厂进行全自动的焊接当一个产品完成后,就要设计吸引人的产品外壳,这称为结构设计.比较简单的是用金属冲压件.如果电脑机箱,机柜之类.优点设计成本低,可以快速实现.缺点就是一般只能是带直角 的设计.外形过于简单.现在大部分

8、电子产品采用塑料外壳.优点可以做出非常复杂的外形.并 且可以采用不同材质进行组合.缺点是设计复杂,并且要用设计专用模具来生产.现在结构设 计软件有普遍采用Pro/E或UG来进行设计.也有人使用AutoCAD来设计.现在结构设计一 般也是外包给专业的设计公司进行设计.很多产商为了节约成本,往往采用模具厂预先做的好模具,这个称为“公模”.欧美市场对环保有极为严格的要求,如果产品要销往欧美市场,往往需要使用无铅的焊锡 油漆.电磁辐射也有强制要求.以有其它的准入门槛.如欧盟的CE认证,美国的UL认证,FCC认 证等,这一些都是强制标准,必须先在先由认证的代理机构认证后.才能在上述市场销售.这是必须一个

9、环节.电路图的识图能力常见电路图有三大类框图(BLOCK DIAGRAM ,原理图和PCB图,时序图框图用于描述系统结构,一般用于文档描述.原理图用于系统原理设计.同时进行底层软件编 程时往往需要多次查阅原理图的设计.PCB图用于实际生产.软件编程一般不需要查看 PCB图.底层软件人员往往需要了解是时序图(Timing),用于反映多个信号源或管脚之间信号的相互关系。因为一个硬件完成一项工作必须是多个管脚协同工作。而且往往有时间顺序上的要求。而时序图就是反应这种时间上的信号之间相互关系的图形,大量于IC的设计文档,在实例运行中,往往也可以用显波器之类设备测量出这种波形关系。用于协助软件人员调试错

10、误。S3c2440的原理框图BLOCK DIAGRAMARM92QTiPApiqJTAGk旬 ructicmMMJbutrucLicnCACHE(16KB)iVA(3ijDC13ARMSTDM)Froceaar core(InternaJ Emb-edded ICE)3VA ;31 0;CTJA91 工8 Ml MULBCOW.Clock Grwnl&r(MPLL)QQ2440部分原理图CF15 口231 :zimw:司DataCACHE flSKB)LCDDMA弟白H518MT.hANSCzri.NANC-qashJacwtLcsae*EjcixrrnjilCopiocIrrtirfac:*

11、11 Bridge & DMA 4ChWrtteBuIVtrVVnteBack抬T蝇RAMmerrup: CONT.匕括汽agwryd_ arrI lerfaM!AM BABus*l/FMtrrory CONTER AM 八二 DR/”4gMb4EOG:5 4MBgR? 41R旦?QWII 、: K 4C qutm i。式“I : 4CCIRIL 4cM I: 3和4DC:iL 4DWM 4rsecm wenn qtxwiE 房 4ECHi-kddiai忖ft 3HATL d LQAn-1卓 n&Tvlx zIMnTEm* 2%&*:0。 工 MgMW 030-2WbCQ贡f n CP-HUS

12、H-n- vnY &SRP n D 一舍百营, -nc MuaKfl-ro EJV *r*rS3=EV*ts-By.-ETW5K L&EAU. T =第fEaMl arzu 由的 EMFAj dM* &K4E riTAi am, LMRAE am, 5an Ei*r.*ii 3禺n 口 Hh 8rM 4 取加 dr*LII i xw, 54W4II E WlMl W熊1 修即用fcl anwCM斯, 3gs arMi xr” ag瑞 EMM” W4 2人如: : rWlTiT-F g iJLwrMF I_UMYT.yr- 5 iTiqTy,F口 4 ulktre s uuvnnTE J LBA

13、GI aET t1 ULRTTQHF 5 U0AT.4EZE- 7 MLIVVA*一个S3c2410开发板的PCB图二 -g. W-S y_k 可u.信号时序图(Timing)SPI总线时序试指令时序图而0 I 2 3 4 3 6 7 B 。 1口仰1之1* M 时点17 I甘伯的22妗5CKJVuwiARnjWbWLnjiMLjWUW L 何5*0! 网(13林工厘虱引巫亚应一写指令时序图SCK1匚1二1r匚1虺扑丁性q lVA2J1T)00000(常用时序图NAND Flash 控制时序图,有规则的波形HCLK一般用于表示时钟信号,用于不同信号计时。上例中,表示在第二个时钟周期时,CLE/

14、ALE的必须由低平切换为高电平。在第三个时钟周期,new由高电平变为低电平。用双线表示波形,即 DATA ,表示高低电平不确定,必须取决于当时应用的情况。比方在这个例子,DATA在有效的时钟周期,传输是不同命令或地址。一个复杂的时序图 内存控制器的时序图HCLK1f J,r*181V J h J 1II hlcADDR:11f_LLpnGCSi i i I LTacc=41II IIPL -J 1 LnOE1uIfaJDelayed if i iIcoswJSampling riA/AITJnW A IT皿H l)1 |lii iI iiU芦i I f EL1卜JII |i11Figuire

15、5-2. S3C2440A External nWAIT Timing Diagram (Tacc=4)软件控制硬件方法作为一个嵌入式软件开发人员,必须熟悉如何控制硬件.首先从技术要确定项目开发采用哪种CPU.这取决项目人员技术背景,产品以前经验以技术特点等.一般公司尽可能采用同一种CPU来开发不同产品.这样可以最大可能节约成本,并且技术风险比较小.当确定的CPU后,研发人员就要研究的 CPU相关文件指令集和测试程序.这一些都要在 项目开始前完成.硬彳IC的 通常是PDF格式的.称为DataSheet.CPU的datasheet是相当于 一本厚厚的技术词典.如S3c2440的datasheet

16、有596页.如果要控制比较复杂的外部设备,通常还要去阅读相应的手册.因此在开发前,最好尽可能阅读尽可能多的手册.以S3C2440 CPU为例.首先要了解一下 CPU的框图,了解这一款 CPU的大致部件.BLOCK DIAGRAM03 8E.5 制 QGG*$LC3LCD Igm&WA |,i9 -cc ccwr.3却me.lllermar? C-iFsT.Figure 1-1. S3C244M Block Diagram从这个框图可以看到,这一款CPU具备的基本硬件包括内存 ,LCD几项装置.另外这个 CPU还提供了许多的 GPIO(General Purpose I/O)管脚,让设计者可以根

17、据自已的需求来控制 这一些外围设备,这是一个很典型的一种做法.如果这些外围还是不够的话,就要自已加控控制芯片,拉到地址线(address line)及总线(bus line)上,通过这些线来控制外围,像是SDRAM或是Flash就是通过地址线与总线来存取 数据.有三个概念要分清楚,存储器,I/O端口,寄存器.寄存器是指CPU和外设内部的存储单元,数量有限,但速度快,分通用寄存器和特殊 功能寄存器比方 pc, sp等。不同CPU寄存器宽度是不一样的.8位单片机表示地址线和数据为 8位大小.寄存器宽度 也是8位,在C程序中正好可以用一个 char数据类型来操作.主流32位CPU的寄存器就是 32位

18、宽度.正好用一个32位,在程序中可以用一个 unsigned int来操作.CPU的寄存器或地址 位的宽度称为WORD(字)通常说的存储器都是独立于 CPU 之外的,比方内存,硬盘,光盘等CPU 本身几乎每一种外设都是通过读写设备上的寄存器来进行操作的。外设寄存器也称为 “ I/O 端口” ,通常包括:控制寄存器、状态寄存器和数据寄存器三大类,而且一个外设的寄存器通常被连续地编址。 CPU 对外设 IO 端口物理地址的编址方式有两种: 一种是I/O 映射方式 I/O mapped ,另一种是存储空间映射方式Memory mapped 。 而具体采用哪一种则取决于 CPU 的体系结构。有些体系结

19、构的 CPU如,PowerPC、m68k等通常只实现一个物理地址空间RAM。在这种情况下,外设I/O 端口的物理地址就被映射到 CPU 的单一物理地址空间中,而成为存储空间的一部分。 此时, CPU 可以象访问一个内存单元那样访问外设I/O 端口, 而不需要设立专门的外设I/O 指令。这就是所谓的“存储空间映射方式” Memory mapped 。 ARM体系的 CPU 均采用这一模式.而另外一些体系结构的 CPU 典型地如 X86 则为外设专门实现了一个单独地地址空间,称为“ I/O 地址空间”或者“ I/O 端口空间” 。这是一个与 CPU 的 RAM 物理地址空间不同的地址空间,所有外设

20、的 I/O 端口均在这一空间中进行编址。 CPU 通过设立专门的 I/O指令如 X86 的 IN 和 OUT 指 令来访问这一空间中的地址单元也即 I/O 端口 。这就是所谓的“ I/O 映射方式” I/O mapped。 与 RAM 物理地址空间相比, I/O 地址空间通常都比较小,如 x86 CPU 的 I/O 空间就只有64KB 0 0 xffff 。这是“ I/O 映射方式”的一个主要缺点。而且必须要专门的汇编语言才能处理.Linux 即在 X86 运行 ,也在ARM 之类运行.为了简化操作,Linux 在所以 CPU 上都采用 I/O端口概念.如果是象ARM 这样内存映射 .也被模拟

21、成端口 .模式 .在ARM下,所有外设的寄存器都被映射到一个4G地址.(注意要与操作系统下的映射2G地址空间分开,那是操作系统给每个进程模拟的空间,I/O 地址实际映射物理地址空间 )以下是在 S3C 2440 的 Nand/Nor 在设备空间映射地址空间anqi:q = oirio目oot lul9g 3fUM (iKBy 加CX3SC2JD3EQ 0i 5M!_63M SROmDAM判KM嗯RAM (小乃JJ2M34ME豆呼号4MB12! MB 也阳toLgn&C!峋fn&C 蚓r不如5.需附dA旭鼬flBJf的呼rSHOW(HGCS5IMON (R&CI5)/qE-125VBCX2EtL

22、_Q.KDC3_O3W -kC=1=: 二二二 _QKlj:_CJDa - ninn-IRON1国ON (IWS4|dh19MB1GBrHADORHESHOM.h&C导畀SRON即d rb具器UEHU12WEAR0M2CE卦SROM taxid r1W第拒SROM(IUGCSISRDN (n&csi)jr12WHARONd128MBF,CMDDZJDiCd 力 pin&CB 酊SO0t nnwrui 各证帆网Wjrtot uiingiNJsjyD riish rw bwt rom j:uo:ng Nhc r 羽,囤 no4t row |Figure 5-1. S3C2440A Memory M

23、ap after Reset所有S3C2440寄存器地址映射表写在手册 55页(1-32)如下例就是内存控制器相关的寄存器地址设置T曲但 14 SJC?440A special Keisters (Sheet 1 cf 14;Register NameAcdress 但 tndian)Address(L bndian)Acc.UnilRead/WriteFunctionMemory CoturollrBV/SCON0 x4600000(WR/WBus w din & 审ait status confro驰 NK8NO0 x46000004Boot ROM controlBANKCON10i48

24、ODCK8BA1NK1 control舶 NK8N2OSOOQCOCBANK2 wnuol3ANKCON3(M8OMM10BANK3 controlSANKCOM40 x46000014BANK4 control3ANKCON50 x46000018B4NK5 control3ANKCON6Oj4EOQ001CBANKS control3ANKCON74h46C00020BANK? controlREFRESH出480(024DRAI/.SDRAy介已由 control3ANKSIZE046000028FlgMbte bank sizeVRSRB6tMEOOOO2cMode regisier

25、set for SDRAM BANKSMRSRB70 x46000030Mode register set for SDRAM BANK?一般的PC机和ARM 板都带有外接电池供电的RTC(REAL TIME CLOCK 实时时钟)芯片,即便是切断的外接电源,RTC电路记录的时间也会按真实时间流逝而做相应变化.首先根据地址表找出 RTC电路寄存器相关地址.(S3c2440芯片手册P66)日 NjF11aVJ WJ Ktyi rrnur1日产 i r hs-jpBNTPEMD0 x56OT0CAfiExLfei id inlen jpl peidGSfTAT 闷OiGGOMCACftExtern

26、al pin slitusGSTATU310 x56000000R/WCHp DGSTATUS2Ox5GODOOB.57000C74BCD minuteBCOHOUR0 xS7O3K7B0 xS73O0C73BCD hourBCQDATEto57O10(J7F皿5加0(口/匚BCD rlstyDCDCAYD*f700MM3口居 57moe00BCD 山 IsSCDMOTJ970。由DkE73O0C&4BCD monthHCPYFARMTOtXKlPRWWOOOORHRCD收班其中存储年 月 日小时分钟,秒的的寄存器分别是 BCDSEC,BCDMIN,BCDHOUR,BCDDATE,BCDDAY

27、 ,BCDMON,BCDYEAR. 地 址 从 0 x570000770 x5700008B 地址.在C语言中为,方便程序编写,往往把寄存器定义为宏,这样当CPU微调的寄存器定义,程 序不需要重写./ RTC#ifdef _BIG_ENDIAN/RTC control/Tick time count/RTC alarm control/Alarm second/Alarm minute/Alarm Hour/Alarm date /edited by junon#define rRTCCON (*(volatile unsigned char *)0 x57000043)#define rTI

28、CNT (*(volatile unsigned char *)0 x57000047)#define rRTCALM(*(volatile unsigned char *)0 x57000053)#define rALMSEC(*(volatile unsigned char *)0 x57000057)#define rALMMIN(*(volatile unsigned char *)0 x5700005b)#define rALMHOUR (*(volatile unsigned char *)0 x5700005f)#define rALMDATE(*(volatile unsign

29、ed char *)0 x57000063)#define rALMMON(*(volatile unsigned char *)0 x57000067)/Alarm month#define rALMYEAR (*(volatile unsigned char *)0 x5700006b) /Alarm year/RTC round reset#define rRTCRST (*(volatile unsigned char *)0 x5700006f) #define rBCDSEC (*(volatile unsigned char *)0 x57000073) /BCD second

30、#define rBCDMIN (*(volatile unsigned char *)0 x57000077) /BCD minute #define rBCDHOUR (*(volatile unsigned char *)0 x5700007b) /BCD hour #define rBCDDATE (*(volatile unsigned char *)0 x5700007f)#define rBCDDAY (*(volatile unsigned char *)0 x57000083)#define rBCDMON (*(volatile unsigned char *)0 x570

31、00087)#define rBCDYEAR (*(volatile unsigned char *)0 x5700008b)/BCD date /edited by junon/BCD day /edited by junon/BCD month/BCD year#define rRTCCON (*(volatile unsigned char *)0 x57000040)#define rTICNT (*(volatile unsigned char *)0 x57000044)#define rRTCALM(*(volatile unsigned char *)0 x57000050)#

32、define rALMSEC(*(volatile unsigned char *)0 x57000054)#define rALMMIN(*(volatile unsigned char *)0 x57000058)#define rALMHOUR (*(volatile unsigned char *)0 x5700005c)#define rALMDATE (*(volatile unsigned char *)0 x57000060)#define rALMMON (*(volatile unsigned char *)0 x57000064)#define rALMYEAR#defi

33、ne rRTCRST#define rBCDSEC(*(volatile unsigned char *)0 x57000068)(*(volatile unsigned char *)0 x5700006c)(*(volatile unsigned char *)0 x57000070)#define rBCDMIN#define rBCDHOUR#define rBCDDATE#define rBCDDAY#define rBCDMON#define rBCDYEAR(*(volatile unsigned char *)0 x57000074)(*(volatile unsigned c

34、har *)0 x57000078)(*(volatile unsigned char *)0 x5700007c)(*(volatile unsigned char *)0 x57000080)(*(volatile unsigned char *)0 x57000084)(*(volatile unsigned char *)0 x57000088)/RTC control/Tick time count/RTC alarm control/Alarm second/Alarm minute/Alarm Hour/Alarm date / edited by junon/Alarm mon

35、th/Alarm year/RTC round reset/BCD second/BCD minute/BCD hour/BCD date /edited by junon/BCD day /edited by junon/BCD month/BCD year#else /Little Endian#endif /RTC其中 volatile 是 C 的保留字 ,通知编译器 ,不要自动优化这个地址所对应的变量值为0, 因为寄存器的值往往是有含义的,并且是由硬件自动来设置的.强制设为 0 可能会带来错误 .#define rRTCCON (*(volatile unsigned char *)0

36、 x57000043) /RTC control 表示取地址 0 x57000043 对应内存的地址volatile unsigned char *, volatile unsigned short *, volatile unsigned int * 表示处理对应地址的宽度/范围 ,分别是 1,2,4 Byte, 在寄存器地址强制转换成哪一种类型,取决于这一寄存器的有效位 ,如 rRTCCON 只用到 4 位,转换成一个char * 即可所有有寄存器用 unsigned 来强制因为寄存器里所有位都是有效的数据位.而有符号会把最高位看成符号位.这样经常容易产生错误,用 unsigned 另外要

37、还要考虑到有符号右移位操作符号位不动, 即算术右移.在底层编程往往是错误的 .接着可以参考CPU手册的寄存器详细定义(457页),其中描述了每一位的格式BCD SECOND (BCDSEC) REGISTERRegishaAddressR/WDeset iptonReset ValueBCDSEC0 x57000070(1)0(5700007 耶)R/W曲 b/tc)日CD second rgetefUnd嘀口改0CDSECBitDescriptionInitial StateSCOATA性尚ECD value For second 05P:0”9BCD MINUTE (BCDMIN) REG

38、ISTERRegisterAddressR/WtescriptonReset ValueBCDMIN3(57000a74fL) ttc57 mo077(8)RAV的 byte)3CD minute registeiUndEfinedBCDMINBitDoccriplionInitial StamMNDATA4ECD value form nite 0 5P:00-9BCD HOUR I0CDHOUR) REGISTERRtpgifit&rAddrygR/WDp riptinnRa-t Vai iipBCDH0LR你讨 MO70(L) Ok57O3O370(B)R/W切 bae)BCL hour

39、 registerUndefinedBCD DATt (BCDDATEJREGISItR如dm,R/WCeicripticnR既* *h睡BCDDATEDx57D0CD7C(L)Ck*73DCD7F(S)R/WI b?匕Fe;BC2 亡目域 re iE:rUrds-f n-dIBCDDATEDescriptionInitial StateRewrvsd一SCD value for date :. m-3,DBCC DAY (BCDDAY) FtEGISTER凸ddre;筝R/WRqmet Valu?BoD DAYDm57DOOOM(L)Dk5OC,DD53 S RfWj 孙 bjr)BCD a

40、 day of rf Mk regisrUrdefiwciBCDDAYBitDescriptionInitial Stat7-31DAYDATA201BCD value for a day of dhe week.1、7BCD MONTH (&CCMONI SISTERAd Hlr目弓事MW口 跳。也 ripHeniR堂餐叁l V jiIui电BCDMONIOM57aocaa4(L)Ck5 了口口 口口 67日RFW( by by:e)3C D mci rrtij regisierUrdefinrt&d:SCDHONBiiDescriptionInitij) StateReserved7:5|

41、MOTJOATABCD 耐u- for montli.0,1w向31 7接着按程序初始化一个固定的年月日void RTC_Time_Set( void )rRTCCON = 1 ;RTC read and write enablerBCDYEAR =:0 x05 ;年rBCDMON=0 x06 ;月rBCDDA TE :=0 x19 ;日rBCDDAY=0 x02 ;星期rBCDHOUR =0 x15 ;小时rBCDMIN=0 x21 ;/分rBCDSEC=0 x30 ;秒/1取反,表示0 x11111110,与上rRTCCON表示把最低0位置0,其余位不变rRTCCON &= 1 ;RTC

42、read and write disable置1采用或操作/rRTCCON |= 1;读取时间电路void RTC_Display(void)U16 year ;U8 month, day ;/ weekU8 hour, minute, second ;RTC_Time_Set();Uart_Printf( RTC TIME Display, press ESC key to exit !n);while( Uart_GetKey() != ESC_KEY ) rRTCCON = 1 ;/RTC read and write enable TOC o 1-5 h z year = 0 x200

43、0+rBCDYEAR ; 年 month = rBCDMON;月day = rBCDDATE ;/ 日/ week = rBCDDAY;星期hour = rBCDHOUR;小时minute = rBCDMIN;分second = rBCDSEC;秒rRTCCON &= 1 ;/RTC read and write disableUart_Printf( RTC time : %04x-%02x-%02x %02x:%02x:%02xn, year, month, day, hour, minute, second );Delay( 900 );嵌入式C语言寄存器定义解释参见寄存器定义#ifde

44、f _BIG_ENDIAN#define rBCDSEC (*(volatile unsigned char *)0 x57000070)#else从上述定义中,请思考,如下问题 TOC o 1-5 h z 为什么要分字节序符定义?volatile 表示什么含意?为什么要用无符号的数字?宏定义的最前面* 表示什么含意?为什么要分字节序符定义?寄存器的地址位于一个线性空间上.但是不同字节序下,同一寄存器的地址会发生变化 .这可参见 CPU 的手册,为了隐藏这个细节,所以定义两套 .另外 ,我们已经 32 位寄存器的各个位的固定的 .不同的 CPU 字节序有不同结果,这样进行对位操作时.同一个寄存

45、值在不同字节序下,会产生不同位排列. 因此为防止字节序对寄存器进行干扰.后面的ADS 的 C 代码一般会直接采用大端字节序.在Linux 下很多时候会采用移位来排除字节序的干扰.volatile 表示什么含意?volatile 关键字是一种类型修饰符, 用它声明的类型变量表示可以被某些编译器未知的因素更改,比方操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。volatile 区分 C 程序员和嵌入式系统程序员的最基本的问题。 搞嵌入式的家伙们经常同硬件、中断、RTOS等等打交道,所有这些都要求用到volatile

46、变量。不懂得volatile的内容将会带来灾难。当要求使用 volatile 声明的变量的值时,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存。如果一个变量没有volatile, 编译器会自动进行优化, 比方说自动清0.如果这个整数是一个多线程,或硬件地址 .这样可能会带来意想不到结果.Volatile 的应用场合存储器映射的硬件寄存器通常也要加 volatile 说明, 因为每次对它的读写都可能由不同意义,如并行设备的硬件寄存器如:状态寄存器中断服务程序中修改的供其它程序检测的全局变量需要加volatile, 如一个中断服务子程序中会访问到

47、的非自动变量(Non-automatic variables)多任务环境下各任务间共享的数据,如多线程应用中被几个任务共享的变量为什么要用无符号的数字?我们知道,数字有两种移位,一种是算术移位,一种逻辑移位.其中前者在有符号位的情况下 ,会对符号位做特殊处理.而且寄存器对应就是原始位,最高位也有特定的含意 .这种情况下, 指定为无符号位数是了防止编译器对最高位采用特殊算术移位 . 从而违反了设计者的本意.宏定义的最前面*表示什么含意?表示取指针的内容,类似于char *p=&a; *p= A寄存器操作因为每个寄存器都32位宽,因此在程序中可把寄存器的值看成一个无符号整数,对寄存器的取值看成是取

48、一个整数值,而对寄存器设置看成是对一个整数变量赋值.置某一位为01置第一位为0/1取反,表示0 x11111110,与上rRTCCON表示把最低0位置0,其余位不变 rRTCCON &= 1 ;RTC read and write disable.置第三位为0/0X0100取反。再与上相应的寄存器地址rRTCCON &= 0 x4;.假设置12-13 bit的为0 ,则二进制展开为0,换算为0 x3000rADCDA T0 &=0 x3000;.置采用左移,或右移来置位,以置 14bit为0例rADCDA T0 &=(0 x114);某一位1置第一位为1/1取反,表示0 x00000001,或

49、上rRTCCON表示把最低0位置1,其余位不变 rRTCCON |= 1 ; /RTC read and write disable1/0 x0100,再或上相应的寄存器地址rRTCCON |= 0 x4;.假设置12-13 bit的为1 ,则二进制展开为rADCDA T0 |=0 x3000;.置采用左移,或右移来置位,以置 14bit为1例rADCDA T0 |=(0 x114);取位操作。.假设是否判断rADCDA T0的第14位的值。if( rADCDA T0 & (0 x0112;以初始化一个Nand Flash为例.#define TACLS 0 x01rNFCONF = (TAC

50、LS12)|(TWRPH08)|(TWRPH14)(00);rNFCONT = (013)|(012)|(010)|(09)(08)(16)(15)(14)(11)(12NAND flasn rrennory page 奴馥 for 01tob0otng AdvF05n PageSizeWhtr AdvFIaih is 0.0: 25C Wondpage.1: 512 By:t5.(p3geWhen AdvFIash is 1.0: 1024 Wordpage.1: 2M& Bytes/pageThis brt is determined 6y GPG13 pin status curing

51、reset and wake-cp from s*eep mode. After reset, th GPG13 can be used as genera; I/O port o* External interrupt.H/W Set (GPG 13)AddrCyde (Read only)1:NAND f ash memory Add-ess cycle for auo-bootingAO vF lash AddrCycteWhen AdvFIash is 0.0: 3 address cycie1: 4 address cycleWhen AdvFIash is 1.0: 4 addre

52、ss cycle1: 5 address cycleThis brt is determined by GPG 14pin status during reset and wake-Lp from s p mode. After reset, trie GPG Mean be used as genera b*O port o* xxterra interrupt.H/W Set (GPG 14)BusWidth (RW)0NAND Flash Memory 70 bus width for auto-booing and general access.0: 8-bit bus1: 16-bi

53、t busH/W Set (CFG 13)CONTROL REGISTERAdoresRMDesa-ptiQnReset VjIupKfCOHTC-i4E 000004FtVHNUY匚flash厅:间喇闻(MBMNF CONTBitDKeiiptionIn hi si StateRwfrt:【MT 5RvlCLm height139Leck-cigiht 却喷0 Diubl. d,tght1; Enbi*locJi-tgOnee r i bit Ml b 1. you cannet dur. 0 nly nut or ,此* up franiieec moda an -a依bitnsidIic

54、s*mt cljr*c by so日宿方h*ftrt唐 驰,归1. tM蜒世旭ri卜肉miKQNEWW理的附糖打H戏4 uriloc*d. and iwp4 thisHita or erae carnrrjnawl be inviiid d on呼 pd gmrr口p 的 mW Wh*n ycu t/y lo河(制 or电脑h bdi a上r ; 1植科I配ce will be acer :N kATJ3 bit w fee iet)1 ihe NF36L? and NFEBLf. are lare, enurt area 闻1 死 IttdMd0Lac*.UNLant Mrtgurater0

55、. Doable IdcK1: Enable locJiScft IDg area can tie rifld 竹E at any :by 与口亡twa号.IVhen it is set to 1. ne area -sett ng n hFSai_K(C)(4EDM)03Bi in hFEa,Ci4E3ODfBC .-1 s unlEk. an= &iifrptris area writ* 面包 ra“ t&rif。#1 be riYld and ooij Fd wnrad h vale.V/hEn yCu try in write Or erase osited anea t-e U eg

56、a ac组工 will be ooCdt,:M F51Ali国 bilwl X uf).Ix iht rF33LK jrid NFEBLK jtq sare, enurs m旧m wdl be locked.1ResbJEcResa*=dEcbMp 14 Klmg3KCif intSfFpf CQTrcJ十 口城杷 kUEfrupt1; Enable iEEgpt1 Azcrn intetTjDt 话 ocgEbd Mien C PU Ines in proonr cr enw Icckiruj msj (frt jr Ealing in 在SBLK(Qa4EOO(M36j to MFEBUq

57、UHEOWOaCI.0Epbftfi0lN.T0F /日input sigrt/l Lg5itiorii irnfH|il conrolQ DisAJeRnB inw-rrupr Jr En前帕 Rn0 inlwupi0RrtB_Tm5MDC*8RnB Jinniiticn -ion canFigufXicn0 DtiKC rsing ed9#1: 口今* u .Wing dg07Rved0现在把rNFCONF值折成如下值TACLS 14:12 CLE&ALE duration = HCLK*TACLS.TWRPH0TWRPH1AdvFlash(R) 3PageSize(R) 2AddrCycle(R) 1BusWidth(R/W) 010:8 TWR

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论