【【FPGA 之 MicroBlaze定时器中断实验】】

FPGA 之 MicroBlaze定时器中断实验

AXI Timer 具有 AXI 总线接口,能够产生不同时间周期和占空比的时钟、脉冲产生电路、产生与时间有关的中断和用于电机控制的脉宽调制信号。
AXI Timer IP 核提供了一个 AXI4 Lite 接口用于与处理器通信;它内部有两个可编程的定时器,具有中断、事件生成和事件捕获功能,用户可根据自身需求选择 8、16、32 位定时器的计数宽度;通过对两个定时器联合操作,可以输出一个脉宽调制信号,我们可以通过该信号控制一些外设,如 LED 等;我们也可以对两个 32 位宽的定时器进行级联操作,生成一个 64 位宽的定时器;在软件调试期间冻结停止计数器的输入。
在这里插入图片描述

AXI4-Lite Interface(AXI4-Lite 接口):该 AXI4-lite 接口模块被设计成 AXI4-lite 从接口,用于访问内存映射的定时器寄存器,我们也可以通过该接口对各个寄存器模块进行配置。

Timer Registers(定时器寄存器):该模块是一组 32 位寄存器。这组寄存器包含加载寄存器(Load Register)、
定时器/计数器寄存器和控制/状态寄存器(Control/Status Registers)。加载寄存器保存用于事件生成的计数
器的初始值或捕获值。控制/状态寄存器包含定时器模块的控制位和状态位。

32-bit Counters(32 位寄存器):定时器/计数器模块有两个 32 位计数器,每个计数器可设置为递增或
递减计数,并可从加载寄存器中加载一个值。

Interrupt Control(中断控制):中断控制模块根据操作模式生成单个中断。

Pulse Width Modulation (PWM,脉宽调制):PWM 模块能够产生具有指定频率和占空比的脉冲信号
PWM0。它使用 Timer0 作为 PWM0 周期,Timer1 作为 PWM0 输出宽度。

本章的实验任务是 通过定时器产生中断,控制 LED 灯闪烁。

实验框图 如下
在这里插入图片描述

为了方便记忆 我们拿出最小系统
在这里插入图片描述

多了的就是 一个 AXI Timer 和 GPIO-LED

每次实验 我们都会介绍一下 当前使用的IP的各个选项意思及作用

在这里插入图片描述

配置完成之后 设计的总体结构布局 如图所示
在这里插入图片描述

我们修改 XDC 文件

