LPC824-串口USART(续二)

发布者:SparkCrafter最新更新时间:2023-10-03 来源: elecfans关键字:LPC824  串口  USART 手机看文章 扫描二维码
随时随地手机看文章

通过前面的分析知道,在LPC824中,USART所拥有的配置寄存器有很多,但在一般情况下,如果只是简单地使用收发功能,则只需要使用到配置寄存器CFG、波特率发生器寄存器BRG、中断使能读取和置位寄存器INTENSET、中断状态寄存器INTSTAT、接收器数据寄存器RXDAT、发送器数据寄存器TXDAT等6个主要寄存器,其余的寄存器取默认值即可。下面就来看一个实例。

例子:要求LPC824把USART接收到的数据原样发送回去,波特率115200,8位数据位,1位停止位。

完整代码如下。

#include
//************************串口初始化***********************************
void uart_init(void)
{
LPC_SYSCON->SYSAHBCLKCTRL|=1<<7; //开启SWM时钟
LPC_SWM->PINASSIGN0 &= ~0xFFFF;
LPC_SWM->PINASSIGN0 |= 0x04;
LPC_SYSCON->SYSAHBCLKCTRL &= ~(1<<7); //关闭SWM时钟(使用完之后记得关闭,节省功耗)
LPC_SYSCON->SYSAHBCLKCTRL |= 1<<14; //开启USART0时钟
LPC_SYSCON->PRESETCTRL &= ~(1<<3); //开启复位USART0
LPC_SYSCON->PRESETCTRL |= (1<<3); //关闭复位USART0
LPC_USART0->CFG &= ~(1<<0); //串口USART0禁止
LPC_USART0->CFG|=1<<2; //配置USART0为8位数据方式
LPC_SYSCON->UARTCLKDIV = 1;
LPC_SYSCON->UARTFRGDIV = 0xFF;
LPC_SYSCON->UARTFRGMULT = 0; //配置串口的外设时钟U_PCLK
LPC_USART0->BRG = 12; //配置USART0的波特率为115200
LPC_USART0->CFG |= 1<<0; //串口USART0使能
}

//***************************主函数************************************
int main(void)
{
uart_init();
LPC_USART0->INTENSET |= 1<<0; //使能串口接收中断
NVIC_ClearPendingIRQ(UART0_IRQn); //清除挂起的中断
NVIC_EnableIRQ(UART0_IRQn); //使能NVIC串口中断
while(1)
;
}
//************************串口中断***********************************
void UART0_IRQHandler(void)
{
// if(LPC_USART0->STAT & 0x1)
if(LPC_USART0->INTSTAT & 0x1) //如果是接收到数据的中断
LPC_USART0->TXDAT = LPC_USART0->RXDATSTAT; //把接收到的数据发送出去
}

从上述代码中可以看出,在默认状态下,LPC824是没有把USART(包括USART0~USART2)的引脚映射到芯片的物理引脚上的,所以初始化串的第一步,就要把串口所需要的引脚映射出来。 在上述程序中,通过操作开关矩阵寄存器SWM,把USART0的RXD和TXD引脚分别映射到了PIO0_0和PIO0_4物理引脚上。引脚映射完成后,要关闭SWM时钟,以节约能耗。接下来需要开启USART0的时钟,并对其进行一次复位操作。开启USART0的时钟,配置的是SYSAHBCLKCTRL寄存器,详见前面时钟配置部分。复位USART0配置的是PRESETCTRL寄存器,详见前面多速率定时器部分。

接下来配置CFG寄存器,使能USART0,设置为8位数据方式。本例的波特率为115200,为了弄清波特率的配置,需要先讨论一下在LPC824中,串口的波特率是如何进行计算的。

先来看一下LPC824的USART时钟结构,如下图所示。

从图中可以看到USART的时钟分为两个部分,第一部分是由系统时钟(system clock)提供的USART模块时钟,它为整个USART模块提供正常工作所需的时钟,受SYSAHBCLKCTRL寄存器第15到17位的控制(详见前面时钟配置部分)。第二部分是由主时钟(main clock)分频后提供一个统一的外设时钟(U_PCLK),外设时钟再经由各自(USART0~USART2)的波特率时钟发生器,为各自的异步通信提供独立的波特率。

外设时钟的值为:U_PCLK = FRGCLKDIV/(1+MULT/DIV)。三个USART模块共用一个外设时钟,并且在需要时共用一个带小数的波特率发生器。

上面公式中的FRGCLKDIV项由USART时钟分频器寄存器UARTCLKDIV来实现,下面给出的是它全部位结构,其字节地址为0x40048094。

