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

📄 uart.c

📁 周立功开发板SmartArm2200 I2C中断方式读写板上EEPROM CAT1025,在MDK Keil环境下完成。实现了完整的串口输入输出
💻 C
字号:
/*****************************************************************************************
* 模块名称: 串口通讯模块
* 模块描述: 串口通讯模快,选择uart0作为通讯口
* 创建人  : hlb
* 创建日期: 2008-4-8
******************************************************************************************
* 修改人  :
* 修改日期:
*****************************************************************************************/
#include <LPC22xx.h>
#include "Public.h"
#include "Uart.h"
#include "Queue.h"
#include <string.h>

__irq void Uart_RcvTask(void);
/*****************************************************************************************
* 接收缓冲区定义
*****************************************************************************************/
#define RCVBUF_SIZE  20
typedef struct
{
  U8 D[RCVBUF_SIZE];
  U32 Idx;
}TRcvBuf;
static TRcvBuf UartBuf;
/*****************************************************************************************
* 函数名称: void Uart_Init(S32 Baud, S32 DataBit, S32 ODD, S32 StopBit) 
* 函数描述: 串口初始化
* 参数描述: Baud 波特率, DataBit 数据位,ODD 奇偶校验 0 禁止校验 1 奇校验 2 偶校验
*           StopBit 停止位
*****************************************************************************************/
void Uart_Init(U32 Baud, U32 DataBit, S32 ODD, U32 StopBit)
{
  U16    Fdiv;
  PINSEL0 = (PINSEL0 & 0xFFFFFFF0) | 0x5;  //选择引脚为串口
  //IO0DIR = IO0DIR | 0x1;         //TxD,P0.0 定义为输出
  //IO0DIR = IO0DIR & 0xFFFFFFFD;  //RxD,P0.1 定义为输入
  U0LCR = 0x83; //字长度
  
  if (StopBit ==1)
  {
    U0LCR = U0LCR & 0xFFFFFFFB; //一个停止位         
  }
  else
  {
    U0LCR = U0LCR | 0x00000004; //两个停止位
  }
  if (ODD == 0) //禁止校验
  {
    U0LCR = U0LCR & 0xFFFFFFF7; //禁止奇偶校验
  }
  else if (ODD == 1) //奇校验
  {
    U0LCR = U0LCR | 0x00000008; //使能奇偶校验
    U0LCR = U0LCR & 0xFFFFFFCF; //奇校验
  }
  else //偶校验
  {
    U0LCR = U0LCR | 0x00000008; //使能奇偶校验
    U0LCR = (U0LCR | 0x00000030) & 0xFFFFFFDF; //偶校验
  }
  
  Fdiv = (GD.Fpclk / 16) / Baud;
  U0DLM = (U8)(Fdiv >> 8);
  U0DLL = (U8)(Fdiv & 0x0FF);
  U0FCR = 0x7;
  U0LCR = U0LCR & 0x7F;  //禁止访问除数锁存寄存器
  memset(&UartBuf, 0, sizeof(TRcvBuf));

  VICIntSelect = VICIntSelect & (~(1 << 6)); //Uart0中断分配为IRQ中断
  VICIntEnable = VICIntEnable | (1 << 6); //允许Uart0中断
  
  VICVectAddr1 = (U32)Uart_RcvTask;
  VICVectCntl1 = 0x20 | 0x6;  //中断Uart0分配给中断优先级为0的中断槽
  U0IER = 0x1;  //使能Uart0接受中断
}
/*****************************************************************************************
* 函数名称: void Uart_SendByte(Byte Data) 
* 函数描述: 发送一个字节
*****************************************************************************************/
void Uart_SendByte(U8 data)
{
  U0THR = data;                 //发送数据
  while ((U0LSR & 0x40) == 0);  //等待数据发送完毕
}
/*****************************************************************************************
* 函数名称: Byte Uart_ReceiveByte(void) 
* 函数描述: 发送一个字节
*****************************************************************************************/
U8 Uart_ReceiveByte(void)
{
  U8 rcv_data;
  while ((U0LSR & 0x01) == 0);   //等待数据
  rcv_data = U0RBR;
  return (rcv_data);
}
/*****************************************************************************************
* 函数名称: void Uart_SendStr(U8 const * str) 
* 函数描述: 发送一个字节
*****************************************************************************************/
void Uart_SendStr(U8 const * str)
{
  while (TRUE)
  {
    if (*str == '\0') break;
    Uart_SendByte(*str++);
  }
}
/*****************************************************************************************
* 函数名称: void Uart_RcvISR(void) 
* 函数描述: Uart0接受中断服务程序
*****************************************************************************************/
    
__irq void Uart_RcvTask(void)
{
  static U8 rcv_data;
  if ((U0IIR & 0x0F) == 0x4)
  {
    if ((U0LSR & 0x1) == 1)
    {
      rcv_data = U0RBR;
      if (rcv_data == '@')
      {
        UartBuf.Idx = 0;
        UartBuf.D[UartBuf.Idx++] = rcv_data;
      }
      else if (rcv_data == '#')
      {
        if (UartBuf.Idx < RCVBUF_SIZE - 1)
        {
          UartBuf.D[UartBuf.Idx++] = rcv_data;
		  UartBuf.D[UartBuf.Idx] = 0;
          Queue_Put(&CommQueue, &UartBuf.D[0], UartBuf.Idx+1);
        }
      }
      else
      {
        if (UartBuf.Idx < RCVBUF_SIZE)
        {
          UartBuf.D[UartBuf.Idx++] = rcv_data;
        }
      }
    }
  }
  VICVectAddr = 0x0;
}

⌨️ 快捷键说明

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