【1213工作日志】ZYNQ的中断应用

2024-06-21 14:08

本文主要是介绍【1213工作日志】ZYNQ的中断应用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【1213工作日志】ZYNQ的中断应用 /** main.c**  Created on: 2018年12月3日*      Author: xizi.cheng*//** main.c**  Created on: 2018年10月7日*      Author: xizi.cheng*/
/** main.c**  Created on: 2018年9月27日*      Author: xizi.cheng*/
/** main.c**  Created on: 2016年11月12日*      Author: Administrator*/
#include <stdio.h>
#include "xparameters.h"
#include "xil_io.h"
#include "sleep.h"
#include "xil_types.h"
#include "xscugic.h"
#include "xil_exception.h"
#define BASE_ADDR 0x43c00000
//int rec_data;
#define INT_CFG0_OFFSET 0x00000C00
// Parameter definitions
#define SW1_INT_ID              61
#define SW2_INT_ID              62
#define SW3_INT_ID              63
#define INTC_DEVICE_ID          XPAR_PS7_SCUGIC_0_DEVICE_ID
#define INT_TYPE_RISING_EDGE    0x03
#define INT_TYPE_HIGHLEVEL      0x01
#define INT_TYPE_MASK           0x03
static XScuGic INTCInst;
static void SW_intr_Handler(void *param);
static int IntcInitFunction(u16 DeviceId);
static void SW_intr_Handler(void *param)
{int sw_id = (int)param;printf("SW%d int\n\r", sw_id);Get_msg();
}
void IntcTypeSetup(XScuGic *InstancePtr, int intId, int intType)
{int mask;intType &= INT_TYPE_MASK;mask = XScuGic_DistReadReg(InstancePtr, INT_CFG0_OFFSET + (intId/16)*4);mask &= ~(INT_TYPE_MASK << (intId%16)*2);mask |= intType << ((intId%16)*2);XScuGic_DistWriteReg(InstancePtr, INT_CFG0_OFFSET + (intId/16)*4, mask);
}
int IntcInitFunction(u16 DeviceId)
{XScuGic_Config *IntcConfig;int status;// Interrupt controller initialisationIntcConfig = XScuGic_LookupConfig(DeviceId);status = XScuGic_CfgInitialize(&INTCInst, IntcConfig, IntcConfig->CpuBaseAddress);if(status != XST_SUCCESS) return XST_FAILURE;// Call to interrupt setupXil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,(Xil_ExceptionHandler)XScuGic_InterruptHandler,&INTCInst);Xil_ExceptionEnable();// Connect SW1~SW3 interrupt to handlerstatus = XScuGic_Connect(&INTCInst,SW1_INT_ID,(Xil_ExceptionHandler)SW_intr_Handler,(void *)1);if(status != XST_SUCCESS) return XST_FAILURE;status = XScuGic_Connect(&INTCInst,SW2_INT_ID,(Xil_ExceptionHandler)SW_intr_Handler,(void *)2);if(status != XST_SUCCESS) return XST_FAILURE;status = XScuGic_Connect(&INTCInst,SW3_INT_ID,(Xil_ExceptionHandler)SW_intr_Handler,(void *)3);if(status != XST_SUCCESS) return XST_FAILURE;// Set interrupt type of SW1~SW3 to rising edgeIntcTypeSetup(&INTCInst, SW1_INT_ID, INT_TYPE_RISING_EDGE);IntcTypeSetup(&INTCInst, SW2_INT_ID, INT_TYPE_RISING_EDGE);IntcTypeSetup(&INTCInst, SW3_INT_ID, INT_TYPE_RISING_EDGE);// Enable SW1~SW3 interrupts in the controllerXScuGic_Enable(&INTCInst, SW1_INT_ID);XScuGic_Enable(&INTCInst, SW2_INT_ID);XScuGic_Enable(&INTCInst, SW3_INT_ID);return XST_SUCCESS;
}
/**************************************************************
crc_high_first
指令描述:crc校验 x^8+x^2+x^1+1
类型:
延时:
输入:
***************************************************************/
u8 crc_high_first(u8  *ptr, u16 len)
{u16 i;u8 crc=0x00; //计算的初始crc值while(len--){crc ^= *ptr++;  //每次先与需要计算的数据异或,计算完指向下一数据for (i=8; i>0; --i)   //下面这段计算过程与计算一个字节crc一样{if (crc & 0x80)crc = (crc << 1) ^ 0x07;elsecrc = (crc << 1);}}return (crc);
}
#define ENCODE 0xAA
void Auto_addr(u8 chip_num){u8 send_data[4];send_data[0]=0x01;send_data[1]=0x00;send_data[2]=chip_num;send_data[3]=crc_high_first(send_data,3);u32 send4byte[2];send4byte[0]=(((0xaa&0x000000FF)<<24)|(((send_data[0]^ENCODE)&0x000000FF)<<16)|(((send_data[1]^ENCODE)&0x000000FF)<<8)|(((send_data[2]^ENCODE)&0x000000FF)<<0));send4byte[1]=((((send_data[3]^ENCODE)&0x000000FF)<<24)|0xFFFFFF);Xil_Out32(BASE_ADDR,send4byte[0]);Xil_Out32(BASE_ADDR,send4byte[1]);Xil_Out32(BASE_ADDR+4,0x0);//发送长度Xil_Out32(BASE_ADDR+4,0x10005);//发送长度int c=0;while(1){u32 rdata=Xil_In32(BASE_ADDR+0x24);if(rdata&0x40==0x40)break;elsec=c+1;if(c>10000)break;}//Xil_Out32(BASE_ADDR+4,0x0);//发送长度
}void Write_reg(int chip_addr,int reg_addr,u32 wdata){u8 send_data[8];send_data[0]=0x05;send_data[1]=chip_addr&0xFF;send_data[2]=reg_addr&0xFF;send_data[3]=((wdata&0xFF000000)>>24);send_data[4]=((wdata&0xFF0000)>>16);send_data[5]=((wdata&0xFF00)>>8);send_data[6]=((wdata&0xFF));//send_data[7]=0xFF;send_data[7]=crc_high_first(send_data,7);u32 send4byte[3];send4byte[0]=(((0xaa&0x000000FF)<<24)|(((send_data[0]^ENCODE)&0x000000FF)<<16)|(((send_data[1]^ENCODE)&0x000000FF)<<8)|(((send_data[2]^ENCODE)&0x000000FF)<<0));send4byte[1]=((((send_data[3]^ENCODE)&0x000000FF)<<24)|(((send_data[4]^ENCODE)&0x000000FF)<<16)|(((send_data[5]^ENCODE)&0x000000FF)<<8)|(((send_data[6]^ENCODE)&0x000000FF)<<0));send4byte[2]=((((send_data[7]^ENCODE)&0x000000FF)<<24)|0xFFFFFF);Xil_Out32(BASE_ADDR,send4byte[0]);Xil_Out32(BASE_ADDR,send4byte[1]);Xil_Out32(BASE_ADDR,send4byte[2]);Xil_Out32(BASE_ADDR+4,0x0);//发送长度Xil_Out32(BASE_ADDR+4,0x10009);//发送长度int b=0;while(1){u32 rdata=Xil_In32(BASE_ADDR+0x24);if(rdata&0x40==0x40)break;elseb=b+1;if(b>10)break;}
}
void Get_msg(){u32 rdata;u32 read_data[4];for(int i =0;i<4;i++){read_data[i]=0xffffffff;}rdata=Xil_In32(BASE_ADDR+0x24);xil_printf ("status is %8x\n",rdata);if(rdata&0x80==0x80){for(int i =0;i<4;i++){read_data[i]=Xil_In32(BASE_ADDR+0x8);}for(int i =0;i<4;i++){xil_printf ("%8x\t",read_data[i]^0xaaaaaaaa);}printf("\n");}else if(((~rdata)&0x200)==0x200){for(int i =0;i<4;i++){read_data[i]=Xil_In32(BASE_ADDR+0x8);}for(int i =0;i<4;i++){xil_printf ("%8x\t",read_data[i]^0xaaaaaaaa);}printf("\n");}elseprintf("did not get message \n");
}//READ_REG
void Read_reg(u8 chip_num,u8 reg_addr){u8 send_data[4];send_data[0]=0x06;send_data[1]=chip_num;send_data[2]=reg_addr;send_data[3]=crc_high_first(send_data,3);u32 send4byte[2];send4byte[0]=(((0xaa&0x000000FF)<<24)|(((send_data[0]^ENCODE)&0x000000FF)<<16)|(((send_data[1]^ENCODE)&0x000000FF)<<8)|(((send_data[2]^ENCODE)&0x000000FF)<<0));send4byte[1]=((((send_data[3]^ENCODE)&0x000000FF)<<24)|0xFFFFFF);Xil_Out32(BASE_ADDR,send4byte[0]);Xil_Out32(BASE_ADDR,send4byte[1]);Xil_Out32(BASE_ADDR+4,0x0);//发送长度Xil_Out32(BASE_ADDR+4,0x10005);//发送长度printf("Read reg\n");int c=0;while(1){u32 rdata=Xil_In32(BASE_ADDR+0x24);if(rdata&0x40==0x40)break;elsec=c+1;if(c>1000)break;}}
void Spi_Test(u8 chip_id){u8 send_data[5];u8 b[4];int m;send_data[0]=0x09;send_data[1]=chip_id;send_data[2]=0x00;send_data[3]=crc_high_first(send_data,3);u32 send4byte[2];send4byte[0]=(((0xaa&0x000000FF)<<24)|(((send_data[0]^ENCODE)&0x000000FF)<<16)|(((send_data[1]^ENCODE)&0x000000FF)<<8)|(((send_data[2]^ENCODE)&0x000000FF)<<0));send4byte[1]=((((send_data[3]^ENCODE)&0x000000FF)<<24)|0xFFFFFF);Xil_Out32(BASE_ADDR,send4byte[0]);Xil_Out32(BASE_ADDR,send4byte[1]);Xil_Out32(BASE_ADDR+4,0x0);//发送长度Xil_Out32(BASE_ADDR+4,0x10005);//发送长度int c=0;while(1){u32 rdata=Xil_In32(BASE_ADDR+0x24);if(rdata&0x40==0x40)break;elsec=c+1;if(c>1000)break;}//Xil_Out32(BASE_ADDR+4,0x0);//发送长度}
void Bist_Start(u8 chip_addr){u8 send_data[5];u8 b[4];int m;send_data[0]=0x02;send_data[1]=chip_addr;send_data[2]=0x00;send_data[3]=crc_high_first(send_data,3);u32 send4byte[2];send4byte[0]=(((0xaa&0x000000FF)<<24)|(((send_data[0]^ENCODE)&0x000000FF)<<16)|(((send_data[1]^ENCODE)&0x000000FF)<<8)|(((send_data[2]^ENCODE)&0x000000FF)<<0));send4byte[1]=((((send_data[3]^ENCODE)&0x000000FF)<<24)|0xFFFFFF);Xil_Out32(BASE_ADDR,send4byte[0]);Xil_Out32(BASE_ADDR,send4byte[1]);Xil_Out32(BASE_ADDR+4,0x0);//发送长度Xil_Out32(BASE_ADDR+4,0x10005);//发送长度int c=0;while(1){u32 rdata=Xil_In32(BASE_ADDR+0x24);if(rdata&0x40==0x40)break;elsec=c+1;if(c>1000)break;}// Xil_Out32(BASE_ADDR+4,0x0);//发送长度}
#define COUNT 4
int main()
{u32 rec_data[4],rdata;//配置SCI控制寄存器。SCI_TDY 、LSB_first、CPOL、CPHA。Xil_Out32(BASE_ADDR+0x14,0x3);//配置波特率寄存器。Xil_Out32(BASE_ADDR+0x10,80);//设置TX-FIFO控制寄存器SPI_TXFIFO_CTRL中的TX_EN比特位,使能TX-FIFO。Xil_Out32(BASE_ADDR+0x18,0x1);Xil_Out32(BASE_ADDR+0x20,0xc0);//rec_data=Xil_In32(BASE_ADDR+0x24);Xil_Out32(BASE_ADDR+0x1c,0x0);//接收端使能Xil_Out32(BASE_ADDR+0x1c,0x1);//接收端使能Xil_Out32(BASE_ADDR+0x0c,0xa0a);//接收端使能//将待发送数据通过写SCI_TX_DATA寄存器依次存入TX-FIFO。Xil_Out32(BASE_ADDR+4,0x0);//发送长度//----------chip config--------------Auto_addr(0x01);Spi_Test(0x01);Spi_Test(0x01);Write_reg(0x01,0x01,0x1E002);Write_reg(0x01,0x01,0x1E002);Read_reg(0x01,0x01);Get_msg();Write_reg(0x01,0x10,0xFFFFFFFF);Write_reg(0x01,0x11,0xFFFFFFFF);Bist_Start(0x01);Get_msg();//3)发送完单次(一条完整的指令)传输的所有数据后,//设置SCI_TX_CTL寄存器,通知硬件准备发送已经需要发送的数据长度。//1)设置SCI接收数据控制寄存器SCI_RX_CTRL,配置单次接收的数据长度。//2)设置RX-FIFO控制寄存器SCI_RXFIFO_CTRL中的RX_EN比特位,启动RX-FIFO。//3)当接收到RX_END中断后,通过读取SCI_RX_DAT寄存器依次从RX-FIFO中读取相应长度的数据。//rec_data=Xil_In32(BASE_ADDR+0x24);////rec_data=Xil_In32(BASE_ADDR+0x8);
u32 status=0;
int a=0;
int b=0;
Xil_Out32(BASE_ADDR+0x1c,0x0);//接收端使能
Xil_Out32(BASE_ADDR+0x1c,0x1);//接收端使能
Xil_Out32(BASE_ADDR+0x0c,0xa0a);//接收端使能
b=1;
rdata=Xil_In32(BASE_ADDR+0x04);
Read_reg(0x01,1);
for(int m;m<10000;m++){ }
Get_msg();
Get_msg();
Read_reg(0x01,1);
for(int m;m<10000;m++){ }
Get_msg();Read_reg(0x01,1);
for(int m;m<10000;m++){ }
Get_msg();
Get_msg();
IntcInitFunction(INTC_DEVICE_ID);while(1){printf("==enter write thread==\n");Read_reg(0x01,b);if(b==1){b=3;}else if(b==3){b=1;}Get_msg();Get_msg();Get_msg();
//  Get_msg();
//  Get_msg();
//  Get_msg();}
return 0;
}

 

这篇关于【1213工作日志】ZYNQ的中断应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Nacos日志与Raft的数据清理指南

《Nacos日志与Raft的数据清理指南》随着运行时间的增长,Nacos的日志文件(logs/)和Raft持久化数据(data/protocol/raft/)可能会占用大量磁盘空间,影响系统稳定性,本... 目录引言1. Nacos 日志文件(logs/ 目录)清理1.1 日志文件的作用1.2 是否可以删除

SpringBoot实现文件记录日志及日志文件自动归档和压缩

《SpringBoot实现文件记录日志及日志文件自动归档和压缩》Logback是Java日志框架,通过Logger收集日志并经Appender输出至控制台、文件等,SpringBoot配置logbac... 目录1、什么是Logback2、SpringBoot实现文件记录日志,日志文件自动归档和压缩2.1、

Python Flask 库及应用场景

《PythonFlask库及应用场景》Flask是Python生态中​轻量级且高度灵活的Web开发框架,基于WerkzeugWSGI工具库和Jinja2模板引擎构建,下面给大家介绍PythonFl... 目录一、Flask 库简介二、核心组件与架构三、常用函数与核心操作 ​1. 基础应用搭建​2. 路由与参

Spring Boot中的YML配置列表及应用小结

《SpringBoot中的YML配置列表及应用小结》在SpringBoot中使用YAML进行列表的配置不仅简洁明了,还能提高代码的可读性和可维护性,:本文主要介绍SpringBoot中的YML配... 目录YAML列表的基础语法在Spring Boot中的应用从YAML读取列表列表中的复杂对象其他注意事项总

电脑系统Hosts文件原理和应用分享

《电脑系统Hosts文件原理和应用分享》Hosts是一个没有扩展名的系统文件,当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址,一旦找到,系统会立即打开对应... Hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应

CSS 样式表的四种应用方式及css注释的应用小结

《CSS样式表的四种应用方式及css注释的应用小结》:本文主要介绍了CSS样式表的四种应用方式及css注释的应用小结,本文通过实例代码给大家介绍的非常详细,详细内容请阅读本文,希望能对你有所帮助... 一、外部 css(推荐方式)定义:将 CSS 代码保存为独立的 .css 文件,通过 <link> 标签

使用nohup和--remove-source-files在后台运行rsync并记录日志方式

《使用nohup和--remove-source-files在后台运行rsync并记录日志方式》:本文主要介绍使用nohup和--remove-source-files在后台运行rsync并记录日... 目录一、什么是 --remove-source-files?二、示例命令三、命令详解1. nohup2.

Python使用Reflex构建现代Web应用的完全指南

《Python使用Reflex构建现代Web应用的完全指南》这篇文章为大家深入介绍了Reflex框架的设计理念,技术特性,项目结构,核心API,实际开发流程以及与其他框架的对比和部署建议,感兴趣的小伙... 目录什么是 ReFlex?为什么选择 Reflex?安装与环境配置构建你的第一个应用核心概念解析组件

C#通过进程调用外部应用的实现示例

《C#通过进程调用外部应用的实现示例》本文主要介绍了C#通过进程调用外部应用的实现示例,以WINFORM应用程序为例,在C#应用程序中调用PYTHON程序,具有一定的参考价值,感兴趣的可以了解一下... 目录窗口程序类进程信息类 系统设置类 以WINFORM应用程序为例,在C#应用程序中调用python程序

Java应用如何防止恶意文件上传

《Java应用如何防止恶意文件上传》恶意文件上传可能导致服务器被入侵,数据泄露甚至服务瘫痪,因此我们必须采取全面且有效的防范措施来保护Java应用的安全,下面我们就来看看具体的实现方法吧... 目录恶意文件上传的潜在风险常见的恶意文件上传手段防范恶意文件上传的关键策略严格验证文件类型检查文件内容控制文件存储