打印
[牛人杂谈]

M051的UART接口控制器

[复制链接]
1949|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
NuMicro M051™ 提供2个通用异步收/发器( UART)通道, UART0~1支持普通速度,支持流控制

概述
通用异步收/发器(UART) 对从外设收到的数据执行串到并的转换,对从CPU发送的数据执行并到串的转
换。该串口同时支持IrDA SIR 功能和RS-485模式. 每个UART通道有5种类型的中断, 它们是, 发送FIFO
空中断(Int_THRE), 接收阀值到达中断(Int_RDA), 线状态中断 (奇偶校验错误或者帧错误或者打断中断)
(Int_RLS) , 接收缓冲器溢出中断中断(Int_Tout), 调制解调器/唤醒状态中断(Int_Modem).中断号12(中
断向量为28)支持UART0的中断,中断号13(中断向量29)支持UART1的中断,参考嵌套向量中断控
制器.
UART0~1内嵌一个15字节发送FIFO (TX_FIFO) 和一个15字节接收 FIFO (RX_FIFO)。 CPU可以随时
读UART的状态。返回的状态信息包括正在被UART执行的传输操作的类型和条件, 在接收数据时还可能
发生3个错误(奇偶校验错误、帧错误、打断中断)状况。 UART包括一个可编程的波特率发生器,它可以
将输入时钟分频来得到收发器需要的时钟. 波特率公式是 Baud Rate = UART_CLK / M * [BRD + 2]. 其
中M和BRD在波特率分频寄存器UA_BAUD中配置. 图表6.10-1和6.10-2分别列出了不同条件下波特率方
程和UART波特率设置表。





沙发
huangcunxiake|  楼主 | 2016-8-6 08:56 | 只看该作者
UART0与UART1 控制器支持自动流控制功能,它使用 2 种低电平信号, /CTS (clear-to-send,允许发
送)和 /RTS (request-to-send,请求发送),来控制UART 和外部驱动器(ex: Modem)之间的数据流传递.
当自动流控功能使能时, UART被禁止接收数据直到UART 向外发出/RTS信号. 当Rx FIFO中字节数量
和RTS_TRI_LEV (UA_FCR [19:16])的值相等时, /RTS信号不再发出. 当UART控制器从外部驱动器侦测
到 /CTS, UART 向外发送数据 如果 /CTS 未被侦测, UART 将不向外发送数据.
UART 控制器提供 串行 IrDA (SIR, 串行红外) 功能 (用户需置位rDA_EN (UA_FUN_SEL[1:0])使能 IrDA
功能). SIR 规范定义短**外异步串行传输模式为1 开始位, 8 数据位, 和1 停止位. 最大数据速率 为
115.2 Kbps (半双工). IrDA SIR模块包括一个IrDA SIR协议编码/解码器. IrDA SIR 只是半双工协议. 因此
不能同时发送和接收数据. IrDA SIR 物理层规定在发送和接收之间至少要有10ms传输延时. 该特性必须
由软件执行.
UART控制的另一功能是支持RS-485 9位模式, 由RTS控制方向或通过软件编程GPIO (P0.3 对应于
RTS0 and P0.1 对应于 RTS 1) 执行该功能. RS-485模式通过设置UA_FUN_SEL寄存器选定。 使用来
自异步串行口的RTS控制信号来使能RS-485驱动器,执行RS-485驱动器控制。在RS-485模式下, RX
与TX的许多特性与UART相同。

使用特权