(1)第0到7位(DIV)为USART小数波特率生成器时钟分频器值,值从0到255,分别对应相应的分频值,其中值为0时时钟被禁止。
(2)第8到31位为保留位。

公式中的MULT项由USART小数生成器乘法器值寄存器UARTFRGMULT来实现,下面给出的是它全部位结构,其字节地址为0x400480F4。

(1)第0到7位(MULT)为小数分频器分子,MULT等于设定值。
(2)第8到31位为保留位。

公式中的DIV项由USART小数生成器分频器值寄存器UARTFRGDIV来实现,下面给出的是它全部位结构,其字节地址为0x400480F0。 

  (1)第0到7位(DIV)为小数分频器分母,DIV等于设定值+1。要使用小数波特率生成器,应当始终设为0xFF。
(2)第8到31位为保留位。

UARTFRGDIV寄存器位于分母上,其默认值为0,表明默认时分频不启用小数部分,如果分频需要启用小数部分,则它的值只能是255(即0xFF)。如果在启用后位于分子的UARTFRGMULT寄存器的值为0(默认值),则小数分频仍为1分频,即不分频,除非UARTFRGMULT的值大于0。综上所述,默认状态下不启用分频的小数部分,若要启用则UARTFRGDIV及UARTFRGMULT两个寄存器的值都不为0。

配置上述三个寄存器,可以得到一个统一的外设时钟U_PCLK。注意,U_PCLK时钟并不区分是哪个USART模块的,它是三个USART模块共用的时钟,如果USART0~USART2三个模块的波特率不一致,则还需要配置各自模块内的USART波特率发生器寄存器BRG,该寄存器的具体位结构参见前面“串口USART(续一)”部分。每个USART模块的波特率为:Baud rate=U_PCLK/(16×(BRGVAL+1))。

下面总结一下计算波特率的步骤:

1、主时钟(main clock)先除以UARTCLKDIV中的分频值,得到分频以后的时钟,如果分频值为1,则分频后的值与主时钟一致。

2、如果启用了分频的小数部分,则把第1步中得到的分频值再乘以小数部分,得到的值即为U_PCLK时钟,小数部分的值按公式 1/(1+UARTFRGMULT/256)进行计算。若未启用小数部分,则第1步中得到的分频值即为U_PCLK时钟。

3、对上面得到的U_PCLK时钟进行16的倍数的再分频,倍数值即为BRG寄存器的值加1(BRGVAL+1),再分频后的时钟值即为最终的波特率。

4、有时无论如何取三个寄存器的值,得到的波特率都不会完全等于预期值,仍会有一定的误差,一般来说只要该误差控制在2%以内,USART的异步通信就可以正常工作了。

另外,在LPC824中,波特率时钟一般是实际波特率的16倍(默认为16倍,可在过采样选择寄存器OSR中进行配置),这种超采样允许将数据采样时间集合到一个通信位的单元中,并可通过从接收数据中取三次采样来降低噪声和实行检测。比如说,在接收到的某一个位上是高电平1,按传统的方式只对该位采样一次,而在LPC824中会采样三次,若三次都为高电平则表明该位是1,若三次采样中有一次是低电平,则表明通信上存在噪声干扰,此时虽然该位仍然是1,但LPC824会在RXDATSTAT、STAT及INTSTAT寄存器中标记一个位(第15位),以供程序进行通信噪声检测。

在前面的示例程序中,要配置波特率为115200,则各寄存器的取值如下:UARTCLKDIV=1, UARTFRGMULT=0,UARTFRGDIV=255(DIV等于设定值+1),BRGVAL=12。计算如下。

主时钟(main clock)为24MHz。

U_PCLK的分频值为:1/(1+0/256)=1,即1分频,则外设时钟U_PCLK的值也为24MHz。

波特率为:Baud rate=24000000/(16×(12+1))=115384,该值最为接近115200,误差仅为0.2%以内。

同理,如果要把波特率改为9600,则各寄存器的取值改为如下:UARTCLKDIV=1, UARTFRGMULT=64,UARTFRGDIV=255,BRGVAL=124。通过这样的配置,可准确的产生出9600的波特率,没有误差。当然,也可以有其他配置,比如:UARTCLKDIV=2, UARTFRGMULT=0,UARTFRGDIV=255,BRGVAL=77。但这个配置存在误差,经过计算,该误差仍控制在0.2%以内。下表给出在24MHz的主时钟下,能产生出一部分精确波特率的配置情况。

 

