ZYNQ笔记(九):定时器中断

 版本:Vivado2020.2(Vitis)

任务:使用定时器 (私有定时器) 中断 实现 LED(PS端) 定时1s亮灭翻转

目录

一、介绍

二、硬件设计

三、软件设计

四、效果


一、介绍

        Zynq系列是Xilinx(现为AMD)推出的集成了ARM Cortex-A9双核处理器和FPGA的可编程SoC器件。在Zynq中,定时器是重要的外设模块,用于时间测量、延时控制和周期性中断触发等。

Zynq主要有以下几种定时器:

  1. 私有定时器(Private Timer) - 每个ARM核都有一个私有定时器

  2. 全局定时器(Global Timer) - 双核共享的64位定时器

  3. 看门狗定时器(Watchdog Timer、WDT) - 用于系统监控和复位

  4. 三重定时器计数器(TTC) - FPGA侧提供的定时器

像 PS 端延时可以用定时器中断方式进行操作,以让cpu执行其他重要操作。

二、硬件设计

        ZYNQ 的配置使用到了 MIO(LED灯)、UART(用于Debug)、DDR(存储器),跟之前的工程案例相比没有额外的特殊配置,下面这幅图是CPU的工作频率,保持默认666.666MHz,定时器驱动时钟是其二分之一,也就是333.333MHz(后面会用到)

        最后整体 bd 设计部分如图所示:设计检查、Generate Output Products、 Create HDL Wrapper、(管脚约束、Gnerate Bitstream、(无PL端设计这两部忽略))、Export Hardware(不用包含比特流文件)、启动Vitis

三、软件设计

        可以打开官方提供的私有定时器的示例工程,这里可以选定时器中断的示例工程,方便在设计时进行对照参考。