评论回复
板凳
huangcunxiake|  楼主 | 2016-8-6 09:34 | 只看该作者
特性
z 全双工,异步通信
z 独立的接收/发送15字节 (UART0/UART1) FIFO数据装载区
z 支持硬件自动流控制/流控制功能(CTS, RTS)和可编程的RTS流控制触发电平(UART0 与UART1 支
持)
z 可编程的接收缓冲触发电平
z 每个通道都支持独立的可编程的波特率发生器
z 支持CTS 唤醒功能(UART0 与 UART1 支持)
z 支持7位接收缓冲计时溢出检测功能
z 通过设置UA_TOR [DLY] 可以编程在上一个停止与下一个开始位之间数据发送的延迟时间
z 支持打断错误,帧错误,奇偶校验错误检测功能
z 完全可编程的串行接口特性
z可编程的数据位, 5, 6, 7, 8位
z可编程的奇偶校验位, 偶校验、奇校验、无校验位或stick校验位 发生和检测
z可编程停止位, 1, 1.5, 或 2 停止位 产生
z支持IrDA SIR 功能
z 普通模式下支持 3/16位持续时间
z支持RS-485 模式.
z支持 RS-485 9位模式
z支持由RTS提供的硬件或软件直接使能控制

使用特权

评论回复
地板
huangcunxiake|  楼主 | 2016-8-6 09:50 | 只看该作者
IrDA是红外数据组织(Infrared Data Association)的简称,目前广泛采用的IrDA红外连接技术就是由该组织提出的.到目前为止,全球采用IrDA技术的设备超过了5000万部。 IrDA已经制订出物理介质和协议层规格,以及2个支持IrDA标准的设备可以相互监测对方并交换数据。 初始的IrDA1.0标准制订了一个串行,半双工的同步系统,传输速率为2400bps到115200bps,传输范围1 m,传输半角度为15度到30度。最近IrDA扩展了其物理层规格使数据传输率提升到4Mbps。PXA27x就是使用了这种扩展了的物理层规格。
IrDA数据协议由物理层,链路接入层和链路管理层三个基本层协议组成,另外,为满足各层上的应用的需要,IrDA栈支持IrLAP, IrLMP, IrIAS, IrIAP, IrLPT, IrCOMM,IrOBEX和IrLAN等。
1、 IrDA红外串行物理层协议:
IrPHY定义了4Mb/s以下速率的半双工连接标准。在IrDA物理层中,将数据通信按发送速率分为三类:SIR、MIR和FIR。串行红外(SIR)的速率覆盖了RS-232端口通常支持的速率(9600bps~115.2Kbps)。MIR可支持0.576Mbps和1.152Mbps的速率;高速红外(FIR)通常用于4Mbps的速率,有时也可用于高于SIR的所有速率。4Mb/s连接使用4PPM编码,1.152Mb/s连接使用归零OOK编码,编码脉冲的占空比为0.25。115.2kb/s以及以下速率的连接使用占空比为0.1875的归零OOK编码。
2、 IrLAP红外链路接入协议:
IrLAP定义了链路初始化、设备地址发现、建立连接(其中包括比特率的统一)、数据交换、切断连接、链路关闭以及地址冲突解决等操作过程。它是从异步数据通信标准高级数据链路控制(HDLC)协议演化而来的。IrLAP使用了HDLC中定义的标准祯类型,可用于点对点和点对多的应用。IrLAP的最大特点是,由一种协商机制来确定一个设备为主设备,其他设备为从设备。主设备探测它的可是范围,寻找从设备,然后从那些相应它的设备中选择一个并试图建立连接。在建立连接的过程中,两个设备彼此协调,按照它们共同的最高通信能力确定最后的通信速率。以上所说的寻找和协调过程都是在9.6kbps的波特率下进行的。
3、 IrLMP红外链路管理协议:
IrLMP是IrLAP之上的一层链路管理协议,主要用于管理IrLAP所提供的链路连接中的链路功能和应用程序以及评估设备上的服务,并管理如数据速率、BOF的数量(帧的开始)及连接转换向时间等参数的协调、数据的纠错传输等。
4、IrIAS,IrLPT,IrCOMM,IrOBEX,IrLAN是建立在IrLAP之上的应用。
IrDA建立连接的过程
当 IrDA被建立时,它为自己设置下列目标:“建立可互操作的,廉价的红外线资料互连标准能维持无连接的, 定向无线电传送的使用者模型,能适应活动的宽带的的要连接到外围设备和主机的应用。”
IrDA选择短射程的、无连接的、点对点定向的红外线通信模型有两主要的原因。
1. 第一,它初始的目标市场为支持IrDA的设备将是可移动的
2. 第二, IrDA选择这个通信模型因为它最低的价格。
IrDA建立连接通信分四个阶段
1. 设备发现和地址解析
发现过程是IrDA 设备查明在通讯范围是否有其它设备的过程。 在此情况下,发现范围内所有设备的地址,也就是IrLAP操控的设备序号, 也有的是由IrLMP层指定的。哪个设备的发现程序占有时间槽, 那个设备就控制发现过程。当范围内有多个设备时,这种分槽的办法减少了冲突的可能性。在等待560ms后(普通断开方式规则),初始设备在每个时间槽的头部开始发现过程, 并广播帧标记。当听到初始发现槽时, 设备将随机选择一个响应。当设备接收到它选择槽的帧标记时,传送一个发现响应帧。 在发现过程中所有的帧都采用HDLC的无编号的交换标识(XID)类型。如果参加发现过程的设备有重复的地址,那就需启动地址解析过程。 地址解析过程与发现过程相似,它用探测地址冲突来启动过程,仅解析有冲突的地址。 初始设备向冲突的地址传送地址解析XID命令,这个地址的设备选择另一个随机地址和槽响应。 初始这像以前一样传送槽标记,而原先地址冲突的设备选择恰当的槽响应。 一旦过程结束,每个设备将有唯一地址。如果仍有冲突,此过程反复进行。
2. 链接建立
一旦发现和地址解析过程完成后,应用层可以决定它希望连接到哪一个被发现的设备。 应用层将发一个连接请求,它最终选择调用适当的IrLAP服务原语。 IrLAP层连接远程设备是采用发送带轮换查询位(poll bit)的设置正常响应模式(SNRM)的命令帧。 假设远程的设备能接受连接,它将发送一个带中止位的无编号应答响应帧, 指示连接已经被接受。在正常环境下,启动连接的设备(发送SNRM)是主设备,其它设备是从设备。
3. 信息交换和链接复位
信息交换过程的操作实在主从模式下进行的,就是主设备控制从设备的访问。 主设备发出命令帧,从设备响应。为了保证在同一时间里只有一个设备能传送帧, 一个传送许可令牌在主、从设备间交换。一个传送许可令牌在主、从设备间交换。 主设备通过发送带轮换查询位的控制帧传递一个传送许可令牌给从设备, 从设备通过带结束位的响应帧返回令牌。传送数据时,从设备保留令牌, 一旦数据传输结束或达到最长转换时间,它必须将令牌返回主设备。 当然,主设备也受最长传送时间的限制,但没有数据传送时,主设备允许保留令牌。
4. 链接终止
一旦数据传输完,主、从设备之一将断开链接。如果主设备希望断开链接,它将发送带轮询位的断开命令给从设备。从设备返回带终止位的未编号确认帧应答。 两个设备将都处于正常断开模式,采用其参数(9600bps)。
一旦两个设备处于正常中断模式,传输媒介对于任何设备都是空闲的,都可以开始设备发现,地址解析,连接建立过程。
IrLAP协议分析
IrDA提供的服务分为两大类,即面向连接的服务和无连接的服务。具体分为4种:
-Request 由上层协议送达,用来激活服务
-Indication 用于将服务初始化请求通知上层应用
-Response 上层协议用于接受服务请求
-Confirm IrLAP层报告服务结果
另外也是Infra Red Data Association的缩写,即红外线接口


