嵌入基础系统及其应用 6_第1页
嵌入基础系统及其应用 6_第2页
嵌入基础系统及其应用 6_第3页
嵌入基础系统及其应用 6_第4页
嵌入基础系统及其应用 6_第5页
已阅读5页,还剩67页未读 继续免费阅读

下载本文档

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

文档简介

第4章Exynos4412微处理器与接口目录4.1基于Exynos4412微处理器的硬件体系结构4.2存储系统4.3GPIO接口4.4串行通信接口4.5A/D转换器4.6本章小结Exynos4412是三星电子在2012年推出的一款适用于高端智能手机、平板设备等多媒体设备的微处理器,它是三星的第一款四核处理器,又称Exynos4Quad。Exynos4412微处理器基于Cortex-A9四核架构,采用三星32nmHKMG工艺,主频可达到1.4~1.6GHZ,配备Mali-400MP4图形处理器,GPU性能较前代提升约170%,采用新工艺实现功耗降低约40%。由于该处理器的高性能,被应用于三星GALAXYS3、联想K860、魅族MX2等智能手机产品中。本章将简要介绍Exynos4412微处理器的硬件结构、主要外设功能及其接口。

基于Exynos4412微处理器的硬件体系结构PartOne4.14.1.1Exynos4412处理器简介Exynos4412微处理器是一款专为智能手机应用设计的基于Coretex-A9四核处理器的32位精简指令集架构(RISC)微处理器解决方案,具有高性价比、低功耗和性能优化三大优势。该芯片采用64/128位内部总线架构,并配备多种高性能硬件加速器,可高效处理移动通信服务及智能手机应用中的各类任务,例如动态视频处理、图像信号处理、显示控制与缩放等。集成的多格式编解码器(MFC)支持MPEG-2/4、H.263、H.264编解码以及VC1解码功能,其硬件编解码器可实现实时视频会议和数字电视输出。内存系统有专用的DRAM端口和静态存储器端口。专用DRAM端口支持高带宽的DDR3接口,静态存储器端口支持NORFlash和ROM类型的外部存储器及组件。为降低系统总成本并提升整体性能,Exynos4412微处理器集成了多种硬件外设。Exynos4412微处理器主要由多核处理器单元、存储和文件模块、多媒体模块、GPS/GLONASS功能模块、音频功能模块、电源管理模块、安全模块、系统功能模块和通信接口模块等9大部分组成,各个部分之间通过多层AXI总线进行通信。存储系统PartTwo4.24.2.1Exynos4412微处理器的地址空间Exynos4412的存储器地址映射如表4-1所示。地址大小描述0x0000_00000x0001_000064KBiROM区,设备引导使用0x0200_00000x0201F_000064KBiROM区,0x0到0x10000的镜像0x0202_00000x0206_0000256KBiRAM区,设备引导使用0x0300_00000x0302_0000128KB数据存储器或三星可重构处理器SRP的通用数据区0x0302_00000x0303_000064KB指令缓存或SRP通用数据区0x0303_00000x0303_900036KBSRP的配置存储器(只写)0x0381_00000x0383_0000―音频子系统的特殊功能寄存器区域0x0400_00000x0500_000016MB静态只读存储控制器(SMC)的Bank0/Bank1/Bank2/Bank3,用于外部总线设备的地址映射0x0500_00000x0600_000016MB0x0600_00000x0700_000016MB0x0700_00000x0800_000016MB0x0800_00000x0C00_000064MB保留区0x0C00_00000x0CD0_0000―保留区0x0CE0_00000x0D00_0000―NANDFLASH控制器(NFCON)的特殊功能寄存器区域0x1000_00000x1400_0000―特殊功能寄存器区域0x4000_00000xA000_00001.5GB动态内存DRAM控制器的内存区域(DMC-0/DMC-1),用于内存地址映射0xA000_00000x0000_00001.5GB从表4-1可见,Exynos4412微处理器的存储空间主要有以下几部分:(1)iROM区:存放设备启动程序,也就是BL0。(2)iRAM区:内部的内存区域,加载后续的启动程序BL1、BL2。(3)SMC区:静态内存区域,通常用于映射挂接在外部总线上的设备也就是引脚名称以XM0开头的;该区域被分为4个Bank,每个16MB空间。(4)SFR区:特殊功能寄存器区域,通常用于映射芯片内部设备。(5)DMC区:动态内存区域,也就是内存芯片的地址映射区域,支持DDR2/DDR3和LPDDR2等。4.2.2

Exynos4412微处理器启动流程Exynos4412微处理器的启动过程由BL0、BL1和BL2(BL为BootLoader的简称,在本书后续章节中将有详细介绍)3部分代码实现,其中BL0在出厂时已经被固化到64KB的iROM区中。图4-2Exynos4412处理器的启动流程(1)执行内部只读存储器iROM中的启动代码BL0(厂家固化在里面的),这段代码主要是初始化一些系统的基本配置,对应图4-2中的标志①。该段代码主要的功能有:

关看门狗时钟。

初始化指令cache。

初始化栈、堆。

初始化块设备复制函数。

初始化PLL及设置系统时钟。(2)根据OM引脚设置,从相应启动设备复制BL1到片内256KB的SRAM中(iRAM区),并检查BL1的完整性校验信息,如果检查失败,iROM将自动偿试从其它启动设备启动,如SD/MMC等。BL1的代码量一般不大,因而一般情况下BL1负责完成的工作较少,主要是进一步完善系统时钟的初始化工作、动态内存DRAM控制器的配置、通信接口的初始化等。根据安全启动秘钥值,BL1还将对操作系统镜像进行完整性校验。该过程对应图4-2中的标志②。(3)完成内动态内存DRAM控制器的初始化后,把操作系统镜像从启动设备加载到DRAM中,该过程对应图4-2中的标志③。(4)跳转到操作系统中运行。

GPIO接口PartFour4.34.3.1

GPIO概述GPIO(General-PurposeInput/OutputPorts)全称是通用编程I/O端口。它们是CPU的引脚,可以通过它们向外输出高低电平,或者读入引脚的状态,这里的状态也是通过高电平或低电平来反应的,所以GPIO接口技术可以说是CPU众多接口技术中最为简单、常用的一种。每个GPIO端口至少需要两个寄存器,一个是用于控制的“通用I/O端口控制寄存器”,一个是存放数据的“通用I/O端口数据寄存器”。控制和数据寄存器的每一位和GPIO的硬件引脚相对应,由控制寄存器设置每一个引脚的数据流向,数据寄存器设置引脚输出的高低电平或读取引脚上的电平。除了这两个寄存器以外,还有其它相关寄存器,比如上拉/下拉寄存器设置GPIO输出模式是高阻、带上拉电平输出还是不带上拉电平输出等。

GPA0、GPA1:14个输入/输出端口。

GPB:8个输入/输出端口。

GPC0、GPC1:10个输入/输出端口。

GPD0、GPD1:8个输入/输出端口。

GPM0、GPM1、GPM2、GPM3、GPM4:35个输入/输出端口。

GPF0、GPF1、GPF2、GPF3:30个输入/输出端口。

GPJ0、GPJ1:13个输入/输出端口。

GPK0、GPK1、GPK2、GPK3:28个输入/输出端口。

GPL0、GPL1:11个输入/输出端口。Exynos4412微处理器共有304个GPIO端口和164个存储端口引脚,分成37组通用端口和2组存储端口:

GPL2:8个输入/输出端口。

GPX0、GPX1、GPX2、GPX3:32个输入/输出端口。

GPZ:7个输入/输出端口。

GPY0、GPY1、GPY2:16个输入/输出端口。

GPY3、GPY4、GPY5、GPY6:32个输入/输出端口。

MP1_0~MP1_9:78个DRAM1端口。

MP2_0~MP2_9:78个DRAM2端口。

ETC0、ETC1、ETC6:18个输入/输出ETC端口。

ETC7,ETC8:4个时钟端口。有些GPIO引脚除了作为输入/输出引脚外,一般都还有其它功能,称为引脚复用。具体要使用引脚的哪个功能,需要通过相关的寄存器来设置。图4-3GPIO端口功能框图4.3.2

GPIO寄存器每组GPIO端口都有两类控制寄存器,分别工作在正常模式和掉电模式(STOP、DEEP-STOP、睡眠模式)。Exynos4412微处理器工作在正常模式下时,正常寄存器(如GPA0配置寄存器GPA0CON,GPA0数据寄存器GPA0DAT,GPA0上拉/下拉寄存器GPA0PUD,GPA0驱动能力控制寄存器GPA0DRV)工作;进入掉电模式时,所有配置和上拉/下拉控制由掉电寄存器(如GPA0的掉电模式配置寄存器GPA0CONPDN,GPA0的掉电模式上拉/下拉寄存器GPA0PUDPDN)控制。GPIO主要的相关寄存器:GPIO配置寄存器GPxnCON。用于控制GPIO的引脚功能,向该寄存器写入数据来设置相应引脚是输入/输出,还是其它功能。该寄存器中每4位控制一个引脚,写入0000设置为输入口,从引脚上读入外部输入的数据;写入0001设置为输出口,向该位写入的数据被发送到对应的引脚上;写入其它值可设置引脚的第二功能,具体功能可查阅Exynos4412微处理器的芯片手册。GPIO数据寄存器GPxnDAT。用于读/写引脚的状态,即该端口的数据。当引脚被设置为输出引脚,写该寄存器的对应位为1,设置该引脚输出高电平,写入0设置该引脚输出低电平;当引脚被设置为输入引脚,读取该寄存器对应位中的数据可得到端口电平状态。GPIO上拉/下拉寄存器GPxnPUD。用于控制每个端口上拉/下拉电阻的使能/禁止。该寄存器中每2位控制一个引脚,写入00禁止上拉/下拉电阻,写入01使能下拉电阻,写入11使能上拉电阻,00是保留值写入无效。GPIO掉电模式配置寄存器GPxnCONPDN。用于掉电模式下使用。该寄存器中每2位控制一个引脚,写入00时输出低电平,写入01时输出高电平,写入10时为输入功能,写入11时保持原有状态。4.3.3