在前面的示例程序中,采用了接收中断的方式来实现,在中断服务程序中,由于响应的是USART的NVIC中断,所以需要判断一下具体是什么类型的USART中断,有两种方式,一种是通过读取INTSTAT寄存器来判断,另一种是通过读取STAT寄存器来判断,效果是一样的。此外,在配置CFG寄存器时,一般建议先把该USART禁能,等配置完成后再使能,以避免出错。

该示例程序只是以最简单的方式来验证USART的异步收发功能,在实际的项目应用中,应该结合LPC824中丰富的各个串口配置寄存器,把USART的通信程序做的即高效又健壮,这里就不再进行深入讨论了。


关键字:LPC824  串口  USART 引用地址:LPC824-串口USART(续二)

上一篇:LPC824-SPI接口
下一篇:LPC824-串口USART(续一)

推荐阅读最新更新时间:2024-11-17 00:49

STM32串口发送十六进制的数组
通过串口发送十六进制的数组的方法有很多种,这里我介绍一种最简单也最使用的一种方法。 我这里使用的板子是STM32F103RCT6,使用串口2,usart2.c的代码如下: #include delay.h #include usart2.h #include stdarg.h #include stdio.h #include string.h #include timer.h //串口接受缓存区 u8 USART2_RX_BUF ; //接受数据缓冲,最大为USART2_MAX_RECV_LEN个字节 u8 USART2_TX_BUF ; //发送数据缓冲,最大为USART2
[单片机]
Stm32f407DISCOVEY学习uart串口波特率乱总结
这几天调试Stm32f407DISCOVEY。由于没有串口现成的库函数例程,就用的神州王开发板上的例程直接调,结果串口输出老是乱,115200波特率;;试着把它换到 38400居然可以打印,相差3倍多;真相只有一个,进过调试摸索百度,终于找到原因; .时钟频率不对 由于时钟频率是在库文件里自动定义好的,一开始没有发现,但是波特率一直不对,后来发现问题在库文件里定义的外部晶振是25M,而DISCOVERY的板子上用的是8M的晶振,故产生的主频不对,需要改两个地方,①所以在 stm32f4xx.h中改 #if !defined (HSE_VALUE) #define HSE_VALUE ((uint32_t)8000000) /*!
[单片机]
M430_Launchpad串口UART使用硬件方面注意点
首先,不得不说Launchpad是一个很实用的开发工具. 就我个人是用来看, 板载SBW的JTAG相当实用.而且还可以仿真我的MSP430F5438的板子,实在相当给力,省去了上百元的仿真器的费用~~爽~~ 但是,(一碰到这个词果断没什么好事..) 这个板子有个地方搞得非常非主流,不仔细阅读文档的话,妥妥的要被坑! 问题就出在板上的J3插座.(图中,左侧的黄框框) 前面四个是正常的, 最后一个TXD.靠近EMULATION一侧的排针其实是和右侧芯片的3脚相连的.从下面PCB图可以看出来. 至于RXD么,就自己看UserGuide咯.不多废话.(其实这张图里基本也就看出来了..) 这么设计,我估
[单片机]
M430_Launchpad<font color='red'>串口</font>UART使用硬件方面注意点
运用于电池管理系统中的串口与CAN通信模块电路设计
   串口通信模块: 电池管理系统将采集处理后的数据通过串口发送到PC机界面上,实现人机交互。通过串口界面,可以观察到电池的总电压、单体电压、电流、SOC、故障状态、充放电功率等参数,还可以通过串口发送实现管理系统的在线标定。其硬件电路主要基于MAX232芯片,如图)所示。   MAX232 是+5V电源的收发器,与计算机串口连接,实现RS-232接口信号和TTL 信号的电平转换,使BMS 和PC 机能够进行异步串行通讯。为了防止电磁干扰影响串口上数据的传输,必须对总线信号进行隔离。串口是单向传输,所以利用6N137光电耦合较为方便)所示为232TXD 信号 光耦 隔离电路。    CAN通信模块: CAN通信是架接电池管理系
