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两个源文件中,下面把部分代码帖出来,完整部分请参阅附件:

1uart.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
******************************************************************************/

2main.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. Cortex-M3学习日志(六) -- ADC实验

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

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

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

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

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

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

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

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

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

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

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

  7. leveldb 学习记录(四)Log文件

    前文记录 leveldb 学习记录(一) skiplistleveldb 学习记录(二) Sliceleveldb 学习记录(三) MemTable 与 Immutable Memtablelevel ...

  8. ARM 架构、ARM7、ARM9、STM32、Cortex M3 M4 、51、AVR 之间有什么区别和联系?(转载自知乎)

    ARM架构:  由英国ARM公司设计的一系列32位的RISC微处理器架构总称,现有ARMv1~ARMv8种类. ARM7:       一类采用ARMv3或ARMv4架构的,使用冯诺依曼结构的内核. ...

  9. Unity3d-Particle System 5.x系统的学习(四)

    Unity3d-Particle System 5.x系统的学习(四) 今天,我们来聊聊unity5.x的粒子系统和unity4.x粒子系统的区别. 我大致看了下,区别还是蛮多的,但是总体的粒子制作思 ...

  10. Git 学习(四)操作修改和版本穿梭

    Git 学习(四)操作修改和版本穿梭 之前的章节,已介绍了本地Git库创建.暂存区增.删.改,以及提交版本库:可回顾下命令操作: git add 和 git commit. 光有之前章节的操作,Git ...

随机推荐

  1. Elong App 性能测试分享

    个人简介: 测试老鸟,曾做过6年的测试以及2年的大数据开发:曾就职于伟景行.高德(大数据开发):钟情于钻研开源测试框架:目前挂单于艺龙. 有对本主题感兴趣的同学,可以加我Q私信(305285925): ...

  2. Java核心技术点之动态代理

    本篇博文会从代理的概念出发,介绍Java中动态代理技术的使用,并进一步探索它的实现原理.由于个人水平有限,叙述中难免出现不清晰或是不准确的地方,希望大家可以指正,谢谢大家:) 一.概述 1. 什么是代 ...

  3. SQL迁移到ORACLE实例

    nohup ./command.sh > output 2>&1 & SQL迁移到ORACLE实例 日常运维中,我们经常会有数据库不同类型的迁移,比较多的就是从sql se ...

  4. Redhat6.x下如何进行远程安装虚拟机

    远程主机IP:192.168.122.1 远程主机名:server1.example.com 本地主机IP:192.168.122.2 本地主机名:server2.example.com 1.登录到远 ...

  5. Hadoop学习笔记2---配置详解

    配置系统是复杂软件必不可少的一部分,而Hadoop配置信息处理是学习Hadoop源代码的一个很好的起点.现在就从Hadoop的配置文件谈起. 一.Hadoop配置格式 Hadoop配置文件格式如下所示 ...

  6. Python3.5入门学习记录-函数

    Python 函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也 ...

  7. 阿里笔试js题

    有一个数组,其中保存的都是小写英文字符串,现在要把它按照除了第一个字母外的字符的字典顺序(字典顺序就是按首字母从a-z顺序排列,如果首字母相同则按第二个字母……)排序,请编写代码: 例:[" ...

  8. Docker学习笔记 - Docker的仓库

  9. pm2自动部署

    配置pm2自动部署前,请确保已经能够ssh免密登录服务器. 一.创建ecosystem.json { "apps" : [{ "name" : "HT ...

  10. SpringBoot整合Freemarker+Mybatis

    开发工具 , 开始 新建工程 .选择Spring Initializr 下一步 下一步,选择需要的组件 ..改一下工程名,Finish ..目录结构 首先,修改pom文件 然后,将applicatio ...