GPIO操作步骤Exynos4412处理器GPIO端口操作步骤如下:①

确定所使用的GPIO端口的功能,如作为输入/输出引脚使用时,是否需要设置上拉/下拉电阻;作为其它功能使用时,对应Exynos4412微处理器的芯片手册进行设置。②

确定GPIO端口的输入/输出方向,通过端口配置寄存器完成端口的输入/输出功能或其它功能设置。③

对数据寄存器操作。如果设置为输入引脚,读取数据寄存器对应位值,实现引脚状态的读取;如果设置为输出引脚,通过写数据寄存器对应位值,实现引脚状态的设置。4.3.4一个LED灯的例子IO口的操作是硬件控制的基础,本例子是一个最简单的IO口操作。8个LED灯分别用8个GPIO口来进行单独控制,通过I/O控制发光二极管的亮和灭。图4-4GPIO与LED灯的连接通过电路原理图可以得到的物理连接如下表所示:原理图led灯标识芯片引脚标识Led1GPX0_0Led2GPX0_1Led3GPX0_2Led4GPX0_3Led5GPX0_4Led6GPX0_5Led7GPX0_6Led8GPX0_7查看GPX0相关的寄存器:GPH2相关的寄存器有:GPX0CON、GPX0DAT、GPX0PUD以及GPX0DRV。通过对不同寄存器的操作,可以配置GPIO的功能。寄存器物理地址读/写属性描述初始值GPX0CON0x1100_0C00R/WGPX0CON端口配置寄存器0x00000000GPX0DAT0x1100_0C04R/WGPX0DAT端口数据寄存器0x00GPX0PUD0x1100_0C08R/WGPX0PUD端口上拉/下拉寄存器0x5555GPX0DRV0x1100_0C0CR/WGPX0DRV端口驱动能力寄存器0x00_0000表4-3GPX0寄存器族GPX0CON位描述初始值GPX0CON[0][3:0]0000=Input0001=Output0010=Reserved0011=AUD_TCK0100=GNSS_TCK0101=ALV_TCK0110~1110=Reserved1111=WAKEUP_INT0[0]0x00表4-4GPX0CON端口配置寄存器表4-5GPX0DAT端口数据寄存器GPX0DAT位描述初始值GPX0DAT[7:0][7:0]8位数据输入或者输出0x00表4-6GPX0PUD端口上拉寄存器GPX0PUD位描述初始值GPX0PUD[n][2n+1:2n]n=0~700=禁止上拉/下拉01=下拉使能10=Reserved11=上拉使能0x5555表4-7GPX0DRV端口驱动能力寄存器GPX0DRV位描述初始值GPX0DRV[n][2n+1:2n]n=0~700=1x01=2x10=3x11=4x0x0000本例通过使用mmap方法实现不经过内核驱动直接在用户区映射的方式来控制寄存器,从而最终控制LED灯的功能。由于在应用程序中不能直接操作物理地址,因此通过mmap将一个文件或者其它对象映射进物理地址,应用程序就可以直接操作地址,从而达到控制寄存器的目的。在向端口写函数port_write中我们可以看到mmap方法。intport_write(unsignedintn, unsignedintfd, volatileunsignedintADDR_CON_OFFSET, volatileunsignedintGPIO_WR_CON, volatileunsignedintGPIO_WR_DAT){ADDR_START=(volatileunsignedchar*)mmap(NULL,1024*n,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0x11000000); if(ADDR_START==NULL){ printf("mmaperr!\n"); return-1; } *(volatileunsignedint*)(ADDR_START+ADDR_CON_OFFSET)=GPIO_WR_CON; GPIO_DAT= (volatileunsignedint*)(ADDR_START+ADDR_CON_OFFSET+0x04); *(volatileunsignedchar*)GPIO_DAT=GPIO_WR_DAT; return0;}port_write中的mmap函数有如下说明:void*mmap(void*start,size_tlength,intprot,intflags,intfd,off_toffset);start:映射到进程空间的虚拟地址;length:映射空间的大小;prot:映射到内存的读写权限;flagsflags:可取MAP_SHARED,MAP_PRIVATE,MAP_FIXED,如果是MAP_SHARED。此进程对映射空间的内容修改会影响到其它的进程,即对其它的进程可见,而MAP_PRIVATE,此进程修改的内容对其它的进程不可见;fd:要映射文件的文件标识符;offset:映射文件的位置,一般从头开始。而在设备文件中,表示映射物理地址的起始地址。程序中另外的主要调用的函数定义分别如下:intopen_port_device(void){ intfd; fd=open(DEV_NAME,O_RDWR); if(fd<0) { printf("Opendeviceerr!\n"); return-1; } returnfd;}intclose_port_device(intfd){ close(fd); return0;}intfree_port_device(void){ munmap((void*)ADDR_START,1024*16); return0;}LED灯分别用8个GPIO接口进行独立控制,实现一个一个连续单独亮起,程序名称为led8,工程文件列表makefile文件内容如下:CC =arm-linux-gccINSTALL =installTARGET =led8all:$(TARGET)$(TARGET):led8.cled8.h $(CC)-static$<-o$@clean: rm-rf*.o$(TARGET)主程序如下://Cortex-A9LEDTEST#include<stdio.h>#include<stdlib.h>#include<string.h>#include<fcntl.h>#include<sys/mman.h>#include<unistd.h>#include"led8.h"intmain(void){ intfd; if((fd=open_port_device())<0) exit(0);while(1){ if((port_write(16,fd,GPH2CON_OFFSET,0x1111111,0xff))<0) exit(0);