使用特权

评论回复
5
huangcunxiake|  楼主 | 2016-8-6 09:50 | 只看该作者
红外发射电路由红外线发射管L2 和限流电阻R2 组成。当主板红外接口的输出端I

RTX输出调制后的电脉冲信号时,红外线发射管将电脉冲信号转化为红外线光信号发射出去。电阻R2 起限制电流的作用,以免过大的电流将红外管损坏。当R2 的阻值越小,通过红外管的电流就越大,红外管的发射功率也随电流的增大而增大,发射距离就越远,但R2 的阻值不能过小,否则会损坏红外管或主板红外接口

红外接收电路由红外线接收管L1 和取样电阻R1 组成。当红外接收管接收到红外线光信号时,其反向电阻会随光信号的强弱变化而相应变化,根据欧姆定律可以得知通过红外接收管L1 和电阻R1 的电流也会相应变化,而在取样电阻两端的电压也随之变化,此变化的电压经主板红外接口的输入端IRRX 输入主机。由于不同的红外接收管的电气参数不同,所以取样电阻R1 的阻值
要根据实际情况作一定范围的调整。

[size=13.3333339691162px]红外通讯电路标准方案



使用特权

评论回复
6
huangcunxiake|  楼主 | 2016-8-6 09:51 | 只看该作者
一般空调的遥控发射,我猜就是这种协议吧,要不怎么实现双向通信

