理论教育 ARM嵌入式系统基础与应用:UART中断方式处理未处理中断

ARM嵌入式系统基础与应用:UART中断方式处理未处理中断

时间:2023-11-03 理论教育 版权反馈
【摘要】:图4-3 UART的Proteus仿真电路例4-4 采用查询方式,通过UART0接收上位机发送的字符串,然后送回上位机显示。而采用中断方式进行,则可以避免这些问题。中断服务处理子程序必须判断是否有尚未处理的中断。

ARM嵌入式系统基础与应用:UART中断方式处理未处理中断

使用UART之前,必须先对引脚进行配置。进行如下设置可将P0.0、P0.1选择UART0功能:

978-7-111-44508-1-Chapter04-32.jpg

进行如下设置可将P0.8、P0.9选择UART1功能:

978-7-111-44508-1-Chapter04-33.jpg

LPC2138的两个串口具有完全相同的寄存器,只是物理地址不一样。寄存器UxRBR与UxTHR是同一地址,但物理上是分开的,读操作时为UxRBR,而写操作时为UxTHR。

寄存器UxDLL与UxRBR/UxTHR、UxDLM与UxTER具有相同的地址。如果要访问UxDLM、UxDLL,除数访问位DLAB必须为1,若要访问UxRBR/UxTHR、UxTER,则除数访问位DLAB必须为0。

UxDLM和UxDLL寄存器是波特率发生器的除数锁存寄存器,用于设置合适的串口波特率;波特率的除数计算公式如下:

UxDLM、UxDLL=Fpclk/(16×baud)

其中,baud为所需要的波特率。

UxRBR为数据接收缓冲,用于读取接收到的数据,若FIFO使能,串口接收到的数据会压入FIFO缓冲;UxTHR为发送保存,向此寄存器写入数据时,将会引起串口数据发送,若FIFO使能,数据将会压入FIFO缓冲。

通过线控制寄存器LCR设置串口的工作模式,而FCR则用于FIFO的使能或者复位操作;当接收或者发送数据的时候,会产生相应的状态标志位(LSR);通过对IER进行设置,可实现串口的发送、接收、出错中断等。

注意,IER中的位0为接收中断使能,位1为发送中断使能,位2为线状态中断使能(通讯出错中断使能),若不使能相应的中断,对应的中断不会产生,此时可以通过LSR读取串口的状态判断串口操作是否完成或是否成功。

UART的基本操作方法如下:

●设置I/O引脚连接到UARTx。

●设置串口波特率(UxDLM、UxDLL)。

●设置串口工作模式(UxLCR、UxFCR)。

●发送或接收数据(UxTHR、UxRBR)。

●检查串口状态字(UxLSR)或者等待串口中断(UxIIR)。

●利用UART与PC通信,由于PC串口是RS232电平,连接时需要使用RS232转换器。

UART的Proteus仿真电路如图4-3所示。

978-7-111-44508-1-Chapter04-34.jpg(www.daowen.com)

图4-3 UART的Proteus仿真电路

例4-4 采用查询方式,通过UART0接收上位机发送的字符串,然后送回上位机显示。 主程序文件main.c如下:

978-7-111-44508-1-Chapter04-35.jpg

978-7-111-44508-1-Chapter04-36.jpg

978-7-111-44508-1-Chapter04-37.jpg

上述程序中使用自定义函数UART0_GetStr()和UART0_SendStr()实现串行数据的输入和输出,从虚拟终端每输入一个字符都会立即显示出来。另外,也可以调用标准库函数printf()实现从串行口输出,但在调用之前,先要利用putchar()函数将printf重新定义到串口0,这可以通过如下语句实现:

978-7-111-44508-1-Chapter04-38.jpg

使用查询方式进行通信时,CPU必须不停地查询相应的标志位,将会占用CPU很大一部分时间,效率较低。而采用中断方式进行,则可以避免这些问题。

编写UART中断服务处理子程序时需要注意的是,当中断服务处理子程序接收到1次中断,它仅仅能知道UART产生了中断,至于是什么类型的中断,还需要按以下方式查询中断标志寄存器UxIIR,依据不同中断源类型,进行如下不同处理:

●UxIIR[3:0]=0110,“奇偶错等错误或间断”中断,则从“线路状态寄存器”中读取状态位,分析具体错误原因,再进行处理。

●UxIIR[3:0]=0100,“接收缓冲寄存器就绪”中断,则从“接收缓冲寄存器”中读取数据插入接收队列。

●UxIIR[3:0]=0010,“发送保持寄存器空”中断,则从发送队列中读取数据写到“发送保持寄存器”中。

●UxIIR[3:0]=1100,“字符超时指示”中断,进行超时处理。

中断服务处理子程序必须判断是否有尚未处理的中断。在处理完当前的中断源类型之后,不能立即退出服务,而应当继续判断UxIIR寄存器最低位是否为0,如果为0,则表示还有尚未处理的中断,应当继续根据UxIIR[3:0]判断中断源类型,进行处理,直到UxIIR的最低位为1,最后发送中断结束命令,结束中断服务处理程序,

例4-5 采用中断方式通信,从上位机接收数据,然后发送回上位机显示。每当从虚拟终端输入8个字符后会立即显示出来。

主程序文件main.c如下:

978-7-111-44508-1-Chapter04-39.jpg

978-7-111-44508-1-Chapter04-40.jpg

978-7-111-44508-1-Chapter04-41.jpg

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