else {*(volatileunsignedchar*)GPIO_DAT=0xfe;printf("LED1\n");sleep(1);*(volatileunsignedchar*)GPIO_DAT=0xfd;printf("LED2\n");sleep(1);*(volatileunsignedchar*)GPIO_DAT=0xfb;printf("LED3\n");sleep(1);*(volatileunsignedchar*)GPIO_DAT=0xf7;printf("LED4\n");sleep(1);*(volatileunsignedchar*)GPIO_DAT=0xef;printf("LED5\n");sleep(1);*(volatileunsignedchar*)GPIO_DAT=0xdf;printf("LED6\n");sleep(1);*(volatileunsignedchar*)GPIO_DAT=0xbf;printf("LED7\n");sleep(1);*(volatileunsignedchar*)GPIO_DAT=0x7f;printf("LED8\n");sleep(1);*(volatileunsignedchar*)GPIO_DAT=0xff;

}} free_port_device(); close_port_device(fd); return0;}除在开发板可看到LED亮灯结果外,在调试终端中显示结果如下:串行通信接口PartFive4.4在数据通信中有两种常用的通信方式:串行通信和并行通信。并行通讯是指数据的各位同时进行传送(例如数据和地址总线),其优点是传送速度快,缺点是有多少位数据就需要多少根传输线,这在数据位数较多,传送距离较远时就不宜采用。串行通讯是指数据一位一位地按顺序传送,其突出优点是只需一根传输线,特别适宜于远距离传输,缺点是传送速度较慢。串行通讯中又分为异步传送和同步传送。异步传送时,数据在线路上是以一个字(或称字符)为单位来传送的,各个字符之间可以是连续传送,也可以是间断传送,这完全由发送方根据需要来决定。另外,在异步传送时,发送方和接收方各用自己的时钟源来控制发送和接收。4.4.1串行通信方式Exynos4412处理器中采用的是异步串行通信(UART)方式。所谓异步就是指发送端和接收端使用的不是同一个时钟。异步串行通信通常以字符(或者字节)为单位组成字符帧传送。1.异步串行通信数据格式异步串行通信发送的数据帧(字符帧)由4个部分组成,分别是起始位、数据位、奇偶校验位、停止位。数据帧格式如图4-10所示,起始位:位于字符帧的开头,只占一位,始终为逻辑“0”低电平,表示发送端开始发送一帧数据。数据位:紧跟起始位后,可取5、6、7、8位,低位在前,高位在后。奇偶校验位:占一位,用于对字符传送作正确性检查。奇偶校验位是可选择的,共有三种可能,即奇偶校验、偶校验和无校验,由用户根据需要选定。停止位:末尾,为逻辑“1”高电平,可取1、1.5、2位,表示一帧字符传送完毕。空闲位:处于逻辑“1”高电平,表示当前线路上没有数据传输。2.波特率串行通信的速率用波特率来表示,所谓波特率就是指一秒钟传送数据位的个数。每秒钟传送一个数据位就是1波特,即:1波特=1bps(位/秒)。在串行通信中,数据位的发送和接收分别由发送时钟脉冲和接收时钟脉冲进行定时控制。时钟频率高,则波特率高,通信速度就快;反之,时钟频率低,波特率就低,通信速度就慢。例如每秒传送的速率为960字符/秒,而每个字符又包含10位,(1位起始位,7位数据位,1位奇偶校验位,1位停止位),则波特率为:960字符/秒×10位/字符=9600位/秒=9600波特4.4.2RS-232C串行接口RS-232C标准(协议)的全称是EIA-RS-232C标准,其中EIA(ElectronicIndustryAssociation)代表美国电子工业协会,RS(recommendedstandard)代表推荐标准,232是标识号,C代表RS232的最新一次修改(1969),在这之前,有RS232B、RS232A。它规定连接电缆和机械、电气特性、信号功能及传送过程。常用物理标准还有EIA-RS-422A、EIA-RS-423A、EIA-RS-485。这里只介绍EIA-RS-232C(简称232,RS232)。1.RS-232C串行接口引脚定义由于RS-232C标准并未定义连接器的物理特性,因此,出现了DB-25、DB-15和DB-9各种类型的连接器,其引脚的定义也各不相同。现在常用的是9针的DB-9接口,DB-9引脚顺序和定义如图4-10和表4-2所示。图4-11DB-9串口针脚图针脚信号定义1DCD载波检测2RXD接收数据3TXD发送数据4DTR数据终端准备好5SGND信号地6DSR数据准备好7RTS请求发送8CTS清除发送9RI振铃提示表4-8DB-9引脚定义2.RS-232C串行接口电气特性EIA-RS-232C对电气特性、逻辑电平和各种信号线功能都作了规定:在TxD和RxD上:逻辑1=-3V~-15V,逻辑0=+3~+15V;在RTS、CTS、DSR、DTR和DCD等控制线上:信号有效(接通,ON状态,正电压)=+3V~+15V;信号无效(断开,OFF状态,负电压)=-3V~-15V。以上规定说明了RS-232C标准对逻辑电平的定义。对于数据(信息码):逻辑“1”的电平低于-3V,逻辑“0”的电平高于+3V;对于控制信号:接通状态(ON)即信号有效的电平高于+3V,断开状态(OFF)即信号无效的电平低于-3V,也就是当传输电平的绝对值大于3V时,电路可以有效地检查出来。介于-3~+3V之间的电压无意义,低于-15V或高于+15V的电压也认为无意义。因此,实际工作时,应保证电平在-3V~-15V或+3V~+15V之间。EIA-RS-232C与TTL转换:EIARS-232C是用正负电压来表示逻辑状态,与TTL以高低电平表示逻辑状态的规定不同。因此,为了能够同计算机接口或终端的TTL器件连接,必须在EIA-RS-232C与TTL电路之间进行电平和逻辑关系的变换。实现这种变换的方法可用分立元件,也可用集成电路芯片。目前较为广泛地使用集成电路转换器件,如MAX232芯片可完成TTL←→EIA双向电平转换。EIA-RS-232C与TTL转换:EIARS-232C是用正负电压来表示逻辑状态,与TTL以高低电平表示逻辑状态的规定不同。因此,为了能够同计算机接口或终端的TTL器件连接,必须在EIA-RS-232C与TTL电路之间进行电平和逻辑关系的变换。实现这种变换的方法可用分立元件,也可用集成电路芯片。目前较为广泛地使用集成电路转换器件,如MAX232芯片可完成TTL←→EIA双向电平转换。4.4.3Exynos4412微处理器的异步串行通信Exynos4412微处理器的UART模块提供了4个独立的异步串行输入/输出端口(UART0~UART3),还为GPS提供一个专用UART通道UART4。每个端口都支持中断模式或DMA模式,UART可产生一个中断或发出一个DMA请求,来传输CPU和UART之间的数据。UART支持最高4Mb/s的传输速度。每个UART通道都包含两个FIFO用来接收和发送数据,其中UART0的FIFO为256字节,UART1和UART4为64字节,UART2和UART3为16字节。图4-8UART结构图Exynos4412处理器的UART每个通道的结构可见图4-8所示。每个UART包含一个波特率发生器、一个发送器、一个接收器和一个控制单元。波特率发生器使用PCLK或SCLK_UART,发送器和接收器包含FIFO和数据移位寄存器。要发送的数据被写入TxFIFO,然后被复制到发送移位寄存器,随后被发送引脚TxDn移出。接收数据时,数据通过RxDn引脚移位进入接收移位寄存器中,最后被复制到RxFIFO。在数据通信过程中,有一个状态寄存器UTRSTATn来描述当前状态下的发送状态和接收状态,通过查看状态寄存器中的相应位的值就可以确定当前状态下发送和接收的状态,从而判断是否可以发送数据,是有有新的数据到来。每个UART波特率发送器为发送器和接收器提供串行时钟。波特率发生器的时钟源可以通过UCONn寄存器中的时钟选择位来选择PCLK或SCLK_UART。波特率是将时钟源和波特率除数寄存器(UBRDIVn)的值相除得到的。计算公式为:习题分析阅读以下S3C2410部分用户手册.求:当PCLK或UCLK为40MHz时,串口0的波特率为2400bps,串口1的波特率为115200bps,相应的控制寄存器UBRDIVn如何设置.UARTBAUDRATEDIVISORREGISTERTherearethreeUARTbaudratedivisorregisters(寄存器)includingUBRDIV0,UBRDIV1andUBRDIV2intheUART

block(模块).

Thevaluestoredinthebaudratedivisorregister(UBRDIVn),isusedtodeterminetheserialTx/Rxclockrate(baudrate)asfollows:UBRDIVn=(int)(PCLK/(bpsx16))–1orUBRDIVn=(int)(UCLK/(bpsx16))–1Where,thedivisorshouldbefrom1to(216-1)andUCLKshouldbesmallerthanPCLK.答:根据UBRDIVn=(int)(PCLK/(bpsx16))–1寄存器UBRDIV0=(int)(40000000/2400*16)-1=1040=10000010000(B)------5分寄存器UBRDIV1=(int)(40000000/115200*16)-1=20=10100(B)4.4.4Exynos4412处理器的UART寄存器Exynos4412处理器的UART功能寄存器有:UART线控寄存器(ULCONn)。UART控制寄存器(UCONn)。UARTFIFO控制寄存器(UFCONn)。UARTMODEM控制寄存器(UMCONn)。UART接收发送状态寄存器(UTRSTATn)。UART错误状态寄存器(UERSTATn)。UARTFIFO状态寄存器(UFSTATn)UARTMODEM状态寄存器(UMSTATn)。UART发送缓存寄存器(UTXHn)。UART接收缓存寄存器(URXHn)。UART波特率除数寄存器(UBRDIVn)。UART初始化用到的寄存器有:ULCONn、UCONn、UFCONn、UMCONn、UBRDIVn等;收发数据用到的寄存器有:UTRSTATn、UTXHn、URXHn等。详细的寄存器说明和初始化设置方法请参阅Exynos4412微处理器的芯片手册。4.4.5