使用特权

评论回复
7
huangcunxiake|  楼主 | 2016-8-6 10:34 | 只看该作者


TX_FIFO
发送用一个15字节的FIFO做缓存来降低向CPU申请的中断数量.
RX_FIFO
接收用一个15字节(每个字节加3个比特的错误比特)的FIFO做缓存来降低向CPU申请的中断数量.
TX移位寄存器
此模块控制移动正在发送的数据串行输出.
RX移位寄存器
此模块控制移动正在接收的数据串行输入.
Modem控制寄存器
该寄存器控制与MODEM 或者数据传输转换器(或者一个MODEM模拟器)的接口.
波特率发生器
将外部时钟除以一个除数来获得需要的波特率时钟,参考波特率方程.
IrDA 编码
IrDA 编码控制模块.
IrDA 解码
IrDA 解码控制模块.
控制和状态寄存器
该域是用于发送器和接收器的寄存器组, 包括 FIFO 控制寄存器 (UA_FCR), FIFO 状态寄存器
(UA_FSR), 和线控制寄存器 (UA_LCR)。时间溢出控制寄存器 (UA_TOR) 应用于标识时间溢出中断产
生的条件. 该寄存器组还包括中断控制使能寄存器 (UA_IER) 和中断状态寄存器 (UA_ISR) 来使能或者禁
用中断响应并且识别发生的中断. 有7种中断: FIFO为空中断( INT_THRE),接收阀值到达中断
( INT_RDA),线状态中断 (校验错误,帧错误和打断中断)( INT_RLS) , 定时溢出中断
( INT_Tout), MODEM/唤醒状态中断( INT_Modem)和缓冲错误中断( INT_Buf_Err)

使用特权

评论回复
8
huangcunxiake|  楼主 | 2016-8-6 10:39 | 只看该作者

IrDA 模式
UART 支持 IrDA SIR (串行红外) 发送编码 和接收解码, IrDA 模式通过设定 UA_FUN_SEL 寄存器的
IrDA_EN 位被选择.
IrDA 模式下, UA_BAUD[DIV_X_EN] 位需禁用.
波特率 = Clock / (16 * BRD), BRD 为UA_BAUD 寄存器中的波特率分频器.
图6.10-4为IrDA 控制框图


使用特权

评论回复
9
huangcunxiake|  楼主 | 2016-8-6 10:45 | 只看该作者
IrDA SIR发送编码器
IrDA SIR发送编码器以非归零(NRZ) 调制方式从 UART 输出比特流。 . IrDA SIR 物理层指定使用归零,
反向 (RZI) 调制方式,使用逻辑0代表红外线脉冲。被调制的输出脉冲流被发送到外部输出驱动器和红
外发射二极管
在正常模式下, 传输脉冲的宽度为 3/16 波特率周期

IrDA SIR接收解码器
IrDA SIR 接收解码器以归零return-to-zero方式解调由输入探测器输入的比特流,并输出 NRZ比特流到
UART 作为数据输入. 解码器在空闲模式输入通常为高。 (因此, IRCR bit 6 默认设定为高)
当解码器输入为低时,起始位将被检测到。

IrDA SIR操作
IrDA SIR 编码/解码器提供UART数据流和半双工串行SIR接口间互相转换的功能。 . 图6.10-15是IrDA编
码/解码器波形图