[电源管理]
运用于电池管理系统中的<font color='red'>串口</font>与CAN通信模块电路设计
STM32_USART 串口通讯详解
对51单片机有了解的都知道51单片机的串口通讯工作原理,我们单片机使用的电平TTL电平,为了使我们的的单片机与PC进行通信,就需要一个电平转换芯片,把TTL电平转换为USB电平(使用的USB接口,如果使用的DB9接口,电平转换芯片则为TTL转RS232电平芯片),然后通过对SBUF寄存器的读写操作来实现PC与MCU的通信。STM32的串口通讯原理与51相同。下面就对USART尽行具体的介绍。 USART(Universal synchronous asynchronous receivertransmitter )通用同步异步收发器,是STM32上基于串口通讯协议来实现与外部通信的一个外设,因为串口通讯协议的简单,便捷,所以在
[单片机]
STM32_<font color='red'>USART</font> <font color='red'>串口</font>通讯详解
C51通用串口收发数据C语言程序
#include reg52.h //C51通用串口收发数据C语言程序模块 #define uchar unsigned char #define uint unsigned int uchar shu; bit i; sbit led1=P0^0; void delayms(uint xms) //1ms; { uint i,j; for(i=xms;i 0;i--) for(j=110;j 0;j--) ; } /************************************************************************/ void UART_ini
[单片机]
ARM的串口通信配置
#include Usart.h #include stdio.h void usart_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; USART_ClockInitTypeDef USART_ClockInitStructure; ////////////////////////////////////////////////////////////////// // USART_ClockI
[单片机]
基于ARM的智能电子提花机控制系统设计
0 引 言 提花就是在织物的织造过程中对经线的升降加以控制,使其具有凹凸不平的立体感。随着电子技术的发展,纺织提花技术由最初的机械选针方式发展到现在的电磁选针方式。电子提花与机械提花相比,结构较为简单,花型控制更为灵活可靠。电子提花又有基于工控机和基于嵌入式单片机两种方案,后者比前者在可靠性、成本等方面更具有优势。 1 电子提花机嵌入式控制系统硬件设计 设计方案中,本文采用了核心板+底板的方式。在不修改核心板电路图的情况下,只要改变底板的功能单元,就可以方便得对系统的外围接口进行扩展。有利于二次开发,核心板框和底板框图如图1、2所示。 核心板上集成Samsung S3C2410处理器,32M的SDRAM以及8M的Fl
[应用]

推荐帖子

IAR全面支持小华全系芯片了~
管管今早看到的新闻,说IAR全面支持小华全系芯片了,涵盖通用控制、电机控制、汽车电子、超低功耗四大产品线,强化工控及汽车MCU生态圈。感兴趣的可以看下原文:https://news.eeworld.com.cn/qrs/ic662726.html文中还提到了小华出了新品,推出了HC32F448系列,备丰富的电机驱动专用Timer、高精度的模拟外设(包括ADC、DAC和电压比较器等)、以及充足的通信接口(U(S)ART、CAN)等。此外,它还具备宽温度范围和高可靠性,可应用在空调室外机
okhxyyo 汽车电子
串口调试助手V2.2
串口调试,串口监视,开发串口通信程序的好帮手串口调试助手V2.2下载看看Re:串口调试助手V2.2
maker 单片机
Linux术语大全(Linux Glossary)
•AccountName–SameasLoginID,UserID,orUserName.ThenameassignedtoauseronaUNIX/Linuxsystem.Multipleuserscanbesetuponasystemwithuniqueaccountnames,eachwithvaryingaccess(permission)levels.AfterLinuxinstalla
空气 Linux与安卓
有谁用过LMH6505芯片吗?能解决增益调节与偏置的问题?
有谁用过LMH6505芯片吗?能解决增益调节与偏置的问题?有谁用过LMH6505芯片吗?能解决增益调节与偏置的问题?LMH6505本身就是可变增益放大器。不知道楼主在问什么?就是我调他的1管脚电压,应该输出只是信号的幅值变化,现在竟然出现了直流偏置,而且调制增益的时候偏置也在变化。回复沙发dontium的帖子我希望用它来实现信号的可变增益放大和衰减,当我把1管脚的控制电压设为0到2伏,调节时本来应该是信号幅值在变,基线不变,但现在的情况是信号幅值却是变化了,和理想的一样,可水平
lyf870615 模拟电子
如何设计一款属于特殊用途的传感器?
各位坛友,谁有设计传感器的经验,如何设计一款具有某种功能的传感器呢?结合已有的电学等知识,例如满足食品的检测等,不是用现有的传感器,各位坛友们可以各抒己见啊咱们讨论讨论!如何设计一款属于特殊用途的传感器?首先,需要找到一种材料或基于某种效应,可以针对被测物理/化学参量做出可以观测到的反应,且这种反应必须是特异性的。然后,基于这种材料或效应,想办法使其成为可以实际应用的技术手段。最后,使这种手段足够廉价、稳定且应用尽量简便。需要电子元器件吗?联系我17615404088微信同号
rookiewws 医疗电子
Wince中如何使用本地socket?急问,多谢各位!
新手请教:本人是wm新人,现在在做一个从POXIS代码porting到wm的工作,现在被一个有关localsocket的问题困住了:原程序中使用的是:intsockfd;structsockaddr_inserv_addr;if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)//1{perror(socketcreateerror!);exit(1);}serv_addr.sin_family
xuchenjian WindowsCE
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved