标题: Cortex-M3学习LPC1768 - UART0实验 [打印本页]
作者: xiongxiao 时间: 2015-5-27 19:22
标题: Cortex-M3学习LPC1768 - UART0实验
本帖最后由 xiongxiao 于 2015-5-27 19:25 编辑
LPC1768含有4 个符合16C550工业标准的异步串口UATR0-UART3,其中UART1具有标准的MODEM接口和RS232。至于RS232的标准是什么样的,这里不在总结了,如果哪位有兴趣可以上网查一下维基百科。RS-485是后期出现的一个传输标准,关于它们的特性,下面列表总结一下:
UATR0/2/3可以工作在UART模式下,也可以工作在IrDA模式下, IrDA是红外数据组织(Infrared Data Association)的简称,目前广泛采用的IrDA红外连接技术就是由该组织提出的。到目前为止,全球采用IrDA技术的设备超过了5000万部。IrDA已经制订出物理介质和 协议层规格,以及2个支持IrDA标准的设备可以相互监测对方并交换数据。 初始的IrDA1.0 标准制订了一个串行,半双工的同步系统,传输速率为2400bps到115200bps,传输范围1 m,传输半角度为15度到30度。最近IrDA扩展了其物理层规格使数据传输率提升到4Mbps。IrDA数据协议由物理层,链路接入层和链路管理层三个基本层协议组成,另外,为满足各层上的应用的需要,IrDA栈支持IrLAP, IrLMP, IrIAS, IrIAP, IrLPT, IrCOMM, IrOBEX和IrLAN等。IrDA的优点是成本低,体积小、功耗低,数据传输干扰小等。关于IrDA的协议与应用这里暂时先不总结,后续学习中会再慢慢涉及到,届时将做深入研究。UATR1具有MODEM接口,能过该接口可以接入电话网络,实现远距离通讯。至于怎么通讯,这里也暂时不总结,因为这一块懒猫也没有深入研究。
关于串口的配置主要涉及到引脚的配置,波特率的配置,帧格式的设置及FIFO设置等。涉及到的寄存器主要有接收缓冲寄存器,它包含即将读取的接收数据。发送保持寄存器,它主要是用来写入发送数据的,中断使能寄存器IER,若是用到中断接收或发送时需配置些寄存器,与之相关联的寄存器还有中断标志寄存器IIR。还有FIFO控制寄存器FCR,它是用来配置先进先出相关的东东的。线控制寄存器LCR,这个寄存器主要就是用来设置帧格式的,与这个寄存器相关联的寄存器是线状态寄存器LSR,用来读取帧格式状态的寄存器。当然还有缓存寄存器SCR,这个与串口操作关系不大。还有自动波特率控制器ACR,配置程序自适应波特率的。还有IrDA控制寄存器,它与红外发送与接收有关。小数分频寄存器FDR,它是波特率配置有关。传输使能寄存器TER,如果这个寄存器的TXEN配置为1,刚只要缓存中有有效数据,就可以通过发送引脚把数据发送出去。还有一个寄存器FIFO等级寄存器FIFOLVL,它是个只读寄存器,用来读取当前FIFO等级状态。此次实验我是用查询方式发送字符到串口,所以很大寄存器没有用到,关于寄存器的详细说明可以参考LPC1768的数据手册,这里就不再照搬手册了。下面简单说一下这次实验电路图,主要是一个 按键,8个LED灯,还有串口0,功能就是按一下按键亮一个灯,等全亮时,再按按键灯全来,然后再按按键时第按一下点亮一个,循环往复,同时哪个灯亮,就发送字符“Led X on”,下面是这次实验的电路图:
图 1-1 实验电路图
下面简单说一下这个软件,软件主要分为两大部分,一个是关于串口配置及常用的函数,另一个就是主LED点灯程序,分别在UART.C与MAIN.C两个源文件中,下面把部分代码帖出来,完整部分请参阅附件:
(1)、 uart.c源文件
#include "includes.h"
/********************************************************************************
* 函数名称 :uint32_t UARTInit( uint32_t PortNum, uint32_t baudrate )
* 函数功能 : 串口初始化
* 入口参数 : uint32_t PortNum -- 端口号(0、1)
* uint32_t baudrate -- 波物率
* 出口参数 : 返回真或假
* 备 注 :如果中断句柄没有建立在向量表中则返回false
*******************************************************************************/
void UARTInit( uint32_t PortNum, uint32_t baudrate )
{
uint32_t Fdiv;
if ( PortNum == 0 )
{
PINCON->PINSEL0 |= (1 << 4); /* Pin P0.2 -- TXD0 (Com0) */
PINCON->PINSEL0 |= (1 << 6); /* Pin P0.3 -- RXD0 (Com0) */
UART0->LCR = 0x83; /* 8 bits, 无校验, 1 个停止位 */
Fdiv = (SystemFrequency/4/ 16) / baudrate;/* 设置波特率 */
UART0->DLM = Fdiv / 256;
UART0->DLL = Fdiv % 256+1;
UART0->LCR = 0x03; /* 锁定波特率 */
UART0->FCR = 0x07; /* 串口先进先出控制寄存器设置*/
}
else if ( PortNum == 1 )
{
PINCON->PINSEL4 |= (1<<1); /* Pin P2.0 -- TXD1 (Com1)*/
PINCON->PINSEL4 |= (1<<3); /* Pin P2.1 -- RXD1 (Com1)*/
UART1->LCR = 0x83; /* 8 bits, 无校验, 1 个停止位 */
Fdiv = (SystemFrequency/4/16)/ baudrate ; /* 设置波特, Fpclk: 18MHz */
UART1->DLM = Fdiv/256;
UART1->DLL = (Fdiv%256)+1;
UART1->LCR = 0x03; /* DLAB = 0 */
UART1->FCR = 0x07; /* 使能TX与 RX 并初始化FIFO. */
}
}
/********************************************************************************
* 函数名称 :void UARTSend( uint32_t portNum, uint8_t *BufferPtr, uint32_t Length )
* 函数功能 : 从串口发送一串数据
* 入口参数 : uint32_t PortNum -- 端口号(0、1)
* uint8_t *BufferPtr -- 缓冲指针
* uint32_t Length -- 数据长度
* 出口参数 : 无
* 备 注 :无
*******************************************************************************/
void UARTSend( uint32_t portNum, uint8_t *BufferPtr, uint32_t Length )
{
if ( portNum == 0 )
{
while ( Length != 0 )
{
while ( !(UART0->LSR & 0x20) ); /* 检测串口状态,是否包含有效数据 */
UART0->THR = *BufferPtr; /* 输出数据 */
BufferPtr++; /* 指向下一个数据 */
Length--; /* 数据长度减1 */
}
}
else
{
while ( Length != 0 )
{
while ( !(UART1->LSR & 0x20)); /* 检测串口状态,是否包含有效数据 */
UART1->THR = *BufferPtr; /* 输出数据 */
BufferPtr++; /* 指向下一个数据 */
Length--; /* 数据长度减1 */
}
}
return;
}
/********************************************************************************
* 函数名称 :int UART0_SendByte (int ucData)
* 函数功能 : 串口0发送数据
* 入口参数 : int ucData - 要发送的数据
* 出口参数 : 无
* 备 注 :无
*******************************************************************************/
int UART0_SendByte (int ucData)
{
while (!(UART0->LSR & 0x20));
return (UART0->THR = ucData);
}
/********************************************************************************
* 函数名称 :void UART0_SendString (unsigned char *s)
* 函数功能 : 串口0发送字符串
* 入口参数 : unsigned char *s -- 要发送的字符串
* 出口参数 : 无
* 备 注 :无
*******************************************************************************/
void UART0_SendString (unsigned char *s)
{
while (*s != '\0')
{
UART0_SendByte(*s++);
}
}
(2)、 main.c源文件
程序不是太难,只是简单的实验,各个部分都有详细的注释,这里不在总结,下面是挨靠结果串口调试助手截图:

图 1-2 串口助手截图好了,先总结到这吧,最近手头上的事有点多,所以写日志的时间就有点紧张,不过,工作归工作,该学习的东东还是要坚持学习的,没有足够的时间,那就见缝插针的学吧。最后再来吼一下懒猫的口号,来鼓励一下自己:每天进步一点点,开心多一点^_^
完整程序源代码工程文件下载地址:
SW.rar
(188.86 KB, 下载次数: 83)
作者: 苏荷风 时间: 2015-7-4 16:21
这个非常有用啊,感谢楼主。
作者: 骞子 时间: 2015-10-26 21:48
哈哈 不错不错 学习下
作者: 菟丝子 时间: 2015-10-28 17:14
新手真在整这个
作者: m4416202 时间: 2016-2-20 10:08
多谢楼主,下来看看,多谢多谢
作者: 马小马 时间: 2016-5-26 21:16
楼主能不能给我发一份呢?840515756@qq.com
作者: w1332433263 时间: 2016-6-22 15:32
楼主 能不能发给我一份
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |