LPC1768含有4 个符合16C550工业标准的异步串口UATR0-UART3,其中UART1具有标准的MODEM接口和RS-485/EIA-485接口模式。串口通讯接口是连接计算机、终端、通讯控制器等设备之间的物理接口。它实行的最成功的标准是RS232。至于RS232的标准是什么样的,这里不在总结了,如果哪位有兴趣可以上网查一下维基百科。RS-485是后期出现的一个传输标准,关于它们的特性,下面列表总结一下:

RS-232特性

RS-485特性

最高速率约为20kb/s

与TTL电平兼容

传输最大距离约为15m

传输距离实际达1200m

共模抑制比能力差

共模抑制比能力强

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源文件

/*********************************************************************************
 文件名称:uart.c
 功    能: 与串口相关的一些函数
 编译环境: MDKV4.12
 时    钟: 外部12Mhz
 日    期: 11/08/19
 作    者: 懒猫爱飞
 备    注:NULL
 ---------------------------------------------------------------------------------
 修改内容:NULL
 修改日期:XXXX年xx月xx日      xx时xx分
 修改人员:xxx xxx xxx

**********************************************************************************/
#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;

   )
  {
    PINCON->PINSEL0 |= ( << );             /* Pin P0.2 -- TXD0 (Com0) */
    PINCON->PINSEL0 |= ( << );             /* Pin P0.3 -- RXD0 (Com0) */

      UART0->LCR  = 0x83;                       /* 8 bits, 无校验, 1 个停止位 */
    Fdiv = (SystemFrequency// ) / baudrate;/* 设置波特率 */
    UART0->DLM  = Fdiv / ;
    UART0->DLL  = Fdiv % +;
    UART0->LCR  = 0x03;                       /* 锁定波特率  */
    UART0->FCR  = 0x07;                       /* 串口先进先出控制寄存器设置*/

  }
   )
  {
    PINCON->PINSEL4 |= (<<);                /* Pin P2.0 -- TXD1 (Com1)*/
       PINCON->PINSEL4 |= (<<);                /* Pin P2.1 -- RXD1 (Com1)*/

    UART1->LCR = 0x83;                          /* 8 bits, 无校验, 1 个停止位 */
    Fdiv = (SystemFrequency//)/ baudrate ; /* 设置波特, Fpclk: 18MHz */
    UART1->DLM = Fdiv/;
    UART1->DLL = (Fdiv%)+;
    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 )
{
   )
  {
     )
    {
      while ( !(UART0->LSR & 0x20) );     /* 检测串口状态,是否包含有效数据 */
      UART0->THR = *BufferPtr;           /* 输出数据 */
      BufferPtr++;                       /* 指向下一个数据 */
      Length--;                          /*  数据长度减1 */
    }

  }
  else
  {
     )
    {
      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++);
    }
}
/******************************************************************************
**                            End Of File
******************************************************************************/

(2)main.c源文件

 /*********************************************************************************
 工程名称:lesson4
 功    能: 学习使用LPC1768的串口通讯
 编译环境: MDKV4.12
 时    钟: 外部12Mhz
 日    期: 11/08/19
 作    者: 懒猫爱飞
 版本  号:V1R0
 ---------------------------------------------------------------------------------
 修改内容:NULL
 修改日期:
 修改人员:
 ---------------------------------------------------------------------------------

**********************************************************************************/

/*********************************************************************************
 文件名称:mian.c
 功    能: 主要调度函数及应用函数
 编译环境: MDKV4.12
 时    钟: 外部12Mhz
 日    期: 11/08/19
 作    者: 懒猫爱飞
 备    注:NULL
 ---------------------------------------------------------------------------------
 修改内容:NULL
 修改日期:XXXX年xx月xx日      xx时xx分
 修改人员:xxx xxx xxx

**********************************************************************************/
#include"includes.h"

volatile unsigned long SysTickCnt;                   /* 用于系统时钟计数 */

unsigned char LedOnMeg[] = "Led 1 On!\r\n";
unsigned char LedOffMeg[] = "Led all Off!\r\n";
unsigned char KeyMeg[] = "key push down \r\n";
unsigned ] = {
                                "**********************************************\r\n",
                                "****             --欢迎光临--             ****\r\n",
                                "**** 小野兽的小草窝^_^                    ****\r\n",
                                "**** http://blog.ednchina.com/ytfdhb/     ****\r\n",
                                "**** 我是懒猫爱飞,我的口号是:           ****\r\n",
                                "**** 每天进步一点点,开心多一点^_^        ****\r\n",
                                "**********************************************\r\n"
                                };

unsigned ;              /* 按键状态 */
unsigned ;               /* 按键当前状态值 */
unsigned ;               /* 按键前一个状态值 */
unsigned ;

unsigned ;        /* 状态计数 */

/********************************************************************************
 * 函数名称 :void SysTick_Handler (void)
 * 函数功能 : 系统节拍定时器中断函数,每1ms计数一次
 * 入口参数 : 无
 * 出口参数 : 无
 * 备    注 :无
 *******************************************************************************/
void SysTick_Handler (void)
{
  SysTickCnt++;
}

/********************************************************************************
 * 函数名称 :void Delay (unsigned long tick)
 * 函数功能 : 毫秒级延时函数
 * 入口参数 : unsigned long tick -- 延时时长
 * 出口参数 : 无
 * 备    注 :无
 *******************************************************************************/
void DelayMs (unsigned long tick)
{
  unsigned long systickcnt;

  systickcnt = SysTickCnt;
  while ((SysTickCnt - systickcnt) < tick);
}
/********************************************************************************
 * 函数名称 :void PortInit(void)
 * 函数功能 : 端口初始化
 * 入口参数 : 无
 * 出口参数 : 无
 * 备    注 :无
 *******************************************************************************/
void PortInit(void)
{
   GPIO1->FIODIR = 0xB0000000;           /* LEDs on PORT1 defined as Output    */
   GPIO2->FIODIR = 0x0000007C;           /* LEDs on PORT2 defined as Output    */
   LedAllOff();                             /* 初始化时熄灭所有的灯 */
}

/********************************************************************************
 * 函数名称 :void KeyScan(void)
 * 函数功能 : 按键扫描
 * 入口参数 : 无
 * 出口参数 : 无
 * 备    注 :现在只扫描一个按键
 *******************************************************************************/
void KeyScan()
{
    key_pre = KEY_EN ;
    if(!KEY_EN )                      /* 如果按键按下 */
    {
        if(key_old)
        {
            )         /* 下降沿有效 */
            {
             key_sta = ;            /* 记录按键状态 */
            }
        }
    }
    key_old = key_pre;
}

/********************************************************************************
 * 函数名称 :void KeyHandle(void)
 * 函数功能 : 按键处理函数
 * 入口参数 : 无
 * 出口参数 : 无
 * 备    注 :无
 *******************************************************************************/
void KeyHandle(void)
{
    )
    {
        StepCnt++;                        /* 执行下一步*/
        )
        {
            UART0_SendString (LedOffMeg); /* 显示LED状态信息 */
        }
         )
        {
            LedOnMeg[] = StepCnt+0x30;       /* 转换成字符 */
            UART0_SendString (LedOnMeg);      /* 显示LED状态信息 */
        }
        key_sta = ;                     /* 按键状态清零,保证只执行一次 */
    }
}
void LedHandle()
{
    switch(StepCnt)
    {
        :Led1On();   /* LED1 点亮*/
               break;
        :Led2On();   /* LED2 点亮*/
               break;
        :Led3On();   /* LED3 点亮*/
               break;
        :Led4On();   /* LED4 点亮*/
               break;
        :Led5On();   /* LED5 点亮*/
               break;
        :Led6On();   /* LED6 点亮*/
               break;
        :Led7On();   /* LED7 点亮*/
               break;
        :Led8On();   /* LED8 点亮*/
               break;
        :LedAllOff();    /* 熄灭所有的LED灯*/
               StepCnt = ;    /* 重新开始 */
               break;
        default:break;
    }
}

/********************************************************************************
 * 函数名称 :int main(void)
 * 函数功能 : 主函数
 * 入口参数 : 无
 * 出口参数 : 无
 * 备    注 :无
 *******************************************************************************/
int main(void)
{
    unsigned ;
    SystemInit();       /* 系统初始化,函数在system_LPC17xx.c文件夹中定义 */
    SysTick_Config(SystemFrequency/ - );/* 配置节拍定时器中断,每1ms中断一次 */ 

    PortInit();                              /* 端口初始化 */

    UARTInit(,);                         /* 设置串口0波特率 */
    ;i<;i++)
    {
        UARTSend(,OpenString[i],);        /* 发送欢迎信息 */
    }
//LedOnMeg[4] = 4+0x30;                    /* 转换成字符 */
//UART0_SendString (KeyMeg);
    )
    {
      KeyScan();   // 按键扫描
      KeyHandle(); // 按键处理
      LedHandle(); // Led处理程序
    }
}

程序不是太难,只是简单的实验,各个部分都有详细的注释,这里不在总结,下面是挨靠结果串口调试助手截图:


图 1-2 串口助手截图

好了,先总结到这吧,最近手头上的事有点多,所以写日志的时间就有点紧张,不过,工作归工作,该学习的东东还是要坚持学习的,没有足够的时间,那就见缝插针的学吧。最后再来吼一下懒猫的口号,来鼓励一下自己:

Cortex-M3学习日志(四) -- UART0实验的更多相关文章

  1. stm32和cortex M3学习内核简单总结

    1.stm32综述 2.寄存器组 3.操作模式和特权级别 4.存储器映射 5.中断和异常 6.其他 Stm32综述 这可以说是我第一款认真学习的单片机了,学完这个就要开启我通往arm9的大门了,接下来 ...

  2. springmvc学习日志四

    一.回顾 1.文件上传 1.1引入fileupload的jar包 1.2在springmvc的配置文件中引入CommonsMutilpartResolver文件上传解析器 1.3在控制层在写入代码 2 ...

  3. spring学习日志四

    一.spring对JDBC的支持 JdbcTemplate 简介 为了使 JDBC 更加易于使用, Spring 在 JDBC API 上定义了一个抽象层, 以此建立一个 JDBC 存取框架. 作为 ...

  4. Cortex-M3学习日志(六) -- ADC实验

    上一次简单的总结了一下DAC方面的知识,好吧,这次再来总结一下ADC方面的东东.ADC即Analog-to-Digital Converter的缩写,指模/数转换器或者模拟/数字转换器.现实世界是由模 ...

  5. STM32学习之路入门篇之指令集及cortex——m3的存储系统

    STM32学习之路入门篇之指令集及cortex——m3的存储系统 一.汇编语言基础 一).汇编语言:基本语法 1.汇编指令最典型的书写模式: 标号 操作码        操作数1, 操作数2,... ...

  6. Cortex-M3学习日志(五) -- DAC实验

    终于逮了个忙里偷闲的机会,就再学一下LPC1768的外围功能吧,循序渐进是学习的基本规则,也许LPC1768的DAC与8位单片机16位单片机里面集成的DAC操作类似,但是既然这是懒猫的学习日志,就顺便 ...

  7. 第六周学习总结&第四次实验报告

    第六周学习总结&第四次实验报告 学习总结 这周我们简单的学习了一点点关于接口的内容,接口是Java中最重要的概念之一,接口可以理解为一个特殊的类, 里面由全局常量和公共的抽象方法组成,接口摆脱 ...

  8. 从零开始学习jQuery (四) 使用jQuery操作元素的属性与样式

    本系列文章导航 从零开始学习jQuery (四) 使用jQuery操作元素的属性与样式 一.摘要 本篇文章讲解如何使用jQuery获取和操作元素的属性和CSS样式. 其中DOM属性和元素属性的区分值得 ...

  9. java之jvm学习笔记四(安全管理器)

    java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...

  10. 南京邮电大学java第四次实验报告

    实 验 报 告 ( 2017 / 2018学年 第2学期) 课程名称 JAVA语言程序设计 实验名称 Java集成开发环境的安装与使用. Java变量.表达式与控制结构 实验时间 2018 年 6 月 ...

随机推荐

  1. oracle中的初始化参数文件

    oracle初始化参数文件管理 oracle实例是指运行状态下的oracle软件,是由内存结构跟一些进程结构组成的,主要实现数据库的访问跟控制功能,是oracle的核心. 初始化参数文件是oracle ...

  2. java web每天定时执行任务(四步轻松搞定)

    第一步: package com.eh.util; import java.util.Calendar; import java.util.Date; import java.util.Timer; ...

  3. sql server 2008 索引

    微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引.簇集索引)和非聚集索引(nonclustered index,也称非聚类索引.非簇集索引) 我们举例来 ...

  4. 限制TextBox输入,只能输入整数

    public class TextBoxInt : TextBox { public TextBoxInt() { KeyDown += TextBoxInt_KeyDown; TextChanged ...

  5. Mindjet 一打开鼠标就动不了解决方法

    在网上查找了一下相关资料,这个主要是Mindjet不支持64位系统造成的,其实就和Windows tablet pc input 这个服务相冲突造成的,临时的解决方法是,win+r (别告诉我你不知道 ...

  6. HttpHelps类,用来实现Http访问,Post或者Get方式的,直接访问,带Cookie的,带证书的等方式,可以设置代理

    原文地址:http://blog.csdn.net/cdefg198/article/details/8315438 万能框架:http://www.sufeinet.com/forum.php?mo ...

  7. ssh 应用

    SSH反向连接及Autossh ssh 隧道: http://www.cnblogs.com/robinyjj/archive/2008/11/02/1325018.html This guy wri ...

  8. opennebula extend(expending) auth module ldap

    LDAP Authentication addon permits users to have the same credentials as in LDAP, so effectively cent ...

  9. rootvg 镜像

    具体操作步骤如下 : a)        查看一下当前可用的硬盘: # lspv hdisk0          0002d74f0e69d97a                    rootvg ...

  10. 如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)

    看上去似乎任何已知的算法都无法做到,如果谁做到了,那么所有的排序方法:QuickSort,ShellSort,HeapSort,BubbleSort等等等等,都可以扔掉了,还要这些算法干吗阿,呵呵.不 ...