zynq 的定時器中斷實驗

2021-08-17 23:49:50 字數 3490 閱讀 2891

本文通過定時器中斷實驗,介紹zynq 的中斷和定時器的基本使用方法。

本文是在helloworld 實驗的基礎上完成的,所以必須先完成了helloworld 的實驗。這個可以學習本部落格的helloworld 實驗,或者開發板提供的helloworld 實驗。

1:中斷和定時器介紹:

中斷對於保證任務的實時性非常必要, 在 zynq 裡整合了中斷控制器 gic(generic interrupt controller)。gic 可以接受 i/o 外設中斷 iop 和 pl 中斷, 將這些中斷發給cpu。

中斷體系結構框圖圖下(ug585 page221) :

中斷可以分為三類:

軟體中斷:sgi (software generated interrupts )通過寫 icdsgir 暫存器產生 sgi.

共享中斷:spi (shared peripheral interrupts )通過 ps 和 pl 內各種 i/o 和儲存器控制器產生。

私有中斷:ppi 

(private peripheral interrupts )包含: 全域性定時器, 私有看門狗定時器, 私有定時器以及來自 pl 的 fiq/irq。

zynq 每個 cpu 鏈結 5 個私有外設中斷, 所有中斷的觸發型別都是固定不變的。 並且來自 pl 的快速中斷訊號 fiq 和中斷訊號 irq 反向, 然後送到中斷控制器因此儘管在icdicfr1 暫存器內反應的他們是低電平觸發, 但是 ps-pl 介面中為高電平觸發。 如圖所示(ug585 page 222:

2: 實驗過程

本文要求你有helloworld 工程,當然你可以把工程取名為timer_test。 用如下**替換helloworld.c 的檔案內容。

helloworld.c

#include

#include "xadcps.h"

#include "xil_types.h"

#include "xscugic.h"

#include "xil_exception.h"

#include "xscutimer.h"

//timer info

#define timer_device_id     xpar_xscutimer_0_device_id

#define intc_device_id      xpar_scugic_single_device_id

#define timer_irpt_intr     xpar_scutimer_intr

#define timer_load_value    0x13d92d3f

static xscugic intc; //gic

static xscutimer timer; //timer

static void setupinterruptsystem(xscugic *gicinstanceptr,

xscutimer *timerinstanceptr, u16 timerintrid);

static void timerintrhandler(void *callbackref);

int main()

return 0;

}void setupinterruptsystem(xscugic *gicinstanceptr,xscutimer *timerinstanceptr, u16 timerintrid)

static void timerintrhandler(void *callbackref)

{static int sec = 0;   //計數

xscutimer *timerinstanceptr = (xscutimer *) callbackref;

xscutimer_clearinterruptstatus(timerinstanceptr);

sec++;

printf(" %d second\n\r", sec);  //每秒列印輸出一次

和helloworld 實驗一樣,儲存編譯鏈結後,run as或  debug as 執行程式。這個時候,在終端上就可以看到

------------start-------------

1 second

2 second

3 second

4 second

每一秒看到多一行,報告其秒數。就是說每秒中斷一次,顯示累計的秒數。

3:**分析

程式中編寫了 3 個凼數,乙個是 main 主凼數,乙個是中斷建立凼數setupinterruptsystem,另乙個是中斷呼叫

凼數timerintrhandler。

main 凼數:

1,初始化定時器 timer, 指定 timer的裝置號為xpar_xscutimer_0_device_id,此裝置號在 xparameters.h 的標頭檔案中定義了的。2,設定定時器的初始設定值。3,設定定時器自動裝載,當定時器減為 0 的時候,會重新賦值這個初始設定值。4,開啟定時器。5,呼叫定時器中斷建立凼數 setupinterruptsystem。

定時器中斷建立凼數setupinterruptsystem:

xscugic_config *intcconfig; //gic config

xil_exceptioninit();

//初始化 gic

intcconfig = xscugic_lookupconfig(intc_device_id);

xscugic_cfginitialize(gicinstanceptr, intcconfig,intcconfig->cpubaseaddress);

//連線硬體

xil_exceptionregisterhandler(xil_exception_id_int,(xil_exceptionhandler) xscugic_interrupthandler,gicinstanceptr);

//設定定時器中斷,

xscugic_connect(gicinstanceptr, timerintrid,(xil_exceptionhandler) timerintrhandler,(void *) timerinstanceptr);

//使能中斷給定時器在gic

xscugic_enable(gicinstanceptr, timerintrid);

//使能定時器中斷

xscutimer_enableinterrupt(timerinstanceptr);

// 使能處理器的中斷

xil_exceptionenablemask(xil_exception_irq);

中斷呼叫凼數timerintrhandler:

當定時器計數為 0 時會產生定時器中斷。其主要內容是: 清除定時器中斷標誌,sec 的數值加 1, 再從串列埠資訊中列印出來。

實驗內容就介紹這麼多了。

定時器中斷實驗

常用庫函式 定時器引數初始化 void tim timebaseinit tim typedef timx,tim timebaseinittypedef tim timebaseinitstruct typedef struct tim timebaseinittypedef 定時器使能函式 vo...

定時器中斷實驗

今天看了並實際做了一次正點原子的定時器中斷實驗,實驗結果並不重要,這部分教程的意義在於讓我們學會如何去配置乙個定時器中斷。想要使用定時器中斷,我們要進行各種配置,將它們整合到乙個初始化函式裡,在這個函式中我們要做的事主要有 1.定義nvic和定時器初始化的結構體。2.使能定時器時鐘。3.配置nvic...

中斷和定時器實驗

實驗五 中斷和定時器實驗 姓名 鄭旅軍學號 0656061 指導老師 鄒慧蘭成績 如有疑問,請zlj800800 163.com 題目 通過外部中斷0,觸發乙個延時過程,假定延時時間為1秒,延時期間可以點亮乙個led或讓蜂鳴器發出聲音。已知微控制器晶振頻率為6 00mhz。可以使用定時器中斷,也可以...