ZYNQ嵌入式学习(5)

news2025/7/13 17:59:28

UART

  • UART简介
    • 发送FIFO
    • 接收FIFO
    • 模式切换
    • 寄存器操作
      • 中断和状态寄存器
  • 发送数据
    • 轮询
    • 中断
  • 接收数据
    • 轮询
    • 中断
  • 实验:串口中断数据环回

UART简介

不需要了解时序。
UART是全双工异步收发的,没有时钟。
UART的操作通过配置和模式寄存器控制。
UART由独立的接受和发送路径构成。每个路径包含深度为64字节的FIFO。FIFO中断状态为支持轮询或中断方式。
轮询方式:不停地读取寄存器看有没有数据。
中断方式:只有当接收到串口数据后才打断主进程来接收数据。
数据位宽:6/7/8bit
停止位:1/1.5/2bit


发送FIFO

CPU通过APB接口将数据写入发送FIFO,直到发送模块(Transmitter,执行并转串)将数据从FIFO中读出并送到移位寄存器。CPU通过操纵TxFIFO寄存器来写数据。
写入数据后,TxFIFO的空标志被清零,发送模块检测到非空后,开始从TxFIFO中读出数据,并转为串行。

接收FIFO

接收FIFO存储来源于接收模块(Receiver,执行串转并)的数据,写入RxFIFO。CPU通过APB接口读取RxFIFO寄存器。
阈值触发:当RxFIFO接收到设定的阈值位数的数据后,阈值触发标志位变为1。可用于产生中断。

模式切换

寄存器操作

中断和状态寄存器

有两个状态寄存器:

  • 中断状态寄存器可以被读取状态和产生中断。(sticky)
  • 状态寄存器仅能读取状态。(dynamic)
    中断状态寄存器和掩码寄存器(只读)按位与。仅有都为1的位才能产生中断,送入中断控制器。

    通过中断使能寄存器和中断除能寄存器来控制中断掩码寄存器。

    收发FIFO寄存器的几种中断:空、满、触发阈值、接近满、溢出。

发送数据

轮询

  1. 检查TxFIFO是否为空
  2. 向TxFIFO中写数(64B)
  3. 等待TxFIFO空后再次写入

中断

  1. 除能TxFIFO空中断
  2. 向TxFIFO中写数(64B)
  3. 检查TxFIFO中还有没有空间可以写数
  4. 重复2、3
  5. 使能中断
  6. 等待TxFIFO为空后返回1

接收数据

轮询

  1. 等待RxFIFO中数据达到阈值或接收超时
  2. 从RxFIFO中读数据
  3. 重复2直到RxFIFO空
  4. 若接收超时,清除超时位

中断

  1. 使能中断
  2. 等待RxFIFO中数据达到阈值或接收超时
  3. 从RxFIFO中读数据
  4. 重复2、3
  5. 清除中断

读写数据操纵的都是TX_RX_FIFO0寄存器,其中包含收发两个FIFO。

实验:串口中断数据环回

/******************************************************************************
*
* Copyright (C) 2009 - 2014 Xilinx, Inc.  All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* Use of the Software is limited solely to applications:
* (a) running on a Xilinx device, or
* (b) that interact with a Xilinx device through a bus or interconnect.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* XILINX  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
* Except as contained in this notice, the name of the Xilinx shall not be used
* in advertising or otherwise to promote the sale, use or other dealings in
* this Software without prior written authorization from Xilinx.
*
******************************************************************************/

/*
 * helloworld.c: simple test application
 *
 * This application configures UART 16550 to baud rate 9600.
 * PS7 UART (Zynq) is not initialized by this application, since
 * bootrom/bsp configures it to baud rate 115200
 *
 * ------------------------------------------------
 * | UART TYPE   BAUD RATE                        |
 * ------------------------------------------------
 *   uartns550   9600
 *   uartlite    Configurable only in HW design
 *   ps7_uart    115200 (configured by bootrom/bsp)
 */
/*
 * 20230307运行成功!
 */
#include <stdio.h>
//#include "platform.h"
#include "xil_printf.h"
#include "xuartps.h"
#include "xparameters.h"
#include "xscugic.h"
#include "xuartps_hw.h"

