⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test.c

📁 uart-test 基于lpc21系列的uart
💻 C
字号:
#include <LPC213x.h>


//#define Fpclk 11059200/4   //晶振是11.0592M,没有配置PLL和VPB分频器,故为默认值
#define Fpclk 12000000*5  //晶振是12M,
/********************************************************************
定义串口模式设置数据结构
********************************************************************/
typedef struct uartmode
{
 unsigned char datab;    //字长度,5/6/7/8可选
 unsigned char stopb;    //停止位,1/2可选
 unsigned char parity;    //奇偶校验位,0无1奇2偶
}UARTMODE;

unsigned char rcv_buf[8];   //UART数据接收缓冲区
volatile unsigned char rcv_new;//接收新数据标志

/***************************************************************************
函数名称:IRQ_UART()
函数功能:串口0接收中断服务程序
入口参数:无
出口参数:无
***************************************************************************/
void IRQ_UART (void) __irq
{
 unsigned char i;
 
 if((U0IIR & 0x0F) == 0x04)
  rcv_new = 1;         //设置接收到新的数据标志
 for(i = 0; i < 8; i ++)     //FIFO使能时设为8字节长度
 {
  rcv_buf[i] = U0RBR;      //读取FIFO的数据,并清除中断
 }
 VICVectAddr = 0x00;       //中断处理结束,更新硬件优先级
}

/***************************************************************************
函数名称:UART_SendByte()
函数功能:向串口发送字节数据
入口参数:dat 要发送的数据
出口参数:无
***************************************************************************/
void UART_SendByte(unsigned char dat)
{
 U0THR = dat;
}

/*************************************************************************************
函数名称:UART_SendBuf()
函数功能:向串口发送8字节数据
入口参数:无
出口参数:无
*************************************************************************************/
void UART_SendBuf(void)
{
 unsigned char i;
 for(i = 0;i <8; i++)
  UART_SendByte(rcv_buf[i]);
 while((U0LSR & 0x20) == 0);    //等待数据发送完毕
}

/*************************************************************************************
函数名称:UART_Init()
函数功能:串口初始化,设置工作模式和波特率
入口参数:baud 波特率
     set 模式设置
出口参数:1为初始化成功 0为初始化失败
*************************************************************************************/
unsigned char UART_Init(unsigned long baud,UARTMODE set)
{
 unsigned long bak;
 /**参数过滤**/
 if((baud == 0)||(baud > 115200)) return(0);
 if((set.datab < 5)||(set.datab > 8)) return(0);
 if((baud == 0)||(baud > 115200)) return(0);
 if((set.parity > 4)) return(0);
 
 /**设置串口波特率**/
 U0LCR = 0x80;       //DLAB = 1
 bak = (Fpclk /64)/baud;
 U0DLM = bak >>8;
 U0DLL = bak & 0xff;
// U0DLM = 0x00;
// U0DLL = 0x12;
 
  /* 设置串口模式 */
    bak = set.datab-5;                    // 设置字长度
    if(set.stopb==2)
    {
       bak |= 0x04;             // 判断是否为2位停止位 
    }
    if(set.parity!=0)
    {
        set.parity = set.parity-1;
        bak |= 0x08;
    }
    bak |= set.parity<<4;                // 设置奇偶校验
    U0LCR = bak;

    return(1);
}

/*************************************************************************************
函数名称:main()
函数功能:从串口接收字符串,并送回上位机显示
*************************************************************************************/
int main()
{
 UARTMODE set;
 set.datab = 8;  //字长度8位
 set.stopb = 1;  //1位停止位
 set.parity = 0;  //无奇偶校验
 rcv_new = 0;
 PINSEL0 = (PINSEL0 & (~0x0F))|0x05;   //设置I/O连接到UART0
 
 UART_Init(9600,set);
 U0FCR = 0x81;              //使能FIFO,并设置触发点为8字节
 U0IER = 0x01;              //允许RBR中断
 
 VICIntSelect = 0x00000000;       //设置所有通道为IRQ中断
 VICVectCntl0 = 0x20|0x06;        //UART0分配到IRQ slot0,即具有最高优先级
 VICVectAddr0 = (unsigned long)IRQ_UART; //设置UART的向量地址
 VICIntEnable = 1<<0x06;         //使能UART中断
 
 while(1)
 {
  if(rcv_new == 1)
  {
   rcv_new = 0;
   UART_SendBuf();
  }
 }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -