[X]关闭
1

(基础篇)S05-CH07-Uart-Interrpt

摘要: 前面两章我们详细的对中断系统的代码和设计流程进行了介绍,这一章我们将继续学习中断系统,这一章将为大家讲解串口中断的设计方法。串口中断、定时器中断、按键中断是用的比较多的三种中断方式,熟练的掌握这三种中 ...

软件版本:VIVADO2017.4

操作系统:WIN10

硬件平台: ARTIX-7 系列开发板

米联客(MSXBO)论坛www.osrc.cn答疑解惑专栏开通,欢迎大家给我提供!!!

7.1 概述

      前面两章我们详细的对中断系统的代码和设计流程进行了介绍,这一章我们将继续学习中断系统,这一章将为大家讲解串口中断的设计方法。串口中断、定时器中断、按键中断是用的比较多的三种中断方式,熟练的掌握这三种中断的设计,那么就可以称得上对中断设计已经掌握了。

7.2 硬件工程搭建

Step1:创建一个新的vivado工程,命令为System.

Step2:将第一章生成的tcl文件复制到当前文件目录中来,然后使用tcl创建一个BD文件。

Step3:点击IP添加图标,输入关键字intc,添加一个intc。

点击Run connection Automation,然后直接单击OK。

Step4:连接intc的Interrupt和MicroBlaze的INTERRUPT。

Step5:连接UART的中断输出引脚和intc的中断输入引脚。

Step6:选中top.bd,右单击然后选择Generate Output Products。

Step7:选中top.bd,右单击然后选择Create HDL Wrapper,在弹出来的窗口中直接点击OK。

Step8:添加约束文件。

Step9:单击 产生Bit文件。

Step10:生成Bit文件之后,单击File-Export-Export Hardware。单击File-Launch SDK。

7.3软件设计

Step1:单击File-New-Application Project开始创建一个SDK工程。

Step2:在新弹出来的窗口中,输入工程名字Uart_Interrupt(注意不能有非法字符)。


Step3:单击Next,然后在左侧选择Empty Application(空白工程),最后选择Finish。

Step4:在我们提供的源代码中,找到sdk_src文件夹,然后复制里面的sys_intr.h,sys_intr.c,UART_intr.h,UART_intr.c,main.c文件。

Step5:选中Uart_Interrupt下的src,然后按Ctrl+V将刚才复制的文件拷贝到工程中。

Step6:选中SDK工程文件,右单击选择Debug as-Debug configuration。

Step7:在弹出来的新窗口中,双击下图圈出部分,然后勾选箭头所示参数

Step8:单击APPly,然后单击Debug(进行这一步之前,先给开发板上电)。

Step9:在下图所示区域找到SDK Terminal,然后单击加号图标

Step10:单击加号图标之后,再新弹出来的窗口中设置好对应的端口号和波特率,然后单击OK。


​​​​​​​

7.4 程序分析

      从实验效果可以看到,本章的程序是使用串口中断做了一个回传的实验。现在,我们就来看看,我们是如何实现回传的呢?首先,我们看看整体的程序框架:

      这个程序的框架还是和之前两个程序是大体一致的,也是遵循我们提出的中断的设置流程,里面有些函数在之前已经对其进行过介绍,在此处就不再重复的进行讲解。一开始仍然是UART的初始化函数,这个与之前的也是类似,直接看到Uart_SetupIntrSystem这个函数,其原函数如下图所示:

     子函数还是熟悉的子函数,这次变了个回调函数,回调的参数变为了Uart的实例。我们还是只看改动部分,看看这个回调函数实现了一个什么功能:

     这个函数是本章程序的精髓所在,从上图中可以看到本章使用了两个比较陌生的函数XUartLite_ReadReg和XUartLite_WriteReg。首先我们看到XUARTLite_ReadReg这个函数,先看看其原函数:

     可以看到这个函数是XUartLite_In32这个子函数进行了重定义,他的作用是从UART的寄存器中读取一个值。读取的这个值是一个32bit的值。第一个参数是Uart的基地址,第二个是寄存器的偏移地址。那么,我们如何得知这个寄存器的具体含义呢?这个时候我们还得借助官方的IP手册。下面介绍如何获取IP的指导手册:

  1. 在VIVADO工程的BD硬件原理图中找到要查找的IP的图标

