您的位置 首页 FPGA

LPC1343串口学习

本节我们来使用LPC1343的UART接口做一个简单的收发实验。大家之前应该都有使用51或AVR一类单片机做过异步串行收发实验,当然串口在电子开发

本节咱们来运用LPC1343的UART接口做一个简略的收发试验。

咱们之前应该都有运用51或AVR一类单片机做过异步串行收发试验,当然串口在电子开发中的运用位置就无需多言。咱们直接进入主题。

本次试验这样规划,用PC作为上位机向UART发送一个(串)字节,然后LPC1343收到这个(串)字节后再发回UART,在PC上的串口调查软件显现出来。

咱们来看NXP带给咱们的UART例程来看看UART的设置以及作业进程。首要是主函数:
int main (void)
{
UARTInit(115200);//初始化UART接口并设置为波特率115200,NVIC也在内同时设置
while (1)
{
if ( UARTCount != 0 )
{
LPC_UART->IER = IER_THRE | IER_RLS;
UARTSend( (uint8_t *)UARTBuffer, UARTCount );//发送数据
UARTCount = 0;

LPC_UART->IER = IER_THRE | IER_RLS | IER_RBR;
}
}
}

从主函数就能够看到本次例程的意图了:初始化UART——一旦接纳到数据之后当即中止接纳——发送——敞开下一次接纳。最重要的当然是初始化函数UARTInit():

void UARTInit(uint32_t baudrate)
{
uint32_t Fdiv;
uint32_t regVal;

UARTTxEmpty = 1;
UARTCount = 0;

NVIC_DisableIRQ(UART_IRQn); //封闭UART中止,防止尔后的初始化有中止打断
LPC_IOCON->PIO1_6 &= ~0x07;
LPC_IOCON->PIO1_6 |= 0x01;
LPC_IOCON->PIO1_7 &= ~0x07;
LPC_IOCON->PIO1_7 |= 0x01;

LPC_SYSCON->SYSAHBCLKCTRL |= (1<<12);
LPC_SYSCON->UARTCLKDIV = 0x1;

LPC_UART->LCR = 0x83;
regVal = LPC_SYSCON->UARTCLKDIV;
Fdiv=(((SystemCoreClock*LPC_SYSCON->SYSAHBCLKDIV)/regVal)/16)
//baudrate ;

LPC_UART->DLM = Fdiv / 256; //写入波特率核算值高位
LPC_UART->DLL = Fdiv % 256; //写入波特率核算值低位
LPC_UART->LCR = 0x03;
LPC_UART->FCR = 0x07;

regVal = LPC_UART->LSR;

while (( LPC_UART->LSR & (LSR_THRE|LSR_TEMT)) != (LSR_THRE|LSR_TEMT) );
while ( LPC_UART->LSR & LSR_RDR )
{
regVal = LPC_UART->RBR;
}


NVIC_EnableIRQ(UART_IRQn);

#if TX_INTERRUPT //是否运用发送中止,本次例程运用
LPC_UART->IER = IER_RBR | IER_THRE | IER_RLS;
#else //所以履行此else
LPC_UART->IER = IER_RBR | IER_RLS;

#endif
return;
}

打星号的当地是笔者认为比较值得重视的当地:
1、UART的IO口设置,依据上述函数中的句子查找相关寄存器,能够发现它将P16、P17设置为:UART_RXD和UART_TXD功用;
2、挑选UART时钟分频数,此处1分频,和波特率设置有直接关系;
3、挑选数据格式,此处挑选数据长度8位,无校验,1位中止位,并敞开除数锁存;
4、除数锁存器:分为LSB(8位)和MSB(8位),用来填入对应某波特率的计数值,更改之前免除确定,更改结束康复确定,这样就能够确定波特率了(能够这样简略的了解);
5、核算波特率,此处是重点了。首要咱们必定知道体系中心频率为72MHz,即SystemCoreClock=72 000 000(参阅本系列前几章内容)。而UART作为AHB总线上的设备,天然要经过AHB分频器,在此处,AHB分频系数并未做过特别设置,所认为默认值1。时钟经过AHB分频之后要经过UART分频器进行再分频,分频系数仍为1(第2点)。因而咱们来核算这个公式:
Fdiv = (((SystemCoreClock*LPC_SYSCON->SYSAHBCLKDIV)/regVal)/16)/baudrate
其间SystemCoreClock=72000000,LPC_SYSCON->SYSAHBCLKDI=1,regVal=1,baudrate=115200,所以能够核算出:
Fdiv=39.0625≈0x27
这个就是发生115200波特率所要填入除数锁存器的值。逆过来就能够核算出计数值对应的波特率。
6、线状况寄存器(下文稍加叙述)是以读操作来清空的;
其实这个函数,关于用户来说,只需求填入想要发生的波特率作为函数参数就能够结束LPC1343的UART初始化以及波特率设定作业。
设定结束之后,UART就开端作业了,由于初始化函数里边敞开了“启用缓存数据可用中止、线状况中止”所以当有数据从上位机向UART发送数据时,进入中止服务函数:
void UART_IRQHandler(void)
{
uint8_t IIRValue, LSRValue;
uint8_t Dummy = Dummy;
IIRValue = LPC_UART->IIR;
IIRValue >>= 1;
IIRValue &= 0x07;
if (IIRValue == IIR_RLS)
{
LSRValue = LPC_UART->LSR;

if (LSRValue & (LSR_OE | LSR_PE | LSR_FE | LSR_RXFE | LSR_BI))
{

UARTStatus = LSRValue;
Dummy = LPC_UART->RBR;

return;
}
if (LSRValue & LSR_RDR)
{

UARTBuffer[UARTCount++] = LPC_UART->RBR;
if (UARTCount == BUFSIZE)
{
UARTCount = 0;
}
}
}
else if (IIRValue == IIR_RDA)
{

UARTBuffer[UARTCount++] = LPC_UART->RBR;
if (UARTCount == BUFSIZE)
{
UARTCount = 0;
}
}
else if (IIRValue == IIR_CTI)
{

UARTStatus |= 0x100;
}
else if (IIRValue == IIR_THRE)
{

LSRValue = LPC_UART->LSR;
if (LSRValue & LSR_THRE)
{
UARTTxEmpty = 1;
}
else
{
UARTTxEmpty = 0;
}
}
return;
}
这个中止服务函数是一个if…else if….else if结构。在进入此中止服务函数后,读取

