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

📄 uart.cpp

📁 LPCARM之I2C中断读写CAT1025C++程序祥解 LPCARM之I2C中断读写CAT1025C++程序祥解
💻 CPP
字号:
#include "LPC213XDEF.h"
#include "main.h"
#include "uart.h"

extern "C" void IRQ_UART0 (void) __irq;

UartObj::UartObj(void)
{
  Init();
}

void UartObj::Init(void)
{
unsigned int Fdiv;
  TxCount = 0;
  RxCount = 0;
  TxdCount = 0;
  RxdCount = 0;
  TxBusy = 0;
  PINSEL->PIN_SEL0 |= (P0_0_TXD0 << P0_0_PINSEL) | (P0_1_RXD0 << P0_1_PINSEL); //设置I/O连接到UART0

  U0->LCR = 0x83;// DLAB=1,允许设置波特率
  Fdiv  = (Fpclk / 16) / UART_BPS;// 设置波特率38400
  U0->DLM = Fdiv / 256;
  U0->DLL = Fdiv % 256;
  U0->LCR = 0x03;
  U0->FCR = 0xc7;/* 初始化FIFO 接收14个字节就中断*/
  U0->IER = 0x07;/* 允许接收发送中断 */
  VIC->VectAddrs[0] = (unsigned int)IRQ_UART0;
  VIC->VectCntls[0]   = VICIntSel_Enable//使能IRQ中断
                      | VICIntSel_UART0;//获取UART0的IRQ级别
  VIC->IntEnable |= (1 << VICIntSel_UART0);
}

void UartObj::putchar(unsigned char ch)
{
  TxBuffer[TxCount] = ch;
  TxCount ++;
  if (ch == '\n') {
/*-----------------------------------------------------------------
    串口激活部分代码
当Uart.TxBusy=1时表示串口忙正在发送数据,这是就不需用软件激活。
因为串口FIFO中最后一个字节的数据发送结束时还要引发一次中断。
否则在Uart.TxBusy=0时,由于串口闲,不可能进入发送中断。故需两种
办法来激活发送中断:
1.取出一个字节发送出去,在发送中断里再发送后续字节。
2.用VIC->SoftInt = (1 << VICIntSel_UART0);//模拟51的TI=1来引发发送中断
-----------------------------------------------------------------*/
	if (!TxBusy) {//发送器不忙可以立即发送
	  VIC->SoftInt = (1 << VICIntSel_UART0);//模拟51的TI=1来引发发送中断
	}
  }
}

void UartObj::puts(const char str[])
{
  while (*str) {
    putchar(*str++);
  }
}

void UartObj::Wait(void)
{
  while(TxBusy);//等待串口数据发送结束
}

void UartObj::UartExec(void)
{
unsigned int i;
unsigned char ch;
  switch(U0->IIR & 0x0f) {
    case 0x06://接收线状态
	  switch (U0->LSR) {
	    case 0x63:
		  break;
	  }
	  break;
/*-----------------------------------------------------------------
    串口接收部分代码
用while循环从FIFO中快速地取出全部数据,也可不用循环每次取出一个字节
的数据但达不到FIFO的功效。
-----------------------------------------------------------------*/
    case 0x04://接收数据可用
    case 0x0c://字符超时指示
	  while (U0->LSR & 0x01) {//从FIFO中取出全部数据
	    ch = U0->RBR;//从FIFO中取出1个字符的数据
	    RxBuffer[RxCount ++] = ch;//暂存入缓冲区
	  }
      break;
/*-----------------------------------------------------------------
    串口发送激活部分代码
由于U0->IIR & 0x0f==1时为LPCARM保留中断,可用于软件模拟激活UART0中断
利用此漏洞来实现非典的思想来达到实战的要求。
-----------------------------------------------------------------*/
	case 0x01://LPCARM保留中断,可用于软件模拟激活UART0中断
     if (!(VIC->SoftInt & (1 << VICIntSel_UART0))) {//硬件UART0中断
	   break;//正常的UART0中断退出
	 }
	 //至此成功利用了软件模拟中断偷入敌阵~~~继续运行,以达到发送首字符的目的
/*-----------------------------------------------------------------
    串口发送部分代码
这里主要是充分地利用LPCARM的16个字节的FIFO来实现“无限FIFO”
-----------------------------------------------------------------*/
    case 0x02://THRE中断
  	  TxBusy = TxCount != TxdCount;//保证FIFO发送全部结束时,缓冲区空不拒绝发送
	  for (i = 0; (i < 16) && (TxCount != TxdCount); i ++) {//1次写入FIFO最多16个字节
		ch = TxBuffer[TxdCount ++];//取出缓冲区1个字节数据
	    U0->THR = ch;//将缓冲区1个字节数据写入FIFO
	  }
	  VIC->SoftIntClr = (1 << VICIntSel_UART0);//这里必须清除此软件标志!!!
	  break;
  }
}

⌨️ 快捷键说明

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