宏定义

#define INTC             XScuGic                         //中断控制器驱动
#define DeviceId            XPAR_XUARTPS_0_DEVICE_ID        //UART0 设备ID
#define UART_INT_IRQ_ID     XPAR_XUARTPS_0_INTR             //UART0 中断ID
#define INTC_DEVICE_ID      XPAR_SCUGIC_SINGLE_DEVICE_ID    //中断装置ID 用于初始化中断
#define BAUDRATE            115200

UART配置控制器功能

控制器功能主要配置字符帧、波特率、FIFO 触发器等级、Rx 超时机制,并启用控制器。重置控制器后
必须要配置所有这些参数。步骤如下:
1、 配置 UART 数据帧格式。如:数据位长度、停止位、校验方式、IO 模式等;
2、 设置波特率;
3、 设置 RxFIFO 触发器等级,可以选择启用或禁用该功能;
4、 使能 UART 控制器;
5、 配置接收器的超时机制,可以选择启用或禁用该功能。

void UART_Init(XUartPs *UartPs,u32 BaudRate)
{/** 初始化UART 驱动* Initialize the UART driver so that it's ready to use* Look up the configuration in the config table, then initialize it.*/XUartPs_Config *Config;Config = XUartPs_LookupConfig(DeviceId);XUartPs_CfgInitialize(UartPs, Config, Config->BaseAddress);//设置UART波特率XUartPs_SetBaudRate(UartPs,BaudRate);//设置UART的模式XUartPs_SetOperMode(UartPs, XUARTPS_OPER_MODE_NORMAL);//设置FIFO阈值  0为disable  1为接收一字节就触发XUartPs_SetFifoThreshold(UartPs, 1U);printf("UART Initial finished!\n\t");
}

清除中断标志函数

/*
IntrMASK 为中断触发方式
#define XUARTPS_IMR_OFFSET      0x0010U  //< Interrupt Mask [12:0]
#define XUARTPS_ISR_OFFSET      0x0014U  //< Interrupt Status [12:0]
*/
void XScuGic_ClearIntC(XUartPs * Uart_Ps,u32 IntrMASK)
{XUartPs_WriteReg(Uart_Ps->Config.BaseAddress,XUARTPS_ISR_OFFSET, IntrMASK) ;
}

获得中断状态函数

u32 XScuGic_Getregstate(XUartPs * Uart_Ps)
{u32 int_state;//第二个参数 表示基地址的偏移量int_state  = XUartPs_ReadReg(Uart_Ps->Config.BaseAddress,XUARTPS_IMR_OFFSET) ;int_state &= XUartPs_ReadReg(Uart_Ps->Config.BaseAddress,XUARTPS_ISR_OFFSET) ;return int_state;
}

接收和发送数据中断处理函数

1、 使能RXFIFO触发和RXFIFO空中断;
2、 等待,直到 RxFIFO 中的数据数量达到触发等级或者发生超时;
3、 从 RxFIFO 中读取数据;
4、 重复步骤 2 和 3,直到 RxFIFO 为空;
5、 清除中断标志。

使能RXFIFO触发和RXFIFO空中断

设置接收缓存中设置了最大2000字节的缓冲,可以根据需要修改。

#define MAX_LEN  2000u8 ReceivedBuffer[MAX_KEN];

在中断服务程序中,将ReceivedBufferPtr指针地址和ReceivedByteNum加上接收到的个数,如果FIFO空了,将ReceivedFlag置为1。同时向中断状态寄存器写数据,清除中断。

在main函数中,将ReceivedFlag和ReceivedByteNum清零,ReceivedBufferPtr指针复位。

发送接收数据函数


总代码

