原创 LPC的UART0通信(查询方式)

2010-4-30 11:17 4502 8 8 分类: MCU/ 嵌入式

        折腾了两天的板子,终于有些反应了。先用周立功提供的ADS的模板,改了周立功的程序只发送数据,没有数据输出。检查没发现什么问题,怀疑可能是模板的问题,用的是ARM Executable Image for lpc2100的模板。改了程序只做给一个GPIO输出高低电平点亮LED的实验,还是没有反应,估计是这个板子和周的模板不匹配,需要做一些修改吧,可惜菜鸟不会改。


        用KEIL for ARM ,按照板子附带的测试程序设置target,改了里面的程序,给一个GPIO输出高低电平点亮LED的实验,果然可以了。用这个startup.s,开始做串口的实验。测试程序用的是printf()的函数,想更加直观的了解寄存器的用法,用周的程序,发送的是乱码。。。所以自己写发送程序。


 


 #include <LPC21xx.H>              /* LPC21xx definitions                      */


#include "Main.h"      //包含数据类型定义和常用数据的define


//--------------------------------------------------------------------------------
void UART0_Init (void)  
{
 UINT16 Fdiv;


 PINSEL0 = 0x00000005;
 U0LCR = 0x83;                  // DLAB = 1,可设置波特率
 Fdiv = (Fpclk / 16)/ UART_BPS;             // 设置波特率 ,已define UART_BPS为115200
 U0DLM = Fdiv / 256;       
 U0DLL = Fdiv % 256; 
 U0LCR = 0x03;
}


/***************PLL初始化**************/
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; 
}


//--------------------------------------------------------------------------------
int main (void)
{  
  UINT32 i;   
  UINT8 string[]="Hello World\n";


  PLL_Init();     //芯片内部锁相环设置(系统和各部份工作频率设置)
  UART0_Init();    //串口初始化和设置波特率

 while(1)
 { 
   sendchar(string[j]);


   sendstr(string);


   for(i=0; i<0xfffff; i++);
 }
}  


sendchar() 和sendstr()函数放在serial.c中,方便以后其他程序调用。


int sendchar (int ch)  {                 /* Write character to Serial Port    */


 /* if (ch == '\n')  {      //如果有\n,则输入的ASCII码为0x0D,换行
    while (!(U0LSR & 0x20));    //没有这段程序,依旧可以换行
    U0THR = CR;                          // output CR ASCII的回车名称
  }
 */
  while (!(U0LSR & 0x20));     /*UxLSR 第5位 发送保持寄存器空 0:UxTHR 包含有效数据   1: UxTHR 空  
               UxLSR 第6位 发送器空 0:UxTHR 或 UxTSR 包含有效数据   1: UxTHR 和 UxTSR 空 */   
  return (U0THR = ch);


 void sendstr(unsigned char *str)
{   
 char ch;
 while ((ch=*str++) !='\0')
  sendchar(ch);
}


再用周的程序,也出来结果了,呵呵。


/********************************************************************************************************
**    函数名称: UART0_SendByte()
**    函数功能: 从串口发送1字节数据,并等待发送完毕,使用查询方式
**    入口参数: dat 要发送的数据
**    出口参数: 无
********************************************************************************************************/


void UART0_SendByte(uint8 dat)
{
 U0THR = dat; // 发送数据 
 while( (U0LSR & 0x40)==0 );  // 等待数据发送完毕 
}       


/********************************************************************************************************
**    函数名称: UART0_SendStr()
**    函数功能: 从串口发送一字符串
**    入口参数: str 指向要发送的字符串的指针  
**    出口参数: 无
********************************************************************************************************/


void UART0_SendStr(uint8 const *str)
{
 while(1)
 {
  if (*str == '\0')      //结束符
  break;     
  UART0_SendByte(*str++);     //发送数据
 }
}

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
8
关闭 站长推荐上一条 /3 下一条