当前位置: 首页 > news >正文

UART控制器——ZYNQ学习笔记14

        UART 控制器是一个全双工异步收发控制器, MPSoC 内部包含两个 UART 控制器, UART0 和 UART1。每一个 UART 控制器支持可编程的波特率发生器、 64 字节的接收 FIFO 和发送 FIFO、产生中断、 RXD 和TXD 信号的环回模式设置以及可配置的数据位长度、停止位和校验方式等。UART 控制器的配置以及状态的获取由控制(Control)和状态寄存器(Status Registers完成。另外,UART 控制器不仅可以连接至 MIO,也可以映射到 EMIO,从而使用 PL 的端口来实现串口通信的功能。当 UART 控制器连接到 MIO 时,只有 Tx(发送)和 Rx(接收)两个引脚;而当连接 EMIO 时,除 Tx 和Rx 引脚外,可选的还有 CTS、 RTS、 DSR、 DCD、 RI、 DTR 等引脚,这些引脚用于串口的流控制,即调制解调器的数据通讯中。UART 控制器采用独立的接收和发送数据路径,每个路径包含一个 64 字节的 FIFO,控制器对发送和接收 FIFO 中的数据进行串并转换操作。 FIFO 的中断标志支持轮询处理或中断驱动处理两种方式。 另外,控制器中还有一个模式开关,支持 RXD 和 TXD 信号的各种环回配置。 UART 控制器内部框图如下图所示:

main.c

#include "xparameters.h"	//器件参数信息
#include "xuartps.h"		//包含 PS UART 的函数声明
#include "xil_printf.h"		//包含 print()函数
#include "xscugic.h"		//包含中断的函数声明
#include "stdio.h"			//包含 printf 函数的声明
#include "xscugic.h"		//
#include "uart.h"
#include "intr.h"//定义结构体
XUartPs Uartps	;
XScuGic Intc	;int main(){uart_config(&Uartps);intr_config(&Intc,&Uartps);while(1){}
}

uart.c

#include "xparameters.h"	//器件参数信息
#include "xuartps.h"		//包含 PS UART 的函数声明
#include "xil_printf.h"		//包含 print()函数
#include "xscugic.h"		//包含中断的函数声明
#include "stdio.h"			//包含 printf 函数的声明
#include "uart.h"#define UART_DEVICE_ID 	XPAR_PS7_UART_0_DEVICE_ID //串口设备 IDvoid uart_config(XUartPs *uartps){XUartPs_Config *uart_cfg;//查找配置信息uart_cfg = XUartPs_LookupConfig(UART_DEVICE_ID);//串口初始化XUartPs_CfgInitialize(uartps,uart_cfg,uart_cfg->BaseAddress);//UART参数设置//波特率 115200XUartPs_SetBaudRate(uartps,115200);//模式设置 正常模式XUartPs_SetOperMode(uartps,XUARTPS_OPER_MODE_NORMAL);//设置触发数量:1XUartPs_SetFifoThreshold(uartps, 1);}

uart.h

#include "xparameters.h"	//器件参数信息
#include "xuartps.h"		//包含 PS UART 的函数声明
#include "xil_printf.h"		//包含 print()函数
#include "xscugic.h"		//包含中断的函数声明
#include "stdio.h"			//包含 printf 函数的声明
#include "xscugic.h"		//void uart_config(XUartPs *uartps);

init.c

#include "xparameters.h"	//器件参数信息
#include "xuartps.h"		//包含 PS UART 的函数声明
#include "xil_printf.h"		//包含 print()函数
#include "xscugic.h"		//包含中断的函数声明
#include "stdio.h"			//包含 printf 函数的声明
#include "intr.h"#define UART_INT_IRQ_ID XPAR_XUARTPS_0_INTR //串口中断 ID
#define INTC_DEVICE_ID 	XPAR_SCUGIC_SINGLE_DEVICE_ID //中断控制器 IDvoid intr_config(XScuGic *Intc,XUartPs *Uartps){SetupInterruptSystem(Intc,Uartps);					//设置中断系统
}void SetupInterruptSystem(XScuGic *Intc, XUartPs *Uartps)
{XScuGic_Config *IntcConfig;//查找GIC配置信息,进行初始化IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);XScuGic_CfgInitialize(Intc, IntcConfig,IntcConfig->CpuBaseAddress);//配置UART中断XUartPs_SetInterruptMask(Uartps,XUARTPS_IXR_RXOVR);/*********************************************************************************************************************///初始化ARM处理器异常句柄Xil_ExceptionInit();//给IRQ异常注册处理程序Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,(Xil_ExceptionHandler)XScuGic_InterruptHandler,Intc);//使能处理器中断Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ);
/*********************************************************************************************************************///关联IQC异常处理函数XScuGic_Connect(Intc,UART_INT_IRQ_ID,(Xil_ExceptionHandler)IntrHandler,(void *)Uartps);//使能GIC控制器对应ID中断XScuGic_Enable(Intc, UART_INT_IRQ_ID);}void IntrHandler(void *call_back_ref){u32 int_state;u8 rxdata;XUartPs *uart_ps = (XUartPs *) call_back_ref;//获取中断配置信息int_state = XUartPs_GetInterruptMask(uart_ps);//读取中断状态int_state &= XUartPs_ReadReg(uart_ps->Config.BaseAddress,XUARTPS_ISR_OFFSET); //中断状态//判断是否为rxfifo中断if(int_state & XUARTPS_IXR_RXOVR){		//RXFIFO缓冲区中断//读取RXFIFO数据rxdata = XUartPs_RecvByte(uart_ps->Config.BaseAddress);//清除中断标志XUartPs_WriteReg(uart_ps->Config.BaseAddress,XUARTPS_ISR_OFFSET,1);//发送数据XUartPs_SendByte(uart_ps->Config.BaseAddress,rxdata);}}

inrt.h

#include "xparameters.h"	//器件参数信息
#include "xuartps.h"		//包含 PS UART 的函数声明
#include "xil_printf.h"		//包含 print()函数
#include "xscugic.h"		//包含中断的函数声明
#include "stdio.h"			//包含 printf 函数的声明void intr_config(XScuGic *Intc,XUartPs *Uartps);
void SetupInterruptSystem(XScuGic *Intc, XUartPs *Uartps);
void IntrHandler();

使用printf函数要注意在初始化函数之后使用

更换UART1

        

http://www.dtcms.com/a/361432.html

相关文章:

  • 解决Content Security Policy (CSP)问题
  • Sparse4Dv3 部署到 TensorRT-(1)
  • Gradle vs. Maven,Java 构建工具该用哪个?
  • Paimon MergeTreeWrite、Compaction 和 快照构建
  • 嵌入式解谜日志之Linux操作系统—进程间的通信(IPC):无名管道,有名管道,信号通信5
  • 单片机元件学习
  • 【stm32】定时器(超详细)
  • Git安装教程
  • 【51页PPT】智慧社区解决方案(附下载方式)
  • 审美积累 | 金融类 SaaS 产品落地页设计
  • Empire: LupinOne靶场渗透
  • 贪心算法解决固定长度区间覆盖问题:最少区间数计算
  • CICD实战(2) - 使用Arbess+GitLab+SonarQube实现Java项目快速扫描/构建/部署
  • 【MySQL详解】索引、事务、锁、日志
  • 【C++上岸】C++常见面试题目--数据结构篇(第十六期)
  • 科学研究系统性思维的方法体系:数据收集
  • 11,FreeRTOS队列理论知识
  • linux内核 - ext 文件系统介绍
  • 嵌入式学习日志————I2C通信外设
  • 拥抱智能高效翻译 ——8 款视频翻译工具深度测评
  • Linux Shell 脚本中括号类型及用途
  • 【项目思维】嵌入式产业链与技术生态
  • 2025 最新React前端面试题目 (9月最新)
  • Windows Qt5.15.17源码使用VS2019编译安装
  • 六、练习3:Gitee平台操作
  • 瑞芯微RK3576平台FFmpeg硬件编解码移植及性能测试实战攻略
  • 深入掌握 Flask 配置管理:从基础到高级实战
  • 校园网IP地址要如何管理
  • MySQL基础知识保姆级教程(四)基础语句
  • 人工智能学习:NLP文本处理的基本方法