#include"stdio.h"
#include"xuartps.h"
#include "xparameters.h"
#include "xscugic.h"
#include "xplatform_info.h"
#include "xil_exception.h"
#include "sleep.h"#define INTC                XScuGic
#define DeviceId            XPAR_XUARTPS_0_DEVICE_ID
#define UART_INT_IRQ_ID     XPAR_XUARTPS_0_INTR
#define INTC_DEVICE_ID      XPAR_SCUGIC_SINGLE_DEVICE_ID
#define BAUDRATE            115200XUartPs UartPs;
INTC InterruptController;   /* Instance of the Interrupt Controller *///function  list
int SetupInterruptSystem(INTC *IntcInstancePtr,XUartPs *UartInstancePtr,u16 UartIntrId);
//void Handler(void *call_back);
void Handler(void *call_back_ref);
void UART_Init();
void XScuGic_ClearIntC(XUartPs * Uart_Ps,u32 IntrMASK);
u32 XScuGic_Getregstate(XUartPs * Uart_Ps);int main()
{//UART 初始化UART_Init(&UartPs,BAUDRATE);//设置中断系统SetupInterruptSystem(&InterruptController, &UartPs, UART_INT_IRQ_ID);printf("uart loop test action!\t\n");while(1){}return 0;
}void UART_Init(XUartPs *UartPs,u32 BaudRate)
{/** 初始化UART 驱动* Initialize the UART driver so that it's ready to use* Look up the configuration in the config table, then initialize it.*/XUartPs_Config *Config;Config = XUartPs_LookupConfig(DeviceId);XUartPs_CfgInitialize(UartPs, Config, Config->BaseAddress);//设置UART波特率XUartPs_SetBaudRate(UartPs,BaudRate);//设置UART的模式XUartPs_SetOperMode(UartPs, XUARTPS_OPER_MODE_NORMAL);//设置FIFO阈值  0位disable  1为接收一位就触发中断XUartPs_SetFifoThreshold(UartPs, 1U);printf("UART Initial finished!\n\t");
}int SetupInterruptSystem(INTC *IntcInstancePtr,XUartPs *UartInstancePtr,u16 UartIntrId)
{u32 IntrMask;/* Config for interrupt controller */XScuGic_Config *IntcConfig;/* Initialize the interrupt controller driver */IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);XScuGic_CfgInitialize(IntcInstancePtr, IntcConfig,IntcConfig->CpuBaseAddress);// 中断必须要配置的函数Xil_ExceptionInit();Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,(Xil_ExceptionHandler) XScuGic_InterruptHandler,IntcInstancePtr);Xil_ExceptionEnable();//连接中断处理函数XScuGic_Connect(IntcInstancePtr, UartIntrId,(Xil_ExceptionHandler) Handler,(void *) UartInstancePtr);IntrMask =XUARTPS_IXR_TOUT | XUARTPS_IXR_PARITY | XUARTPS_IXR_FRAMING |XUARTPS_IXR_OVER | XUARTPS_IXR_TXEMPTY | XUARTPS_IXR_RXFULL |XUARTPS_IXR_RXOVR;//设置中断触发方式//IntrMask =XUARTPS_IXR_RXOVR;XUartPs_SetInterruptMask(UartInstancePtr, XUARTPS_IXR_RXOVR);/* Enable the interrupt for the device */XScuGic_Enable(IntcInstancePtr, UartIntrId);return 0;
}/*
#define XUARTPS_IMR_OFFSET      0x0010U  //< Interrupt Mask [12:0]
#define XUARTPS_ISR_OFFSET      0x0014U  //< Interrupt Status [12:0]
*/
void XScuGic_ClearIntC(XUartPs * Uart_Ps,u32 IntrMASK)
{XUartPs_WriteReg(Uart_Ps->Config.BaseAddress,XUARTPS_ISR_OFFSET, IntrMASK) ;
}u32 XScuGic_Getregstate(XUartPs * Uart_Ps)
{u32 int_state;//第二个参数 表示基地址的偏移量int_state  = XUartPs_ReadReg(Uart_Ps->Config.BaseAddress,XUARTPS_IMR_OFFSET) ;int_state &= XUartPs_ReadReg(Uart_Ps->Config.BaseAddress,XUARTPS_ISR_OFFSET) ;return int_state;
}void Handler(void *call_back_ref){XUartPs *uart_instance_ptr = (XUartPs *) call_back_ref;u32 rec_data = 0 ;u32 isr_status ; //中断状态标志printf("interrupt assert \n\t");//读取中断 ID 寄存器,判断触发的是哪种中断isr_status = XUartPs_ReadReg(uart_instance_ptr->Config.BaseAddress,XUARTPS_IMR_OFFSET);isr_status &= XUartPs_ReadReg(uart_instance_ptr->Config.BaseAddress,XUARTPS_ISR_OFFSET);//判断中断标志位 RxFIFO 是否触发if (isr_status & (u32)XUARTPS_IXR_RXOVR){rec_data = XUartPs_RecvByte(XPAR_PS7_UART_0_BASEADDR);//清除中断标志XUartPs_WriteReg(uart_instance_ptr->Config.BaseAddress,XUARTPS_ISR_OFFSET, XUARTPS_IXR_RXOVR) ;}XUartPs_SendByte(XPAR_PS7_UART_0_BASEADDR,rec_data);printf("interrupt end\t\n");}//简易版本
/*void Handler(void *call_back_ref)
{u32 rec_data = 0 ;XUartPs * Uart_PS = (XUartPs*)call_back_ref;printf("interrupt assert \n\t");rec_data = XUartPs_RecvByte(XPAR_PS7_UART_0_BASEADDR);XUartPs_SendByte(XPAR_PS7_UART_0_BASEADDR,rec_data);XScuGic_ClearIntC(Uart_PS,XUARTPS_IXR_RXOVR);printf("interrupt end\t\n");}*/

ZYNQ之UART中断实验软件设计相关推荐

  1. 基于zynq 7020的串口UART中断实验

    1.参考 UG585,P1790 [JokerのZYNQ7020]UART 学会Zynq(27)UART中断驱动模式示例 2.理论知识 在ZYNQ的中断中有一个IOP的中断集,它包几个外设的中断,其中 ...

  2. ZYNQ AXI GPIO中断实验——FPGA Vitis篇

    文章目录 1. 前言 2. Vivado工程的编写 2.1 Block Design工程设计 2.2 创建XDC管脚约束 3. Vitis工程的编写 4. 实验小结 5. 工程源码下载 1. 前言 使 ...

  3. 计算机导论设计实验,基于抽象知识点的《计算机导论》实验软件设计

    Development of Experiment Software for<Computing Essentials>based on the Abstract Knowledge Po ...

  4. 计算机系统(1) 实验五 中断实验

    计算机系统(1) 实验五 中断实验 一.实验目的 二.实验背景及要求 (一)实验背景: (二)实验要求:实现三部分程序 1.用户程序: 2.键盘中断处理程序: 3.操作系统使能代码: 三.实验步骤 1 ...

  5. matlab交互式gui,利用MATLAB的GUI功能制作交互式演示实验软件

    第19卷第2期 大 学 物 理 实 验 V ol.19N o.22006年6月出版PHY SIC A L EXPERI ME NT OF C O LLEGE Jun.2006收稿日期:2006-02- ...

  6. gd32f303 设计中断优先级_ALIENTEK 阿波罗 STM32F767 开发板资料连载第九章 外部中断实验...

    1)实验平台:alientek 阿波罗 STM32F767 开发板2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第九章 外部中断实验 这 ...

  7. 复习单片机:动态数码管(1 数码管介绍+2 74HC245 和 74HC138 芯片介绍+3 硬件设计+4 软件设计+5 实验现象)

    本章所要实现的功能是:控制动态数码管从左至右显示数字 0-7.学习本章可以参考 前面的实验章节内容.本章分为如下几部分内容: 1 数码管介绍 2 74HC245 和 74HC138 芯片介绍 3 硬件 ...

  8. 复习单片机:温度检测 DS18B20(内含:1 DS18B20 介绍+2 硬件设计+3 软件设计+4 实验现象)

    本章分为如下几部分内容: 1 DS18B20 介绍 2 硬件设计 3 软件设计 4 实验现象 1 DS18B20 介绍 DS18B20 温度传感器的内部存储器包括一个高速的暂存器 RAM 和一个非易 ...

  9. 软件设计与体系结构第三次实验——web服务开发

    目录 一.后端 二.前端 三.运行结果 概述:本次实验中我们选择使用实现REST API,在web上实现登录.签到以及查询签到结果的功能. 一.后端 本次实验在第二次实验(设计模式)的基础上进行了极大 ...

