在工作中经常将平台的串口和PC机连接,通过串口打印信息进行程序调试。LPC1788共有5个串口Uart0~Uart4,根据开发板的资源,将使用Uart2进行简单的串口输出和输入中断的操作。开发板上使用74HC4052多路开关对UART2的RXD和TXD进行选择,使用SP3243E进行3.0V到5.5V的RS-232电平转换。查看手册配置好相关的跳线帽,保证DB口上的串口输出采用的是Uart2。

下面介绍Uart相关系统配置和Uart模块的配置。Uart的时钟采用PCLK,我们配置系统的CCLK为120M,PCLK为60M,后面设置串口的波特率就采用PLCK进行计算。要使用串口2的功能需要使能系统时钟控制PCONP,以及配置GPIO管脚为Uart2的RXD和TXD功能。要实现通信,我们需要设置数据的格式,包括传输的波特率,数据长度,停止位,以及校验等,这些数据在线性控制寄存器UnLCR中控制。波特率的产生需要经过分数波特率分频器UnFDR和主分频器DLL,DLM。计数公式如下图。

根据计算,当PLCK=60M,波特率为115200,数据位为8,停止位为1,无校验,则DLL = 22, DLM =0, DivAddVal =1, MulVal = 2 ,线性控制寄存器中的值为0x3。

要通过串口发送数据时,只需要把要发送的数据写入发送保持寄存器UnTHR,系统就会通过移位寄存器将数据通过串口发送。为了了解系统的发送状态,还需要线性状态寄存器UnLSR,例如程序中使用该该寄存器的第5位判断发怂保持寄存器是否为空,防止数据溢出。

如果需要进行串口的中断操作,还需要对串口中断进行配置,如串口中断使能寄存器UnIER和串口中断标识寄存器UnIIR。程序中使用到了串口2的接收中断,为此在中断使能设置寄存器ISER中使能UART2中断,在串口中断使能寄存器UnIER中使能串口的接收中断,该中断同时使能了字符接收超时中断。UART2的RXD管脚接收到数据将存放在FIFO中,程序中配置接收FIFO的触发条件为1个字节,即有接收到数据就触发。中断触发后,我们可以根据中断标识寄存器UnIIR判断到底是串口的接收中断,超时中断,发送中断等。进入中断以后,接收中断和超时中断,都可以通过读取接收缓存寄存器UnRBR进行中断复位,使下次中断可以发生。

下面的程序例子,程序开始打印菜单,PC串口软件发送一个字节数据给开发板,开发板接收到数据后将读取UnRBR前后的中断标识寄存器IIR的值,以及接收到的值发送回给PC。如果是0x5a或者0xa5还可以打开或者关闭LED指示灯。

