当前位置:
文档之家› UART串口通讯中断.ppt
UART串口通讯中断.ppt
• {int i;
• switch(U0IIR & 0x0f)
•{
• case 0x04:
//RxFIFO达到14字节
•
for(i=0;i<13;i++) RcvBuf[RcvP++]=U0RBR; break;
•
case 0x0c:
//接收超时, 表示数据结束
•
while(U0LSR & 0x01) RcvBuf[RcvP++]=U0RBR;
• VICIntSelect |= 1<<6; //选择UART0为IRQ
• VICIntEnable = 1<<6; //允许UART0中断
• VICVectCntl15 = 0x20 | 6;
• VICVectAddr15= (int)UART0_IRQHandler;
•}
中断服务函数
• void UART0_IRQHandler(void)
0 使能FIFO
• UART发送FIFO缓冲区
• UART0、UART1各含有1个 16字节的发送FIFO缓冲区。
• UnTHR是UARTn发送FIFO 的最高字节。
• UART的发送FIFO是一直使 能的。
UnTHR
发送FIFO
UnTSR
TXD
• UART线状态寄存器——UnLSR
线状态寄存器(UnLSR)为只读寄存器,它提 供UARTn发送和接收模块的状态信息 。
U0IER = 0X07; // THRE中断使能
RcvL=0;} //结束处理
…… //其它主程序处理
•}
• return(0);
•}
练习
• 通过PC串口助手或其它串口工具发送字符 串
• 将该字符串前面添加响应字符“>”,字符串 后添加结束字符“#”,然后传送回PC
• 比如接收到包“This is a test string!”,则返 回字符串“> This is a test string!#”
UART串口通讯
中断方式LPC21XX串口通讯
• UART结构图
CTS DSR
RI DCD DTR RTS
MODEM
Modem控制寄存器 U1MCR
Modem状态寄存器 中断使能寄存器
B 总
UnIER
线
中断标志寄存器 UnIIR
UARTn高速缓存寄存器 UnSCR
UARTn发送单元
UART线状态寄存器
位
7
6
5
4
3
2
1
0
功能 RXFE TEMT THRE BI FE PE OE RDR
RxFIF 发送 O错误 器空
发送 保持 寄存 器空
间隔 中断
帧错 误
奇偶 错误
溢出 错误
接收 数据 就绪
中断方式UART0初始化
• void UART0_Ini(void)
• { uint16 Fdiv;
发送缓冲寄存器
UnTHR
移位寄存器 UnTSR
UARTn波特率发生器
除数锁存寄存器
UnDLL、UnDLM
UARTn接收单元
接收缓冲寄存器
UnRBR
移位寄存器 UnRSR
FIFO控制寄存器(UnFCR)
UARTn控制寄存器(UnLCR) UARTn状态寄存器(UnLSR)
TxDn RxDn
• UART接收FIFO缓冲区
• PINSEL0 = (PINSEL0 & 0x0fffffff0) | 0x00000005;
•
// 只修改P0.0和P0.1连接到UART0,教材P174表4.53
• U0LCR = 0x83;
•
// DLAB = 1,允许设置波特率, 教材P288
• Fdiv = (Fpclk / 16) / UART_BPS; // 设置波特率
• 该练习主要锻炼中断发送接收程序设计, 以及通过接收超时区分数据包间隔
• 课后编写MODBUS RTU协议的3号从协议 功能,下次课堂测试该功能。
•
RcvL=RcvP; //一帧数据结束标志
•
RcvP=0; break;
//准备接受下一数据
• case 0x02:
//发送缓冲器空
•
if(TxdP==TxdL) {U0IER = 0X05;
// THRE中断禁止
•
TxdL=TxdP=0;}
•
else {for(i=16;i>0;i--) {if(TxdP==TxdL) break; //发送字符完
•
else U0THR = TxdBuf[TxdP++];} } break;
• case 0x06:
//状态中断
•
RcvL=U0LSR; //读状态, 清除错误标志
•
RcvP=RcvL=TxdP=RxdL=0; break;
• }}
演示程序
• int main(void)
• { uint8 RcvP=0,RcvL=0,TxdP=0,RxdL=0;
• UART0、UART1各含有1 个16字节的接收FIFO缓冲 区。
• 软件设置接收FIFO缓冲区 的触发字节。
UnRSR
RXD
接收FIFO
UnFCR
UnRBR
位
7
6
功能
Rx触发点设置
00:1字节
01:4字节
10:8字节
11:14字节
UART FIFO控制寄存器
[5 : 3]
2
—
复位TxFIFO
1 复位RxFIFO
char RcvBuf[256],Txdbuf[256];
• int i=0;
• UART0_Ini();
• while(1)
• { if(RcvL!=0){ //接收到完整数据包
……
• for(i=16;i>0;i--) {if(TxdP==TxdL) break; //发送字符完
•
else U0THR = TxdBuf[TxdP++];}
• U0DLM = Fdiv / 256;
//教材P283
• U0DLL = Fdiv % 256;
• U0LCR = 0x03; // 8位数据位,1位停止位,无奇偶校验
• U0FCR = 0x0C7; // 使能和复位TX和RX FIFO, Rx触发点为14字节
• U0IER = 0X05; //RBR、Rx线状态 中断使能, THRE中断禁止,P284