#define UART_DEVICE_ID		XPAR_XUARTPS_0_DEVICE_ID
#define UART_INT_IRQ_ID		XPAR_XUARTPS_0_INTR
#define INTC				XScuGic
#define INTC_DEVICE_ID		XPAR_SCUGIC_0_DEVICE_ID
//#define TEST_BUFFER_SIZE	100

XUartPs UartPs	;
XUartPs_Config *Config;
INTC InterruptController;	// 中断控制器驱动实例
//u8 RecvBuffer[TEST_BUFFER_SIZE];

void Handler();
void uart_init();
void uart_intr_handler();
void uart_intr_init(INTC *IntcInstancePtr,XUartPs *UartInstancePtr,u16 UartIntrId);
int SetupInterruptSystem(INTC *IntcInstancePtr,XUartPs *UartInstancePtr,u16 UartIntrId);
int main()
{
	// 串口初始化
	uart_init();
	xil_printf("Uart initializes successfully!");
	// 串口中断初始化(包含:1.对Uart的中断进行配置;2.对PS的中断控制器(Gic)进行配置)
	uart_intr_init(&InterruptController, &UartPs, UART_INT_IRQ_ID);

	while(1); // 让程序停在这个位置,用来检测中断,只有cpu收到中断指令,才会跳出while(1),进入中断服务子程序
    return 0;
}


// 串口初始化函数
void uart_init(){
	Config = XUartPs_LookupConfig(UART_DEVICE_ID);
	XUartPs_CfgInitialize(&UartPs, Config, Config->BaseAddress);
	// 设置串口工作模式
	XUartPs_SetOperMode(&UartPs, XUARTPS_OPER_MODE_NORMAL);
	// 设置串口波特率(默认就是115200)
	XUartPs_SetBaudRate(&UartPs, 115200);
	// 设置接收FIFO中断事件触发阈值,这里设置为1Byte,即每接收到1字节的数据就要产生一次中断,在中断函数中处理此中断
	XUartPs_SetFifoThreshold(&UartPs, 1);
}

// 串口中断初始化函数
void uart_intr_init(INTC *IntcInstancePtr,XUartPs *UartInstancePtr,u16 UartIntrId){
	/*
	 * 以下为中断控制器Gic配置
	 */
	XScuGic_Config *IntcConfig;
	IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);
	XScuGic_CfgInitialize(IntcInstancePtr, IntcConfig, IntcConfig->CpuBaseAddress);
	// 关联中断ID和中断处理函数
	XScuGic_Connect(IntcInstancePtr, UartIntrId, (Xil_ExceptionHandler) uart_intr_handler, (void *) UartInstancePtr);
	// 设置并打开中断异常处理功能
	Xil_ExceptionInit();
	Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT, (Xil_ExceptionHandler) XScuGic_InterruptHandler,IntcInstancePtr);
	Xil_ExceptionEnable();

	/*
	 * 以下为Uart中断配置
	 */
	// 设置UART中断触发方式,即哪些状态位能够产生中断
	u32 IntrMask;
	IntrMask = XUARTPS_IXR_RXOVR; 	// 接收fifo触发阈值中断位
	XUartPs_SetInterruptMask(UartInstancePtr, IntrMask);

	/*
	 * 使能UART中断
	 */
	XScuGic_Enable(IntcInstancePtr, UartIntrId);
}

// 中断处理函数
void uart_intr_handler(XUartPs *UartInstancePtr){
	// 读取中断状态寄存器
	u32 rec_data = 0;
	u32 IsrStatus;
	IsrStatus = XUartPs_ReadReg(UartInstancePtr->Config.BaseAddress,
				   XUARTPS_IMR_OFFSET);		// 获取中断掩码寄存器值,此处应该只有最低位为1,对应接收触发阈值中断
	IsrStatus &= XUartPs_ReadReg(UartInstancePtr->Config.BaseAddress,
				   XUARTPS_ISR_OFFSET);		// 获取对应的中断状态寄存器的值
	// 若满足中断掩码寄存器和中断状态寄存器的与为1,再和接收fifo触发阈值位相与,为高电平,则确实为所需类型中断
	/*
	 * 接收处理
	 */
	if(IsrStatus & XUARTPS_IXR_RXOVR) {
		// 读取出Rxfifo中接收到的数据(仅一个字节)
		//	rec_data = XUartPs_Recv(UartInstancePtr, RecvBuffer, TEST_BUFFER_SIZE);
		rec_data = XUartPs_RecvByte(UartInstancePtr->Config.BaseAddress);
		// 清除中断状态寄存器的接收fifo触发阈值位
		XUartPs_WriteReg(UartInstancePtr->Config.BaseAddress, XUARTPS_ISR_OFFSET,
				XUARTPS_IXR_RXOVR);
	}
	/*
	 * 发送处理
	 */
	XUartPs_SendByte(UartInstancePtr->Config.BaseAddress, rec_data);

}



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/396038.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue计算属性Computed

