1、LPC2000 系列芯片的串口的接收模块包括接收缓冲寄存器和移位寄存器。接收的数据进入移位寄存器后经移位处理并行传入缓冲寄存器,事实上,UART的FIFO是一个硬件环形的缓冲队列,物理上不可寻址,不可见,仅U0RBR这个FIFO出口可见。U0RBR就是接收FIFO的第一位。FIFO的长度是可设的,也叫触发点,低于这个长度的字符串不会引起中断,但在实际应用中,不可能串口读入的数据长度总为触发点值的整数倍,为此,引入了CTI即字符接收超时中断,当有不足触发点值规定的字符串读入时,将引起中断,其与串口的RDA中断具有相同的优先级,并会同时被使能。
那么,LPC2000的UART机制是如何判断串口读入数据的一次性容量呢?如果接收FIFO里已经有了1个字符,它可在一定的时间内等待下一个字符的读入,也就是说,不超过一定的时间就不会触发CTI中断,这个时间是在本次通讯协议设置的前提下,接收3.5到4.5个字符所用的时间。比如,需串口接收GPRS数传状态成功建立后的返回值“Ok_Info_WaitingForData”22个字符组成的字符串,FIFO触发点设置为14,在前14个字符读入之后,立即触发RDA中断,跳转至RDA中断服务子程序将这14个字符放入我所预设的缓冲区内,接着,后8个字符读入,这时CPU并不立刻中断,它需等待在本次串口通讯协议设置的前提下,接收3.5到4.5个字符所用的时间(需根据波特率和帧格式具体计算),这个时间一到,立刻触发CTI中断,换句话说,超过这个时间的等待,CPU就认为一个完整的字符串已经结束了,这才是字符串超时的真正含义。
2、为什么要用FIFO呢?我个人觉得,主要是为了提高串口的利用效率,同时可以避免一定程度上的丢包。比如,在用串口发送FIFO中断时,触发深度设为8,那么接收中断发生的条件是,FIFO里有了8个字符,但不是8个字节,因为串口异步通信的协议中,会加帧头和帧尾,但外表上还是以字符为单位。发送时,则是当FIFO里不满8个字符的时候要中断一次,所以利用FIFO发送时也要自建一个用来串口发送的缓冲池,发送中断服务程序里要做的就是从这个发送缓冲区里取数送进FIFO里,沿用上面的假设,触发深度设为8,一次性向FIFO里送15个字符,在送入第一批15个字符之后串口开始自动发送,当FIFO里只有7个字符时,立即发生中断,因此,在发送中断服务程序里要设个计数指针作为跳出中断的上限,这个上限不是8而是15。我认为,如果要发挥fifo的高效率,就必须把自设的缓冲区作成一个环状链表,即,不需要做移位处理使自设的缓冲区剩余的数据顶头。ZLG有详细的基于队列思想的例程。
3、个人觉得,当FIFO的触发深度设为1时和不用FIFO时的效果是一样的。
4、串口发送时,推荐第一个字符要在打开串口中断前送,否则可能中断只来一次。比如下面的这个用串口中断发送字符串的函数为:
/****************************************************************************************************
** 函数名称 :UART0_SendStr()
** 函数功能 :向串口发送字符串
** 入口参数 :str 要发送的字符串的首地址指针
** 出口参数 :无
*****************************************************************************************************
void UART0_SendStr( CHAR const *str)
{
Str_Send_P = str;
U0THR = *Str_Send_P++;
U0IER |= 0x02; //开发送中断
}
在中断发送程序中的处理为:
SWITCH(IIR & 0x0e)
{
case 0x02: //利用串口发送中断,发送字符串
if((*Str_Send_P)!='/0')
U0THR = *Str_Send_P++;
else
U0IER &= (~0x02); //关发送中断
break;
关键字:LPC2000 UART 串口使用
引用地址:
LPC2000 UART串口使用心得
推荐阅读最新更新时间:2024-03-16 16:21
单片机使用printf函数进行串口打印输出
以前在使用keil编写51单片机程序的时候,经常使用printf函数打印输出一些关键的过程数据到电脑,方便监控程序的运行状况。最近使用IAR for MSP430 调试 MSP430G2553 程序的时候,发现了一些小问题,MSP430G2553单片机并没有按照我的预期输出数据到电脑。 带着疑惑我查看了keil的帮助文件里面的printf函数说明,原来printf函数最终是调用putchar函数来实现打印输出字符的。 putchar,该函数将制定的表达式的值所对应的字符输出到标准输出终端上。表达式可以是字符型或整型,它每次只能输出一个字符。我们来看keil标准函数库里的putchar函数的函数体。 根据说明提示,我在D:Keil
[单片机]
集成UART核心的FPGA异步串行实现
串行外设都会用到RS232-C异步串行接口,传统上采用专用的集成电路即UART实现,如TI、EXAR、EPIC的550、452等系列,但是我们一般不需要使用完整的UART的功能,而且对于多串口的设备或需要加密通讯的场合使用UART也不是最合适的。如果设计上用到了FPGA/CPLD器件,那么就可以将所需要的UART功能集成到FPGA内部,本人最近在用XILINX的XCS30做一个设计的时候,就使用VHDL将UADT的核心功能集成了,从而使整个设计更加紧凑,更小巧、稳定、可靠,下面就谈谈设计方法。
分析UART的结构,可以看出UART主要由数据总线接口、控制逻辑和状态接口、波特率发生器、发送和接受等部分组成,各部分间关
[嵌入式]
stm8s开发(三) UART的使用:串口通信!
串口通信是单片机学习的一个最基本、最重要的功能之一。串口通信可以间接的当做调试接口使用,实现单片机与电脑之间的通信。当然可以与一些模块(比如蓝牙、wifi)通信,也可以作为和其他单片机通信的工具。 STM8S的通用异步收发器(UART)主要特性: ● 全双工的,异步通信 ● 可编程数据字长度(8位或9位) ● 可配置的停止位-支持1或2个停止位 一般的,我们使用串口通信主要是关心几点参数:波特率、停止位、奇偶校验位。 其次就是如何发送、如何接收数据,这里介绍的使用阻塞式发送数据、中断方式接收数据。 以下代码是初始化串口,参数为:115200 1停止位 无校验位 void Init_UART1(void)
[单片机]
UART多串口扩展器SP2338DP及其应用
摘要:SP2338DP是一种新颖的串口扩展器,可将一个高波特率的UART扩展为3个,解决了普通单片机UART串口太少的问题。文中给出该器件的主要特性、引脚说明及应用说明,并以AT89C52单片机为例给出多串口扩展应用电路及相应软件。
关键词:UART 串口扩展 单片机
1 概述
当前,以单片机为核心构成的智能化测控系统及电子产品不断涌现,为了满足数字化及智能化要求,许多外围电路功能模块、部件、器件及传感器也具备了UART串口通信功能。而现阶段的8位、16位、32位单片机却大部分仅提供一个UART串口,这样就很难满足系统中一方面要与具有UART功能的串口部件通信,另一方面又要与上位机通信的要求。利用SP2338DP多串口扩展器
[应用]
CAN总线的硬/软件设计简述
引 言
随着信息技术的飞速发展,32位ARM微控制器以其低功耗、高性能以及小体积等特性,得到了广泛的应用。在汽车、消费娱乐、仪器仪表、工业控制、海量存储、网络、安保和无线等领域,随处可见其应用实例。因而,基于ARM的技术方案是最具市场前景和市场优势的解决方案。
现场总线是当前工业通信领域中应用最广的技术之一。作为现场总线之一的CAN总线,以其高性能、高可靠性以及灵活的设计越来越受到人们的重视,越来越多的 ARM微控制器带有CAN控制器。Philips 2000系列ARM微控制器是基于ARM7的集成有2个或4个CAN控制器的微控制器,在工业通信网络中有广泛的应用。
1 CAN总线的硬/软件设计简述
1.1 硬件设计
[嵌入式]
基于单片机通用引脚的软件UART设计
引言 随着单片机应用技术的不断深入,由单片机构成的多机系统取得了长足的发展,多个单片机之间以串口进行数据传输,构成复杂的主从式通讯网。在多机系统中的有一些单片机承担着复杂的通讯任务,当计算机的串口不能满足需要,就必须对串口进行扩展。如多参数医用监护仪、小区防盗报警系统、RS485总线控制系统等。 目前扩展串口的方法主要有以下方法, ①、采用串口扩展芯片实现,如ST16C550、ST16C554、SP2538、MAX3110等,虽然成本较高, 但系统的可靠性得到了保证,适用于数据量较大、串口需求较多的系统;②、采用分时切换的方法将一个串口扩展与多个串口设备通信,分时复用的方法成本低, 但只适用于数据量不大的场合, 并且只能由这个
[单片机]
#51单片机# UART串口通信的基本应用、模块介绍和串口程序
UART串口通信的基本应用 通信的三种基本类型: 单工通信:值允许一方向另一方传送星系,另一方不能回传信息。例:电视遥控器、收音机广播 半双工通信:数据可在双方之间相互传播,但同一时刻只能一方传给另一方。例:对讲机 全双工通信:发送数据的同时也可接收数据,两者同步进行。例:电话 UART模块介绍 通常情况下,我们关心的是通信的结果而非过程。51单片机内部存在UART模块,可自动接收数据,接收完毕,会发出通知信号。要使用这个模块,需要配置对应的具有特殊功能的寄存器。 51单片机的UART串口结构由串行口控制寄存器SCON、发送和接收电路三部分构成。 先来了解串口控制寄存器SCON SCON——串行控制寄存
[单片机]
使用变参函数实现STM32串口的简易printf功能
第一,去掉了原来使用的goto语句,因为C语言中除了错误处理之外,不建议使用goto语句; 第二,fmt和pnt的含义更加明确,它们始终指向下一个需要处理的字符和变参; 第三,整理了程序结构,使它更加清晰。 void uart_printf(USART_TypeDef *USARTx, char *fmt, ...) { char *pnt = (char *)&fmt + sizeof(fmt); int len; while (*fmt != '') { if (*fmt == '%') { if (*(fmt + 1) == 'c') { uart_send_byte(
[单片机]