1.1UART串口
通用异步接纳器和发送器(Universal Asynchronous Receiver and Transmitter)简称UART。一般是嵌入式设备中默许都会装备的通讯接口。这是咱们,许多嵌入式设备没有显示屏,无法获得嵌入式设备实时数据信息,经过UART串口和超级终端相连,打印嵌入式设备输出信息。而且在对嵌入式体系进行盯梢和调试时,UART串口了是必要的通讯手法。比方:网络路由器,交换机等都要经过串口来进行装备。UART串口仍是许多硬件数据输出的首要接口,如GPS接纳器便是经过UART串口输出GPS接纳数据的。
1.1.1异步通讯和同步通讯
图2-56同步信号与异步信号
同步通讯技能
在发送数据信号的时分,会一起送出一根同步时钟信号,用来同步发送方和接纳方的数据采样频率。如图2-56所示,同步通讯时,信号线1是一根同步时钟信号线,以固定的频率进行电平的切换,其频率周期为t,在每个电平的上升沿之后进行对同步送出的数据信号线2进行采样(高电平代表1,低电平代表0),依据采样数据电平凹凸获得输出数据信息。假设两边没有同步时钟的话,那么接纳方就不知道采样周期,也就不能正常的获得数据信息。
异步通讯技能
在异步通讯技能中,数据发送方和数据接纳方没有同步时钟,只需数据信号线,只不过发送端和接纳端会依照洽谈好的协议(固定频率)来进行数据采样。数据发送方以每秒钟57600bits的速度发送数据,接纳方也以57600bits的速度去接纳数据,这样就能够确保数据的有用和正确。一般异步通讯中运用波特率(Baud-Rate)来规则两边传输速度,其单位为bps(bits per second每秒传输位数)。
1.1.2数据的串行和并行通讯方法
串行通讯比方是一列纵队,每个数据元素顺次纵向摆放。如图2-57所示,传输时一个比特一个比特的串行传输,每个时钟周期传输一个比特,这种传输方法相对比较简略,速度较慢,可是运用总线数较少,一般一根接纳线,一根发送线即可完成串行通讯。它的缺陷是要添加额定的数据来操控一个数据帧的开端和结束。
并行通讯比方一排横队,齐头并进一起传输。这种通讯方法每个时钟周期传输的数据量和其总线宽度成正比,可是完成较为杂乱。UART通讯选用的是串行方法进行通讯的。
图2-57串行数据通讯与并行数据通讯
1.1.3数据通讯传输形式
在数据通讯进程中,发送方和接纳方为了完成数据的正确发送和接纳,一般会有一个状况寄存器来描绘当时数据接纳和发送状况,当发送方有数据发送时,会检查发送状况寄存器,看是否答应发送数据(假设上一次数据还没有发送结束,不答应继续数据发送),在发送答应情况下再送出新数据。相同,接纳端经过检查接纳状况寄存器,确认是否有新数据抵达,假设有数据抵达,将去接纳数据缓冲区读取数据。
(1)轮询形式
经进程序碑文流,不断的检测状况寄存器的成果,假设当时可发送或接纳,则发送或接纳数据。其进程能够用下面伪代码来一共。
Send(){
While(1){
if(发送状况==可发送)
碑文数据发送操作;
}
}
;轮询方法完成数据接纳伪代码
Receive(){
While(1){
if(接纳状况==有数据抵达)
碑文数据接纳操作;
}
}
由程序可知,这种方法完成简略,但在进行数据接纳和发送时都要进入循环检查状况寄存器的值,当没有数据抵达或数据不行发送时,CPU会一向空转,其它程序又得不到CPU的碑文权,很影响体系的功率。
(2)间断形式
间断方法是指,当数据抵达或数据可发送时,发生间断,告诉CPU去发送或接纳数据,这种方法将通讯硬件和CPU独立出来,通讯硬件只需在发送或接纳条件预备好之后中,才告诉CPU去处理数据,在通讯条件没有预备好的时分,CPU去处理其它程序,明显这种方法更合理,这种方法要求通讯硬件要求比较高,需求支撑发生间断信号。
(3)DMA形式
一般完成数据的搬运或劳动时,CPU将从源地址处仿制数据到寄存器,然后将寄存器数据再写入意图地址处,该仿制进程需求CPU来碑文。S3C2440支撑DMA传输形式,DMA传输是指在CPU不干与的情况下,DMA硬件主动完成数据的搬运和仿制,在DMA传输进程中,CPU简直不必干与,这样能够让CPU安心的去做自己的作业。尽管如此,可是DMA在传输数据进程中要占用总线,在大批数据传输时,体系总线会被DMA通道占用,也会影响体系的功率。S3C2440 UART操控器支撑DMA方法传输串口通讯数据。
1.1.4S3C2440 UART操控器
S3C2440 UART操控器,供给了三个独立的异步串行I/O端口,每个端口都能够在间断形式或DMA形式下作业,换而言之,UART能够生成间断或DMA恳求用于CPU和UART之间的数据传输。UART串口挂接在APB总线上,APB总线最高能够抵达50MHz作业频率,在运用APB时钟频率时能够抵达最高115.2Kbps波特率的通讯速度。假设UART串口接纳外部设备供给UEXTCLK(外部时钟),UART能够在更高的速度下作业。每个UART串口在接纳设备和发送设备里别离包含一个64Byte的FIFO缓冲区,用于缓存发送数据和接纳数据。
咱们UART是串行异步通讯方法,因而在UART通讯进程中每次只能传输1位(bit),若干位组成一个数据帧(frame),帧是UART通讯中最根本单元,它首要包含:开端位,数据位,校验位(假设舱位了数据校验,要包含校验位),和间断位,帧结构如图2-58所示。
图2-58 UART数据帧结构
UART在通讯之前要在发送端和接纳端约定好帧结构,也便是约定好传输数据帧格局。
l开端位:有必要包含在数据帧中,一共一个帧的开端。
l数据位:可选5,6,7,8位,该位长度可由编程人员指定。
l校验位:假设在舱位了数据校验时,该位有必要指定。
l间断位:可选1,2位,该位长度可由编程人员指定。
通讯两边约定好帧格局后,指定同一波特率,以确保两边数据传输的同步。
1.1.5S3C2440 UART串口作业原理
每个UART包含一个波特率发生器,发送器,接纳器和一个操控单元,如下图所示:
图2-59 UART硬件结构
UART是以异步方法完成通讯的,其采样速度由波特率决议,波特率发生器的作业频率能够由PCLK(外围设备频率),FCLK/n(CPU作业频率的分频),UEXTCLK(外部输入时钟)三个时钟作为输入频率,波特率设置寄存器是可编程的,用户能够设置其波特率决议发送和接纳的频率。发送器和接纳器包含了64Byte的FIFO和数据移位器。UART通讯是面向字节省的,待发送数据写到FIFO之后,被劳动到数据移位器(1字节巨细)里,数据经过发送数据管脚TXDn宣布。相同道理,接纳数据经过RXDn管脚来接纳数据(1字节巨细)到接纳移位器,然后将其劳动到FIFO接纳缓冲区里。
(1)数据发送
发送的数据帧可编程的,它的一个帧长度是用户指定的,它包含一个开端位,5~8个数据位,一个可选的奇偶校验位和1~2个间断位,数据帧格局能够经过设置ULCONn寄存器来设置。发送器也能够发生一个间断信号,它是由一个悉数为0的数据帧组成。在当时发送数据被彻底传输完今后,该模块发送一个间断信号。在间断信号发送后,它能够继续经过FIFO(FIFO)或发送坚持寄存器(NON-FIFO)发送数据。
(2)数据接纳
相同接纳端的数据也是可编程的,接纳器能够侦测到溢出过错奇偶校验过错,帧过错和间断条件,每个过错都能够设置一个过错标志。
l溢出过错是指在旧数据被读取到之前,新数据覆盖了旧数据
l奇偶校验过错是指接纳器侦测到了接纳数据校验成果失利,接纳数据无效
l帧过错是指接纳到的数据没有一个有用的间断位,无法断定数据帧结束
l间断条件是指RxDn接纳到坚持逻辑0状况继续善于一个数据帧的传输时刻
(3)主动流控AFC(Auto Float Control)
UART0和UART1支撑有nRTS和nCTS的主动流控,UART2不支撑流控。在AFC情况下,通讯两边nRTS和nCTS管脚别离衔接对方的nCTS和nRTS管脚。经过软件操控数据帧的发送和接纳。
在舱位AFC时,发送端接纳发送前要判别nCTS信号状况,当接纳到nCTS激活信号时,发送数据帧。该nCTS管脚衔接对方nRTS管脚。接纳端在预备接纳数据帧前,其接纳器FIFO有大于32个字节的闲暇空间,nRTS管脚会发送激活信号,当其接纳FIFO小于32个字节的闲暇空间,nRTS有必要置非激活状况。如图2-60所示。
图2-60主动流控数据传输
(4)波特率
在UART中波特率发生器为发送器和接纳器供给作业时钟。波特率发生器的时钟源能够挑选S3C2440A的内部体系时钟(PCLK,FCLK/n)或UEXTCLK(外部时钟源),能够经过设置UCONn寄存器来设置波特率发生器的输入时钟源。一般咱们挑选运用PCLK作为UART作业时钟。
UART操控器中没有对波特率进行设置的寄存器,而是经过设置一个除数因子,来决议其波特率。其计算公式如下:
其间:UBRDIVn的取值规模应该为1~2^16-1。例如:波特率为115200bps,PCLK时钟为其作业频率,选用50MHz,UBRDIVn为:
在体系时钟未初始化时,PCLK = 12MHz,假设波特率选用57600bps,那么UBRDIVn为:
当运用外部时钟源时,假设外部时钟小于PCLK时钟,则UEXTCLK应该设置为0。
(5)波特率的过错哨所率(Baud-Rate Error Torlerance)
数据信号在传输进程中咱们外界电磁搅扰,信号削弱等原因,当时钟频率较低,传输速率较高时会发生夺冠,当夺冠抵达必定值时,会呈现数据信号不能正常辨认,形成通讯反常。比方方,在一般列车轨迹上小事行进高速列车相同,咱们高速列车对轨迹要求很高,当速度抵达必定程度,很可能形成事端。业界的波特率的过错哨所率为1.86%(3 / 160),假设大于该值则应该挑选较低的波特率或进步输入时钟频率。
过错哨所率计算公式为:
注:tUPCLK为UART的实在作业时钟频率:tUPCLK = (UBRDIVn + 1) * 16 * 1Frame / PCLK
tUEXACT为UART抱负作业时钟频率:tUEXACT = 1Frame / baud-rate
其间:1Frame为数据帧的长度=开端位+数据位+可选校验位+间断位
假设,波特率选用115200bps,PCLK时钟为50MHz,波特率除数因子UBRDIVn为26(经过前面UBRDIVn计算公式算出),选用1个间断位,8个数据位,无校验的8N1方法通讯时,其过错哨所率为:
tUEXACT = 10 / 115200 = 0.0000868
UART Error= | 0.0000864 – 0.0000868 | / 0.0000868 = 0.46%
在开发板没有初始化体系时钟前,开发板作业在12MHz下,假设咱们将波特率设置为115200bps,选用PCLK为体系默许时钟12MHz,8N1数据帧格局通讯,那么:
UBRDIVn = (int)(12M / (115200 * 16)) – 1 = 6
其过错哨所率:
tUEXACT = 10 / 115200 = 0.0000868
UART Error = | 0.0000933 – 0.0000868 | / 0.0000868 = 7.5%
其过错哨所率大于1.86%,因而在12MHz频率下,波特率不能设置为115200,现在将波特率设置为56700bps,选用8N1数据帧格局通讯,那么:
tUPCLK = 13 * 16 * 10 / 12M = 0.000173
tUEXACT = 10 / 57600 = 0.0001736
UART Error = | 0. 000173 – 0. 0001736 | / 0. 0001736 = 0.345%
选用波特率为56700bps,8N1数据帧格局通讯时,其过错哨所率小于规范的1.86%,因而能够正常作业。
图2-61 MINI2440开发板串口硬件图
UART的接口
图2-61为MINI2440开发板引出UART串口接线图,它选用DB9接口公头(有接线柱的端口,只需接线孔的为母头),其有9根信号线,UART通讯进程顶用到了信号线2 RSTXD0(数据发送管脚)它和串口线母头TXDx信号线相接(x代表0号,1号,2号串口),信号3 RSRXD0(数据接纳管脚)和串口线母头RXDx相接(x代表0号,1号,2号串口),信号线5(接地管脚),信号线7 RSCTS0(数据发送流操控管脚)和串口线母头nCTSx相接,信号线8 RSRTS0(数据接纳流操控管脚)和串口线母头nRTSx相接。假设UART中没有舱位AFC流控的话,只需用到信号线2,信号线3和信号线5。
图2-62 MINI2440串口管脚接线
经过MINI2440硬件CPU管脚图能够看出,RSTXD0和RSRXD0衔接到CPU的GPH2和GPH3管脚上的,而GPH2和GPH3是CPU复用管脚,因而咱们要对GPH2和GPH3对应寄存器进行设置,其对应寄存器为GPHCON。
表2-23 GPIO端口H设置寄存器(GPHCON)
寄存器名 | 地址 | 是否读写 | 描绘 | 复位默许值 |
GPHCON | 0x56000070 | R/W | GPIO端口H装备寄存器 | 0x0 |
GPHDAT | 0x56000074 | R/W | GPIO端口H数据寄存器 | 未定义 |
GPHUP | 0x56000078 | R/W | GPIO端口H上拉无效寄存器 | 0x000 |
GPHCON | 位 | 描绘 | 初始值 |
… | … | … | … |
GPH3 | [7:6] | 设置当时管脚功用: 00 =输入端口01 =输出端口 10 = RXD[0]装备为串口0的接纳数据管脚 11 =保存 |
0 |
GPH2 | [5:4] | 设置当时管脚功用: 00 =输入端口01 =输出端口 10 = RXD[0]装备为串口0的接纳数据管脚 11 =保存 |
0 |
… | … | … | … |
GPHCON[7:6]和GPHCON[5:4]为RSTXD0和RSRXD0管脚设置位,将其功用设置为了UART专用通讯管脚,因而应该设置其为0b10,别离用于UART数据的接纳和发送。
表2-24 GPIO端口H上拉电阻设置寄存器(GPHUP)
GPHUP | 位 | 描绘 | 初始值 |
GPH[10:0] | [10:0] | 设置对应管脚GPHn的是否启用上拉功用 0 =启用上拉功用 1 =禁用上拉功用 |
0 |
GPHUP上拉电阻设置寄存器:上拉电阻用来安稳电平信号,保证传输数据的正确,GPHUP里设置其内部上拉。
表2-25 UART0串行操控寄存器(ULCON0)
寄存器名 | 地址 | 是否读写 | 描绘 | 复位默许值 |
ULCON0 | 0x50000000 | R/W | 串口0串行操控寄存器 | 0x00 |
ULCON0 | 位 | 描绘 | 初始值 |
保存 | [7] | 0 | |
红外形式 | [6] | 挑选串口0是否运用红外形式: 0 =正常通讯形式 1 =红外通讯形式 |
0 |
校验形式 | [5:3] | 设置串口0在数据接纳和发送时选用的校验方法: 0xx =无校验 100 =奇校验 101 =偶校验 110 =强制校验/检测是否为1 111 =强制校验/检测是否为0 |
000 |
间断位 | [2] | 设置串口0间断位数: 0 =每个数据帧一个间断位 1 =每个数据帧二个间断位 |
0 |
数据位 | [1:0] | 设置串口0数据位数: 00 = 5个数据位01 = 6个数据位 10 = 7个数据位11 = 8个数据位 |
00 |
经过设置ULCON0来设置UART0通讯方法,ULCON0[6]挑选通讯方法为一般通讯形式或红外通讯形式,ULCON0[5:3]设置串口0校验方法,ULCON0[2]设置串口0间断位数,ULCON0[1:0]设置串口0的数据位数。
咱们挑选一般通讯形式,无校验位,1个间断位,8个数据位的数据通讯方法。因而:
表2-26 UART0串口操控寄存器(UCON0)
寄存器名 | 地址 | 是否读写 | 描绘 | 复位默许值 |
UCON0 | 0x50000004 | R/W | 串口0操控寄存器 | 0x00 |
UCON0 | 位 | 描绘 | 初始值 |
FCLK分频因子 | [15:12] | 当UART0挑选FCLK作为时钟源时,设置其FCLK的分频因子 UART0作业时钟频率= FCLK/ FCLK分频因子+ 6 |
0000 |
UART时钟源挑选 | [11:10] | 挑选UART0的作业时钟PCLK,UEXTCLK,FCLK/n: 00,10 = PCLK 01 = UEXTCLK 11 = FCLK/n 当挑选FCLK/n作为UART0作业时钟时还要做其它设置,详细请读者自行检查硬件手册 |
00 |
发送数据间断 发生类型 |
[9] | 设置UART0间断恳求类型,在非FIFO传输形式下,一旦发送数据缓冲区为空,当即发生间断信号,在FIFO传输形式下抵达发送数据触发条件时当即发生间断信号: 0 =脉冲触发 1 =电平触发 |
0 |
接纳数据间断 发生类型 |
[8] | 设置UART0间断恳求类型,在非FIFO传输形式下,一旦接纳到数据,当即发生间断信号,在FIFO传输形式下抵达接纳数据触发条件时当即发生间断信号: 0 =脉冲触发 1 =电平触发 |
0 |
接纳数据超时 | [7] | 设置当接纳数据时,假设数据超时,是否发生接纳间断: 0 =不舱位超时间断1 =舱位超时间断 10 = 7个数据位11 = 8个数据位 |
0 |
接纳数据过错间断 | [6] | 设置当接纳数据时,假设发生反常,如传输间断,帧过错,校验过错时,是否发生接纳状况间断信号: 0 =不发生过错状况间断1 =发生过错状况间断 |
0 |
回送形式 | [5] | 设置该位时UART会进入回送形式,该形式仅用于测验 0 =正常形式1 =回送形式 |
0 |
发送间断信号 | [4] | 设置该位时,UART会发送一个帧长度的间断信号,发送结束后,该位主动康复为0 0 =正常传输1 =发送间断信号 |
0 |
发送形式 | [3:2] | 设置选用哪个方法碑文数据写入发送缓冲区 00 =无效 01 =间断恳求或查询形式 10 = DMA0恳求 |
00 |
接纳形式 | [1:0] | 设置选用哪个方法碑文数据写入接纳缓冲区 00 =无效 01 =间断恳求或查询形式 10 = DMA0恳求 |
00 |
一般UART串口选用PCLK作为输入作业时钟,选用简略的轮询方法进行数据接纳和发送,不舱位数据接纳超时,数据发生过错时不发生过错状况间断,因而:
表2-27 UART FIFO操控寄存器(UFCON0)
寄存器名 | 地址 | 是否读写 | 描绘 | 复位默许值 |
UFCON0 | 0x50000008 | R/W | 串口0 FIFO操控寄存器 | 0x00 |
UFCON0 | 位 | 描绘 | 初始值 |
发送数据 触发等级 |
[7:6] | 设置FIFO发送形式的触发等级: 00 = FIFO为空触发01 = 16字节触发 10 = 32字节触发11 = 48字节触发 |
00 |
接纳数据 触发等级 |
[5:4] | 设置FIFO接纳形式的触发等级: 00 = FIFO为空触发01 = 16字节触发 10 = 32字节触发11 = 48字节触发 |
00 |
保存 | [3] | 0 | |
发送FIFO重置 | [2] | 在重置FIFO后主动铲除发送缓冲区 0 =正常形式1 =主动铲除 |
0 |
接纳FIFO重置 | [1] | 在重置FIFO后主动铲除接纳缓冲区 0 =正常形式1 =主动铲除 |
0 |
启用FIFO | [0] | 0 =不启用FIFO1 =启用FIFO | 0 |
表2-28 UART MODEM操控寄存器(UMCON0)
寄存器名 | 地址 | 是否读写 | 描绘 | 复位默许值 |
UMCON0 | 0x5000000C | R/W | 串口0MODEM操控寄存器 | 0x00 |
UMCON0 | 位 | 描绘 | 初始值 |
保存 | [7:5] | 有必要悉数置0 | 000 |
AFC主动流控 | [4] | 0 =不舱位流控1 =舱位流控 | 0 |
保存 | [3:1] | 有必要悉数置0 | 000 |
恳求发送 | [0] | 假设启用AFC,该位无效,S3C2440会主动操控nRTS,假设不启用AFC,nRTS有必要由软件操控 0 =高电平激活nRTS1 =低电平激活nRTS |
0 |
表2-29 UART发送/接纳状况寄存器(UTRSTAT0)
寄存器名 | 地址 | 是否读写 | 描绘 | 复位默许值 |
UTRSTAT0 | 0x50000010 | R/W | 串口0发送/接纳状况寄存器 | 0x06 |
UTRSTAT0 | 位 | 描绘 | 初始值 |
发送器为空 | [2] | 当发送缓存寄存器中没有数据要发送且发送移位寄存器为空时,主动置1 0 =非空 1 =发送器为空(发送缓存和移位寄存器) |
1 |
发送缓存寄存器为空 | [1] | 当发送缓存寄存器为空时,主动置1 0 =发送缓存寄存器非空 1 =发送缓存寄存器为空 |
1 |
接纳缓存寄存器为空 | [0] | 当接纳缓存寄存器有数据抵达时,主动置1 0 =接纳缓存寄存器为空 1 =缓存寄存器接纳数据 |
0 |
表2-30 UART发送缓存寄存器(UTXH0)
寄存器名 | 地址 | 是否读写 | 描绘 | 复位默许值 |
UTXH0 | 0x50000020(L) 0x50000023(B) |
W | 串口0发送缓存寄存器 | – |
表2-31 UART接纳缓存寄存器(URXH0)
寄存器名 | 地址 | 是否读写 | 描绘 | 复位默许值 |
URXH0 | 0x50000024(L) 0x50000027(B) |
R | 串口0接纳缓存寄存器 | – |
表2-32 UART波特率除数寄存器(UBRDIV0)
寄存器名 | 地址 | 是否读写 | 描绘 | 复位默许值 |
UBRDIV0 | 0x50000028 | R/W | 串口0波特率除数寄存器 | – |
UBRDIV0 | 位 | 描绘 | 初始值 |
波特率除数 | [15:0] | 设置波特率除数(大于0)运用外部输入时钟时能够置0 | – |
上述寄存器是是和UART通讯相关寄存器,运用简略的无FIFO,无主动流控AFC时,设置如下:
UMCON0 = 0x00;//不运用流控
UBRDIV0 = 26;//波特率为115200,PCLK=50Mhz
UBRDIV0 = 53;//波特率为57600,PCLK=50Mhz
UBRDIV0 = 12;//波特率为57600,PCLK=12Mhz
UTXH0和URXH0别离是数据发送和接纳寄存器,发送数据时经过轮询方法判别发送状况寄存器的状况,当能够发送数据时,碑文UTXH0寄存器写入操作,接纳数据时,以轮询方法检测接纳状况寄存器状况,当有数据抵达时,读取URXH0寄存器里的数据即可获得串口数据。
#defineRXD0READY(1)//接纳数据状况OK
/* UART串口单个字符打印函数*/
extern void putc(unsigned char c)
{
while( ! (UTRSTAT0 & TXD0READY) );
UTXH0 = c;
}
/* UART串口承受单个字符函数*/
extern unsigned char getc(void)
{
while( ! (UTRSTAT0 & RXD0READY) );
return URXH0;
}
1.1.6UART串口驱动实验
init.s:本程序文件对看门狗,内存等根本硬件做初始化,然后跳入到xmain.c中的xmain函数碑文。
; UART串口实验
;
GPBCONEQU0x56000010
GPBDATEQU0x56000014
AREA Init, CODE, READONLY
ENTRY
start
; close watchdog
ldr r0, = 0x53000000;将看门狗操控寄存器地址放入r0
mov r1, #0
str r1, [r0];设置看门狗操控寄存器的值为0
bl initmem;跳转到initmem代码段,初始化内存
IMPORT xmain;引进main.c中的xmain函数
ldr sp, =0x34000000;调用C程序之前先初始化栈指针
ldr lr, =loop;设置xmain函数的回来地址
ldr pc, =xmain;跳转到C程序中的xmain函数的入口处碑文
loop
b loop;死循环
initmem;内存初始化
ldr r0, =0x48000000;加载内存相关寄存器首地址r0
ldr r1, =0x48000034;加载内存相关寄存器尾地址到r1
adr r2, memdata;将寄存器装备数据地址段首地址加载到r2
initmemloop
ldr r3, [r2], #4;循环设置存寄存器
str r3, [r0], #4
teq r0, r1
bne initmemloop;循环到最后一个寄存器时退出函数
mov pc,lr
memdata
DCD0x22000000;BWSCON
DCD0x00000700;BANKCON0
DCD0x00000700;BANKCON1
DCD0x00000700;BANKCON2
DCD0x00000700;BANKCON3
DCD0x00000700;BANKCON4
DCD0x00000700;BANKCON5
DCD0x00018005;BANKCON6
DCD0x00018005;BANKCON7
DCD0x008e07a3;REFRESH
DCD0x000000b1;BANKSIZE
DCD0x00000030;MRSRB6
DCD0x00000030;MRSRB7
END
xmain.c:uart_init函数对UART0进行初始化,然后进入死循环内,不断打印字符串“Uart串口打印实验”。
/* GPIO registers */
#defineGPHCON(*(volatile unsigned long *)0x56000070)
#defineGPHDAT(*(volatile unsigned long *)0x56000074)
#defineGPHUP(*(volatile unsigned long *)0x56000078)
/*UART registers*/
#defineULCON0(*(volatile unsigned long *)0x50000000)
#defineUCON0(*(volatile unsigned long *)0x50000004)
#defineUFCON0(*(volatile unsigned long *)0x50000008)
#defineUMCON0(*(volatile unsigned long *)0x5000000c)
#defineUTRSTAT0(*(volatile unsigned long *)0x50000010)
#defineUTXH0(*(volatile unsigned char *)0x50000020)
#defineURXH0(*(volatile unsigned char *)0x50000024)
#defineUBRDIV0(*(volatile unsigned long *)0x50000028)
#defineTXD0READY(1<<2)//发送数据状况OK
#defineRXD0READY(1)//接纳数据状况OK
/* UART串口初始化*/
void uart_init( )
{
GPHCON |= 0xa0;//GPH2,GPH3 used as TXD0,RXD0
GPHUP= 0x0;//GPH2,GPH3内部上拉
ULCON0= 0x03;//8N1
UCON0= 0x05;//查询方法为轮询或间断;时钟挑选为PCLK
UFCON0 = 0x00;//不运用FIFO
UMCON0 = 0x00;//不运用流控
UBRDIV0 = 12;//波特率为57600,PCLK=12Mhz
}
/* UART串口单个字符打印函数*/
extern void putc(unsigned char c)
{
while( ! (UTRSTAT0 & TXD0READY) );
UTXH0 = c;
}
/* UART串口承受单个字符函数*/
extern unsigned char getc(void)
{
while( ! (UTRSTAT0 & RXD0READY) );
return URXH0;
}
/* UART串口字符串打印函数*/
extern int printk(const char* str)
{
int i = 0;
while( str[i] ){
putc( (unsigned char) str[i++] );
}
return i;
}
__inline void delay(int msec)
{
int i, j;
for(i = 1000; i > 0; i–)
for(j = msec*10; j > 0; j–)
/* do nothing */;
}
/* xmain经过UART串口打印字符串*/
int xmain()
{
uart_init();
while(1) {
delay(10);
printk(“Uart串口打印实验/r/n”);
}
return 0;
}
当编译并将生成Norflash,在->一切程序->通讯mini2440,在之后弹出的COM波特率1个间断位,PC串口(笔记本一般没有串口,能够买一个Uart串口打印实验”字符串。