30. Vue计算属性Computed 1. 定义 Computed属性是Vue中的一个计算属性&#xff0c;是一种基于其它属性值计算而来的属性值&#xff0c;具有缓存机制&#xff0c;在依赖的属性值发生变化时会重新计算。 使用computed属性可以避免在模板中书写过多的计算逻辑&#xff0c;提高代…

【敏捷开发】jenkins「CI持续集成 CD持续部署」- 部署vue和go项目 - 待定

文章目录前言一、安装jenkins1. 部署中的痛点2. 什么是jenkins3. jenkins的安装和配置&#xff08;1&#xff09;下载&#xff08;2&#xff09;安装二、上传到运行服务器1. jenkins构建服务器流程2. 安装jenkins常用插件3. 通过freestyle构建项目4. 将构建服务器上的代码上传到…

Mybatis工程升级到FlunetMybatis后引发的问题以及解决方法

0. 背景交代为了提高开发速度,我打算将公司原有Mybatis框架升级为FlunetMybatis。可是遇到了一系列问题&#xff0c;下面开始爬坑工程结构示意如下&#xff1a;src/ ├── main │ ├── java.com.demo │ │ ├── Application.java //S…

常见数据模型

目录 1.1两类数据模型 1.2概念模型 1.3数据模型的组成要素 1.4常见数据模型 层次模型 网状模型 关系模型 数据模型是对现实世界数据特征的抽象&#xff0c;也就是说数据模型是用来描述数据、组织数据和对数据进行操作的。数据模型是数据库系统的核心和基础。 1.1两类数…

ip地址的分类及地址范围

IP地址根据网络ID的不同分为5种类型&#xff0c;A类地址、B类地址、C类地址、D类地址和E类地址。1、A类IP地址一个A类IP地址是指&#xff0c; 在IP地址的四段号码中&#xff0c;第一段号码为网络号码&#xff0c;剩下的三段号码为本地计算机的号码。A类IP地址中网络的标识长度为…

一种用于智能建筑云辅助检测的快速传感器放置位置优化方法

随着健康意识的觉醒&#xff0c;人们对居住的建筑提出了一系列与健康相关的要求&#xff0c;以期改善居住条件。在此背景下&#xff0c;BIM&#xff08;Building Information Modeling&#xff09;充分利用健康、环境、信息技术等诸多领域的前沿理论和技术&#xff0c;为工程师…

低代码开发的优势是什么?

低代码开发的优势是什么?低代码开发这个概念这两年来经常出现在人们的视野中&#xff0c;市场对于低代码的需求也越来越庞大。 Gartner预测&#xff0c;到2025年&#xff0c;75%的大型企业将使用至少四种低代码/无代码开发工具&#xff0c;用于IT应用开发和公民开发计划。 可…

Java面试题--Spring事务失效

Spring事务失效概述 Spring对事务的管理和处理&#xff0c;是基于AOP和编程范式的。因此Spring事务失效的场景较为丰富&#xff0c;包括但不限于以下常见情况&#xff1a; 异常被吞掉&#xff1a;当事务管理中出现异常但没有被正确捕捉并处理时&#xff0c;事务就会失效。例如…

Sedona 简介

Sedona 可以做什么? 分布式空间数据集 Spatial RDD on SparkSpatial DataFrame/SQL on SparkSpatial DataStream on FlinkSpatial Table/SQL on Flink 处理复杂的空间类型 Vector geometries / trajectoriesRaster images with Map AlgebraVarious input formats: CSV, TSV…

Vue 项目如何迁移小程序

最近我们看到有开发者在社群里提出新的疑惑「我手头已经有一个成熟的 HTML5 项目了&#xff0c;这种项目可以转为小程序在 FinClip 环境中运行吗&#xff1f;」。 经过工作人员的沟通了解&#xff0c;开发者其实是想将已有的 Vue 项目转为小程序&#xff0c;在集成了 FinClip …

