IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 基于ZYNQ实现串口中断读写不定长数据 -> 正文阅读

[嵌入式]基于ZYNQ实现串口中断读写不定长数据

基于zynq7000系列芯片的ARM核,与上位机通信,串口是在数据量不大,速率不快的情况下的最好选择,ZYNQ的串口提供了诸多中断模式,最常用的FIFO满中断(XUARTPS_IXR_RXFULL),FIFO空中断(XUARTPS_IXR_RXEMPTY),以及设定一定长度字符的等级中断(XUARTPS_IXR_RXOVR),对于不定长度的通信,若希望以不定长帧的形式发送数据给下位机,以上几种方式都不是最好的方法,这里使用接收时间溢出的方法,在接收到一帧数据结束后,几个bit的时间内没有接收到信息,则发生中断,这属于以时间成本换取功能的方法。

对于串口中断,需要三个主要部分:串口中断设置,串口初始化和中断服务函数,对于vivado的ps部分配置省略

中断配置函数

int setup_interrupt_uart(XScuGic *intc)
{
?? ?int status;
?? ?XScuGic_Config *interConfig;
?? ?Xil_ExceptionInit();
?? ?//查找中断控制器配置信息及初始化中断控制器驱动
?? ?interConfig=XScuGic_LookupConfig(UART_Interrupt_ID);
?? ?if(NULL==interConfig)
?? ?{
?? ??? ?return XST_FAILURE;//初始化失败返回
?? ?}
?? ?//配置中断控制寄存器
?? ?status=XScuGic_CfgInitialize(intc,interConfig,interConfig->CpuBaseAddress);

?? ?if(status!=XST_SUCCESS)
?? ?{
?? ??? ?return XST_FAILURE;
?? ?}
?? ?//InterruptSystemSetup(interConfig);
?? ?//中断异常使能
?? ?Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
?? ??? ??? ?(Xil_ExceptionHandler) XScuGic_InterruptHandler,(void *)intc);
?? ?Xil_ExceptionEnable();
?? ?//链接中断服务函数UartInterrupt_surver
?? ?status = XScuGic_Connect(intc, UART_INT_IRQ_ID,
?? ??? ??? ?( Xil_ExceptionHandler ) XUartPs_InterruptHandler, (void *) &uart_ps);
?? ?XUartPs_SetHandler(&uart_ps,(XUartPs_Handler)uartIntrHandler,&uart_ps);
?? ?//设置中断类型
?? ?XUartPs_SetInterruptMask(&uart_ps,XUARTPS_IXR_TOUT);
?? ?//使能uart中断
?? ?XScuGic_Enable(intc,UART_INT_IRQ_ID);
?? ?return XST_SUCCESS;

//?? ?while(1);
}

串口初始化函数?

int UART_INIT(void)
{
?? ?int status;
?? ?XUartPs_Config *uart_cfg;
?? ?uart_cfg=XUartPs_LookupConfig(UART_DEVICE_ID);
?? ?if(NULL==uart_cfg)
?? ??? ?return XST_FAILURE;
?? ?status=XUartPs_CfgInitialize(&uart_ps,uart_cfg,uart_cfg->BaseAddress);
?? ?if(status!=XST_SUCCESS)
?? ??? ?return XST_FAILURE;
?? ?status=XUartPs_SelfTest(&uart_ps);
?? ?if(status!=XST_SUCCESS)
?? ??? ?return XST_FAILURE;
?? ?//设置工作模式,正常模式
?? ?XUartPs_SetOperMode(&uart_ps,XUARTPS_OPER_MODE_NORMAL);
?? ?//设置波特率率
?? ?XUartPs_SetBaudRate(&uart_ps,115200);
?? ?//设置RxFIFO的中断溢出时间 5个周期
?? ?XUartPs_SetRecvTimeout(&uart_ps,5);
?? ?XUartPs_Recv(&uart_ps,rxbuf,32);
?? ?XUartPs_EnableUart(&uart_ps);
?? ?return XST_SUCCESS;

}

void uartIntrHandler(void *callback_ref,u32 Event,u32 EventData)
{
?? ?XUartPs *uart_instance=(XUartPs *) callback_ref;
?? ?if(Event==XUARTPS_EVENT_RECV_TOUT)
?? ?{
?? ??? ?XUartPs_Recv(&uart_ps,rxbuf,32);
?? ??? ?XUartPs_Send(&uart_ps,rxbuf,EventData);
????????}
?? ??? ?XUartPs_WriteReg(uart_instance->Config.BaseAddress,XUARTPS_ISR_OFFSET,XUARTPS_IXR_RXOVR);
?? ?}

变量声明

XUartPs uart_ps;

u8 rxbuf[32];

#define UART_DEVICE_ID XPAR_XUARTPS_0_DEVICE_ID
#define ?UART_Interrupt_ID XPAR_SCUGIC_SINGLE_DEVICE_ID
#define UART_INT_IRQ_ID XPAR_XUARTPS_1_INTR

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-12-24 18:38:44  更:2021-12-24 18:40:04 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 14:47:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码