最新文章

  1. 中国剩余定理(孙子定理)的证明和c++求解
  2. linux cpu占用率 监控工具 简介
  3. OS / Linux / Ubuntu 创建应用的快捷方式
  4. Centos7下使用yum安装lnmp zabbix3.2
  5. JAVA Opencv在图片上添加中文
  6. axios vue 动态date_Web前端Vue系列之-Vue.js 实战
  7. FreeBSD 11.0-发布公告
  8. delve应该安装到哪_消防水炮安装高度为多少米标准
  9. TensorFlow实现流行的机器学习算法教程
  10. 盘点2021AI Conference Deadlines及论文写作突击要点
  11. 数学小技巧(模拟)求1/n
  12. 计算机在数据处理方面的论文,数据挖掘论文3000字范文参考(2)
  13. 神舟刷蓝天w650dbios_神舟z6kp5D1记录一次艰难的刷蓝天bios,总算成功了
  14. php二次开发帝国,【使用说明】帝国cms万能通用api二次开发核心包
  15. 兰州大学第一届『飞马杯』程序设计竞赛
  16. 蓝牙运动耳机什么牌子好,分享六款好用的运动耳机
  17. MTK Kernel Log 看电池信息
  18. 基于 CherryUSB 调试 dwc2 usb host 笔记
  19. 你想要的宏基因组-微生物组知识全在这(2023.01)
  20. IT界被忽视的小可爱们:致敬QA

热门文章

  1. Python 递归算 阶乘 法斐波那契数 不死兔问题
  2. 【Troubleshooting】用户组/权限_导致grid日志不轮循清理_Bug 9595783
  3. 科普--常见的磁盘文件系统
  4. 交换友情链接的注意事项
  5. 函数可导和可微的区别: 一元中互为充要;多元中可微是可导的必要条件,可导不一定可微。
  6. 设置Mac合上盖子不休眠
  7. 求出1~100中平方根是整数的数的五种方法
  8. 显示某日期为星期几的Excel函数公式
  9. 2019 年 660 余个优质编程相关国外优质课程,帮你学习编程,成为资深程序员
  10. 我的世界服务器文件翻译,【我的世界】options.txt文件翻译(无限夜视就是这个)...