中止标识寄存器判别中止源,挑选进入相应的if环节履行相应句子。咱们看看UART都有哪些中止。第一个是RLS,Receive Line Status即接纳线中止:
能够在用户手册查看到承受线中止别离有以下多种:
RDR :Receiver Data Ready,承受数据安排妥当中止;
OE:Overrun Error,即溢出过错中止;
PE:Parity Error,校验过错中止;
FE:Framing Error,帧过错中止;
BI:Break Interrupt,距离状况中止;
THRE:Transmitter Holding Register Empty,发送坚持寄存器空中止;
TEMP:Transmitter Empty,发送坚持寄存器与暂时寄存器空中止;
RXFE:Error in RX FIFO,RX过错中止;
对照上述中止服务函数第一个if部分,当判别确定为线中止之后,即判别是否是OE——RXFE中的任何一个过错,如果有过错,则读出数据有用保存,如果有过错,则读出数据但丢掉。
所以,线中止在进行数据校验的场合才会运用。而本次试验中并未用到数据校验位。所以此中止不会进入。
当不运用校验功用之时,收到数据之后会进入第一个else if结构:
else if (IIRValue == IIR_RDA)
{}
在进入此部分之后将数据读出。
当承受一个字符(5~8位不等)超不时,会进入“承受字符超时中止”部分。
发送结束中止在本次试验中并未使能,略过。
如此咱们应该能够预知本次试验中当PC上位机发送一个(串)字符之后,会进入中止服务函数而且进入else if (IIRValue == IIR_RDA{}环节,将收到的数据保存在UARTBuffer中,并使UARTCount++。然后退出中止函数之后,回到主函数,履行发送部分:
if ( UARTCount != 0 )
{
LPC_UART->IER = IER_THRE | IER_RLS;
UARTSend( (uint8_t *)UARTBuffer, UARTCount );//发送数据
UARTCount = 0;

LPC_UART->IER = IER_THRE | IER_RLS | IER_RBR;
}
}
找到UARTSend():
void UARTSend(uint8_t *BufferPtr, uint32_t Length)
{
while ( Length != 0 )
{

#if !TX_INTERRUPT//未运用中止发送方法,所以编译此部分
while ( !(LPC_UART->LSR & LSR_THRE) );//等候发送坚持寄存器空
LPC_UART->THR = *BufferPtr;//将待发数据写入发送坚持寄存器
#else

while ( !(UARTTxEmpty & 0x01) );
LPC_UART->THR = *BufferPtr;
UARTTxEmpty = 0;
#endif
BufferPtr++;
Length–;
}
return;
}
此UART数据发送函数,第一个参数要求填入寄存待发送数据(留意为8位,即字符型数据)的数组名,第二个参数为待发数据长度。经过注释能够看到发送的进程很简略,等候发送坚持寄存器为空后将数据写入发送坚持寄存器就结束了发送。
这样咱们就将本次的UART收发试验的进程“初始化——等候接纳——UART中止——保存数据——发送数据”剖析结束。
NXP赠送的这个LPC1343并没有挂载UART接口,而只留了P16、P17两个IO给用户拓宽,所以笔者运用了其他开发板的串口衔接,需求留意的是,咱们手上的这块开发板是3.3V供电,而市面上比较多选用的MAX232是5V供电。所以或许运用LPC1343评价板的5V给MAX232供电,或许运用3.3V供电的电平转化芯片。笔者这儿运用了3.3V供电的ST232芯片。
导入lpc1343.examples->uart,编译链接。连好硬件,从串口调试终端发送一个(串)数据,能够看到串口调试终端的接纳框里精确的显现了咱们所发送的数据,本次试验结束。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/fpga/261135.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部