2、在弹出来的IP参数设置界面,点击Documentation,然后选择Product guide

之后系统就会自动查找到相应的指导手册,如下图所示:

在这里面找到关于寄存器的定义:

       在这里,可以看到Uart有四个寄存器,0h是接收数据FIFO寄存器,04h是发送FIFO寄存器,08h是状态寄存器。0ch是控制寄存器。然后我们回到程序中来,看看程序中是如何操作的。

可以看到,这里先读取了状态寄存器中的内容,我们看看手册中对这个寄存器的详细的描述:

      从上图中可以知道这个寄存器是用于存储接收和发送的一些FIFO的标志,其中关注第0位,这一位是用来检测接收端FIFO的数据是否有效。继续回到程序的分析。

      这里将刚才读取的状态寄存器的值与0x01进行与操作,可以猜出这一步的作用是为了检测接收FIFO中的数据是否有效,只有当有效状态时,才可以进行下一步的操作,相当于一个开关的操作。

      在接下来的这一段程序操作当中,可以看到一开始程序先读取了一部分接收FIFO中的数据,将鼠标放置在XUL_RX_FIFO_OFFSET上可以看到这个偏移量为0,这个偏移量就是我们刚才提到过的接收数据FIFO寄存器,其定义如下图所示:

      从上图可知,Uart一次接收的数据为1个字节。也就是说Uart的数据传输是一个字节一个字节进行传输的。

      继续程序的分析,图中圈出部分可知,接收了一个字节的数据之后,程序马上将这一个字节的数据发送了出去,同样的,发送寄存器也是一个字节传输:

      将数据发送出去之后,再次读取状态寄存器中的数值,刷新isrStaus的值。整体来回顾一下这个回调函数,也就是说当系统检测到Uart中断之后,系统先开始接收数据,然后再把这段数据再发送出去。这一段操作,实际上应该是发生在我们往Uart发送数据时,此时Uart会产生中断,这时才是Uart正式开始数据接收的过程。

      回到Uart_SetupIntrSystem函数的分析之中,看到最后一个函数XUartLite_EnableInterrupt,顾名思义,此函数的功能是允许Uart的中断输出,其函数原型如下图所示:

      可以发现,其实质也是写寄存器的操作,这里其寄存器的偏移地址为十进制数12,换算成十六进制,也就是(0c)h,参照之前的寄存器定义,可知这是往控制寄存器中写入一个32位的数据0x10,具体代表什么意思,请看下面的寄存器定义:

      此处我已经把0x10这位圈出来了,这一位的作用是使能中断,与我们之前的分析一致。至此,整个程序已经分析完了,本章节的程序还算是比较简单。

7.5 本章小结

      本章为大家介绍了串口中断的设计方法,至此,中断部分的讲解就全部完成了。本章最后还为大家介绍了如何获取官方的IP指导手册,这一技巧在以后的设计中尤为重要,大家一定要熟练的掌握。


路过

雷人

握手

鲜花

鸡蛋
发表评论

最新评论

引用 超级大乒乓 2022-1-24 11:27
你好,我想问一下,我按照例程跑的工程,源文件核软件版本都是一样的,编译都是过的,但是发出串口数据,并没有收到同样的数据,而且我看例程文档里,看起来也没有回复一样的数据

查看全部评论(1)

本文作者
2019-11-7 14:56
  • 1
    粉丝
  • 3926
    阅读
  • 1
    回复

关注uisrc网络

扫描关注,了解最新资讯

电话:0519-80699907
EMAIL:270682667@qq.com
地址:常州溧阳市天目云谷3号楼北楼
热门评论
排行榜