grbl移植日志第二天移植串口数据接收

zynq的串口发送中断总是不能进入中断函数 . . . 看了好几天. 找不到原因了. 后来用了官方的串口中断示例代码也不行…

zynq的串口中断示例中, 有些bug. 提供的库也不是很好用. 因为封装好的库里面内置了一些固定的逻辑, 里面默认进行了中断的开启和关闭. 用起来并不是很顺手.

因为grbl 有一个循环缓冲队列, 为了实现此数据的上传, 需要在中断中修改此队列的指针.
索性摸索了一下zynq的的uart库, 直接基于寄存器自己写了一个. 要简单简洁的多.
不再需要像下面这使用uart官方提供的函数XUartPs_InterruptHandler, 也就不需要再使用
XUartPs_SetHandler 进行绑定了. 因为 XUartPs_InterruptHandler 中调用了XUartPs_SetHandler 设置的函数.

 XScuGic_Connect(gicPtr, XPAR_PS7_UART_0_INTR, Xil_InterruptHandler)XUartPs_InterruptHandler, (void *)xUart0Ptr);  XUartPs_SetHandler(xUart0Ptr, (XUartPs_Handler)uartIntrHandler, xUart0Ptr); 

据到FIFO

 /* Fill the FIFO from the buffer 填充发送数据到TX 的FIFO
*/
XUartPs_WriteReg(InstancePtr->Config.BaseAddress,  XUARTPS_FIFO_OFFSET,((u32)InstancePtr->SendBuffer.NextBytePtr[SentCount]));

禁用TXEMPTY中断

 
//禁用TXEMPTY中断
XUartPs_WriteReg(InstancePtr->Config.BaseAddress, XUARTPS_IDR_OFFSET, ((u32)XUARTPS_IXR_TXEMPTY | (u32)XUARTPS_IXR_TXFULL));

启用TXEMPTY中断

//启用TXEMPTY中断
XUartPs_WriteReg(InstancePtr->Config.BaseAddress, XUARTPS_IER_OFFSET, ((u32)XUARTPS_IXR_TXEMPTY | (u32)XUARTPS_IXR_TXFULL));

读取当前中断寄存器ISR的状态

//读取当前中断寄存器ISR的状态
/** Read the interrupt ID register to determine which* interrupt is active*/
u32 IsrStatus;
IsrStatus = XUartPs_ReadReg(InstancePtr->Config.BaseAddress,  XUARTPS_IMR_OFFSET); 
IsrStatus &= XUartPs_ReadReg(InstancePtr->Config.BaseAddress,  XUARTPS_ISR_OFFSET);

判断是不是FITO TX发送完成触发的中断

//判断是不是FITO TX发送完成触发的中断
if((IsrStatus & ((u32)XUARTPS_IXR_TXEMPTY | (u32)XUARTPS_IXR_TXFULL))  != (u32)0)
{/* Transmit data interrupt */SendDataHandler(InstancePtr, IsrStatus);
}

判断是不是接收溢出或接收空或者接收满的触发的状态.

/* Dispatch an appropriate handler. */
//判断是不是接收溢出或接收空或者接收满的触发的状态.
if((IsrStatus & ((u32)XUARTPS_IXR_RXOVR | (u32)XUARTPS_IXR_RXEMPTY |(u32)XUARTPS_IXR_RXFULL)) != (u32)0){ ReceiveDataHandler(InstancePtr);
}

上面的这些代码都是参考自 xuartps_intr.c,xuartps.c

void XUartPs_InterruptHandler(XUartPs *InstancePtr)
{
.....
}

把官方提供的库XUartPs_InterruptHandler 抄过来
改个名

