我在初始化时,已经把发送中断与接收中断都打开了。为什么我发数据时。不进发送中断啊???数据也发不出去。但是接收是这常的。请高手们指点。。。。。
程序如下: #include "config.h"
#define buffer 64
const uint32 LED1 = (1 << 18); // P1.18控制LED1,低电平点亮
uint8 Err[]="abcdefgh";
/* 定义串口模式设置数据结构 */ typedef struct { uint8 datab; // 字长度,5/6/7/8可选 uint8 stopb; // 停止位,1/2可选 uint8 parity; // 奇偶校验位,0-无校验,1-奇校验,2-偶校验 }UartMode;
typedef struct { uint8 RxBuffer[buffer], TxBuffer[buffer]; //定义发送与接收缓冲区 uint8 RxWrite, RxRead; //定义接收存、取指针 uint8 TxWrite, TxRead; //定义发送存、取指针 uint8 TxFlag; //定义发送空标志 }UartStruct;
UartStruct Uart;
volatile uint8 rcv_new; // 接收新数据标志
/* ********************************************************************************************************* ** 函数名称 :IRQ_UART0() ** 函数功能 :串口0接收中断服务程序 ** 入口参数 :无 ** 出口参数 :无 ********************************************************************************************************* */ void IRQ_UART0 (void) __irq { uint8 i, IIR; while(((IIR = U0IIR)&0x01) == 0) //中断处理完成后退出 { //有中断未处理完 switch(IIR&0x0e) { case 0x02: //发送中断(THER) for(i = 0; i < 16; i++) { if(Uart.TxRead == Uart.TxWrite) { Uart.TxFlag = 1;//发送空标志置1 break; } else { U0THR = Uart.TxBuffer[Uart.TxRead++]; //取发送缓冲区的数据 if(Uart.TxRead >= buffer) { Uart.TxRead = 0; } } } break;
case 0x04: //接收中断(RDA) case 0x0c: //字符超时指示(CTI) while (U0LSR & 0x01) //从FIFO中取出全部数据 { Uart.RxBuffer[Uart.RxWrite++] = U0RBR; if(Uart.RxWrite >= buffer) { Uart.RxWrite = 0; } Uart.TxFlag = 0; } break;
case 0x06: //接收线状态(RLS) //ErrState = U0LSR; // 清除出错中断 //ErrState = U0RBR; // 读出出错字符并放弃 break;
default: break; } } VICVectAddr = 0x00; // 中断处理结束 }
/* ************************************************** ** 函数名称 :UartTxStar() ** 函数功能 :把数据写入发送缓冲区,并启动发送中断。 ** 入口参数 :TxAddr 定义数组 ** Num ** 出口参数 : ************************************************** */ void UartTxStar(uint8 *TxAddr, uint8 Num) { for(; Num > 0; Num--) { Uart.TxBuffer[Uart.TxWrite++] = *TxAddr; if(Uart.TxWrite>=buffer) { Uart.TxWrite = 0; } TxAddr++; } }
/* ********************************************************************************************************* ** 函数名称 :UART0_Init() ** 函数功能 :串口初始化,设置工作模式和波特率。 ** 入口参数 :baud 波特率 ** set 模式设置(UARTMODE数据结构) ** 出口参数 :1-初始化成功, 0-初始化失败 ********************************************************************************************************* */ int8 UART0_Init (uint32 baud, UartMode set) { uint32 bak; /* 参数过滤 */ if ((baud ==0 ) || (baud > 115200)) return (0); if ((set.datab <5) || (set.datab > 8)) return (0); if ((set.stopb == 0) || (set.stopb > 2)) return (0); if (set.parity > 4) return (0); /* 设置串口波特率 */ U0LCR = 0x80; // DLAB = 1 bak = (Fpclk >> 4) / baud; U0DLM = bak >> 8; U0DLL = bak & 0xFF; /* 设置串口模式 */ 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() ** 函数功能 :从串口UART0接收字符串"ABCDEFGH",并发送回上位机显示。 ** 调试说明 :需要PC串口显示终端软件如EasyARM.exe。 ********************************************************************************************************* */ int main (void) { UartMode set;
set.datab = 8; set.stopb = 1; set.parity = 0;
Uart.RxWrite = 0; Uart.RxRead = 0; Uart.TxWrite = 0; Uart.TxRead = 0; rcv_new = 0; PINSEL0 = (PINSEL0&(~0x0F))|0x05; // 设置I/O连接到UART0 PINSEL2 = PINSEL2 & (~0x08); // P1[25:16]连接GPIO IO1DIR = LED1; // 设置LED1控制口为输出 UART0_Init(115200, set) // 串口初始化 U0FCR = 0x81; // 使能FIFO,并设置触发点为8字节 U0IER = 0x03; // 允许RBR中断,即接收中断 允许发送中断 /* 使能UART0中断 */ VICIntSelect = 0x00000000; // 设置所有的通道为IRQ中断 VICVectCntl0 = 0x20 | 0x06; // UART0分配到IRQ slot0,即最高优先级 VICVectAddr0 = (uint32)IRQ_UART0; // 设置UART0向量地址 VICIntEnable = 1 << 0x06; // 使能UART0中断 while (1) { UartTxStar(Err, 8); } }
|