UART通信示例在UART通信之前,在uart_init()函数中完成对UART的初始化,即设置UART的时钟源、传输波特率和传输数据的格式等;在getc()和putc()函数中实现串口数据的接收和发送。1.涉及的相关寄存器ULCONn位描述初始值保留[31:7]保留0红外模式[6]是否使用红外模式0=正常模式1=红外模式0校验[5:3]UART发送/接收中的校验码类型0xx=没有校验码100=奇校验101=偶校验110=强制校验位为1111=强制校验位为0000停止位[2]每帧停止位位数0=1位停止位1=2位停止位0数据位数[1:0]每帧数据位数00=5位01

=6位10=7位11=8位00表4-9UART线控寄存器(ULCONn)UCONn位描述初始值保留[31:23]Reserved0TX突发DMA长度[22:20]发送DMAburst长度000=1字节001=4字节010=8字节011=16字节100~111=Reserved000保留[19]Reserved0RX突发DMA长度[18:16]接收DMAburst长度000=1字节001=4字节010=8字节011=16字节100~111=Reserved000RX超时中断间隔[15:12]接收无数据时间超过8×(N+1)帧周期是产生RX超时中断0111RXFIFO空RX超时[11]当RXFIFO计数器值为0时,允许/禁止RX超时中断0=禁止1=允许0表4-10UART控制寄存器(UCONn)UCONn位描述初始值RX超时DMA挂起[10]当RX超时发生时,允许/禁止DMA挂起0=禁止1=允许0TX中断类型[9]发送中断类型0=脉冲1=电平0RX中断类型[8]接收中断类型0=脉冲1=电平0RX超时使能[7]打开UARTFIFO时,允许/禁止接收超时中断0=禁止1=允许0RX错误中断使能[6]允许UART在接收发生异常时产生中断,如接收时发生帧错误、校验错误或溢出错误等0=不产生接收错误中断1=产生接收错误中断0Loop-Back模式[5]是否进入Loop-Back模式,该模式仅用于测试0=正常模式1=回还模式0表4-10UART控制寄存器(UCONn)UCONn位描述初始值发送中断信号[4]在一帧中设置此位触发UART发送中断,发送后该位自动清零0=正常发送1=发送中断信号0发送模式[3:2]决定使用哪种方式发送数据至UART发送缓冲寄存器00=禁止01=中断或轮询模式10=DMA模式11=Reserved00接收模式[1:0]决定使用哪种方式从UART接收缓冲寄存器读取数据00=禁止01=中断或轮询模式10=DMA模式

Reserved00表4-10UART控制寄存器(UCONn)UFCONn位描述初始值保留[31:11]Reserved0TXFIFO触发值[10:8]TXFIFO触发值,如果TXFIFO的数据数量少于或等于该值时,产生发送中断[通道0]000=0B001=32B010=64B011=96B100=128B101=160B110=192B111=224B[通道1和4]000=0B001=8B010=16B011=24B100=32B101=40B110=48B111=56B[通道2和3]000=0B001=2B010=4B011=6B100=8B101=10B110=12B111=14B000保留[7]Reserved0表4-11FIFO控制寄存器(UFCONn)UFCONn位描述初始值RXFIFO触发值[6:4]RXFIFO触发值,如果RXFIFO的数据数量多于或等于该值时,产生接收中断[通道0]000=32B001=64B010=96B011=128B100=160B101=192B110=224B111=256B[通道1和4]000=8B001=16B010=24B011=32B100=40B101=48B110=56B111=64B[通道2和3]000=2B001=4B010=6B011=8B100=10B101=12B110=14B111=16B000保留[3]Reserved0TXFIFO重置[2]重置FIFO后自动清空0=正常1=TXFIFO重置0RXFIFO重置[1]重置FIFO后自动清空0=正常1=RXFIFO重置0FIFO使能[0]0=禁止1=使能0表4-11FIFO控制寄存器(UFCONn)UBRDIVn位描述初始值保留[31:16]保留0UBRDIVn值[15:0]波特率分频值除数整数部分0表4-12UART波特率除数寄存器(UBRDIVn)UFRACVALn位描述初始值保留[31:4]Reserved0UFRACVALn值[3:0]波特率分频值除数小数部分0表4-13UART波特率除数小数寄存器(UFRACVALn)UTRSTATn位描述初始值保留[31:24]Reserved0RX超时状态下RXFIFO计数器值[23:16]当RX超时中断发生时,当前RXFIFO计数器的值00000000TXDMAFSM状态[15:12]TXDMAFSM当前状态0000=空闲0001=Burst请求0010=Burst响应……0000RXDMAFSM状态[11:8]RXDMAFSM当前状态0000=空闲0001=Burst请求0010=Burst响应……0000保留[7:4]Reserved0RX超时状态/清除[3]读取该位时表示RX超时状态0=RX超时未发生1=RX超时发生向该位写入时清除RX超时状态0=无操作1=清除RX超时状态0表4-14UART接收发送状态寄存器(UTRSTATn)UTRSTATn位描述初始值发送器空[2]如果发送缓冲寄存器没有有效传输数据,且发送移位寄存器为空,该位被自动置10=发送器不为空1=发送器为空(包括发送缓冲寄存器和发送移位寄存器)1发送缓冲空[1]如果发送缓冲寄存器为空,该位被自动置10=发送缓冲寄存器不为空1=发送缓冲寄存器为空(在非FIFO模式下,产生中断和DMA请求;在FIFO模式下,如果TXFIFO触发值为0,则产生中断和DMA请求)如果UART使用FIFO,检查USFTAT寄存器中TXFIFO计数位和TXFIFO溢出位,来替代该位。1接收缓存数据就绪[0]如果接收缓冲寄存器从RXDn端口接收到有效数据,该位自动置10=接收缓冲寄存器为空1=接收缓冲寄存器接收到有效数据(在非FIFO模式下,产生中断和DMA请求)如果UART使用FIFO,检查USFTAT寄存器中RXFIFO计数位和RXFIFO溢出位,来替代该位。0表4-14UART接收发送状态寄存器(UTRSTATn)UTXHn位描述初始值保留[31:8]保留-UTXHn[7:0]为UARTn的8位发送数据-表4-15UART发送缓存寄存器(UTXHn)URXHn位描述初始值保留[31:8]保留-URXHn[7:0]为UARTn的8位接收数据-表4-16UART接收缓存寄存器(URXHn)2.示例程序:UART初始化函数uart_init(),串口接收函数getc()和串口发送函数putc()都放在uart.c文件中供main.c文件的主程序调用。UART初始化函数uart_init():#defineGPA0CON (*((volatileunsignedlong*)0x11400000)) #defineGPA1CON (*((volatileunsignedlong*)0x11400020))//UART相关寄存器地址#defineULCON0 (*((volatileunsignedlong*)0x13800000)) #defineUCON0 (*((volatileunsignedlong*)0x13800004))#defineUFCON0 (*((volatileunsignedlong*)0x13800008))#defineUMCON0 (*((volatileunsignedlong*)0x1380000C))#defineUTRSTAT0 (*((volatileunsignedlong*)0x13800010))#defineUERSTAT0 (*((volatileunsignedlong*)0x13800014))#defineUFSTAT0 (*((volatileunsignedlong*)0x13800018))#defineUMSTAT0 (*((volatileunsignedlong*)0x1380001C))#defineUTXH0 (*((volatileunsignedlong*)0x13800020))#defineURXH0 (*((volatileunsignedlong*)0x13800024))#defineUBRDIV0 (*((volatileunsignedlong*)0x13800028))#defineUFRACVAL0 (*((volatileunsignedlong*)0x1380002C))#defineUINTP0 (*((volatileunsignedlong*)0x13800030))#defineUINTSP0 (*((volatileunsignedlong*)0x13800034))#defineUINTM0 (*((volatileunsignedlong*)0x13800038))//波特率分频值#defineUART_UBRDIV_VAL 35#defineUART_UDIVSLOT_VAL 0x5//串口初始化函数voiduart_init(){ /**************配置引脚用于RX/TX功能*****************/ GPA0CON=0x00000022; /**************设置数据格式等*****************/ UFCON0=(1<<0); //使能fifo UMCON0=0x0; //无流控 ULCON0=(3<<0); //数据位:8,无校验,停止位:1 UCON0=(0x01<<2)|(0x01<<0); //时钟:PCLK,禁止中断,使能UART发送、接收/*波特率115200串口时钟SCKL_UART=100MHz*DIV_VAL=SCKL_UART/(115200×16)-1≈53.25*UBRDIV=53*UFRACVAL=0.25×16=4*/UBRDIV0=53;UFRACVAL0=4;}//串口接收一个字符chargetc(void){ //如果RXFIFO空,等待 while(!(UTRSTAT0&(1<<0))); //读取数据 returnURXH0; }//串口发送一个字符voidputc(charc){ //如果TXFIFO满,等待 while(!(UTRSTAT0&(1<<2))); //发送数据 UTXH0=c; }main.c文件中,主函数main()调用函数uart_init()初始化UART串口。在while循环中,调用getc()函数接收一个字符,在将该字符的ASCII码值加1后通过调用函数putc()发送出去。voiduart_init(void);intmain(){ charc; //初始化串口

