Cortex-M3学习日志(四) -- UART0实验
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实验的更多相关文章
- stm32和cortex M3学习内核简单总结
1.stm32综述 2.寄存器组 3.操作模式和特权级别 4.存储器映射 5.中断和异常 6.其他 Stm32综述 这可以说是我第一款认真学习的单片机了,学完这个就要开启我通往arm9的大门了,接下来 ...
- springmvc学习日志四
一.回顾 1.文件上传 1.1引入fileupload的jar包 1.2在springmvc的配置文件中引入CommonsMutilpartResolver文件上传解析器 1.3在控制层在写入代码 2 ...
- spring学习日志四
一.spring对JDBC的支持 JdbcTemplate 简介 为了使 JDBC 更加易于使用, Spring 在 JDBC API 上定义了一个抽象层, 以此建立一个 JDBC 存取框架. 作为 ...
- Cortex-M3学习日志(六) -- ADC实验
上一次简单的总结了一下DAC方面的知识,好吧,这次再来总结一下ADC方面的东东.ADC即Analog-to-Digital Converter的缩写,指模/数转换器或者模拟/数字转换器.现实世界是由模 ...
- STM32学习之路入门篇之指令集及cortex——m3的存储系统
STM32学习之路入门篇之指令集及cortex——m3的存储系统 一.汇编语言基础 一).汇编语言:基本语法 1.汇编指令最典型的书写模式: 标号 操作码 操作数1, 操作数2,... ...
- Cortex-M3学习日志(五) -- DAC实验
终于逮了个忙里偷闲的机会,就再学一下LPC1768的外围功能吧,循序渐进是学习的基本规则,也许LPC1768的DAC与8位单片机16位单片机里面集成的DAC操作类似,但是既然这是懒猫的学习日志,就顺便 ...
- 第六周学习总结&第四次实验报告
第六周学习总结&第四次实验报告 学习总结 这周我们简单的学习了一点点关于接口的内容,接口是Java中最重要的概念之一,接口可以理解为一个特殊的类, 里面由全局常量和公共的抽象方法组成,接口摆脱 ...
- 从零开始学习jQuery (四) 使用jQuery操作元素的属性与样式
本系列文章导航 从零开始学习jQuery (四) 使用jQuery操作元素的属性与样式 一.摘要 本篇文章讲解如何使用jQuery获取和操作元素的属性和CSS样式. 其中DOM属性和元素属性的区分值得 ...
- java之jvm学习笔记四(安全管理器)
java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...
- 南京邮电大学java第四次实验报告
实 验 报 告 ( 2017 / 2018学年 第2学期) 课程名称 JAVA语言程序设计 实验名称 Java集成开发环境的安装与使用. Java变量.表达式与控制结构 实验时间 2018 年 6 月 ...
随机推荐
- 多线程并发编程之显示锁ReentrantLock和读写锁
在Java5.0之前,只有synchronized(内置锁)和volatile. Java5.0后引入了显示锁ReentrantLock. ReentrantLock概况 ReentrantLock是 ...
- js常用DOM操作
在博客园看到了苏夏写的常用DOM整理文章,地址:http://www.cnblogs.com/cabbagen/p/4579412.html,然后抽时间都试了一下这些常用的DOM操作.在这里记录一下. ...
- Android_神奇的android:clipChildren属性
正文 一.效果图 看到这个图时你可以先想想如果是你,你怎么实现这个效果.马上想到用RelativeLayout?NO,NO,NO,,, 二.实现代码 <?xml version="1. ...
- PHPMailer发送邮件方法
/** * * 测试邮件发送s * @param 服务器 $Host * @param 端口 $Port * @param 昵称 $Fromname * @param 身份验证用户名 $Usernam ...
- (极简)linux安装QT4.7.3
1.下载QT http://download.qt.io/ 我用的:qt-everywhere-opensource-src-4.7.3.tar.gz 2.解压安装QT 建议解压到/use/local ...
- sql server 2008 (3)
数据库表常用术语 关系--即二维表.每个关系都有个关系名,就是表名 域:取值范围 记录--行 字段,属性--列 关联--指哪个数据库表之间的数据彼此联系的方式 关键字:属性或属性的组合,可以唯一标识一 ...
- gulp api
gulp api 简介 gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器:它不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自动完成 gulp是基于Nod ...
- nexus 7 2013 驱动安装及root
驱动安装 Nexus 7 2013连接上电脑后,设备管理器显示新设备 nexus 7 待安装驱动(其实是MTP设备待安装驱动).去谷歌网站下载最新的USB驱动,version 8.0 的.与以前的版本 ...
- aix创建lv 在lv上创建文件系统
创建LV命令: mklv -y softlv -t jfs2 rootvg 15G 创建文件系统命令: crfs -v jfs2 -d/dev/softlv -m /soft -A yes 把soft ...
- Weinre - 远程调试工具
Weinre 代表Web Inspector Remote,是一种远程调试工具.借助于网络,可以在PC上直接调试运行在移动设备上的远程页面,中文意思是远程Web检查器,有了Wei ...