微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM7学习---UART0练习

ARM7学习---UART0练习

时间:11-18 来源:互联网 点击:
前段时间在练习ARM7的时候遇到一个问题,就是串口通信一直没成功,数据总是出错,好像是波特率没设置好。但是我找了很久都没找出原因。昨天又看数据手册,后来找到了原因,是LPC2103的PLL等时钟没配置好,所以导致了波特率和我设置的不一样。

以下是调试成功的示例程序:

/**************ARM7(LPC2103)练习程序**************************/
/*************************************************************/
/*****File Function : UART test *****/
/*****Program Author : ZhengWen(ClimberWin) *****/
/*****MCU : LPC2103F 外部11.0592M晶振 *****/
/*****Compile Date : 2009/12/3 *****/
/*****Edition Info : V1.0 *****/
/*************************************************************/
//编译环境 KEIL for ARM
//功能描述:串口练习,使用UART0向串口发送字符和字符串
//接收串口数据并且+1后发回给串口

//修改日期 2010年2月8日。
//以前是系统的各部分时钟没配置好,所以导致波特率不对,现在可以正常工作。
#include
#include
#define uint unsigned int
#define uchar unsigned char

#define baudrate 9600 //设置波特率
#define PE (U0LSR&0x40)//定义串口数据发送忙碌与否,PE=1忙碌;PE=0;不忙绿

#define Fosc(11059200)//晶振频率,10MHz~25MHz,应当与实际一至
#define Fcclk(Fosc * 6) //66.3552 系统频率,必须为Fosc的整数倍(1~32),且<70MHZ
#define Fcco(Fcclk * 4) //CCO频率,必须为Fcclk的2、4、8、16倍,范围为156MHz~320MHz
#define Fpclk(Fcclk / 4) * 1 //016.5888,VPB时钟频率,只能为(Fcclk / 4)的1 ~ 4倍

void delayms(unsigned int count); //延时程序
void UART0_INT(void); //串口初始化
void UART0_SendByte(unsigned char data); //串口发送字节
void UART0_SendStr(unsigned char const *str);//串口发送字符串

void PLL_Init(void)
{
/* 设置系统各部分时钟 */
PLLCON = 1;
#if ((Fcclk / 4) / Fpclk) == 1
VPBdiv = 0;
#endif
#if ((Fcclk / 4) / Fpclk) == 2
VPBdiv = 2;
#endif
#if ((Fcclk / 4) / Fpclk) == 4
VPBdiv = 1;
#endif
#if (Fcco / Fcclk) == 2
PLLCFG = ((Fcclk / Fosc) - 1) | (0 < 5);
#endif
#if (Fcco / Fcclk) == 4
PLLCFG = ((Fcclk / Fosc) - 1) | (1 < 5);
#endif
#if (Fcco / Fcclk) == 8
PLLCFG = ((Fcclk / Fosc) - 1) | (2 < 5);
#endif
#if (Fcco / Fcclk) == 16
PLLCFG = ((Fcclk / Fosc) - 1) | (3 < 5);
#endif
PLLFEED = 0xaa;
PLLFEED = 0x55;
while((PLLSTAT & (1 < 10)) == 0);
PLLCON = 3;
PLLFEED = 0xaa;
PLLFEED = 0x55;
}

/*************延时程序***************/
void delayms(unsigned int count)
{
unsigned int i,j;
for(i=0;ifor(j=0;j<5000;j++);
}
/***********串口0初始化**********************/
void UART0_INT(void)
{ unsigned int U0DL;

U0LCR = 0x83; // DLAB = 1,可设置波特率;无奇偶校验 1位停止位 8位数据长度。
U0DL = (Fpclk/16)/baudrate;
U0DLM= U0DL/256; //高8位
U0DLL = U0DL%256; //低8位
U0LCR = 0x03; // DLAB = 0,设置好波特率;无奇偶校验 1位停止位 8位数据长度。
}
/***********串口发送字节**********************/
void UART0_SendByte(unsigned char data)
{
U0THR = data; //发送数据
while( PE==0 ); //等待数据发送完毕 PE=1忙碌;PE=0;不忙绿

}
/***********串口发送字符串**********************/
void UART0_SendStr(unsigned char const *str)
{ while(1)
{ if( *str == \0 ) break;
UART0_SendByte(*str++); //发送数据
}
}
/*************串口接收字符*************************/

unsigned char UART0_GetChar(void)
{

while (!(U0LSR & 0x01));
return (U0RBR);
}
/////////////主程序///////////////////
int main(void)
{
unsigned char temp;

PINSEL0 = 0x00000005; //设置I/O连接到UART0
PINSEL1 = 0x00000000;

PLL_Init();//系统时钟配置,必须设置
UART0_INT(); //串口初始化
UART0_SendStr("LPC2103 UART0 Test OK!"); //向串口发送字符串
delayms(1000);
while(1)
{
temp=UART0_GetChar(); //接收串口数据
UART0_SendByte(temp+1); //串口数据+1后发回到电脑串口
}
return(0);
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top