uart_init(); while(1) { //开发板接收字符 c=getc(); //开发板发送字符c+1 putc(c+1); } return0;}A/D转换器PartSix4.5A/D转换器是模拟信号源和CPU之间联系的接口,它的任务是将连续变化的模拟信号转换为数字信号,以便计算机和数字系统进行处理、存储、控制和显示。在工业控制和数据采集及许多其他领域中,A/D转换是不可缺少的。

根据转换原理的不同,A/D转换器可以分为以下类型:逐位比较型、积分型、计数型、并行比较型、电压-频率型等,在应用中主要应根据使用场合的具体要求,按照转换速度、精度、价格、功能以及接口条件等因素而决定选择何种类型。A/D转换器可以以独立芯片或设备形式存在,如ADC0809等;也可以在片上系统的芯片内部出现,而这一点在现在的嵌入式系统中十分常见。如基于Cortex-A9内核的处理器Exynos4412有4个模拟信号输入通道的ADC,能将模拟量转换成10位或12位的数字量,支持最高1M/S的采样频率。A/D转换器的主要指标如下所示:(1)分辨率分辨率反映A/D转换器对输入微小变化响应的能力,通常用数字输出最低位(LSB)所对应的模拟输入的电平值表示。n位A/D能反应1/2n满量程的模入电平。由于分辨率直接与转换器的位数有关,所以一般也可简单地用数字量的位数来表示分辨率,即n位二进制数,最低位所具有的权值就是它的分辨率。

值得注意的是,分辨率与精度是两个不同的概念,不要把两者相混淆。即使分辨率很高,也可能由于温度漂移、线性度等原因而使其精度不够高。(2)精度

精度有绝对精度(AbsoluteAccuracy)和相对精度(RelativeAccuracy)两种表示方法。

①绝对误差

在一个转换器中,对应于一个数字量的实际模拟输入电压和理想的模拟输入电压之差并非是一个常数。我们把它们之间的差的最大值,定义为“绝对误差”。通常以数字量的最小有效位(LSB)的分数值来表示绝对误差,例如:±1LSB等。绝对误差包括量化误差和其它所有误差。

②相对误差

是指整个转换范围内,任一数字量所对应的模拟输入量的实际值与理论值之差,用模拟电压满量程的百分比表示。例如,满量程为10V,10位A/D芯片,若其绝对精度为±1/2LSB,则其最小有效位的量化单位:9.77mV,其绝对精度为=4.88mV,其相对精度为0.048%。(3)转换时间

转换时间是指完成一次A/D转换所需的时间,即由发出启动转换命令信号到转换结束信号开始有效的时间间隔。转换时间的倒数称为转换速率。例如AD570的转换时间为25us,其转换速率为40KHz。

(4)电源灵敏度

电源灵敏度是指A/D转换芯片的供电电源的电压发生变化时,产生的转换误差。一般用电源电压变化1%时相当的模拟量变化的百分数来表示。

(5)量程量程是指所能转换的模拟输入电压范围,分单极性、双极性两种类型。例如,单极性量程为0~+5V,0~+10V或者0~+20V;双极性量程为-5~+5V或者-10~+10V。

(6)输出逻辑电平

多数A/D转换器的输出逻辑电平与TTL电平兼容。在考虑数字量输出与微处理的数据总线接口时,应注意是否要三态逻辑输出,是否要对数据进行锁存等。

(7)工作温度范围

由于温度会对比较器、运算放大器、电阻网络等产生影响,故只在一定的温度范围内才能保证额定精度指标。一般A/D转换器的工作温度范围为(0~70。C)。下图是Exynos4412微处理器的两路AD转换器端口连接原理图。图中可以看到AIN0、AIN1是该处理器的两路AD转换器端口。Exynos4412中关于A/D转换器的主要操作的寄存器是ADCCON,ADCDAT。下面两个表反映了这两个寄存器的位组成情况。图4-9两路AD转换器端口连接原理图ADCCON位描述初始值RES[16]ADC输出精度选择0=10位

温馨提示

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

评论

0/150

提交评论