void MyXUartPs_InterruptHandler(XUartPs *InstancePtr){u32 IsrStatus;Xil_AssertVoid(InstancePtr != NULL);Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);/** Read the interrupt ID register to determine which* interrupt is active*/IsrStatus = XUartPs_ReadReg(InstancePtr->Config.BaseAddress,  XUARTPS_IMR_OFFSET);IsrStatus &= XUartPs_ReadReg(InstancePtr->Config.BaseAddress,  XUARTPS_ISR_OFFSET);/* Dispatch an appropriate handler. */if((IsrStatus & ((u32)XUARTPS_IXR_RXOVR | (u32)XUARTPS_IXR_RXEMPTY |(u32)XUARTPS_IXR_RXFULL)) != (u32)0) {/* Received data interrupt */
//			ReceiveDataHandler(InstancePtr);}if((IsrStatus & ((u32)XUARTPS_IXR_TXEMPTY | (u32)XUARTPS_IXR_TXFULL))  != (u32)0){/* Transmit data interrupt */SendDataHandler(InstancePtr, IsrStatus);}/* XUARTPS_IXR_RBRK is applicable only for Zynq Ultrascale+ MP */if ((IsrStatus & ((u32)XUARTPS_IXR_OVER | (u32)XUARTPS_IXR_FRAMING |(u32)XUARTPS_IXR_PARITY | (u32)XUARTPS_IXR_RBRK)) != (u32)0) {/* Received Error Status interrupt */
//			ReceiveErrorHandler(InstancePtr, IsrStatus);}if((IsrStatus & ((u32)XUARTPS_IXR_TOUT)) != (u32)0) {/* Received Timeout interrupt */
//			ReceiveTimeoutHandler(InstancePtr);}if((IsrStatus & ((u32)XUARTPS_IXR_DMS)) != (u32)0) {/* Modem status interrupt */
//			ModemHandler(InstancePtr);}/* Clear the interrupt status. */XUartPs_WriteReg(InstancePtr->Config.BaseAddress, XUARTPS_ISR_OFFSET, IsrStatus);}

中断管理器中把函数和中断管理器进行连接. 这里连接到的是我上面自己修改过的MyXUartPs_InterruptHandler

	Status = XScuGic_Connect(IntcInstancePtr, UartIntrId,  (Xil_InterruptHandler) MyXUartPs_InterruptHandler,  (void *) UartInstancePtr);

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

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

相关文章

MySQL record 06 part

事务、存储过程 事务: MySQL的同步,同步是指 together done,要么一起前进,要么一起后退的意思。 注意,回滚 rollback 对已经提交 commit 的数据是无效的,也就是说,只能对没有被提交 commit …

【iOS】KVC的学习

【iOS】KVC的学习 文章目录 【iOS】KVC的学习前言KVC定义KVC设值KVC取值KVC使用keyPathKVC处理异常处理nil异常 KVC的一些应用修改动态的设置值实现高阶的消息传递 小结 前言 笔者简单学习了有关与KVC的相关内容,这里写一篇博客简单介绍一下相关内容。 KVC 定义 KV…

saas收银系统源码

1. 线下门店多样化收银 ①门店有社区小店、也会有大店,甚至还会有夫妻店,同时还要有Windows版和安卓版,需满足不同门店的收银需求。 ②支持Windows收银、安卓收银、无人自助收银、聚合码收银等,支持ai智能称重、收银称重一体机等…

『功能项目』QFrameWorkBug拖拽功能【66】

我们打开上一篇65QFrameWork道具栏物品生成的项目, 本章要做的事情是实现物品的拖拽功能 修改脚本:UISlot.cs 实现接口后编写脚本: using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; namespace QFramework {publi…

Netty+HTML5+Canvas 网络画画板实时在线画画

采用Html5的canvas做前端画画板&#xff0c;发送数据到后端Netty服务&#xff0c;实时转发笔迹数据&#xff0c;在线实时同步画笔轨迹&#xff0c;单击绿色小方块&#xff0c;保存画板的图片 页面&#xff1a; <!-- index.html --><!DOCTYPE html> <html> …

[Linux]:信号(下)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;Linux学习 贝蒂的主页&#xff1a;Betty’s blog 1. 信号的阻塞 1.1 基本概念 信号被操作系统发送给进程之后&#xff0c;进程…

机器学习05-聚类算法(python)SC(轮廓系数)详解

# 导入必要的库 from sklearn.cluster import KMeans # 导入 KMeans 聚类算法 import matplotlib.pyplot as plt # 导入 matplotlib 用于绘图 from sklearn.datasets import make_blobs # 导入 make_blobs 用于生成模拟数据 from sklearn.metrics import silhouette_score …

react:组件通信

组件通信 父组件向子组件通信 function App() {return (<div><div>这是父组件</div><Child name"这是子组件" /></div>); }// 子组件 function Child(props) {return <div>{props.name}</div>; }props说明 props可以传…

浅谈计算机视觉的学习路径1

计算机视觉&#xff08;Computer Vision, CV&#xff09;是人工智能领域的一个重要分支&#xff0c;它的目标是使计算机能够像人类一样理解和处理图像和视频数据。 面向想要从事该方向的大学生&#xff0c;笔者这里给出以下是关于计算机视觉的学习路径建议&#xff1a; 简要了解…

Linux开发工具(git、gdb/cgdb)--详解

目录 一、Linux 开发工具分布式版本控制软件 git1、背景2、使用 git&#xff08;1&#xff09;预备工作——安装 git&#xff1a;&#xff08;2&#xff09;克隆远程仓库到本地&#xff08;3&#xff09;把需要提交的代码拷贝到本地仓库&#xff08;4&#xff09;提交本地仓库文…

一种新的电子邮件攻击方式:AiTM

新的攻击组利用合作伙伴组织之间的信任关系来绕过多重身份验证。 一种新的攻击方式开始出现&#xff0c;它利用合作伙伴组织之间的信任关系绕过多重身份验证。在一个利用不同组织之间关系的攻击中&#xff0c;攻击者成功地对四家或更多组织进行了商业电子邮件欺诈(BEC)攻击&…

VM-Ubantu中使用vscode头文件报错——解决办法

问题 系统中头文件明明存在但是却报错 解决方法 在报错的文件中点击&#xff0c;shift ctrl p选择Edit Configurations(JSON) 修改文件内容 原文件内容 修改之后的内容 {"configurations": [{"name": "Linux","includePath":…

计算机毕业设计推荐-基于python大数据的个性化图书数据可视化分析

&#x1f496;&#x1f525;作者主页&#xff1a;毕设木哥 精彩专栏推荐订阅&#xff1a;在 下方专栏&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; 实战项目 文章目录 实战项目 一、个性化图书数据可视化分析-项…

828华为云征文 | 云服务器Flexus X实例:开源项目 LangChain 部署,实例测试

目录 一、LangChain 介绍 二、部署 LangChain 2.1 安装 langchain 2.2 安装 langchain_community 2.3 安装 qianfan 三、实例运行 3.1 Chat Models 3.2 LLMs 3.3 Embedding Models 四、总结 本篇文章主要通过 Flexus云服务器X实例 部署开源项目 LangChain&#xff0c…

【每日一题】LeetCode 2374.边积分最高节点(图、哈希表)

【每日一题】LeetCode 2374.边积分最高节点&#xff08;图、哈希表&#xff09; 题目描述 给定一个有向图&#xff0c;图中包含 n 个节点&#xff0c;节点编号从 0 到 n - 1。每个节点都有一个出边&#xff0c;指向图中的另一个节点。图由一个长度为 n 的整数数组 edges 表示…

【Linux学习】基本指令其一

命令行界面 命令行终端是一个用户界面&#xff0c;允许用户通过输入文本命令与计算机系统进行交互。 比如Windows下&#xff0c; 键入winR&#xff0c;然后输入cmd&#xff0c;就可以输入文本指令与操作系统交互了。 Windows有另一个命令行界面Powershell,它的功能比cmd更强大…

江协科技STM32学习- P15 TIM输出比较

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

【开源】LVGL+FreeRTOS 基于STM32F411CEU6的健康助手项目制作

视频演示 【开源】LVGLFreeRTOS 基于STM32F411的智能健康助手小项目 网盘链接在最底下&#xff01;&#xff01;&#xff01;无套路&#xff01;&#xff01;&#xff01;直接分享&#xff01;&#xff01;&#xff01; 硬件介绍 STM32F411CEU6 主控 TFT 1.8inch 显示屏 DTH…

WebGL缓冲区

一、缓冲区对象 缓冲区对象时WebGL系统中的一块内存区域&#xff0c;可以一次性地向缓冲区对象中填充大量的顶点数据&#xff0c;然后将这些数据保存其中&#xff0c;供顶点着色器使用。 类型化数组 这样程序可以预知数组中的类型&#xff0c;提高性能 类型描述Int8Array8位…

数据湖 Data Lake-概述

Data Lake 1. 数据湖的定义 数据湖是一种存储系统&#xff0c;用于集中存储大量的原始数据&#xff0c;可以按数据本来的原始格式进行存储&#xff0c;用户可以在需要时提取和分析这些数据。 A data lake is a centralized repository designed to hold vast volumes of data …