create_clock -period 20.000 -name sys_clk [get_ports sys_clk]
set_property PACKAGE_PIN R4 [get_ports sys_clk]
set_property IOSTANDARD LVCMOS33 [get_ports sys_clk]
set_property IOSTANDARD LVCMOS33 [get_ports sys_rst_n]
set_property PACKAGE_PIN U2 [get_ports sys_rst_n]
set_property IOSTANDARD LVCMOS33 [get_ports UART_rxd]
set_property IOSTANDARD LVCMOS33 [get_ports UART_txd]
set_property PACKAGE_PIN U5 [get_ports UART_rxd]
set_property PACKAGE_PIN T6 [get_ports UART_txd]
set_property IOSTANDARD LVCMOS33 [get_ports {led_tri_io[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led_tri_io[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led_tri_io[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led_tri_io[0]}]
set_property PACKAGE_PIN Y2 [get_ports {led_tri_io[3]}]
set_property PACKAGE_PIN V2 [get_ports {led_tri_io[2]}]
set_property PACKAGE_PIN R3 [get_ports {led_tri_io[1]}]
set_property PACKAGE_PIN R2 [get_ports {led_tri_io[0]}]

我们可以从 plantform 可以找到我们想要的 板级验证包 说实话 我觉得vitis 要比 SDK好用

#include <stdio.h>#include "xparameters.h"#include "xintc.h"#include "xtmrctr.h"#include "xil_exception.h"#include "xgpio.h"#include "xil_printf.h"#define LED_DEV_ID XPAR_GPIO_0_DEVICE_ID //LED ID#define INTC_ID XPAR_INTC_0_DEVICE_ID //中断控制器 ID#define TMRCTR_DEVICE_ID XPAR_TMRCTR_0_DEVICE_ID //定时器中断 ID#define TMRCTR_INTR_ID XPAR_INTC_0_TMRCTR_0_VEC_ID //定时中断 ID#define XIL_EXCEPTION_ID_INT 16U //中断异常 ID#define LED_Channel 1XIntc Intc; //中断控制器实例XGpio led_gpio; //LED 实例XTmrCtr Timer; //定时器实例void timer_intr_hander(void *InstancePtr);int main(){print ("timer interrupt test\n");//初始化 LEDXGpio_Initialize(&led_gpio, LED_DEV_ID);//为指定的 GPIO 信道设置所有独立信号的输入/输出方向XGpio_SetDataDirection(&led_gpio, 1, 0);//设置 LED 初始值XGpio_DiscreteWrite(&led_gpio, 1, 0x0f);//定时器初始化XTmrCtr_Initialize(&Timer, TMRCTR_DEVICE_ID);//为指定的计时器启用指定的选项。XTmrCtr_SetOptions(&Timer, 0,XTC_INT_MODE_OPTION | //中断操作XTC_AUTO_RELOAD_OPTION | //自动加载
XTC_DOWN_COUNT_OPTION); //递减计数//设置指定计时器的重置值XTmrCtr_SetResetValue(&Timer, 0, 50000000);//设置计时器回调函数,指定的计时器满一个周期时驱动程序将调用该回调函数XTmrCtr_SetHandler(&Timer, timer_intr_hander,&Timer);//开启定时器XTmrCtr_Start(&Timer, 0);//中断控制器初始化XIntc_Initialize(&Intc, INTC_ID);//关联中断源和中断处理函数XIntc_Connect(&Intc, TMRCTR_INTR_ID,(XInterruptHandler)XTmrCtr_InterruptHandler,&Timer);//开启中断控制器XIntc_Start(&Intc, XIN_REAL_MODE);//使能中断控制器XIntc_Enable(&Intc, TMRCTR_INTR_ID);//设置并打开中断异常处理Xil_ExceptionInit();Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,(Xil_ExceptionHandler)XIntc_InterruptHandler,&Intc);Xil_ExceptionEnable();while(1);}void timer_intr_hander(void *InstancePtr) //回调函数{static int led_state = 0x00;//检测定时器是否满一个计数周期if (XTmrCtr_IsExpired(&Timer, 0)){led_state = ~led_state; //LED 状态翻转XGpio_DiscreteWrite(&led_gpio, 1, led_state); //输出 LED 值}}

我们根据之前的对于中断的理解 可以这么理解
我们很明显的发现代码其实分为3个部分

一开始是 include 包含头文件

#include <stdio.h>#include "xparameters.h"#include "xintc.h"#include "xtmrctr.h"#include "xil_exception.h"#include "xgpio.h"#include "xil_printf.h"

接下来是

#define LED_DEV_ID     XPAR_GPIO_0_DEVICE_ID //LED ID#define INTC_ID        XPAR_INTC_0_DEVICE_ID //中断控制器 ID#define TMRCTR_DEVICE_ID     XPAR_TMRCTR_0_DEVICE_ID //定时器中断 ID#define TMRCTR_INTR_ID     XPAR_INTC_0_TMRCTR_0_VEC_ID //定时中断 ID#define XIL_EXCEPTION_ID_INT   16U //中断异常 ID#define LED_Channel 1

都是前面介绍过的

接下来的 19到 23行

XIntc Intc; //中断控制器实例
XGpio led_gpio; //LED 实例
XTmrCtr Timer; //定时器实例
void timer_intr_hander(void *InstancePtr);
是我们结构体介绍 还有声明 中断处理函数 接下来2832//初始化 LED
XGpio_Initialize(&led_gpio, LED_DEV_ID);
//为指定的 GPIO 信道设置所有独立信号的输入/输出方向
XGpio_SetDataDirection(&led_gpio, 1, 0);
//设置 LED 初始值
XGpio_DiscreteWrite(&led_gpio, 1, 0x0f);

完成对基本的GPIO设置
(我们发现窍门没有 都是先初始化GPIO , 再设置一下 GPIO的 信号到底是输入还是输出 ,再确定

接下来轮到我们新使用的AXI Timer

//定时器初始化
XTmrCtr_Initialize(&Timer, TMRCTR_DEVICE_ID);
//为指定的计时器启用指定的选项。
XTmrCtr_SetOptions(&Timer, 0,XTC_INT_MODE_OPTION | //中断操作
XTC_AUTO_RELOAD_OPTION | //自动加载
XTC_DOWN_COUNT_OPTION); //递减计数
//设置指定计时器的重置值
XTmrCtr_SetResetValue(&Timer, 0, 50000000);
//设置计时器回调函数,指定的计时器满一个周期时驱动程序将调用该回调函数
XTmrCtr_SetHandler(&Timer, timer_intr_hander,&Timer);
//开启定时器
XTmrCtr_Start(&Timer, 0);

我们掐头去尾 仔细分析 头尾 是 这个block 中 其他的 关于中断也有的东西 拿到一个新的东西 先用来 初始化 最后 开启定时器 或者最后 使能中断控制器
我们现在来看中间的配置

//为指定的计时器启用指定的选项。
XTmrCtr_SetOptions(&Timer, 0,XTC_INT_MODE_OPTION | //中断操作
XTC_AUTO_RELOAD_OPTION | //自动加载
XTC_DOWN_COUNT_OPTION); //递减计数
//设置指定计时器的重置值
XTmrCtr_SetResetValue(&Timer, 0, 50000000);
//设置计时器回调函数,指定的计时器满一个周期时驱动程序将调用该回调函数
XTmrCtr_SetHandler(&Timer, timer_intr_hander,&Timer);
其实是一个 从现实来讲 很连贯的问题  我们初始化定时器了 那么要定时器执行什么功能
XTmrCtr_SetOptions(&Timer, 0,XTC_INT_MODE_OPTION | //中断操作
XTC_AUTO_RELOAD_OPTION | //自动加载
XTC_DOWN_COUNT_OPTION); //递减计数

ok 既然如此 那么至少设定一个初始值 让它到哪里停止 和从哪里开始 既然是递减 那么到最后了我们需要的干什么 执行回调函数代码第 41行设置生成值,这里我们设为 50000000,即 0.5 秒(由于处理器时钟频率为 100M)。代码第 43 行设置回调函数,当指定的定时器满一个周期时驱动程序将调用该回调函数。代码第 45 行启动指定的定时器。

在下面就是中断异常 启动等等 设计了

//中断控制器初始化XIntc_Initialize(&Intc, INTC_ID);//关联中断源和中断处理函数XIntc_Connect(&Intc, TMRCTR_INTR_ID,(XInterruptHandler)XTmrCtr_InterruptHandler,&Timer);//开启中断控制器XIntc_Start(&Intc, XIN_REAL_MODE);//使能中断控制器XIntc_Enable(&Intc, TMRCTR_INTR_ID);//设置并打开中断异常处理Xil_ExceptionInit();Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,(Xil_ExceptionHandler)XIntc_InterruptHandler,&Intc);Xil_ExceptionEnable();

然后 再下面 就是while 循环的 主要工作了

while(1) 

没了

最后一个是 回调函数的定义

void timer_intr_hander(void *InstancePtr) //回调函数
{
static int led_state = 0x00;
//检测定时器是否满一个计数周期
if (XTmrCtr_IsExpired(&Timer, 0)){
led_state = ~led_state; //LED 状态翻转
XGpio_DiscreteWrite(&led_gpio, 1, led_state); //输出 LED 值
}
}

在这里插入图片描述

整个调试窗口

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

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

相关文章

引领数据趋势:2023年最值得关注的十大ETL数据集成工具

在这个数据至上的时代&#xff0c;对于以数据为驱动的组织来说&#xff0c;建立一个信息集中的强大源头是成功的关键。众多企业依靠ETL工具来管理和理解它们的数据。 ETL&#xff0c;即提取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;、加载&…

Jenkins持续集成之修改jenkins工作目录

修改jenkins工作目录 一般不建议把工作目录放到默认的C盘&#xff0c;故可以更改到其他盘中 前置条件&#xff1a;先在其他盘中新建工作目录的文件&#xff1b;如下图 1、首先打开任务管理器&#xff0c;找到服务中的Jenkins进程 2、右击点击转到详细信息&#xff1b; 3、再右…

四大视角看EMC设计:滤波、接地、屏蔽、PCB布局

电磁干扰的主要方式是传导干扰、辐射干扰、共阻抗耦合和感应耦合。对这几种途径产生的干扰我们应采用的相应对策&#xff1a;传导采取滤波&#xff0c;辐射干扰采用屏蔽和接地等措施&#xff0c;就能够大大提高产品的抵抗电磁干扰的能力&#xff0c;也可以有效的降低对外界的电…

EPICS motor模块中SoftMotor的使用示例

本实例使用motor模块中软电机&#xff0c;通过通道访问控制另一个直流电源IOC的输出电压&#xff0c;并且回读输出电压。 此处使用的另一个IOC为&#xff1a;基于EPICS stream模块的直流电源的IOC控制程序实例-CSDN博客 1&#xff09;创建这个IOC程序目录结构&#xff0c;操作…

pnpm 安装

npm install pnpm -g 解决方案&#xff1a; 1、使用管理员的身份打开powershell, win x 2、输入 set-executionpolicy remotesigned 后按y&#xff0c;问题得到解决 其他&#xff1a; pnpm 安装完成只有&#xff0c;可设置其镜像 1、查阅当前镜像&#xff08;源&#xff09…

Python常用库大全及简要说明,附官方网站链接地址

文章目录 前言环境管理包管理包仓库分发构建工具交互式解析器文件日期和时间文本处理特殊文本格式处理自然语言处理文档配置命令行工具下载器图像处理OCR音频Video地理位置HTTP数据库数据库驱动ORMWeb 框架权限CMS电子商务RESTful API验证模板引擎队列搜索动态消息资源管理缓存…

HarmonyOS ArkTS与c++交互通信

一、创建Native C Module 1、右键项目->new->module 如图&#xff1a; 2、修改build-profile.json5配置 "externalNativeOptions": {"path": "./src/main/cpp/CMakeLists.txt","arguments": "-v -DOHOS_STLc_shared&quo…

Android Bitmap 使用Vukan、RenderEffect、GLSL实现模糊

文章目录 Android Bitmap 使用Vukan、RenderEffect、GLSL实现模糊使用 RenderEffect 模糊使用 Vukan 模糊使用 GLSL 模糊RS、Vukan、RenderEffect、GLSL 效率对比 Android Bitmap 使用Vukan、RenderEffect、GLSL实现模糊 本文首发地址 https://blog.csdn.net/CSqingchen/articl…

运算放大器和常见运放电路

关于运算放大器 运算放大器(Operational Amplifier), 简称运放, 是一种直流耦合, 差模输入, 单端输出(Differential-in, single-ended output)的高增益电压放大器件. 运放能产生一个比输入端电势差大数十万倍的输出电势. 因为刚发明时主要用于加减法等运算电路中, 因而得名运算…

LLM算法工程师面试题总结

一、请简述对大模型的基本原理和架构的理解。 大型语言模型如GPT&#xff08;Generative Pre-trained Transformer&#xff09;系列是基于自注意力机制的深度学习模型&#xff0c;主要用于处理和生成人类语言。下面简要概述了它们的一些基本原理和架构特点&#xff1a; 基本原…

线上问题整理-ConcurrentModificationException异常

项目场景&#xff1a; 商品改价&#xff1a;商品改价中通过多线程批量处理经过 Lists.partition拆分的集合对象 问题描述 商品改价中通过多线程批量处理经过 Lists.partition拆分的集合对象&#xff0c;发现偶尔会报 java.util.ConcurrentModificationException: nullat jav…

用element-ui进行简单的商品管理

安装element-ui 项目的控制台输入npm i element-ui -S main.js import ElementUI from element-ui;//引入element-ui模块 import element-ui/lib/theme-chalk/index.css;//引入element-ui的css样式 Vue.use(ElementUI);//使用ElementUI 商品管理组件 <template><…

使用Redis实现分布式锁

说明&#xff1a;在多线程情况下&#xff0c;我们需要用到锁来控制线程对资源的访问&#xff0c;当在多线程分布式的情况下&#xff0c;如果使用synchronized (this)&#xff0c;这会在每台服务器实例上都生成一个锁对象&#xff0c;而这个锁只会对当前实例生效&#xff0c;无法…

【数字图像处理】边缘检测

边缘检测是一种图像处理技术&#xff0c;用于在图像中识别和提取物体边缘的信息&#xff0c;广泛应用于计算机视觉和图像分析领域。本文主要介绍数字图像边缘检测的基本原理&#xff0c;并记录在紫光同创 PGL22G FPGA 平台的布署与实现过程。 目录 1 边缘检测原理 2 FPGA 布署…

【工具分享】| 阅读论文神器 使用技巧 AI润色 AI翻译

文章目录 1 使用技巧1.1 功能一 即时翻译1.2 功能二 文献跳转1.3 功能三 多设备阅读1.4 功能四 小组讨论笔记共享1.5 功能五 个人文献管理 2 其他功能 超级喜欢Readpaper这一款论文阅读软件&#xff0c;吹爆他哈哈 为什么&#xff1f; 当然是他可以解决我们传统阅读论文的种种…

数据库范式1NF-4NF

码和属性 字段是对内而言的&#xff0c;private的 属性是对外而言的&#xff0c;public的 用Java中的类比喻就是一个对像里面定义了很多字段&#xff0c;一般情况下每个字段都有一组对应的getter&setter方法&#xff0c;注意到了吗&#xff0c;字段一般用private修饰&#…

HarmonyOs 4 (一) 认识HarmonyOs

目录 一 HarmonyOs 背景1.1 发展时间线1.2 背景分析1.2.1 新场景1.2.2 新挑战1.2.3 鸿蒙生态迎接挑战 二 HarmonyOS简介2.1 OpenHarmony2.2 HarmonyOS Connect2.3 HarmonyOS Next**2.4 ArkTS &#xff08;重点掌握&#xff09;****2.5 ArkUI** 三 鸿蒙生态应用核心技术理念**3.…

探索APP自动化测试工具的重要作用是什么?

随着移动应用市场的蓬勃发展&#xff0c;保障应用程序的质量和性能成为开发团队至关重要的任务。在这个背景下&#xff0c;APP自动化测试工具崭露头角&#xff0c;成为提高开发效率、减少错误率的关键工具。本文将探讨APP自动化测试工具的用途&#xff0c;以及它们在移动应用开…

mongoDB非关系型数据库学习记录

一、简介 1.1Mongodb是什么 MongoDB是一个基于分布式文件存储的数据库,官方地址https://www.mongodb.com/ 1.2数据库是什么 数据库(DataBase)是按照数据结构来组织、存储和管理数据的应用程序 1.3数据库的作用 数据库的主要作用就是管理数据,对数据进行增©、删(d)、…

大语言模型(LLMs)在 Amazon SageMaker 上的动手实践(一)

本期文章&#xff0c;我们将通过三个动手实验从浅到深地解读和演示大语言模型&#xff08;LLMs&#xff09;&#xff0c;如何结合 Amazon SageMaker 的模型部署、模型编译优化、模型分布式训练等。 实验一&#xff1a;使用 Amazon SageMaker 构建基于开源 GPT-J 模型的对话机器…