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.pswp.cn/news/902449.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/902449.shtml
英文地址,請注明出處:http://en.pswp.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;通過前…