使用特权

评论回复
10
huangcunxiake|  楼主 | 2016-8-6 10:47 | 只看该作者
RS-485 模式
UART 支持RS-485 9位模式. RS-485模式通过设置UA_FUN_SEL寄存器选择RS-485功能设定。使用来
自异步串行口的RTS控制信号来使能RS-485驱动器,执行RS-485驱动器控制。在RS-485模式下, RX
与TX的许多特性与UART相同。
RS-485 模式下,控制器可以配置成可寻址的RS-485从机, RS-485主机发送器将通过设置校验位 (第9
位)为1来识别一个地址字符。对于数据字符,校验位设置为0. 软件可通过设置寄存器UA_LCR 控制第9
位 (PBE , EPE 和 SPE置位, 第9位发送0 , PBE 和 SPE 置位, EPE清零, 第9位发送1). 该控制器支持三
种操作模式: RS-485 普通多点模式(NMM), RS-485 自动地址识别模式 (AAD) 和RS-485 自动方向控制
模式(AUD), 可通过编程UA_RS-485_CSR寄存器选择其中一种工作模式, 通过设置UA_TOR [DLY] 可以
设置上一个停止位与下一个开始位之间的延迟时间.
RS-485 普通多点模式 (NMM)
RS-485 普通多点模式, 首先必须软件配置在地址位之前检测到的数据是否存储于RX-FIFO中。如果想软
件忽略地址位之前检测到的所有数据,则接下来是设置UART_FCR[RS485_RX_DIS]和使能UA_RS-
485[RS485_NMM],这样,接收器忽略所有数据直至检测到地址字节( bit9=1)并将地址字节数据存储
于 RX-FIFO 中 。 如 果 想 软 件 接 收 检 测 到 地 址 位 之 前 的 所 有 数 据 , 接 下 来 就 是 禁 止 UART_FCR
[RS485_RX_DIS]和使能UA_RS-485[RS485_NMM],这样,接收器就会接收所有数据。如果检测到地
址位, RS-485控制器会向CPU产生一个中断,软件可通过设定UA_RS-485_FCR [RX_DIS]来决定是否
使能接收器来接收接下来的数据字节。如果使能接收器接收,所有接收的数据都将被接收并存储于RXFIFO中,如果禁用接收器,则接收到的所有数据都将被忽略直至下一个地址位被检测到。若软件设置
UA_RS-485禁用接收器, 当检测到下一个地址字节,控制器清UA_RS-485_FCR [RX_DIS]位,地址字节
数据存储到RX-FIFO.
RS-485 自动地址识别模式 (AAD)
RS-485自动地址识别模式下, 接收器在检测到地址字节( bit9=1)并且地址字节数据与UA_ALT_CSR
[ADDR_MATCH]的值相匹配之前,忽略所有数据. 地址字节数据将被存储在RX-FIFO. 所有接收字节数
据将被接受,并存储于RX-FIFO 直到地址字节不匹配UA_ALT_CSR [ADDR_MATCH] 的值为止.
RS-485 自动方向模式 (AUD)
RS-485控制器的另一个功能是自动方向控制. 使用来自异步串行口的RTS控制信号来使能RS-485驱动
器,执行RS-485驱动器控制. RTS线被连接到RS-485驱动器使能,以便设置RTS线为高(逻辑1)使能
RS-485 驱动器. 设置RTS为低(逻辑0),使驱动器进入tri-state状态. 用户通过设置寄存器UA_MCR 中
的LEV_RTS位改变 RTS 驱动电平.
编程流程示例:
1. 设置寄存器UA_FUN_SEL中的FUN_SEL位选择RS-485功能.
2. 设置寄存器UA_FCR 中的RX_DIS 位使能或禁用RS-485 接收器
3. 设置RS-485_NMM 或 RS-485_AAD 模式.
4. 如果选择RS-485_AAD 模式, ADDR_MATCH设置成自动地址匹配值.
5. 设置RS-485_AUD选择自动方向控制.