(蓝桥真题)扫描游戏(计算几何+线段树二分)

题目链接&#xff1a;P8777 [蓝桥杯 2022 省 A] 扫描游戏 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 样例输入&#xff1a; 5 2 0 1 1 0 3 2 4 3 5 6 8 1 -51 -33 2 样例输出&#xff1a; 1 1 3 4 -1 分析&#xff1a;先考虑如何对物件进行排序&#xff0c;首先&…

【PSO-PID】使用粒子群算法整定PID参数控制起动机入口压力值

最近在学优化算法&#xff0c;接触到了经典寻优算法之粒子群PSO&#xff0c;然后就想使用PSO算法来调节PID参数&#xff0c;在试验成功之后将此控制算法应用到了空气起动系统上&#xff0c;同时与之前的控制器进行对比看看哪种控制效果最好。 0 引言 PID参数整定主要有两种&…

谁说程序员不懂了浪费,女神节安排

Python的PyQt框架的使用一、前言二、女神节文案三、浪漫的代码四、官宣文案一、前言 个人主页: ζ小菜鸡大家好&#xff0c;我是ζ小菜鸡&#xff0c;特在这个特殊的日子献上此文&#xff0c;希望小伙伴们能讨自己的女神欢心。 二、女神节文案 1.生活一半是柴米油盐&#xff0c…

优化设计流程的“闭环”问题

7.优化设计流程的“闭环”问题 交互设计师有一项很重要的工作就是定义任务流程。在接到需求之后&#xff0c;设计师需要把抽象的需求设计成具象的流程&#xff0c;然后再把流程分配到不同的界面&#xff0c;最终形成成品。设计流程不难&#xff0c;但是设计好的流程非常难&…

VisualStudio2022制作多项目模板及Vsix插件

一、安装工作负载 在vs2022上安装“visual studio扩展开发 ”工作负载 二、制作多项目模板 导出项目模板这个我就不再多说了&#xff08;项目→导出模板→选择项目模板&#xff0c;选择要导出的项目→填写模板信息→完成&#xff09;。 1.准备模板文件 将解决方案中的多个…

SpringBoot整合ElasticSearch实现模糊查询,排序,分页,高亮

目录 前言 1.框架集成-SpringData-整体介绍 1.1Spring Data Elasticsearch 介绍 2.框架集成Spring Data Elasticsearch 2.1版本说明 2.2.idea创建一个springboot项目 2.3.导入依懒 2.3.增加配置文件 2.4Spring Boot 主程序。 2.5.数据实体类 2.6.配置类 2.7.DAO 数据…

速卖通、亚马逊、ebay打造爆款,借助测评自养号提高转化率

做速卖通、亚马逊、ebay只有打造爆款&#xff0c;才能够挣到钱&#xff0c;如果一年到头&#xff0c;不断测款&#xff0c;不断测试不同的广告打法&#xff0c;那么代表了什么&#xff1f;代表了你的试错成本相当高&#xff0c;一不小心&#xff0c;分分钟就能够把手头上仅有的…

【YOLOv8/YOLOv7/YOLOv5/YOLOv4/Faster-rcnn系列算法改进NO.57】引入可形变卷积

文章目录前言一、解决问题二、基本原理三、​添加方法四、总结前言 作为当前先进的深度学习目标检测算法YOLOv8&#xff0c;已经集合了大量的trick&#xff0c;但是还是有提高和改进的空间&#xff0c;针对具体应用场景下的检测难点&#xff0c;可以不同的改进方法。此后的系列…

SRP合批问题

1&#xff09;SRP合批问题 ​2&#xff09;多个Base相机渲染到同一个渲染目标&#xff0c;移动平台花屏的问题 3&#xff09;粒子系统对GPU Instancing的支持 4&#xff09;如何修改URP下场景和UI分辨率分离&#xff08;不需要改颜色空间&#xff09; 这是第327篇UWA技术知识分…

苹果新专利实现无线技术传输睡眠数据,蓝牙在智能家居中的应用

苹果于 2017 年 5 月收购了芬兰科技公司 Beddit&#xff0c;只是在过去 6 年时间里并没有太大的动作。根据美国商标和专利局本周公示的清单&#xff0c;苹果获得了一项 Beddit 相关的技术专利。 根据专利描述&#xff0c;苹果使用一根或者多根天线&#xff0c;利用电磁辐射的…