串口是很多实验的基础,可以作为其他实验运行的验证。在做LPC1114 UART实验时,发现的例程只有发送函数,而且是发送字符串的,所以本人完善了一些,添加了一个发送字符串的函数UARTSendByte(),一个接受字符的函数UARTReceiveByte(),一个接受字符串函数UARTReceive()。具体的代码如下:
// 发送字符函数
/*****************************************************************************
** Function name: UARTSendByte
**
** Descriptions: Send a block of data to the UART 0 port based
** on the data Byte
**
** parameters: send data
** Returned value: None
**
*****************************************************************************/
void UARTSendByte(uint8_t dat)
{
while ( !(LPC_UART->LSR & LSR_THRE) )
{
; // 等待数据发送完毕
}
LPC_UART->THR = dat;
}
// 接受字符函数
/*****************************************************************************
** Function name: UARTReceiveByte
**
** Descriptions: Receive a block of data to the UART 0 port based
** on the data Byte
**
** parameters: None
** Returned value: Byte
**
*****************************************************************************/
uint8_t UARTReceiveByte(void)
{
uint8_t rcvData;
while (!(LPC_UART->LSR & LSR_RDR))
{
; // 查询数据是否接收完毕
}
rcvData = LPC_UART->RBR; // 接收数据
return (rcvData);
}
// 接收字符串函数
/*****************************************************************************
** Function name: UARTReceive
**
** Descriptions: Receive a block of data to the UART 0 port based
** on the data Length
**
** parameters: buffer pointer, and data length
** Returned value: Note
**
*****************************************************************************/
void UARTReceive(uint8_t *BufferPtr, uint32_t Length)
{
while (Length--)
{
*BufferPtr++ = UARTReceiveByte(); // 把数据放入缓冲
}
}
// 主函数
int main(void) {
// TODO: insert code here
uint8_t ch = 0;
UARTInit(9600);
LPC_UART->IER = IER_THRE | IER_RLS; // 设置中断使能寄存器
UARTSend((uint8_t *)Buffer, 10);
while (1)
{
ch = UARTReceiveByte(); // 接收字符
if (ch != 0x00)
{
UARTSendByte(ch); // 发送接收数据
}
}
// Enter an infinite loop, just incrementing a counter
volatile static int i = 0 ;
while(1) {
i++ ;
}
return 0 ;
}
实验图片如下:
IMG_3380.JPG (70.52 KB)
2010-5-14 06:54
IMG_3381.JPG (76.79 KB)
2010-5-14 06:54
IMG_3382.JPG (72.08 KB)
2010-5-14 06:54
串口我用的是USB转串口进行调试的,如果先打开串口进行,再连接实验板时会提示如下:
此时如果点击"OK",将提示如下错误:
此时应该点击如下图红圈的地方,LPC-Link,然后点击“OK”即可正常连接。
-
2010-5-14 07:10
-
关键字:LPC1114 UART 收发实验
引用地址:
LPC1114 UART收发实验
推荐阅读最新更新时间:2024-03-16 15:00
STM32--UART异步通信学习
字符发送的过程描述:在UART的发送过程中先将数据输入到发送数据寄存器中(TDR)此时(TXE)被硬件置1,之后TDR寄存器将数据串行移入到发送移位寄存器中,将数据在TX端口发送,此时(TC)被硬件置1。 发送与接收是逆过程。 UART发送配置步骤: 1.通过USART_CR1寄存器上置位UE来激活USART。 2.编程USART_CR1的M位来定义字长。 3.在USART_CR2中编程停止位的位数。 4.如果采用多缓冲器通信,配置USART_CR3中的DMA使能位(DMAT)。按多缓冲器通信中的描述配置DMA寄存器。 5.利用USART_BRR寄存器选择要求的波特率。 6. 设
[单片机]
如何在keil中快速配置lpc1114主频
这里以KEIL 4.60版本为例进行说明,低于此版本,可能不适合现在我所讲的内容。 打开启动代码文件startup_LPC11xx.s,从第122行看起,代码如下所示: Reset_Handler PROC EXPORT Reset_Handler IMPORT SystemInit IMPORT __main LDR R0, =SystemInit BLX R0 LDR R0, =__main BX R0 ENDP 这是单片机复位以后执行的源头,可以看到,程序并不是先从main函数开始执行,而是先执行SystemInit函数,之后才进入main函数。SystemInit函数即时钟配置函数,此函数已经
[单片机]
LPC23XX的PCONP与UART2和UART3
LPC2368的UART2、UART3与UART0、UART1有什么区别? 同样的处理方法UART0、UART1正常,UART2、UART3死机,下面是那段程序: #include LPC23xx.h #define CR 0x0D void Delay(unsigned int cnt) { do { cnt--; } while(cnt!=0); } int sendchar0 (int ch) { if (ch == '\n') { while (!(U0LSR & 0x20)); U0THR = CR; /* OUTPUT CR */ }
[单片机]
STM32F4 UART1 DMA发送和接收不定长度数据
STM32F4 串口收发使用DMA还是很方便的。但是配置DMA时需要配置数据长度,这一点对于发送来说可以预估计自己发送的长度来配置DMA发送数据长度,但是对于接收不是很好解决,因为如果使用DMA接收中断是要配置的数据长度减到0才能出发中断。但是我们无法判断接受数据的长度,导致无法判断数据接收完成。网上有提出的解决方法是用定时器固定周期的读DMA接收的长度来判断是否接收完成,也有使用UART的空闲中断来处理的。在这里我使用UART的空闲中断来处理接收不定长数据。当然也要打开DMA接收完成中断,处理数据接收超过DMA配置的长度导致的DMA接收中断。 1.使用DMA发送时每次发送数据前需要配置发送的数据长度,此时要注意应先关闭DMA,然
[单片机]
lpc1114 adc中断
观察DR寄存器bit31位来确认是否转换完成,属于查询方式,如果没有转换完成,程序会停在检测的那条语句处,不能做其他的事情,极大的浪费了处理器的资源,这一节,介绍更为效率的中断方式。 给ADINTEN寄存器对应ADINT位写1,当ADC转换完成后,会引发ADC转换中断。 ADINTEN寄存器: 位 符号 描述 复位值 7:0 ADINT 这个位决定了哪个通道转换完成后产生中断。例如:当bit1=1,当AD1通道转换完成后,产生中断 0x00 8 ADGINT 如果这个位是1,当全局DR寄存器的DONE位置1,引发中断 注意:当BURST=1,即硬件扫描模式下,如果用中断,只能用bit7:0这个位必须为0 1 31:9
[单片机]
第4课:UART串口编程
首先明确一点:我们学习的串口是异步串口。在传输时,他们各自有各自的时钟。就是我们说的波特率。 我们学习的RS232与UART的区别是,UART使用标准的TTL/COMS电平 进过一个芯片使它的高低电平从TTL中0与3.3V 变成了 低电平5v到15v 高电平-3v到-12v。 首先说一下串口的数据帧格式。它由一个开始位,数据位,校验位和停止位组成。 平时数据处于1状态。 当要开始发送时,从UART改变TxD数据变成0状态1个位的时间,在接受端到0之后的1.5位的时间,接收端开始接受数据。 数据位分为5,6,7,8。四种类型的数据位。之后就是校验位站1位,可以设置也可以不设置。最后的是停止位。可以是1位,1.5位,2位。这个
[单片机]
lpc1114深度掉电模式Deep power-down mode
在深度掉电模式,除了WAKUP引脚(P1.4),整个芯片都停止工作,而且只有4个32位的寄存器可供存储用户数据,内部SRAM中的数据都会丢失。 1. 怎样进入深度掉电模式 执行以下步骤进入深度掉电模式: 1. 设置PCON寄存器的DPDEN位为1; 2. 把防止丢失的数据存储到通用寄存器; 3. 设置SCR寄存器中的SLEEPDEEP位为1; 4. 在进入深度掉电模式之前,确保PDRUNCFG寄存器中的IRCOUT_PD位和IRC_PD位为0; 5. 执行WFI指令。 2. 进入深度掉电模式后,如何唤醒单片机 进入深度掉电模式,只有一种途径可以唤醒单片机,那就是通过WAKUP引脚上的下降沿唤醒。 3 示例程序 为了很容易的看到效果
[单片机]
Exar推出两款内置电平转换器的通用异步收发器 (UART)
2010德国慕尼黑电子元件展上, Exar 公司 (纳斯达克: EXAR)发布两款集成了电平转换器的UART。XR16M890和XR20M1280分别是业内速率最快的8-bit/VLIO和I2C/SPIUART,最高的数据传输率可达24 Mbps。Exar公司8-bit/VLIO和 I2C/SPI接口产品备受市场肯定,而作为该系列产品的新丁,这两款产品针对手持设备的广泛应用,包括智能电话、蓝牙、PDA、GPS系统以及其它的电池式设备。 XR16M890和 XR20M1280的主要区别是CPU总线接口。XR16M890带有一个可选的8位Intel、Motorola、VLIO 总线接口。XR20M1280带有一个可选的I
[电源管理]