使用特权

评论回复
11
huangcunxiake|  楼主 | 2016-8-6 10:48 | 只看该作者



使用特权

评论回复
12
huangcunxiake|  楼主 | 2016-8-6 10:51 | 只看该作者


使用特权

评论回复
13
huangcunxiake|  楼主 | 2016-8-6 10:52 | 只看该作者
虽然小小的串口很常用,其实很复杂,想要精通的掌握住,还需要多多的学习也练习。

使用特权

评论回复
14
zhuotuzi| | 2016-8-6 13:52 | 只看该作者
IrDA SIR模块包括一个IrDA SIR协议编码/解码器.

使用特权

评论回复
15
zhuomuniao110| | 2016-8-6 22:49 | 只看该作者
UART0~1内嵌一个15字节发送FIFO (TX_FIFO) 和一个15字节接收 FIFO (RX_FIFO)。

使用特权

评论回复
16
捉虫天师| | 2016-8-7 13:37 | 只看该作者
波特率公式是 Baud Rate = UART_CLK / M * [BRD + 2].

使用特权

评论回复
17
734774645| | 2016-8-7 18:42 | 只看该作者
/****************************************************************************
* [url=home.php?mod=space&uid=288409]@file[/url]     main.c
* [url=home.php?mod=space&uid=895143]@version[/url]  V1.00
* $Revision: 7 $
* $Date: 14/01/28 11:45a $
* [url=home.php?mod=space&uid=247401]@brief[/url]    M051 Series UART Interface Controller Driver Sample Code
*
* @note
* Copyright (C) 2011 Nuvoton Technology Corp. All rights reserved.
*
******************************************************************************/
#include <stdio.h>
#include "M051Series.h"


#define PLL_CLOCK           50000000

#define RXBUFSIZE 1024


/*---------------------------------------------------------------------------------------------------------*/
/* Define functions prototype                                                                              */
/*---------------------------------------------------------------------------------------------------------*/
extern char GetChar(void);
int32_t main(void);
void AutoFlow_FunctionTxTest(void);


void SYS_Init(void)
{
    /*---------------------------------------------------------------------------------------------------------*/
    /* Init System Clock                                                                                       */
    /*---------------------------------------------------------------------------------------------------------*/

    /* Enable Internal RC 22.1184MHz clock */
    CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);

    /* Waiting for Internal RC clock ready */
    CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);

    /* Switch HCLK clock source to Internal RC and HCLK source divide 1 */
    CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC, CLK_CLKDIV_HCLK(1));

    /* Enable external XTAL 12MHz clock */
    CLK_EnableXtalRC(CLK_PWRCON_XTL12M_EN_Msk);

    /* Waiting for external XTAL clock ready */
    CLK_WaitClockReady(CLK_CLKSTATUS_XTL12M_STB_Msk);

    /* Set core clock as PLL_CLOCK from PLL */
    CLK_SetCoreClock(PLL_CLOCK);

    /* Enable UART module clock */
    CLK_EnableModuleClock(UART0_MODULE);
    CLK_EnableModuleClock(UART1_MODULE);

    /* Select UART module clock source */
    CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_HXT, CLK_CLKDIV_UART(1));
    CLK_SetModuleClock(UART1_MODULE, CLK_CLKSEL1_UART_S_HXT, CLK_CLKDIV_UART(1));

    /*---------------------------------------------------------------------------------------------------------*/
    /* Init I/O Multi-function                                                                                 */
    /*---------------------------------------------------------------------------------------------------------*/

    /* Set P3 multi-function pins for UART0 RXD and TXD */
    SYS->P3_MFP &= ~(SYS_MFP_P30_Msk | SYS_MFP_P31_Msk);
    SYS->P3_MFP |= (SYS_MFP_P30_RXD0 | SYS_MFP_P31_TXD0);

    /* Set P1 multi-function pins for UART1 RXD and TXD */
    SYS->P1_MFP &= ~(SYS_MFP_P12_Msk | SYS_MFP_P13_Msk);
    SYS->P1_MFP |= (SYS_MFP_P12_RXD1 | SYS_MFP_P13_TXD1);

    /* Set P0 multi-function pins for UART1 CTS */
    SYS->P0_MFP = SYS->P0_MFP & (~SYS_MFP_P00_Msk) | SYS_MFP_P00_CTS1;

}

