ZYNQ之UART中断实验软件设计
宏定义
#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中断实验软件设计相关推荐
- 基于zynq 7020的串口UART中断实验
1.参考 UG585,P1790 [JokerのZYNQ7020]UART 学会Zynq(27)UART中断驱动模式示例 2.理论知识 在ZYNQ的中断中有一个IOP的中断集,它包几个外设的中断,其中 ...
- ZYNQ AXI GPIO中断实验——FPGA Vitis篇
文章目录 1. 前言 2. Vivado工程的编写 2.1 Block Design工程设计 2.2 创建XDC管脚约束 3. Vitis工程的编写 4. 实验小结 5. 工程源码下载 1. 前言 使 ...
- 计算机导论设计实验,基于抽象知识点的《计算机导论》实验软件设计
Development of Experiment Software for<Computing Essentials>based on the Abstract Knowledge Po ...
- 计算机系统(1) 实验五 中断实验
计算机系统(1) 实验五 中断实验 一.实验目的 二.实验背景及要求 (一)实验背景: (二)实验要求:实现三部分程序 1.用户程序: 2.键盘中断处理程序: 3.操作系统使能代码: 三.实验步骤 1 ...
- 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- ...
- gd32f303 设计中断优先级_ALIENTEK 阿波罗 STM32F767 开发板资料连载第九章 外部中断实验...
1)实验平台:alientek 阿波罗 STM32F767 开发板2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第九章 外部中断实验 这 ...
- 复习单片机:动态数码管(1 数码管介绍+2 74HC245 和 74HC138 芯片介绍+3 硬件设计+4 软件设计+5 实验现象)
本章所要实现的功能是:控制动态数码管从左至右显示数字 0-7.学习本章可以参考 前面的实验章节内容.本章分为如下几部分内容: 1 数码管介绍 2 74HC245 和 74HC138 芯片介绍 3 硬件 ...
- 复习单片机:温度检测 DS18B20(内含:1 DS18B20 介绍+2 硬件设计+3 软件设计+4 实验现象)
本章分为如下几部分内容: 1 DS18B20 介绍 2 硬件设计 3 软件设计 4 实验现象 1 DS18B20 介绍 DS18B20 温度传感器的内部存储器包括一个高速的暂存器 RAM 和一个非易 ...
- 软件设计与体系结构第三次实验——web服务开发
目录 一.后端 二.前端 三.运行结果 概述:本次实验中我们选择使用实现REST API,在web上实现登录.签到以及查询签到结果的功能. 一.后端 本次实验在第二次实验(设计模式)的基础上进行了极大 ...
最新文章
- 中国剩余定理(孙子定理)的证明和c++求解
- linux cpu占用率 监控工具 简介
- OS / Linux / Ubuntu 创建应用的快捷方式
- Centos7下使用yum安装lnmp zabbix3.2
- JAVA Opencv在图片上添加中文
- axios vue 动态date_Web前端Vue系列之-Vue.js 实战
- FreeBSD 11.0-发布公告
- delve应该安装到哪_消防水炮安装高度为多少米标准
- TensorFlow实现流行的机器学习算法教程
- 盘点2021AI Conference Deadlines及论文写作突击要点
- 数学小技巧(模拟)求1/n
- 计算机在数据处理方面的论文,数据挖掘论文3000字范文参考(2)
- 神舟刷蓝天w650dbios_神舟z6kp5D1记录一次艰难的刷蓝天bios,总算成功了
- php二次开发帝国,【使用说明】帝国cms万能通用api二次开发核心包
- 兰州大学第一届『飞马杯』程序设计竞赛
- 蓝牙运动耳机什么牌子好,分享六款好用的运动耳机
- MTK Kernel Log 看电池信息
- 基于 CherryUSB 调试 dwc2 usb host 笔记
- 你想要的宏基因组-微生物组知识全在这(2023.01)
- IT界被忽视的小可爱们:致敬QA
热门文章
- Python 递归算 阶乘 法斐波那契数 不死兔问题
- 【Troubleshooting】用户组/权限_导致grid日志不轮循清理_Bug 9595783
- 科普--常见的磁盘文件系统
- 交换友情链接的注意事项
- 函数可导和可微的区别: 一元中互为充要;多元中可微是可导的必要条件,可导不一定可微。
- 设置Mac合上盖子不休眠
- 求出1~100中平方根是整数的数的五种方法
- 显示某日期为星期几的Excel函数公式
- 2019 年 660 余个优质编程相关国外优质课程,帮你学习编程,成为资深程序员
- 我的世界服务器文件翻译,【我的世界】options.txt文件翻译(无限夜视就是这个)...