第6章 部件工作原理与编程示例(东北大学嵌入式课件).docx
第6章部件工作原理与编程示例本章主要以S3C45I0B的几个常用功能部件为编程对象,介绍基于 S3C4510B的系统的程序设计与调试,同时简介BootLoader的基本原理和 编程方法,通过对本章的阅读,可以使读者了解S3C4510B各功能部件的 工作原理及基本编程方法。本章的主要内容包括:- 嵌入式系统应用程序设计的基本方法。- S3C4510B通用I/O 口的工作原理与编程示例。- S3C4510B串行通信控制器的工作原理与编程示例。- S3C4510B中断控制器的工作原理与编程示例。- S3c4510B定时器的工作原理与编程示例。- S3C4510B DMA控制器的工作原理与编程示例。- S3C4510B IIC总线控制器的工作原理与编程示例。- S3C4510B以太网控制器的工作原理。- Flash存储器的工作原理与编程示例。一BootLoader 简介。6.1 嵌入式系统的程序设计方法-般来说,咐于一个完整的嵌入式应用系统的开发,硬件的设计与调 试工作仅占整个工作量的一半,应用系统的程序设计也是嵌入式系统设计 一个非常重要的方面,程序的质量直接影响整个系统功能的实现,好的程 序设计可以克服系统硬件设计的不足,提高应用系统的性能,反之,会使 整个应用系统无法正常工作。本章从应用的角度出发,以S3C4510B的各个功能模块为编程对象, 介绍一些实用的程序段,读者既可按自己的需要修改,也可吸收其设计思想和方法,以便设计出适合于自己特定应用系统的实用程序。同时,由于 ARM体系结构的一致性,尽管以下的应用程序段是针对特定硬件平台开发 的,其编程思路同样适合于其他类型的ARM微处理器。不同于基于PC平台的程序开发,嵌入式系统的程序设计具有其自身 的特点,程序设计的方法也会因系统或因人而异,但其程序设计还是有其 共同的特点及规律的。在编写嵌入式系统应用程序时,可采取如下几个步 骤:(1) 明确所要解决的问题:根据问题的要求,将软件分成若干个相对独立的部分,并合理设计软件的总体结构。(2) 合理配置系统资源:与基于8位或16位微控制器的系统相比较,基于32位微控制器的系统资源要丰富得多,但合理 的资源配置可最大限度地发挥系统的硬件潜能,提高系统的 性能。对于一个特定的系统来说,其系统资源,如Flash、 EEPROM、SDRAM,中断控制等,都是有限的,应合理配 置系统资源。(3) 程序的设计、调试与优化:根据软件的总体结构编写程序,同时采用各种调试手段,找出程序的各种语法和逻辑错误, 最后应使各功能程序模块化,缩短代码长度以节省存储空间 并减少程序执行时间。此外,由于嵌入式系统一般都应用在环境比较恶劣的场合,易受各种 因素的干扰,从而影响到系统的可靠性,因此,应用程序的抗干扰技术也 是必须考虑的,这也是嵌入式系统应用程序不同于其他应用程序的一个重 要特点。6.2 部件工作原理与编程示例6.2.1 通用I/O 口工作原理与编程示例S3c4510B提供了 18个可编程的通用I/O端口,用户可将每个端口配置为输入模式、输出模式或特殊功能模式,由片内的特殊功能寄存器 IOPMOD 和 IOPCON 控制。端口 07的工作模式仅由IOPMOD寄存器控制,但通过设置IOPCON 寄存器,端口 811可用作外部中断请求INTREQ0-INTREQ3的输入, 端口 12、端口 13可用作外部DMA请求XDREQO、XDREQ1的输入,端 口 14、端口 15可作为外部DMA请求的应答信号XDACKO、XDACK1, 端口 16可作为定时器0的溢出TOUTO,端口 17可作为定时器1的溢出 TOUTloI/O端口的功能模块如图6.1所示:IOPMODVddIOPCONIOPCONPort11/xlNTREQ3 Port12/nXDREQ0 Port13/nXDREQ1 Port14/nXDACK0 Port15/nXDACK1 Port16/TOUTO Port17/TOUT1PortO - Port7Port8/xlNTREQ0图6.1 通用I/O 口的功能模块控制I/O 口的特殊功能寄存器-共有3个:IOPMOD、IOPCON和 IOPDATA,简要描述如下: I/O 口模式寄存器(IOPMOD):I/O 口模式寄存器IOPMOD用于配置P17-P0.XXXXXXXXXXXXXX 1 XXXX寄存器偏移地址操作功能描述复位值IOPMOD0x5000读/写I/O 口模式寄存器0x0000,00003118 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0XXXXXXXXXXXXX X I X XXX0P0 的I/O模式位0=输入1=输出1P1 口的I/O模式位0=输入1=输出2P2 口的I/O模式位0=输入1=输出317P3P17 口的 I/O 模式位0=输入1=输出I/O 口控制寄存器(IOPCON):I/O 口控制寄存器IOPCON用于配置端口 P8P17的特殊功能,当这 些端口用作特殊功能(如外部中断请求、外部中断请求应答、外部DMA 请求或应答、定时器溢出)时,其工作模式由IOPCON寄存器控制,而不 再山IOPMOD寄存器控制。对于特殊功能输入端口,S3C4510B提供了一个滤波器用于检测特殊 功能信号的输入,如果输入信号电平宽度等于三个系统时钟周期,该信号被认为是诸如外部中断请求或外部DMA请求等特殊功能信号。寄存器偏移地址操作功能描述复位值IOPCON0x5004读/写I/O 口控制寄存器0x0000,000031 30 29 28 27 26 2523 2220 1915 1410 95 4 3 2 1 0T 0 E N 1T O E N 0D A K 1D A K 0D R Q 1D R Q 0X 1 R Q 3X 1 R Q 2X 1 R Q 1X 1 R Q 14: 0控制端口 8的外部中断请求信号0 (xIRQO)输入4端口 8用作外部中断请求信号00=禁止1=使能3 0=低电平有效1 =高电平有效2 0=滤波器关1=滤波器开1: 0 00=电平检测01 =上升沿检测10=下降沿检测11=上升、下降沿均检测9: 5控制端口 9的外部中断请求信号1 (xlRQ1)输入 使用方法同端口 8。14: 10控制端口 10的外部中断请求信号2 (xlRQ2)输入 使用方法同端口 8。19: 15控制端口 11的外部中断请求信号3 (xlRQ3)输入 使用方法同端口 8。22: 20控制端口 12的外部DMA请求信号0 (DRQO)输入22端口 12用作外部DMA请求信号0 (nXDREQO)0=禁止1=使能210=滤波器关1=滤波器开20J 0 =低电平有效1 =高电平有效25: 23控制端口 13的外部DMA请求信号1 (DRQ1)输入25端口 13用作外部DMA请求信号1 (nXDREQl)0 =禁止1=使能24 0=滤波器关1=滤波器开23 0=低电平有效1 =高电平有效27: 26控制端口 14的外部DMA应答信号0 (DAKO)输出27端口 14用作外部DMA信号0 (nXDACKO)0=禁止 1=使能126J 0 =低电平有效1 =高电平有效29: 28控制端口 15的外部DMA应答信号1 (DAK1)输出29端口15用作外部DMA信号1 (nXDACKl)0 =禁止 1=使能28 0=低电平有效1 =高电平有效30控制端口 16作为定时器。溢出信号(T0EN0)0=禁止1=使能31控制端口 17作为定时器1溢出信号(T0EN1)0=禁止1=使能I/O 口数据寄存器(I0PDATA):当配置为输入模式时,读取I/O 口数据寄存器IOPDATA的每一位对 应输入状态,当配置为输出模式时,写每一位对应输出状态。位17: 0对应于18个I/O引脚P17P0«寄存器偏移地址操作功能描述复位值IOPDATA0x5008读/写I/O 口数据寄存器未定义3118 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0QQQQQQP 11 1P 0 9P 7P 5P 3P P 1 017: 0对应I/O 口 P17-P0的读/写值。I/O 数据寄存器的值反映对 应引脚的信号电平。以上简述了 S3C4510B的通用I/O 口的基本工作原理,更详细的内容 可参考S3C4510B的用户手册。作为本章的第一个例子,将比较详细地描述建立项目、编写程序的过 程,同时可参考第8章关于ADS集成编译调试环境的使用方法。打开 CodeWarrior for ARM Developer Suite(或 ARM Project Manager), 新建一个项目,并新建一个文件,名为Inits具体内容如下: .;Institute of Automation, Chinese Academy of Sciences;File Name:Init.s;Description:;Author:Li JuguangIMPORT MainAREAInit, CODE, READONLYENTRYLDRRO, =0x3FF0000LDRRI, =0xE7FFFF80 ;配置 SYSCFG,片内 4KB Cache, 4KBSRAMSTRRI, ROLDRSP, =0x3FE1000; SP指向4K SRAM的尾地址,堆栈向下生成BLMainEND该段代码完成的功能为:配置SYSCFG特殊功能寄存器,将S3C4510B片内的8KB 一体化的 SRAM配置为4KB Cache, 4KB SRAM,并将用户堆栈设置在片内的SRAM 中。4KB SRAM 的地址为 Ox3FE,OOOO(Ox3FE, 1000-1),由于 S3C4510B 的堆栈山高地址向低地址生成,将SP初始化为0x3FE1000。完成上述操作后,程序跳转到Main函数执行。保存Init.s,并添加到新建的项目。* Institute of* File Name:再新建一个文件,名为main.c,具体内容如下:Automation,Chinese Academy of Sciences main.cDescription:Author:Li Juguangvoid Delay(unsigned int);int Main() (unsigned LED;IOPMOD=OxFFFFFFFF;/将 10 口置为输出模式IOPDATA=0x01;for(;)LED=IOPDATA;LED=(LED<<1);IOPDATA=LED;Delay(10);if(!(IOPDATA&OxOF)IOPDATA=0x01;)return(0);void Delay(unsigned int x)(unsigned intfor(i=0;i<=x;i+)for (j=0;j<Oxff;j + + )for(k=0;k<0xff;k+);)保存main.c,并添加到新建的项目。此时可对该项目进行编译链接, 生成可执行的映像文件。可执行的映像文件主要用于程序的调试,一般在系统的SDRAM中运 行,并不烧写入Flash,因此,项目文件在链接时,注意程序的入口点应与 系统中SDRAM的实际配置地址相对应。链接器默认程序的入口地址为 0x8000,该值应根据实际的SDRAM映射地址进行修改。在编译链接项目文件时,将链接器程序的入口地址设置为 0x0040,0000 o打开 AXD Debugger (或 ARM Debugger for Windows)的命令行窗 口,执行obey命令:>obey C:memmap.txt系统中 SDRAM 被映射到 0x0040,0000(0x0140,0000-1 ),从 0x0040,0000处装入生成的可执行的映像文件,并将PC指针寄存器修改为 0x0040,0000,就可单步调试或运行生成的可执行的映像文件。该程序的运行效果使接在P0-P3 的LED显示器轮流被点亮。6.2.2 串行通讯工作原理与编程示例串行通讯是微计算机之间一种常见的近距离通讯手段,因使用方便、 编程简单而广泛使用,几乎所有的微控制器、pc都提供串行通讯接口。S3C4510B的UART单元提供两个独立的异步串行I/O 口 (Asynchronous Serial I/O, SIO),每个通讯口均可工作在中断模式或DMA 模式,也即UART能产生内部中断请求或DMA请求在CPU和串行I/O 口 之间传送数据。S3C4510B的UART单元特性包括:- 波特率可编程- 支持红外发送与接收- 12个停止位- 5、6、7或8个数据位- 奇偶校验每一个异步串行通讯都具有独立的波特率发生器、发送器、接收器 和控制单元。波特率发生器可由片内系统时钟MCLK驱动,或由外部时钟 UCLK (Pin64)驱动;发送器和接收器都有独立的数据缓冲寄存器和数据 移位器。待发送的数据首先传送到发送缓冲寄存器,然后拷贝到发送移位器并 通过发送数据引脚UATXDn发送出去。接收数据首先从接收数据引脚 UARXDn移入移位器,当接收到一个字节时就拷贝到接收缓冲寄存器。SIO的控制单元通过软件控制工作模式的选择、状态和中断产生。当使用UART的发送中断功能时,应在初始化UART之前先写一个字 节数据到UART的发送缓冲寄存器,这样,当发送缓冲寄存器为空时就可以产生UART的发送中断。图6.2为串行口的功能模块。图6.2串行口功能模块。表6-4为UART特殊功能寄存器描述表6-4 UART特殊功能寄存器寄存器偏移地址操作功能描述复位值ULCONOOxDOOO读/写UART0行控制寄存器0x00ULCON1OxEOOO读/写UART1行控制寄存器0x00UCONO0xD004读/写UART0控制寄存器0x00UCON10xE004读/写UART1控制寄存器0x00USTATO0xD008心UART 0状态寄存器OxCOUSTAT1OxEOO8读UART1状态寄存器OxCOUTXBUFOOxDOOC写UART0发送保持寄存器未定义UTXBUF1OxEOOC叮UART1发送保持寄存器未定义URXBUF0OxDOlO读UART0接收缓冲寄存器未定义URXBUF1OxEOlOttUART1接收缓冲寄存器未定义UBRDIVO0xEM)14读/写UART0波特率除数因子寄存器Ox(X)UBRDIV10xE014读/写UART1波特率除数因子寄存器0x00BRDCNT00xD018写UART0波特率计数寄存器0x00BRDCNT10xE018写UART1波特率计数寄存器0x00BRDCLKOOxDOlC写UART0波特率时钟监视器0x00BRDCLK1OxEOIC写UART1波特率时钟监视器0x00UART 行控制寄存器(UART Line Control Registers, ULCONO. ULCON1):寄存器偏移地址操作功能描述复位值ULCONOOxDOOO读/写UART0行控制寄存器0x0000, 0000ULCON1OxEOOO读/写UART1行控制寄存器0x0000, 0000表6-6为UART行控制寄存器描述表6-6 UART行控制寄存器描述位位名功能描述1:0每帧字长该两位指示发送或接收的每帧的数据位:00' =5 位,'01' =6 位,'10' =7 位,'11' =8 位。2停止位数该位指示每帧数据的停止位数:'0'=每帧一 个停止位,”'=每帧两个停止位。5:3校验模式该三位指示在数据的发送与接收过程中如何生 成校验并进行检测:'0XX'=无校验,*1001 =奇校验,'101'=偶校验,'100'=奇校 验,'110'=校验强制/检测为1, '111'=校 验强制/检测为0.16串行时钟选择该位用于选择时钟源:0=内部时钟(MCLK)1 =外部时钟(UCLK)7红外模式选择S3C4510B的UART模块支持红外(IR)发送与 接收。要使能红外模式,需设置ULCON7为1,否则选择正常UART模式。318765432101 RXPMDSBWL1: 0每帧字长(WL)00=5 位01=6 位10=7 位11=8 位2帧末尾停止位(STB) 0=每帧一个停止位 1=每帧两个停止位 5: 3校验模式(PMD) 0xx=无校验 100=奇校验 101 =偶校验110 =校验强制/检测为1 111 =校验强制/检测为0 6串行时钟选择(SC) 0=内部时钟(MCLK) 1 =外部时钟(UCLK) 7红外模式选择(IR) 0=正常操作模式 1=红外发送模式UART 控制寄存器(UART Control Registers, UCONO、UC0N1):寄存器偏移地址操作功能描述复位值UCONO0xD004读/写UART0控制寄存器0x0000, 0000UCON10xE004读/写UART1控制寄存器0x0000, 0000表6-8为UART控制寄存器描述表6-8 UART控制寄存器描述位位名功能描述1:0接收模式选择该两位的值决定当从UART接收缓冲寄存器中读 取数据时的当前功能:,00'=禁止Rx模式,=产生中断请求,10'=产生GDMA通道0请求," 1'=产生GDMA通道1请求。12接收状态中断使能该位决定当在数据的接收过程中发生异常(如发 生间断、帧错误、校验错误或Overrun错误)时是 否让UART产生中断请求:(0'=不产生接收状态中断请求,1'=产生接收状态中断请求。14:3发送模式选择该两位的值决定当写数据到UART发送缓冲寄存器中时的当前功能:*00'=禁止Tx模式,01'=产生中断请求,10'=产生GDMA通道0请求,11'=产生GDMA通道1请求。5数据设备准备好该位选择是否产生数据设备准备好(DSR)信号 输出:0=不产生DSR输出,1 =产生DSR输出(nUADSR弓|脚).6发送间隔该位选择是否发送间隔信号:0=不发送间隔信号,1 =发送间隔信号。7回环模式选择该位选择UART是否进入回环模式。在回环模式 下,发送的数据的输出置为高电平,发送缓冲寄 存器UTXBUF在内部直接连接到接收缓冲寄存器 URXBUFo回环模式仅用于测试目的,在正常操作模式下, 该位应为0'。31876543210L PBS B KTxMR X S 1RxM1 : 0接收模式选择(RxM)00=禁止01 =产生中断请求10=产生GDMA通道0请求11 =产生GDMA通道1请求2接收状态中断使能(RxSI)0=不产生接收状态中断1=产生接收状态中断4: 3发送模式选择(TxM)00=禁止01 =产生中断请求10=产生GDMA通道0请求11 =产生GDMA通道1请求5数据设备准备好(DSR)0=不产生DSR输出(nUADSR引脚)1 =产生DSR输出(nUADSR引脚)6发送间隔(SBK)0=发送间隔信号1=不发送间隔信号7回环使能(LPB)0=正常工作模式1=使能回环模式(仅用于测试)UART 状态寄存器(UART Status Registers, USTATO. USTAT1):寄存器偏移地址操作功能描述复位值USTAT00xD008读UART0状态寄存器0x0000, 00C0USTAT10xE008读UART1状态寄存器0x0000, 00C0表6-10为UART状态寄存器描述表&10 UART状态寄存器描述位位名功能描述0Overrun 错误在接收串行数据的操作中,当发生Overrun错误 时,该位自动置为1'。在先前接收到的数据还 未读出,而被新收到的数据所覆盖时发生Overrun 错误。如果接收状态中断使能位UCON2为'1',则 当Overrun错误发生时产生接收状态中断。任何时候读取UART状态寄存器USTAT,该位都 会自动清零。1校验错误在接收串行数据的操作中,当发生校验错误时,该位自动置为1'。如果接收状态中断使能位UCON2为'1',则 当校验错误发生时产生接收状态中断。任何时候读取UART状态寄存器USTAT,该位都 会自动清零。2帧错误在接收串行数据的操作中,当发生数据帧错误时, 该位自动置为1'。当检测到停止位为'0'时 发生帧错误。如果接收状态中断使能位UCON2为 T ,则 当帧错误发生时产生接收状态中断。任何时候读取UART状态寄存器USTAT,该位都 会自动清零。3间隔中断当接收到间隔信号时,该位自动置为。如果接收状态中断使能位UCON2为'1',则 当接收到间隔信号时产生接收状态中断。任何时候读取UART状态寄存器USTAT,该位都 会自动清零。4数据终端准备好(DTR)该位指示数据终端准备好引脚(nUADTR)的当 前信号电平。当该位为1'时,数据终端准备好引脚(nUADTR) 为低电平,当该位为0'时,数据终端准备好引 脚(nUADTR)为高电平。5接收数据准备好当接收缓冲寄存器URXBUF从串行口接收到 个有效数据时,该为自动置为1',然后就可以 从URXBUF中读取接收到的有效数据。当该位为'0'时表示还未接收到一个有效的数据。 当该位为1'时,根据当前UART接收模式位 UCON1:0的设置,可以产生中断或DMA请求。6J发送缓冲寄存器空当发送缓冲寄存器UTXBUF为空时,该位自动置 为',此时可以向UTXBUF写入下一个要发 送的数据。当该位为0'时,表示UTXBUF中的数据还未 全部拷贝到发送移位寄存器中,此时不能向 UTXBUF中写入新的发送数据。当该位为1'时,根据当前SIO发送模式位 UCON4:3的设置,可以产生中断或DMA请求。7发送完成(TC)当发送缓冲寄存器UTXBUF为空且发送移位寄 存器也为空时,该位自动置为'1'。该位用于指 示软件是否可以在此时禁用发送功能模块。31876543210TCR D RD T RB K DF E0 V0 Over run 错误(OV)0=在接收过程中未产生Overrun错误l=Overrun错误(如果UCON2置为1,则会产生接收状态中断)注:当已接收到的数据还未被读取,而新接收的数据覆盖了原有的数 据时,就会产生Overrun错误。1校验错误(PE)0=在接收过程中无校验错误1=校验错误(如果UCON2置为1,则会产生接收状态中断)2帧错误(FE)0=在接收过程中无帧错误1=帧错误(如果UCON2置为1,则会产生接收状态中断)3间隔信号检测(BKD)0=未收到间隔信号1=收到间隔信号(如果UCON置为1,则会产生接收状态中断)4数据终端准备好(DTR)0=DTR 弓|脚(nUADTR)置高1=DTR 引脚(nUADTR)置低5接收数据准备好(RDR)0=接收缓冲寄存器中无有效数据1=接收缓冲寄存器中有有效数据(若设置UCON1: 0J,则产生中断 或DMA请求)6发送缓冲寄存器空(TBE)0=发送保持寄存器中有有效数据1=发送保持寄存器中无数据(若设置UCON4: 3,则产生中断或DMA 请求)7发送结束(TC)0=iE在发送数据1=发送数据结束UART 发送缓冲寄存器(UART Transmit Buffer Registers, UTXBUFO, UTXBUF1):UART发送缓冲寄存器UTXBUFO、UTXBUF1,存放待发送的8位数 据。当把待发送的数据写入该寄存器时,UART的状态寄存器USTAT6自动清零。寄存器偏移地址操作功能描述复位值UTXBUF0OxDOOC写UART0发送缓冲寄存器未定义UTXBUF1OxEOOC写UART1发送缓冲寄存器未定义表6-2-11为UART发送缓冲寄存器描述表6-2-11 UART发送缓冲寄存器描述位位名功能描述7:0发送数据该位存放要发送的数据。当向该寄存器写入数据时,状态寄存器中的发送缓冲寄存器空位USTAT6清'0',以防UTXBUF中的数据被覆盖.任何时候向UTXBUF中写入新的数据,发送缓冲寄 存器空位USTAT6都会被清'0' .31876543210Transmit Data7: 0UART要发送的数据UART 接收缓冲寄存器(UART Receive Buffer Reg i ster, URXBUFO, URXBUF1 ):UART接收缓冲寄存器URXBUFO、URXBUF1,存放接收到的8位申 行数据。当UART接收完一个数据帧,UART的状态寄存器USTAT5置 为1。当读取URXBUF时,USTAT5自动清零。寄存器偏移地址操作功能描述复位值URXBUFOOxDOlO读UART0接收缓冲寄存器未定义URXBUF1OxEOlO读UART1接收缓冲寄存器未定义表6-14为UART接收缓冲寄存器描述表6-14 UART接收缓冲寄存器描述位位名功能描述7:0接收数据该位存放接收到的数据。当接收完一帧数据时,UART状态寄存器中的接收 数据准备好位USTATI5被置为'1',以防从 URXBUF中的读出的数据无效.任何时候读取URXBUF,接收数据准备好位USTAT5都会自动清'0'。31876543210I Receive Data |7: 0UART接收到的数据UART波特率除数因子寄存器(UART Baud Rate Divisor Registers,UBRDIVO, UBRDIV1):UART波特率除数因子寄存器UBRDIVO、UBRDIV1的值,决定发送、 接收的波特率。寄存器偏移地址操作功能描述复位值CNTOCNT1NOTE: CNTO = UBTDIVn 15:41,CNT1 = UBRDIVn 3:0, SC = ULCON (6UBRDIVO0xD014读/写UART0波特率除数因子寄存器0x0000, 0000UBRDIV10xE014读/写UART1波特率除数因子寄存器0x0000, 000031 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0I I I FCNTOCNT13: 0波特率除数因子值(CNT1)xxxO=除 1xxxl=| 1615: 4时间常数值(CNTO)CNTO的计算公式如下:CNT0=MCLK/ (32XBR) -1MCLK:系统的工作频率。BR:通讯的波特率。UART波特率示例:UART的波特率发生器的输入时钟可以为系统时钟,也可以从外部引 入时钟信号。若选用系统时钟为波特率发生器的输入时钟,当系统时钟为50MHz 时,则最大的波特率时钟输出为MCLK2/16(= 1.5625MHz),其中MCLK2 为系统时钟MCLK除以2。UCLK弓|脚为UARTO、UART1的外部时钟输入引脚。UART波特率 发生器的输入时钟MCLK2或UCLK,由寄存器UCCON6选择。下图为UART波特率发生器的结构图和典型的波特率.Baud Rates (BRGOUT)MCLK2 = 25MHzUCLK = 33 MHzCNTOCNT1Freq.Dev.(%)CNTOCNT1Freq.Dev.(%)1200130101200.10.0173511200.080.0064240065002400.20.086712400.150.0064480032404807.70.243304800.310.0064960016209585.9-0.121609600.610.00641920080'J19290.10.5108019113.150.453840040'''38109.8-0.853038580.150.475760026057870.40.535057870.370.47115200130111607.1-3.1170115740.740.4723040060223214.283.1280231481.480.4746086020520833.3413.0140416666.669.59关于UART工作原理和使用方法的更详细内容,可参考S3C4510B用 户手册。以下的示例完成通过串行口 UARTO发送数据的功能,接收功能的编 程与之类似。该示例的通讯协议为:19200波特、8位数据、1位停止、无 校验。打开 CodeWarrior for ARM Developer Suite(或 ARM Project Manager), 新建一个项目,并新建一个文件,名为Init.s,具体内容与第一个例子相同。保存Init.s,并添加到新建的项目。再新建一个文件,名为main.c,具体内容如下:Institute of Automation, Chinese Academy of SciencesFile Name:main.cDescription:Author:Li Juguang#define ULCONO(*(volatile unsigned *)0x03FFD000) /UARTchannelO line control register#define UCONO(*(volatile unsigned *)0x03FFD004) /UARTchannelO control register#define USTATO (*(volatile unsigned *)0x03FFD008) /UART channelO status register#define UTXBUFO(*(volatile unsigned*)0x03FFD00c)/UARTchannelO transimit holding register#define URXBUFO(*(volatile unsigned*)0x03FFD010)/UARTchannelO recieve buffer register#define UBRDIVO(*(volatileunsigned*)0x03FFD014)/Baudrate divisor registerO#define ULCON1(*(volatileunsigned*)0x03FFE000)/UARTchannell line control register#define UCON1(*(volatileunsigned*)0x03FFE004)/UARTchannell control register#define USTAT1(*(volatileunsigned*)0x03FFE008)/UARTchannell status register#define UTXBUF1(*(volatileunsigned*)0x03FFE00c)/UARTchannell transimit holding register#define URXBUF1(*(volatile unsigned*)0x03FFE010)/UARTchannell recieve buffer register#define UBRDIV1(*(volatile unsigned*)0x03FFE014)/Baudratedivisor registerlvoidvoidInitUART(int P