void UART0_Init()
{
    /*---------------------------------------------------------------------------------------------------------*/
    /* Init UART                                                                                               */
    /*---------------------------------------------------------------------------------------------------------*/
    /* Reset UART0 module */
    SYS_ResetModule(UART0_RST);

    /* Configure UART0 and set UART0 Baudrate */
    UART_Open(UART0, 115200);
}

void UART1_Init()
{
    /*---------------------------------------------------------------------------------------------------------*/
    /* Init UART                                                                                               */
    /*---------------------------------------------------------------------------------------------------------*/
    /* Reset UART1 module */
    SYS_ResetModule(UART1_RST);

    /* Configure UART1 and set UART1 Baudrate */
    UART_Open(UART1, 115200);
}

/*---------------------------------------------------------------------------------------------------------*/
/* MAIN function                                                                                           */
/*---------------------------------------------------------------------------------------------------------*/

int main(void)
{

    /* Unlock protected registers */
    SYS_UnlockReg();

    /* Init System, IP clock and multi-function I/O */
    SYS_Init();

    /* Lock protected registers */
    SYS_LockReg();

    /* Init UART0 for printf */
    UART0_Init();

    /* Init UART1 for testing */
    UART1_Init();

    /*---------------------------------------------------------------------------------------------------------*/
    /* SAMPLE CODE                                                                                             */
    /*---------------------------------------------------------------------------------------------------------*/

    printf("\n\nCPU [url=home.php?mod=space&uid=72445]@[/url] %dHz\n", SystemCoreClock);

    printf("\n\nUART Sample Program\n");

    /* UART auto flow sample master function */
    AutoFlow_FunctionTxTest();

    while(1);

}

/*---------------------------------------------------------------------------------------------------------*/
/*  AutoFlow Function Tx Test                                                                                 */
/*---------------------------------------------------------------------------------------------------------*/
void AutoFlow_FunctionTxTest()
{
    uint32_t u32i;

    printf("\n");
    printf("+-----------------------------------------------------------+\n");
    printf("|     Pin Configure                                         |\n");
    printf("+-----------------------------------------------------------+\n");
    printf("|    _______                                    _______     |\n");
    printf("|   |       |                                  |       |    |\n");
    printf("|   |Master |---TXD1(P1.3) <====> RXD1(P1.2)---| Slave |    |\n");
    printf("|   |       |---CTS1(P0.0) <====> RTS1(P0.1)---|       |    |\n");
    printf("|   |_______|                                  |_______|    |\n");
    printf("|                                                           |\n");
    printf("+-----------------------------------------------------------+\n");

    printf("\n");
    printf("+-----------------------------------------------------------+\n");
    printf("|       AutoFlow Function Test (Master)                     |\n");
    printf("+-----------------------------------------------------------+\n");
    printf("|  Description :                                            |\n");
    printf("|    The sample code needs two boards. One is Master and    |\n");
    printf("|    the other is slave. Master will send 1k bytes data     |\n");
    printf("|    to slave.Slave will check if received data is correct  |\n");
    printf("|    after getting 1k bytes data.                           |\n");
    printf("|    Press any key to start...                              |\n");
    printf("+-----------------------------------------------------------+\n");
    GetChar();

    /* Enable RTS and CTS autoflow control */
    UART_EnableFlowCtrl(UART1);

    /* Send 1k bytes data */
    for(u32i = 0; u32i < RXBUFSIZE; u32i++)
    {
        /* Send 1 byte data */
        UART_WRITE(UART1, u32i & 0xFF);

        /* Wait if Tx FIFO is full */
        while(UART_IS_TX_FULL(UART1));
    }

    printf("\n Transmit Done\n");

}


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

205

主题

3485

帖子

10

粉丝