#include "xparameters.h"
#include "xil_printf.h"
#include "xgpiops.h"
#include "xscutimer.h"
#include "xscugic.h"
#include "xil_exception.h"
#include "sleep.h"//===========================自定义宏=========================//#define GPIO_DEVICE_ID  	XPAR_XGPIOPS_0_DEVICE_ID 		//宏定义GPIO器件ID
#define MIO_LED  	        7						 		//宏定义LED管脚(PS端LED,根据开发板设值,这里对应GPIO MIO 7)#define INTC_DEVICE_ID		XPAR_SCUGIC_SINGLE_DEVICE_ID	//宏定义中断控制器(GIC)ID
#define TIMER_DEVICE_ID		XPAR_XSCUTIMER_0_DEVICE_ID      //宏定义TIMER器件ID
#define TIMER_IRPT_INTR		XPAR_SCUTIMER_INTR				//宏定义TIMER中断号(中断ID)#define TIMER_LOAD_VALUE	0x13DE4354	//定时器计数值(定时器驱动时钟333.333MHz为CPU时钟(默认666.66MHz)一半,周期约3ns,定时1s计数333_333_333 -1 次)//===========================实例化===========================//XGpioPs Gpio;		//GPIO示例
XScuGic Intc;		//中断控制器实例
XScuTimer Timer;	//定时器实例//=======================函数、变量声明=======================//static void Gpio_Init();        					//GPIO初始化
static void Timer_Intr_Init();  					//定时器中断初始化
static void LED_blink();        					//LED闪烁测试
static void Timer_IntrHandler(void *CallBackRef);	//定时器中断处理函数
static void Setup_Intr_System(XScuGic *intr,  XScuTimer *timer, u16 timer_intr_id);	//建立中断系统//===========================主函数===========================//int main()
{xil_printf("SCU Timer Interrupt Test! \r\n");Gpio_Init(); 		//GPIO初始化LED_blink(); 		//LED闪烁测试Timer_Intr_Init();  //定时器中断初始化while(1)return 0;
}//=====================定时器中断处理函数=====================//
// @param CallBackRef  用户自定义回调参数(对应TIMER实例指针)void Timer_IntrHandler(void *CallBackRef)
{static int led_state = 0;//将回调参数转为TIMER实例指针,用于操作硬件(例规范化设计)XScuTimer *TimerInstPtr = (XScuTimer *) CallBackRef;//打印Debug信息xil_printf("Interrupt Detected! \r\n");//清除定时器中断标志位XScuTimer_ClearInterruptStatus(TimerInstPtr);//翻转LED状态值led_state = ~led_state;//写数据到GPIO引脚(PS端LED)XGpioPs_WritePin(&Gpio, MIO_LED, led_state);}//=========================GPIO初始化========================//
void Gpio_Init()
{//定义器件ID(指针类型)XGpioPs_Config * ConfigPtr;//根据器件ID,查找器件配置信息ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);//初始化GPIO的驱动XGpioPs_CfgInitialize(&Gpio, ConfigPtr,ConfigPtr->BaseAddr);//GPIO方向设置(0输入/1输出)XGpioPs_SetDirectionPin(&Gpio, MIO_LED,  1);//设置输出使能(1使能)XGpioPs_SetOutputEnablePin(&Gpio, MIO_LED, 1);
}//======================定时器中断初始化======================//
void Timer_Intr_Init()
{//定义器件ID(指针类型)XScuTimer_Config *ConfigPtr;//根据器件ID,查找器件配置信息ConfigPtr = XScuTimer_LookupConfig(TIMER_DEVICE_ID);//初始化定时器的驱动XScuTimer_CfgInitialize(&Timer, ConfigPtr,ConfigPtr->BaseAddr);//(可选)定时器自检int Status = XScuTimer_SelfTest(&Timer);if (Status != XST_SUCCESS) { xil_printf("Timer Self Test Error! \r\n"); }//建立中断系统(调用函数)Setup_Intr_System(&Intc,  &Timer, TIMER_IRPT_INTR);//加载计数值(计数上限)XScuTimer_LoadTimer(&Timer, TIMER_LOAD_VALUE);//使能自动加载模式(计完自动加载计数值,不启用计完一次结束)XScuTimer_EnableAutoReload(&Timer);//启动定时器XScuTimer_Start(&Timer);
}//=======================建立中断系统=======================//
/* 建立中断系统,UART接收到数据时产生中断* @param intr			是指向 XScuGic驱动实例的指针* @param timer 		是指向 XScuTimer驱动实例的指针* @param timer_intr_id	是TIMER中断ID*/
void Setup_Intr_System(XScuGic *intr,  XScuTimer *timer, u16 timer_intr_id)
{//定义中断控制器配置信息(指针)XScuGic_Config * IntcConfig;//根据中断控制器ID,查找GIC配置信息IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);//初始化中断控制器驱动XScuGic_CfgInitialize(intr, IntcConfig, IntcConfig->CpuBaseAddress);//设置中断异常处理功能Xil_ExceptionInit();Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,(Xil_ExceptionHandler) XScuGic_InterruptHandler,(void *) intr);//使能处理器中断Xil_ExceptionEnable();//关联中断处理函数XScuGic_Connect(intr, timer_intr_id,(Xil_ExceptionHandler) Timer_IntrHandler,(void *) timer);//使能GIC中的定时器中断XScuGic_Enable(intr, timer_intr_id);//使能定时器中断XScuTimer_EnableInterrupt(timer);
}//========================LED闪烁测试========================//
void LED_blink()
{for(int i=0; i<3; i++)//闪烁3次{//向GPIO写1 、延时200ms、写0、延时XGpioPs_WritePin(&Gpio, MIO_LED, 1);  usleep(200000);XGpioPs_WritePin(&Gpio, MIO_LED, 0);  usleep(200000);}
}

四、效果

        上板后会先打印测试信息,然后LED灯快速闪烁3次(说明MIO配置无误),此后每秒定时器会产生中断,并将LED的状态翻转,效果为每两秒闪烁一次

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

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

相关文章

逻辑思维与软件开发:从选定方向到风险管理的全流程

在软件开发的过程中&#xff0c;逻辑思维是至关重要的。它不仅帮助我们在复杂的技术问题中找到解决方案&#xff0c;还能指导我们在项目管理、团队协作和风险控制等方面做出明智的决策。本文将探讨如何结合逻辑思维&#xff0c;围绕“选定大方向、及时止损、制定适合自己的执行…

描述城市出行需求模式的复杂网络视角:大规模起点-目的地需求网络的图论分析

描述城市出行需求模式的复杂网络视角&#xff1a;大规模起点-目的地需求网络的图论分析 原文&#xff1a; A complex network perspective for characterizing urban travel demand patterns: graph theoretical analysis of large-scale origin–destination demand networks…

如何测试雷达与相机是否时间同步?

在多传感器融合系统中&#xff0c;相机与雷达的协同感知已成为环境理解的关键。相机通过捕捉纹理信息识别物体类别&#xff0c;而雷达利用激光或毫米波实现全天候精确测距。两者的数据融合既能避免单一传感器缺陷&#xff08;如相机受光照影响、雷达缺乏语义信息&#xff09;&a…

探寻Gson解析遇到不存在键值时引发的Kotlin的空指针异常的原因

文章目录 一、问题背景二、问题原因三、问题探析Kotlin空指针校验Gson.fromJson(String json, Class<T> classOfT)TypeTokenGson.fromJson(JsonReader reader, TypeToken<T> typeOfT)TypeAdapter 和 TypeAdapterFactoryReflectiveTypeAdapterFactoryRecordAdapter …

ESP-ADF外设子系统深度解析:esp_peripherals组件架构与核心设计(存储类外设之SPIFFS)

目录 ESP-ADF外设子系统深度解析&#xff1a;esp_peripherals组件架构与核心设计&#xff08;存储类外设之SPIFFS&#xff09;1. 简介2. 模块概述功能定义架构位置核心特性 SPIFFS外设SPIFFS外设概述SPIFFS外设层次架构图 SPIFFS外设API和数据结构外设层API公共API内部API内部数…

【Pandas】pandas DataFrame truediv

Pandas2.2 DataFrame Binary operator functions 方法描述DataFrame.add(other)用于执行 DataFrame 与另一个对象&#xff08;如 DataFrame、Series 或标量&#xff09;的逐元素加法操作DataFrame.add(other[, axis, level, fill_value])用于执行 DataFrame 与另一个对象&…

开发网页程序时预览时遇到跨域问题解决方法

CocosCreator 开发h5游戏要用接口、开发html程序网页程序在chrome中预览时都会遇到跨域问题,怎么办? 网上有很多方法,主要是通过服务器端去配置,但那个相对来说消弱安全问题,这个不建议,因为是开发,个人行业,我们知道问题所以,简单点就主要是通过chrome的参数来禁用: 关闭 Ch…

C语言main的参数;argc与argv

目录 前言 什么是命令行参数 argc与argv argc (Argument Count) argv (Argument Vector) 示例 前言 在C语言中&#xff0c;main函数的标准形式通常有两种&#xff1a; int main(void)int main(int argc, char *argv[]) 其中&#xff0c;argc 和 argv 是用于处理命令行参数…

实验一 进程控制实验

一、实验目的 1、掌握进程的概念&#xff0c;理解进程和程序的区别。 2、认识和了解并发执行的实质。 3、学习使用系统调用fork()创建新的子进程方法&#xff0c;理解进程树的概念。 4、学习使用系统调用wait()或waitpid()实现父子进程同步。 5、学习使用getpid()和getppi…

【Python Web开发】01-Socket网络编程01

文章目录 1.套接字(Socket)1.1 概念1.2 类型1.3 使用步骤 Python 的网络编程主要用于让不同的计算机或者程序之间进行数据交换和通信&#xff0c;就好像人与人之间打电话、发消息一样。 下面从几个关键方面通俗易懂地介绍一下&#xff1a; 1.套接字(Socket) 在 Python 网络编…

Git 配置 GPG 提交签名

使用 GPG 对 Git 提交进行签名&#xff0c;可以证明该提交确实是你本人提交的。这在团队协作和代码审核中非常有用&#xff0c;GitHub/GitLab 等平台也会显示 “Verified” 标签。 &#x1f9e9; 一、检查是否已安装 GPG gpg --version 如果未安装&#xff0c;可使用以下命令…

MySQL运维三部曲初级篇:从零开始打造稳定高效的数据库环境

文章目录 一、服务器选型——给数据库一个舒适的家二、系统调优——打造高性能跑道三、MySQL配置——让数据库火力全开四、监控体系——数据库的体检中心五、备份恢复——数据安全的最后防线六、主从复制——数据同步的艺术七、安全加固——守护数据长城 引言&#xff1a;从小白…

实践项目开发-hbmV4V20250407-跨平台开发框架深度解析与VSCode一站式开发实践

跨平台开发框架深度解析与VSCode一站式开发实践 在当今多端应用开发需求激增的背景下&#xff0c;跨平台开发框架成为了众多开发者的首选。本文将围绕React Native、Taro及其结合方案&#xff0c;以及Uni-app、MUI、Quasar等轻量级框架展开详细分析&#xff0c;并探讨如何在VS…

Android15沉浸式界面顶部有问题

Android15沉浸式界面顶部有问题 往往开发人员的手机没这么高级&#xff0c;客户或者老板的手机是Android15的。 我明明就设了状态栏透明&#xff0c;我的手机也没问题。但Android15是有问题的。 先看下有问题的界面&#xff1a; 解决方案&#xff1a; 处理1&#xff1a; if (…

uni-app 状态管理深度解析:Vuex 与全局方案实战指南

uni-app 状态管理深度解析&#xff1a;Vuex 与全局方案实战指南 一、Vuex 使用示例 1. 基础 Vuex 配置 1.1 项目结构 src/ ├── store/ │ ├── index.js # 主入口文件 │ └── modules/ │ └── counter.js # 计数器模块 └── main.js …

【STM32单片机】#11 I2C通信(软件读写)

主要参考学习资料&#xff1a; B站江协科技 STM32入门教程-2023版 细致讲解 中文字幕 开发资料下载链接&#xff1a;https://pan.baidu.com/s/1h_UjuQKDX9IpP-U1Effbsw?pwddspb 单片机套装&#xff1a;STM32F103C8T6开发板单片机C6T6核心板 实验板最小系统板套件科协 实验&…

每天一道面试题@第一天

1&#xff1a;TCP和UDP的区别&#xff0c;TCP为什么是三次握手&#xff0c;不是两次&#xff1f; 因为TCP是全双工协议&#xff0c;区别在于TCP可靠&#xff0c;UDP不可靠&#xff0c;效率更高。 详解&#xff1a; TCP&#xff08;传输控制协议&#xff09;和 UDP&#xff08;…

一款强大的实时协作Markdown工具 | CodiMD 9.6K ⭐

CodiMD 介绍 CodiMD 是一个开源的实时协作 Markdown 笔记工具&#xff0c;它允许用户在任何平台上共同编辑 Markdown 文档。核心功能是实时协作&#xff0c;它允许多个用户同时编辑同一个文档&#xff0c;并实时看到彼此的更改。支持实时渲染预览&#xff0c;支持超多的富文本格…

若依如何切换 tab 不刷新

方法 如上图配置 菜单中选是否缓存&#xff1a;缓存 资料 前端手册 |RuoYi:

【浙江大学DeepSeek公开课】回望AI三大主义与加强通识教育

回望AI三大主义与加强通识教育 一、人工智能三大主义二、人工智能发展历程三、从 ChatGPT 到 DeepSeek四、人工智能通识教育五、人工智能的挑战与未来 一、人工智能三大主义 符号主义 &#xff1a;逻辑推理&#xff0c;将推理视为计算过程。如苏格拉底三段论&#xff0c;通过前…