您的位置 首页 模拟

Cortex-M3学习日志(四)– UART0试验

LPC1768含有4个符合16C550工业标准的异步串口UATR0-UART3,其中UART1具有标准的MODEM接口和RS232。至于RS232的标准是什么样的,这里不在总

LPC1768含有4个契合16C550工业规范的异步串口UATR0-UART3,其间UART1具有规范的MODEM接口和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,功用便是按一下按键亮一个灯,等全亮时,再按按键灯全来,然后再按按键时第按一下点亮一个,循环往复,一起哪个灯亮,就发送字符“LedXon”,下面是这次试验的电路图:



1-1试验电路图

下面简略说一下这个软件,软件首要分为两大部分,一个是关于串口装备及常用的函数,另一个便是主LED点灯程序,分别在UART.C与MAIN.C两个源文件中,下面把部分代码帖出来,完好部分请参阅附件:

(1)、uart.c源文件

#include “includes.h”

void UARTInit( uint32_t PortNum, uint32_t baudrate )

{

uint32_t Fdiv;

if ( PortNum == 0 )

{

PINCON->PINSEL0 |= (1 << 4);

PINCON->PINSEL0 |= (1 << 6);

UART0->LCR= 0x83;

Fdiv = (SystemFrequency/4/ 16) / baudrate;

UART0->DLM= Fdiv / 256;

UART0->DLL= Fdiv % 256+1;

UART0->LCR= 0x03;

UART0->FCR= 0x07;

}

else if ( PortNum == 1 )

{

PINCON->PINSEL4 |= (1<<1);

PINCON->PINSEL4 |= (1<<3);

UART1->LCR = 0x83;

Fdiv = (SystemFrequency/4/16)/ baudrate ;

UART1->DLM = Fdiv/256;

UART1->DLL = (Fdiv%6)+1;

UART1->LCR = 0x03;

UART1->FCR = 0x07;

}

}

void UARTSend( uint32_t portNum, uint8_t *BufferPtr, uint32_t Length )

{

if ( portNum == 0 )

{

while ( Length != 0 )

{

while ( !(UART0->LSR & 0x20) );

UART0->THR = *BufferPtr;

BufferPtr++;

Length–;

}

}

else

{

while ( Length != 0 )

{

while ( !(UART1->LSR & 0x20));

UART1->THR = *BufferPtr;

BufferPtr++;

Length–;

}

}

return;

}

int UART0_SendByte (int ucData)

{

while (!(UART0->LSR & 0x20));

return (UART0->THR = ucData);

}

void UART0_SendString (unsigned char *s)

{

while (*s != \0)

{

UART0_SendByte(*s++);

}

}

(2)、main.c源文件

#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 char OpenString[][50] = {

“**********************************************\r\n”,

“****–欢迎光临–****\r\n”,

“****小野兽的小草窝^_^****\r\n”,

“**** http://blog.ednchina.com/ytfdhb/****\r\n”,

“****我是懒猫爱飞,我的标语是:****\r\n”,

“****每天前进一点点,高兴多一点^_^****\r\n”,

“**********************************************\r\n”

};

unsigned int key_sta = 0;

unsigned int key_pre = 1;

unsigned int key_old = 1;

unsigned int led_flag = 0;

unsigned intStepCnt = 0;

void SysTick_Handler (void)

{

SysTickCnt++;

}

void DelayMs (unsigned long tick)

{

unsigned long systickcnt;

systickcnt = SysTickCnt;

while ((SysTickCnt – systickcnt) < tick);

}

void PortInit(void)

{

GPIO1->FIODIR = 0xB0000000;

GPIO2->FIODIR = 0x0000007C;

LedAllOff();

}

void KeyScan()

{

key_pre = KEY_EN ;

if(!KEY_EN )

{

if(key_old)

{

if(key_pre == 0)

{

key_sta = 1;

}

}

}

key_old = key_pre;

}

void KeyHandle(void)

{

if(key_sta == 1)

{

StepCnt++;

if(StepCnt == 9)

{

UART0_SendString (LedOffMeg);

}

if(StepCnt < 9)

{

LedOnMeg[4] = StepCnt+0x30;

UART0_SendString (LedOnMeg);

}

key_sta = 0;

}

}

void LedHandle()

{

switch(StepCnt)

{

case 1:Led1On();

break;

case 2:Led2On();

break;

case 3:Led3On();

break;

case 4:Led4On();

break;

case 5:Led5On();

break;

case 6:Led6On();

break;

case 7:Led7On();

break;

case 8:Led8On();

break;

case 9:LedAllOff();

StepCnt = 0;

break;

default:break;

}

}

int main(void)

{

unsigned int i = 0;

SystemInit();

SysTick_Config(SystemFrequency/1000 – 1);

PortInit();

UARTInit(0,19200);

for(i=0;i<7;i++)

{

UARTSend(0,OpenString[i],50);

}

//LedOnMeg[4] = 4+0x30;

//UART0_SendString (KeyMeg);

while(1)

{

KeyScan();//按键扫描

KeyHandle(); //按键处理

LedHandle(); // Led处理程序

}

}

程序不是太难,仅仅简略的试验,各个部分都有具体的注释,这儿不在总结,下面是挨靠成果串口调试帮手截图:



1-2串口帮手截图

好了,先总结到这吧,最近手头上的事有点多,所以写日志的时刻就有点严重,不过,作业归作业,该学习的东东仍是要坚持学习的,没有满足的时刻,那就见缝插针的学吧。

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部