#define CCLK     120000000
#define PCLK         60000000#define rFIO1DIR   (*(volatile unsigned*)(0x20098020))
#define rFIO1MASK   (*(volatile unsigned*)(0x20098030))
#define rFIO1PIN    (*(volatile unsigned*)(0x20098034))
#define rFIO1SET    (*(volatile unsigned*)(0x20098038))
#define rFIO1CLR    (*(volatile unsigned*)(0x2009803c))#define rISER0   (*(volatile unsigned*)(0xE000E100))#define rCLKSRCSEL  (*(volatile unsigned *)(0x400FC10C))     //时钟源选择寄存器
#define rPLL0CON    (*(volatile unsigned *)(0x400FC080))     //PLL0控制寄存器
#define rPLL0CFG    (*(volatile unsigned *)(0x400FC084))     //PLL0配置寄存器
#define rPLL0STAT   (*(volatile unsigned *)(0x400FC088))     //PLL0状态寄存器
#define rPLL0FEED   (*(volatile unsigned *)(0x400FC08C))     //PLL0馈送寄存器
#define rPLL1CON    (*(volatile unsigned *)(0x400FC0A0))
#define rPLL1CFG    (*(volatile unsigned *)(0x400FC0A4))
#define rPLL1STAT   (*(volatile unsigned *)(0x400FC0A8))
#define rPLL1FEED   (*(volatile unsigned *)(0x400FC0AC))
#define rCCLKSEL    (*(volatile unsigned *)(0x400FC104))     //CPU时钟选择寄存器
#define rUSBCLKSEL  (*(volatile unsigned *)(0x400FC108))     //USB时钟选择寄存器
#define rPCLKSEL    (*(volatile unsigned *)(0x400FC1A8))     //外设时钟寄存器
#define rPCON       (*(volatile unsigned *)(0x400FC0C0))
#define rPXCONP     (*(volatile unsigned *)(0x400FC0C4))
#define rSCS        (*(volatile unsigned *)(0x400FC1A0))     //系统控制和状态寄存器
#define rCLKOUTCFG  (*(volatile unsigned *)(0x400FC1C8))#define rIOCON_P0_10    (*(volatile unsigned *)(0x4002C028))
#define rIOCON_P0_11    (*(volatile unsigned *)(0x4002C02C))
#define rPCONP      (*(volatile unsigned *)(0x400FC0C4))
#define rU2LCR      (*(volatile unsigned *)(0x4009800C))
#define rU2FDR      (*(volatile unsigned *)(0x40098028))
#define rU2DLL      (*(volatile unsigned *)(0x40098000))
#define rU2DLM      (*(volatile unsigned *)(0x40098004))
#define rU2TER      (*(volatile unsigned *)(0x40098030))
#define rU2THR      (*(volatile unsigned *)(0x40098000))
#define rU2RBR      (*(volatile unsigned *)(0x40098000))
#define rU2FCR      (*(volatile unsigned *)(0x40098008))
#define rU2IIR      (*(volatile unsigned *)(0x40098008))
#define rU2LSR      (*(volatile unsigned *)(0x40098014))
#define rU2IER      (*(volatile unsigned *)(0x40098004))
#define rU2ACR      (*(volatile unsigned *)(0x40098020))void UART2_IRQHandler()
{unsigned int intId;char tmp_char;intId = rU2IIR&0xf;rU2THR = intId;if(intId == 0xc || intId == 0x4)  //RDA或者CTI中断{rU2LCR &= ~(0x1<<7);    //DLAB=0tmp_char = rU2RBR&0xff;rU2THR = tmp_char;}intId = rU2IIR&0xf;rU2THR = intId;if(tmp_char == 0xa5)rFIO1PIN |= (1<<18);else if(tmp_char == 0x5a)rFIO1PIN &= ~(1<<18);
}void SystemInit()
{  rSCS &= ~(0x1<<4);            //频率12M  rSCS |= (0x1<<5);             //使能主振荡器  while(0 == (rSCS & (0x1<<6)));//等待主振荡器稳定  rCLKSRCSEL = 0x1;  rPLL0CFG = 0x9;                 //配置CCLK = 120M  rPLL0CON = 0x01;  rPLL0FEED = 0xAA;  rPLL0FEED =0x55;  while(0 == (rPLL0STAT & (0x1<<10)));   rCCLKSEL = (0x1 | (0x1<<8));  rPCLKSEL = 0x2;                 //配置PCLK = 60M   rCLKOUTCFG = 0x0 | (0xb<<4) | (0x1<<8);
}void Init_Uart2()
{   rPCONP |= 0x1<<24;   //使能UART2功率控制rIOCON_P0_10 = (rIOCON_P0_10 & (~0x7)) | 0x1; //P0.10 P0.11做UART2的发送和接收管脚rIOCON_P0_11 = (rIOCON_P0_11 & (~0x7)) | 0x1;rU2LCR |= 0x1<<7;       //DLAB=1rU2FDR = 1 | 2<<4;      //波特率设置115200rU2DLM = 0;rU2DLL = 22;rU2LCR &= ~(0x1<<7);   //DLAB=0rU2LCR |= 0x3;        //8位数据位,无校验,1个停止位rU2TER |= 0x1<<7;     //使能串口2的发送rU2IER |= 0x1;       //使能串口2的接收中断rU2FCR |= 0x1;         //复位FIFO,设置接收1个字符触发中断rU2FCR |= 0x1<<1 | 0x1<<2;rISER0 |= 0x1<<7;        //使能串口2中断}void Uart2SendC(char c)
{rU2THR = c & 0xff;while(!(rU2LSR&(0x1<<5)));    //等待rU2THR中的数据发送完成,防止数据溢出
}void Uart2SendS(char *s)
{while(*s){Uart2SendC(*s);s++;}
}int main(void)
{char str[] = {"\n\r1, Display the U2IIR[3:0] + Data + U2IIR[3:0]\n\r"+"2, Send 0x5a ---> Turn on the LED\n\r3, Send 0xa5 --->Turn off the LED\n\r"};rFIO1DIR |= (1<<18); //GPIO1.18 -> OUTPUTInit_Uart2();Uart2SendS(str);while(1);
}

运行结果如下图所示

本文章转载自 Cortex-M3 (NXP LPC1788)之UART用法

Cortex-M3 (NXP LPC1788)之UART用法相关推荐

  1. Cortex‐M3的Faults异常究竟是什么?

    关注+星标公众号,不错过精彩内容 作者 | strongerHuang 微信公众号 | strongerHuang 有许多朋友在学习,或者开发STM32时都遇到过HardFault_Handler的情 ...

  2. Cortex、ARMv8、arm架构、ARM指令集、soc?Cortex A8、A9都是ARMv7a 架构;Cortex M3、M4是ARMv7m架构;前者是处理器(内核)后者是指令集的架构(架构)

    架构组成元素的指令集状态或者语法thumb指令集与arm指令集的区别例如thumb指令集是什么_thumb指令集与arm指令集的区别以及thumb-2的关系在下一文中介绍,本文暂时不讨论 有粉丝问我到 ...

  3. Cortex-M3 (NXP LPC1788)之RTC

    实时时钟是一组用于测量时间的计数器,如果使用电池供电,在系统掉电以后它也可以正常运行以记录系统的时间.LPC1788时钟采用内部的32K振荡器输出1HZ的时钟信号做为RTC的时钟源. RTC的寄存器比 ...

  4. Cortex M3 NVIC与中断控制

    Cortex M3 NVIC与中断控制 宗旨:技术的学习是有限的,分享的精神是无限的. 一.NVIC概览 --嵌套中断向量表控制器 NVIC 的寄存器以存储器映射的方式来访问,除了包含控制寄存器和中断 ...

  5. Cortex M3内核架构

    CortexM3内核架构 宗旨:技术的学习是有限的,分享的精神是无限的. 1.ARMCortex-M3处理器 Cortex-M3处理器内核是单片机的中央处理单元( CPU). 完整的基于CM3的MCU ...

  6. Cortex M3 Bit-banding简介

    http://blog.csdn.net/shevsten/article/details/7676397 Cortex M3 Bit-banding简介 分类: ARM MCU2012-06-19 ...

  7. cortex m3 开源_开源增强现实耳机,Steam的125M有效帐户等

    cortex m3 开源 您好,开放游戏迷! 在本周的版本中,我们将了解Steam的1.25亿活跃帐户和Game Developers Conference,这是一个开源增强现实头戴设备,Linux游 ...

  8. cortex m3的操作模式和状态

    1.操作状态(operation state): debug state:处理器在调试器发起halt或匹配到断点时,会进入debug state并停止执行指令. thumb state:处理器正在运行 ...

  9. cortex m3/m4处理器的复位设计

    cortex m3/m4处理器在复位层面总体上可以划分为core和debug logic两部分.core部分包括处理器内核(core)以及NVIC,BUS Matrix,MPU的非debug部分.de ...

  10. stm32 cortex M3 汇编指令集 英文详解

    这是cortex M3的汇编指令集详解,包含指令执行的周期,如下图示例,可以去Arm公司下载此文档,链接在此https://developer.arm.com/documentation/ddi033 ...

最新文章

  1. Android内容观察者
  2. IDEA中SpringBoot项目使用@Data要安装Lombok插件
  3. Linux命令简单操作之lsof
  4. python partial_Python--并行计算框架(pathos)
  5. ssh隧道 mysql,如何通过SSH隧道连接MySQL
  6. android网络框架
  7. CLR_via_C#.3rd 翻译[25.9 线程调度和优先权]
  8. 白天做安全,晚上去挖洞
  9. 用AlphaGo背后的人工智能做金融投资
  10. MySQL 批量插入,如何不插入重复数据?
  11. 【408考研计划】计算机组成原理
  12. 樱花FRP(SAKURA FRP)远程桌面+rdpwrap绕过限制
  13. k3cloud是java,JAVA调用K3Cloud接口新增报“调用目标发生异常
  14. mac os修改默认的Python解释器版本
  15. Airtest多点触控测试
  16. 百万在线:大型游戏服务端开发
  17. 阿里架构专家教你打通Git任督二脉,20分钟搞定Git工作原理
  18. Opencv2.4.9源码分析——Stitching(四)
  19. idea maven报红,但是项目中有jar包,提示找不到xx类
  20. 数据分析:旅游景点销售门票和消费情况分析

热门文章

  1. http下载大文件测试
  2. 微信小程序实例练习——《排班查询》
  3. pythondjango网页制作_python+django加载静态网页模板解析
  4. 应急响应病毒分析查杀集合
  5. 统计计量丨统计学公开课大盘点(附下载)
  6. 推荐几款好的小程序UI库组件
  7. python 反爬虫策略
  8. 色环电阻在线计算器(收藏)
  9. 计算机图形学及CAD技术 微盘,计算机图形学及cad技术讲义——曲线曲面基本理论.pdf...
  10. CSRF - 跨站请求伪造