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

news2025/1/10 11:22:31

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 1

 XIntc Intc; //中断控制器实例
 XGpio led_gpio; //LED 实例
 XTmrCtr Timer; //定时器实例

 void timer_intr_hander(void *InstancePtr);

 int main(){
 print ("timer interrupt test\n");
 //初始化 LED
 XGpio_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.coloradmin.cn/o/1275131.html

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

相关文章

美国站卖家请在今年12/28前更新W-8税务信息

美国税务信息采集指南 根据美国国家税务局的规定&#xff0c;非美国纳税人需要向亚马逊提供W-8BEN表格&#xff0c;以豁免美国报税要求。美国国家税务局W-8BEN表格将在卖家向亚马逊提供此表格三年后过期。收到提示时&#xff0c;海外卖家需要重新接受税务信息采集以提交新表格。…

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

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

Qt开发 之 安装程序错误--安装进程(qt.tool.perl)的解决办法

文章目录 1、问题描述2、问题原因3、解决方案3.1、不关闭错误弹出窗口3.2、手动安装Perl3.3、安装Perl完成后&#xff0c;点击“ignore”继续安装 1、问题描述 Win11下&#xff0c;安装qt5.12.12时遇到“安装进程(qt.tools.perl)运行期间出现错误” 问题描述&#xff1a; Err…

C++-详解智能指针

目录 ​编辑 一.什么是智能指针 1.RAII 2.智能智能指针 二.为什么需要智能指针 1.内存泄漏 a. 什么是内存泄漏&#xff0c;内存泄漏的危害 b.内存泄漏分类 c.如何检测内存泄漏 d.如何避免内存泄漏 总结一下: 2.为什么需要智能指针以及智能指针的原理 三.智能指针的使用 1.C…

程序员养生之道:延寿不忘初心——延寿必备

文章目录 每日一句正能量前言如何养生饮食篇运动篇休息篇后记 每日一句正能量 现代社会已不是大鱼吃小鱼的年代&#xff0c;而是快鱼吃慢鱼的年代。 前言 在IT行业中&#xff0c;程序员是一个重要的职业群体。由于长时间的繁重编程工作&#xff0c;程序员们常常忽略了身体健康…

(Python) 字典dict的使用

a dict(namekl_pen, kl_target0.01, lam0.5) print(类型&#xff1a;, type(a)) print(数值&#xff1a;, a) print(name键的值&#xff1a;, a[name]) print(键&#xff1a;, a.keys()) print(值&#xff1a;, a.values())

知虾平台丨优化Shopee店铺运营,提升销售利润——了解知虾平台

在如今竞争激烈的电商市场中&#xff0c;Shopee作为一家快速发展的平台&#xff0c;吸引了众多卖家加入。然而&#xff0c;要在Shopee上取得成功并实现可观的销售利润&#xff0c;并不是一件容易的事情。为了帮助卖家更好地了解市场趋势、优化商品关键词、监控竞争对手等&#…

Java中的异常你了解多少?

目录 一.认识异常二.异常分类三.异常的分类1.编译时异常2.运行时异常 四.异常的处理1.LYBL&#xff1a;事前防御型2.EAFP&#xff1a;事后认错型 五.异常的抛出Throw注意事项 六.异常的捕获1.异常的捕获2.异常声明throws3.try-catch捕获并处理 七.自定义异常 一.认识异常 在Jav…

MySQL实现(免密登录)

简介: MySQL免密登录是一种允许用户在没有输入密码的情况下直接登录到MySQL服务器的配置。这通常是通过在登录时跳过密码验证来实现的。 1、修改MySQL的配置文件 使用vi /etc/my.cnf&#xff0c;添加到【mysqld】后面 skip-grant-tables #配置项告诉mysql跳过权限验证&#…

避免客户开发信被限制的方法与策略

开发信是外贸或者出海企业常用的一种开发客户的方式。相较于其他的获客方式&#xff0c;开发信能够更加精准地投放到客户中&#xff0c;并且只需承担较低的成本。但是&#xff0c;由于一些限制管制要求&#xff0c;外贸人员可能会遇到开发新被限制的情况。今天&#xff0c;小编…

元宇宙时代CSGO游戏装备市场如何迎合年轻人的需求?

元宇宙时代游戏装备市场如何迎合年轻人的需求&#xff1f;游戏装备市场的主要消费者是年轻人&#xff0c;他们对于游戏装备有着自己的需求和偏好。 为了迎合年轻人的需求&#xff0c;游戏装备需要具备以下几个特点&#xff1a; 1、个性化。年轻人喜欢表达自己的个性和风格&am…

Ubuntu18.04 Udacity project_9_PID_control 如何运行

工程源码和仿真器下载&#xff1a; 源码 仿真器 --- Ubuntu就下载 term2_sim_linux.zip 这个压缩文件即可 紧接着给方框中的文件赋可执行权限 打开project_9_PID_control文件夹 执行如下脚本&#xff0c;安装必要的库&#xff0c;比如websocket&#xff08;程序生成的可执行…

Python秘籍:圆周率不只是3.14,更多玩法让你大开眼界!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在数学领域&#xff0c;圆周率&#xff08;π&#xff09;是一个充满神秘和无限循环的数字&#xff0c;其奇妙性质一直以来都令人着迷。而在Python这个多才多艺的编程语言中&#xff0c;我们有机会以更深入的方式…

解决 from . import _imaging as core ImportError: DLL load failed: 找不到指定的模块。

升级pillow版本就完事了 卸载掉之前的旧版本 conda uninstall pillow升级到新的版本就解决了 pip uninstall pillow 那个错误就解决了

SeaTunnel扩展Source插件,自定义connector-webservice

代码结构 在seatunnel-connectors-v2中新建connector-webservice模块&#xff0c;可以直接赋值connector-http-base模块&#xff0c;webservice和http的方式比较类似&#xff0c;有些类直接复制了http中的代码。 核心类有WebserviceConfig&#xff0c;WebserviceParameter&am…

Maven的配置亲测有效

文章目录 前言一、maven网址二、操作步骤三.配置环境变量四.配置本地仓库五.找到mirror 和配置JDK六.胜利七.提醒⏰;总结 前言 &#xff08;我讲一下什么是maven&#xff0c;不想看跳到下一步就行了&#xff0c;也没必要看&#xff09; Maven&#xff08;Apache Maven&#x…

2023认证杯小美赛数学建模国际赛ABCD题思路及python代码分享

大家好呀&#xff0c;认证杯小美赛数学建模开始了&#xff0c;来说一下初步的选题建议吧&#xff1a; 首先定下主基调&#xff0c; 本次小美赛难度&#xff1a;D&#xff1c;A≈C&#xff1c;B。推荐选择D题。预计12.2中午更新D完整论文。预定论文请往后滑看完本文档链接。 A…

Python+Requests模拟发送GET请求

模拟发送GET请求 前置条件&#xff1a;导入requests库 一、发送不带参数的get请求 代码如下&#xff1a; 以百度首页为例 import requests# 发送get请求 response requests.get(url"http://www.baidu.com") print(response.content.decode("utf-8"))…

geoserver 发布图层(tif、shp等)

我们用得最多的是这个板块的内容 下面我们来尝试发布地图。点击【数据】——【工作区】——【添加新的工作区】&#xff0c;工作区可以理解为是用来存放发布地图的一个集合。 在【新建工作区】中输入名称&#xff0c;还有一个命名空间URI&#xff0c;这个只要保持和之前的工作区…

大气多功能工作室个人引导页源码

源码简介 大气多功能工作室个人引导页源码&#xff0c;支持三端自适应&#xff0c;带赞助功能&#xff0c;采用设计配色网站点赞量最高的一个配色方案&#xff0c;一个二次元风格的引导页就此诞生&#xff0c;经过长传美国服务器测试&#xff0c;结果也是很理想&#xff0c;测速…