<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Backblog &#187; MSS</title>
	<atom:link href="http://backblog.betriebswerk-landshut.de/tag/mss/feed/" rel="self" type="application/rss+xml" />
	<link>http://backblog.betriebswerk-landshut.de</link>
	<description>Über Linux, Fotos und anderes Zeug</description>
	<lastBuildDate>Thu, 12 Aug 2010 09:52:55 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Microblaze Xgpio interrupts</title>
		<link>http://backblog.betriebswerk-landshut.de/2010/02/25/microblaze-xgpio-interrupts/</link>
		<comments>http://backblog.betriebswerk-landshut.de/2010/02/25/microblaze-xgpio-interrupts/#comments</comments>
		<pubDate>Thu, 25 Feb 2010 18:30:29 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[FPGA]]></category>
		<category><![CDATA[Technik]]></category>
		<category><![CDATA[9600]]></category>
		<category><![CDATA[Base System Builder]]></category>
		<category><![CDATA[BSB]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[EDK 10.1]]></category>
		<category><![CDATA[Hyperterminal]]></category>
		<category><![CDATA[Intc]]></category>
		<category><![CDATA[Interrupts]]></category>
		<category><![CDATA[MHS]]></category>
		<category><![CDATA[Microblaze]]></category>
		<category><![CDATA[MSS]]></category>
		<category><![CDATA[Xgpio]]></category>
		<category><![CDATA[Xilinx]]></category>

		<guid isPermaLink="false">http://backblog.betriebswerk-landshut.de/?p=475</guid>
		<description><![CDATA[Leider sind die Beispiele betreffend Interrupts am Microblaze Softcore von Xilinx nicht gerade üppig gesät zumal wenn es um Xgpio geht. Dieses C Beispiel hilft hoffentlich ein wenig mit den Interrupts klar zu kommen. Laut der Xilinx Interrupt Dokumentation die schon ein paar Jahre auf dem Buckel hat (4 Jahre)  gibt es 2 Level auf [...]]]></description>
			<content:encoded><![CDATA[<p>Leider sind die Beispiele betreffend Interrupts am Microblaze Softcore von Xilinx nicht gerade üppig gesät zumal wenn es um Xgpio geht. Dieses C Beispiel hilft hoffentlich ein wenig mit den Interrupts klar zu kommen. Laut der<a href="http://www.xilinx.com/support/documentation/application_notes/xapp778.pdf" target="_blank"> Xilinx Interrupt Dokumentation</a> die schon ein paar Jahre auf dem Buckel hat (4 Jahre)  gibt es 2 Level auf denen die Interrupts angelegt werden können. Der unterste Level (LowLevel) ist in den *_l.h header files festgelegt. Dieser Level ist auch halbwegs gut beschrieben (in diesem Dokument und im Anhang B der <a href="http://www.xilinx.com/support/documentation/sw_manuals/edk10_est_rm.pdf" target="_blank">Embedded System Tools Reference Manual</a>) nur über den höher abstrahierten Level gibt es von Xilinx ein einziges Anwendungsbeispiel (und falls doch so habe ich es nicht gefunden) zugegebener maßen ist die API Dokumentation sehr gut &#8230; aber ein greifbares Beispiel wäre schon sehr Praktisch gewesen.<br />
Gut jetzt gibts ja eins &#8230; nämlich meins &#8230; ich hoffe es Hilft.</p>
<p>Ich habe das Projekt mit dem BSB (Base System Builder)  erstellt und die Buttons und den Timer dort hinzugefühgt und als Interrupt Quellen angegeben. (das ist normal nicht Schwer)</p>
<p>Zum abgleichen gebe ich hier meine mit der EDK 10.1 erstellten MHS (Microprocessor Hardware Specification) MSS (Microprocessor Software Specification) files an.</p>
<blockquote><p>MHS:<br />
# #########################################################<br />
# Created by Base System Builder Wizard for Xilinx EDK 10.1.03 Build EDK_K_SP3.6<br />
# Wed Feb 24 10:37:29 2010<br />
# Target Board:  Avnet Avnet V5FXT Evaluation Board Rev B<br />
# Family:    virtex5<br />
# Device:    xc5vfx30t<br />
# Package:   ff665<br />
# Speed Grade:  -1<br />
# Processor: microblaze_0<br />
# System clock frequency: 125.00 MHz<br />
# On Chip Memory :  16 KB<br />
# ########################################################<br />
PARAMETER VERSION = 2.1.0</p>
<p>PORT fpga_0_RS232_USB_RX_pin = fpga_0_RS232_USB_RX, DIR = I<br />
PORT fpga_0_RS232_USB_TX_pin = fpga_0_RS232_USB_TX, DIR = O<br />
PORT fpga_0_RS232_USB_reset_dummy_pin = net_vcc, DIR = O<br />
PORT fpga_0_LEDs_8Bit_GPIO_d_out_pin = fpga_0_LEDs_8Bit_GPIO_d_out, DIR = O, VEC = [0:7]<br />
PORT fpga_0_Push_Buttons_3Bit_GPIO_in_pin = fpga_0_Push_Buttons_3Bit_GPIO_in, DIR = I, VEC = [0:2]<br />
PORT sys_clk_pin = dcm_clk_s, DIR = I, SIGIS = CLK, CLK_FREQ = 100000000<br />
PORT sys_rst_pin = sys_rst_s, DIR = I, RST_POLARITY = 1, SIGIS = RST</p>
<p>BEGIN microblaze<br />
PARAMETER INSTANCE = microblaze_0<br />
PARAMETER C_INTERCONNECT = 1<br />
PARAMETER HW_VER = 7.10.d<br />
PARAMETER C_DEBUG_ENABLED = 1<br />
BUS_INTERFACE DLMB = dlmb<br />
BUS_INTERFACE ILMB = ilmb<br />
BUS_INTERFACE DPLB = mb_plb<br />
BUS_INTERFACE IPLB = mb_plb<br />
BUS_INTERFACE DEBUG = microblaze_0_dbg<br />
PORT MB_RESET = mb_reset<br />
PORT Interrupt = Interrupt<br />
END</p>
<p>BEGIN plb_v46<br />
PARAMETER INSTANCE = mb_plb<br />
PARAMETER HW_VER = 1.03.a<br />
PORT PLB_Clk = sys_clk_s<br />
PORT SYS_Rst = sys_bus_reset<br />
END</p>
<p>BEGIN lmb_v10<br />
PARAMETER INSTANCE = ilmb<br />
PARAMETER HW_VER = 1.00.a<br />
PORT LMB_Clk = sys_clk_s<br />
PORT SYS_Rst = sys_bus_reset<br />
END</p>
<p>BEGIN lmb_v10<br />
PARAMETER INSTANCE = dlmb<br />
PARAMETER HW_VER = 1.00.a<br />
PORT LMB_Clk = sys_clk_s<br />
PORT SYS_Rst = sys_bus_reset<br />
END</p>
<p>BEGIN lmb_bram_if_cntlr<br />
PARAMETER INSTANCE = dlmb_cntlr<br />
PARAMETER HW_VER = 2.10.a<br />
PARAMETER C_BASEADDR = 0&#215;00000000<br />
PARAMETER C_HIGHADDR = 0x00003fff<br />
BUS_INTERFACE SLMB = dlmb<br />
BUS_INTERFACE BRAM_PORT = dlmb_port<br />
END</p>
<p>BEGIN lmb_bram_if_cntlr<br />
PARAMETER INSTANCE = ilmb_cntlr<br />
PARAMETER HW_VER = 2.10.a<br />
PARAMETER C_BASEADDR = 0&#215;00000000<br />
PARAMETER C_HIGHADDR = 0x00003fff<br />
BUS_INTERFACE SLMB = ilmb<br />
BUS_INTERFACE BRAM_PORT = ilmb_port<br />
END</p>
<p>BEGIN bram_block<br />
PARAMETER INSTANCE = lmb_bram<br />
PARAMETER HW_VER = 1.00.a<br />
BUS_INTERFACE PORTA = ilmb_port<br />
BUS_INTERFACE PORTB = dlmb_port<br />
END</p>
<p>BEGIN xps_uartlite<br />
PARAMETER INSTANCE = RS232_USB<br />
PARAMETER HW_VER = 1.00.a<br />
PARAMETER C_BAUDRATE = 9600<br />
PARAMETER C_DATA_BITS = 8<br />
PARAMETER C_ODD_PARITY = 0<br />
PARAMETER C_USE_PARITY = 0<br />
PARAMETER C_SPLB_CLK_FREQ_HZ = 125000000<br />
PARAMETER C_BASEADDR = 0&#215;84000000<br />
PARAMETER C_HIGHADDR = 0x8400ffff<br />
BUS_INTERFACE SPLB = mb_plb<br />
PORT RX = fpga_0_RS232_USB_RX<br />
PORT TX = fpga_0_RS232_USB_TX<br />
END</p>
<p>BEGIN xps_gpio<br />
PARAMETER INSTANCE = LEDs_8Bit<br />
PARAMETER HW_VER = 1.00.a<br />
PARAMETER C_GPIO_WIDTH = 8<br />
PARAMETER C_IS_DUAL = 0<br />
PARAMETER C_IS_BIDIR = 0<br />
PARAMETER C_ALL_INPUTS = 0<br />
PARAMETER C_BASEADDR = 0&#215;81400000<br />
PARAMETER C_HIGHADDR = 0x8140ffff<br />
BUS_INTERFACE SPLB = mb_plb<br />
PORT GPIO_d_out = fpga_0_LEDs_8Bit_GPIO_d_out<br />
END</p>
<p>BEGIN xps_gpio<br />
PARAMETER INSTANCE = Push_Buttons_3Bit<br />
PARAMETER HW_VER = 1.00.a<br />
PARAMETER C_INTERRUPT_PRESENT = 1<br />
PARAMETER C_GPIO_WIDTH = 3<br />
PARAMETER C_IS_DUAL = 0<br />
PARAMETER C_IS_BIDIR = 0<br />
PARAMETER C_ALL_INPUTS = 1<br />
PARAMETER C_BASEADDR = 0&#215;81420000<br />
PARAMETER C_HIGHADDR = 0x8142ffff<br />
BUS_INTERFACE SPLB = mb_plb<br />
PORT GPIO_in = fpga_0_Push_Buttons_3Bit_GPIO_in<br />
PORT IP2INTC_Irpt = Push_Buttons_3Bit_IP2INTC_Irpt<br />
END</p>
<p>BEGIN xps_timer<br />
PARAMETER INSTANCE = xps_timer_1<br />
PARAMETER HW_VER = 1.00.a<br />
PARAMETER C_COUNT_WIDTH = 32<br />
PARAMETER C_ONE_TIMER_ONLY = 1<br />
PARAMETER C_BASEADDR = 0x83c00000<br />
PARAMETER C_HIGHADDR = 0x83c0ffff<br />
BUS_INTERFACE SPLB = mb_plb<br />
PORT Interrupt = xps_timer_1_Interrupt<br />
END</p>
<p>BEGIN clock_generator<br />
PARAMETER INSTANCE = clock_generator_0<br />
PARAMETER HW_VER = 2.01.a<br />
PARAMETER C_EXT_RESET_HIGH = 1<br />
PARAMETER C_CLKIN_FREQ = 100000000<br />
PARAMETER C_CLKOUT0_FREQ = 125000000<br />
PARAMETER C_CLKOUT0_BUF = TRUE<br />
PARAMETER C_CLKOUT0_PHASE = 0<br />
PARAMETER C_CLKOUT0_GROUP = NONE<br />
PORT CLKOUT0 = sys_clk_s<br />
PORT CLKIN = dcm_clk_s<br />
PORT LOCKED = Dcm_all_locked<br />
PORT RST = net_gnd<br />
END</p>
<p>BEGIN mdm<br />
PARAMETER INSTANCE = debug_module<br />
PARAMETER HW_VER = 1.00.d<br />
PARAMETER C_MB_DBG_PORTS = 1<br />
PARAMETER C_USE_UART = 1<br />
PARAMETER C_UART_WIDTH = 8<br />
PARAMETER C_BASEADDR = 0&#215;84400000<br />
PARAMETER C_HIGHADDR = 0x8440ffff<br />
BUS_INTERFACE SPLB = mb_plb<br />
BUS_INTERFACE MBDEBUG_0 = microblaze_0_dbg<br />
PORT Debug_SYS_Rst = Debug_SYS_Rst<br />
END</p>
<p>BEGIN proc_sys_reset<br />
PARAMETER INSTANCE = proc_sys_reset_0<br />
PARAMETER HW_VER = 2.00.a<br />
PARAMETER C_EXT_RESET_HIGH = 1<br />
PORT Slowest_sync_clk = sys_clk_s<br />
PORT Dcm_locked = Dcm_all_locked<br />
PORT Ext_Reset_In = sys_rst_s<br />
PORT MB_Reset = mb_reset<br />
PORT Bus_Struct_Reset = sys_bus_reset<br />
PORT MB_Debug_Sys_Rst = Debug_SYS_Rst<br />
PORT Peripheral_Reset = sys_periph_reset<br />
END</p>
<p>BEGIN xps_intc<br />
PARAMETER INSTANCE = xps_intc_0<br />
PARAMETER HW_VER = 1.00.a<br />
PARAMETER C_BASEADDR = 0&#215;81800000<br />
PARAMETER C_HIGHADDR = 0x8180ffff<br />
BUS_INTERFACE SPLB = mb_plb<br />
PORT Irq = Interrupt<br />
PORT Intr = Push_Buttons_3Bit_IP2INTC_Irpt &amp; xps_timer_1_Interrupt<br />
END</p></blockquote>
<blockquote><p>MSS:<br />
PARAMETER VERSION = 2.2.0</p>
<p>BEGIN OS<br />
PARAMETER OS_NAME = standalone<br />
PARAMETER OS_VER = 2.00.a<br />
PARAMETER PROC_INSTANCE = microblaze_0<br />
PARAMETER STDIN = RS232_USB<br />
PARAMETER STDOUT = RS232_USB<br />
END</p>
<p>BEGIN PROCESSOR<br />
PARAMETER DRIVER_NAME = cpu<br />
PARAMETER DRIVER_VER = 1.11.b<br />
PARAMETER HW_INSTANCE = microblaze_0<br />
PARAMETER COMPILER = mb-gcc<br />
PARAMETER ARCHIVER = mb-ar<br />
END</p>
<p>BEGIN DRIVER<br />
PARAMETER DRIVER_NAME = bram<br />
PARAMETER DRIVER_VER = 1.00.a<br />
PARAMETER HW_INSTANCE = dlmb_cntlr<br />
END</p>
<p>BEGIN DRIVER<br />
PARAMETER DRIVER_NAME = bram<br />
PARAMETER DRIVER_VER = 1.00.a<br />
PARAMETER HW_INSTANCE = ilmb_cntlr<br />
END</p>
<p>BEGIN DRIVER<br />
PARAMETER DRIVER_NAME = generic<br />
PARAMETER DRIVER_VER = 1.00.a<br />
PARAMETER HW_INSTANCE = lmb_bram<br />
END</p>
<p>BEGIN DRIVER<br />
PARAMETER DRIVER_NAME = uartlite<br />
PARAMETER DRIVER_VER = 1.13.a<br />
PARAMETER HW_INSTANCE = RS232_USB<br />
END</p>
<p>BEGIN DRIVER<br />
PARAMETER DRIVER_NAME = gpio<br />
PARAMETER DRIVER_VER = 2.12.a<br />
PARAMETER HW_INSTANCE = LEDs_8Bit<br />
END</p>
<p>BEGIN DRIVER<br />
PARAMETER DRIVER_NAME = gpio<br />
PARAMETER DRIVER_VER = 2.12.a<br />
PARAMETER HW_INSTANCE = Push_Buttons_3Bit<br />
END</p>
<p>BEGIN DRIVER<br />
PARAMETER DRIVER_NAME = tmrctr<br />
PARAMETER DRIVER_VER = 1.10.b<br />
PARAMETER HW_INSTANCE = xps_timer_1<br />
END</p>
<p>BEGIN DRIVER<br />
PARAMETER DRIVER_NAME = generic<br />
PARAMETER DRIVER_VER = 1.00.a<br />
PARAMETER HW_INSTANCE = clock_generator_0<br />
END</p>
<p>BEGIN DRIVER<br />
PARAMETER DRIVER_NAME = uartlite<br />
PARAMETER DRIVER_VER = 1.13.a<br />
PARAMETER HW_INSTANCE = debug_module<br />
END</p>
<p>BEGIN DRIVER<br />
PARAMETER DRIVER_NAME = generic<br />
PARAMETER DRIVER_VER = 1.00.a<br />
PARAMETER HW_INSTANCE = proc_sys_reset_0<br />
END</p>
<p>BEGIN DRIVER<br />
PARAMETER DRIVER_NAME = intc<br />
PARAMETER DRIVER_VER = 1.11.a<br />
PARAMETER HW_INSTANCE = xps_intc_0<br />
END</p></blockquote>
<p>Das C Progamme zur verarbeitung der Interrupts:</p>
<blockquote><p>#include &lt;xtmrctr.h&gt;<br />
#include &lt;xintc.h&gt;<br />
#include &lt;xgpio.h&gt;<br />
#include &lt;xparameters.h&gt;</p>
<p>XGpio gpio, buttons;<br />
XIntc intc;<br />
XTmrCtr timer;</p>
<p>void buttons_int_handler(void * baseaddr_p) {<br />
//xil_printf(&#8220;Button!\r\n\n&#8221;);<br />
unsigned int csr;<br />
/* Read Button CSR to see if it raised the interrupt */<br />
csr = XTmrCtr_mGetControlStatusReg (XPAR_PUSH_BUTTONS_3BIT_BASEADDR, 0);<br />
xil_printf(&#8220;csr=%d\r\n&#8221;,csr);</p>
<p>switch(csr) {</p>
<p>case 0&#215;01:<br />
xil_printf(&#8220;SW4\r\n&#8221;);<br />
break;</p>
<p>case 0&#215;02:<br />
xil_printf(&#8220;SW3\r\n&#8221;);<br />
break;</p>
<p>case 0&#215;04:<br />
xil_printf(&#8220;SW2\r\n&#8221;);<br />
break;</p>
<p>default : {<br />
}</p>
<p>}</p>
<p>//Clear the interrupt both in the Gpio instance as well as the interrupt controlle<br />
XGpio_InterruptClear(&amp;buttons, 0&#215;3);<br />
XIntc_Acknowledge (&amp;intc, XPAR_XPS_INTC_0_PUSH_BUTTONS_3BIT_IP2INTC_IRPT_INTR);<br />
xil_printf(&#8220;Interrupt Cleared\r\n&#8221;);</p>
<p>}</p>
<p>void timer_int_handler(void * baseaddr_p) {<br />
unsigned int csr;<br />
/* Read timer 0 CSR to see if it raised the interrupt */<br />
csr = XTmrCtr_mGetControlStatusReg (XPAR_XPS_TIMER_1_BASEADDR, 0);<br />
/* If the interrupt occurred, then increment a counter */<br />
if (csr &amp; XTC_CSR_INT_OCCURED_MASK)<br />
{<br />
count++;<br />
}<br />
print (&#8220;Timer Interrupt\r\n&#8221;);<br />
xil_printf (&#8220;Count Sagt: %d Interrupts \r\n&#8221;,count);</p>
<p>/* Clear the timer interrupt */<br />
XTmrCtr_mSetControlStatusReg (XPAR_XPS_TIMER_1_BASEADDR, 0, csr); //Still Level 0 Macro<br />
}</p>
<p>int main()/*the one and only*/ {</p>
<p>microblaze_enable_interrupts();<br />
xil_printf(&#8220;MB interrupts\t\t Enabled\r\n&#8221;);</p>
<p>Xuint32 status;<br />
//Interr Init<br />
status=XIntc_Initialize (&amp;intc, XPAR_XPS_INTC_0_DEVICE_ID);<br />
if (status != XST_SUCCESS){<br />
xil_printf(&#8220;init INTC_0\t Error \r\n&#8221;);<br />
return XST_FAILURE;<br />
}<br />
else xil_printf(&#8220;init INTC_0\t\t OK \r\n&#8221;);</p>
<p>//Button Init Stuff</p>
<p>status=XGpio_Initialize (&amp;buttons, XPAR_PUSH_BUTTONS_3BIT_DEVICE_ID);<br />
if (status != XST_SUCCESS){<br />
xil_printf(&#8220;init Buttons\t\t Error \r\n&#8221;);<br />
return XST_FAILURE;<br />
}<br />
else xil_printf(&#8220;init Buttons\t\t OK \r\n&#8221;);</p>
<p>XGpio_SetDataDirection(&amp;buttons, 1, 0xFFFFFFFF);<br />
xil_printf(&#8220;Buttons Direction\t Set\r\n&#8221;);</p>
<p>//Timer Init Stuff</p>
<p>status=XTmrCtr_Initialize (&amp;timer, XPAR_XPS_TIMER_1_DEVICE_ID);<br />
if (status != XST_SUCCESS){<br />
xil_printf(&#8220;init Timer\t\t Error \r\n&#8221;);<br />
return XST_FAILURE;<br />
}<br />
else xil_printf(&#8220;init Timer\t\t OK \r\n&#8221;);</p>
<p>//buttons<br />
status=XIntc_Connect (&amp;intc, XPAR_XPS_INTC_0_PUSH_BUTTONS_3BIT_IP2INTC_IRPT_INTR,<br />
&amp;buttons_int_handler, (void *)0);</p>
<p>if (status != XST_SUCCESS){<br />
xil_printf(&#8220;connect buttons\t\t Error \r\n&#8221;);<br />
return XST_FAILURE;<br />
}<br />
else xil_printf(&#8220;connect buttons\t\t OK \r\n&#8221;);</p>
<p>//Timer Options</p>
<p>XTmrCtr_SetOptions(&amp;timer, 0,        //for timer #0 (there are 2 timers in the led_timer device, we&#8217;re only using one)<br />
XTC_DOWN_COUNT_OPTION |     // Count down to 0<br />
XTC_INT_MODE_OPTION |         // When it hits 0, cause an interrupt<br />
XTC_AUTO_RELOAD_OPTION);    // And reload the &#8220;reset&#8221; value and begin counting again</p>
<p>xil_printf(&#8220;Timer Setting\t\t Set\r\n&#8221;);</p>
<p>//Timer<br />
status=XIntc_Connect (&amp;intc, XPAR_XPS_INTC_0_XPS_TIMER_1_INTERRUPT_INTR, &amp;timer_int_handler, (void*)0);</p>
<p>if (status != XST_SUCCESS){<br />
xil_printf(&#8220;connect timer\t\t Error\r\n&#8221;);<br />
return XST_FAILURE;<br />
}<br />
else xil_printf(&#8220;connect timer\t\t OK\r\n&#8221;);</p>
<p>XIntc_Enable (&amp;intc, XPAR_PUSH_BUTTONS_3BIT_DEVICE_ID);<br />
xil_printf(&#8220;Button interrupt\t Enabled\r\n&#8221;);</p>
<p>XIntc_Enable (&amp;intc, XPAR_XPS_TIMER_1_DEVICE_ID);<br />
xil_printf(&#8220;Timer interrupt\t\t Enabled\r\n&#8221;);</p>
<p>//Enable Xgpio Interrupt Stuff ans so on &#8230;</p>
<p>//XGpio_InterruptClear(buttons, XGPIO_IR_CH1_MASK);<br />
xil_printf(&#8220;Buttons Interrupt\t NOT Cleared YET\r\n&#8221;);</p>
<p>XGpio_InterruptEnable (&amp;buttons, XPAR_XPS_INTC_0_PUSH_BUTTONS_3BIT_IP2INTC_IRPT_INTR);<br />
xil_printf(&#8220;XGpio interrupt\t\t Enabled\r\n&#8221;);<br />
XGpio_InterruptGlobalEnable (&amp;buttons);<br />
xil_printf(&#8220;XGpio Global interrupt\t Enabled\r\n&#8221;);</p>
<p>status=XIntc_Start (&amp;intc ,XIN_REAL_MODE);</p>
<p>if (status != XST_SUCCESS){<br />
xil_printf(&#8220;start xintc\t\t Error\r\n&#8221;);<br />
return XST_FAILURE;<br />
}<br />
else xil_printf(&#8220;start xintc\t\t OK\r\n&#8221;);</p>
<p>//Load Value 4 the Timer<br />
XTmrCtr_SetResetValue(&amp;timer, 0, 1000000000);<br />
//Start the timer<br />
XTmrCtr_Start (&amp;timer,0);</p>
<p>xil_printf(&#8220;&lt;&#8212;Entering WHILE(1);&#8212;&gt;\r\n&#8221;);</p>
<p>while(1);</p>
<p>}</p></blockquote>
<p>Beim erstellen des Codes haben die Beispiele die auch beide schon ein wenig älter sein dürften (ca. 3 Jahre) <a href="http://warp.rice.edu/trac/browser/Documentation/ReferenceDesigns/InterruptRef_xps_8_2/src/interruptTester.c" target="_blank">hier</a> und <a href="http://wiki.secretlab.de/fpga/edk_tutorial_1" target="_blank">hier</a> sehr geholfen.<br />
Ich hoffe ihr könnt mit meinem Code fetzen etwas anfangen über Kommentare würde ich mich sehr freuen.<br />
Die Ausgaben des Progammes erfolgen über stdout (je nach dem wie er konfiguriert ist über Usb (virtueller Com Port) oder direkt über RS232.<br />
Für mein Beispiel ist das Hyperterminal (Windows Zubehör/ Kommunikation) auf 9600 Baud, 8 Datenbits, Ohne Parität, mit einem Stoppbit und ohne Flusssteuerung zu konfigurieren (BSB default iirr). Getestet habe ich es auf einem <a href="http://www.xilinx.com/products/devkits/aes_v5fxt_evl30-avnet.htm" target="_blank">Avnet Virtex5 Board</a>.</p>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 5572px; width: 1px; height: 1px;">#include &lt;xtmrctr.h&gt;<br />
#include &lt;xintc.h&gt;<br />
#include &lt;xgpio.h&gt;<br />
#include &lt;xparameters.h&gt;</p>
<p>XGpio gpio, buttons;<br />
XIntc intc;<br />
XTmrCtr timer;</p>
<p>void buttons_int_handler(void * baseaddr_p) {<br />
//xil_printf(&#8220;Button!\r\n\n&#8221;);<br />
unsigned int csr;<br />
/* Read Button CSR to see if it raised the interrupt */<br />
csr = XTmrCtr_mGetControlStatusReg (XPAR_PUSH_BUTTONS_3BIT_BASEADDR, 0);<br />
xil_printf(&#8220;csr=%d\r\n&#8221;,csr);</p>
<p>switch(csr) {</p>
<p>case 0&#215;01:<br />
xil_printf(&#8220;SW4\r\n&#8221;);<br />
break;</p>
<p>case 0&#215;02:<br />
xil_printf(&#8220;SW3\r\n&#8221;);<br />
break;</p>
<p>case 0&#215;04:<br />
xil_printf(&#8220;SW2\r\n&#8221;);<br />
break;</p>
<p>default : {<br />
}</p>
<p>}</p>
<p>//Clear the interrupt both in the Gpio instance as well as the interrupt controlle<br />
XGpio_InterruptClear(&amp;buttons, 0&#215;3);<br />
XIntc_Acknowledge (&amp;intc, XPAR_XPS_INTC_0_PUSH_BUTTONS_3BIT_IP2INTC_IRPT_INTR);<br />
xil_printf(&#8220;Interrupt Cleared\r\n&#8221;);</p>
<p>}</p>
<p>void timer_int_handler(void * baseaddr_p) {<br />
unsigned int csr;<br />
/* Read timer 0 CSR to see if it raised the interrupt */<br />
csr = XTmrCtr_mGetControlStatusReg (XPAR_XPS_TIMER_1_BASEADDR, 0);<br />
/* If the interrupt occurred, then increment a counter */<br />
if (csr &amp; XTC_CSR_INT_OCCURED_MASK)<br />
{<br />
count++;<br />
}<br />
print (&#8220;Timer Interrupt\r\n&#8221;);<br />
xil_printf (&#8220;Count Sagt: %d Interrupts \r\n&#8221;,count);</p>
<p>/* Clear the timer interrupt */<br />
XTmrCtr_mSetControlStatusReg (XPAR_XPS_TIMER_1_BASEADDR, 0, csr); //Still Level 0 Macro<br />
}</p>
<p>int main()/*the one and only*/ {</p>
<p>microblaze_enable_interrupts();<br />
xil_printf(&#8220;MB interrupts\t\t Enabled\r\n&#8221;);</p>
<p>Xuint32 status;<br />
//Interr Init<br />
status=XIntc_Initialize (&amp;intc, XPAR_XPS_INTC_0_DEVICE_ID);<br />
if (status != XST_SUCCESS){<br />
xil_printf(&#8220;init INTC_0\t Error \r\n&#8221;);<br />
return XST_FAILURE;<br />
}<br />
else xil_printf(&#8220;init INTC_0\t\t OK \r\n&#8221;);</p>
<p>//Button Init Stuff</p>
<p>status=XGpio_Initialize (&amp;buttons, XPAR_PUSH_BUTTONS_3BIT_DEVICE_ID);<br />
if (status != XST_SUCCESS){<br />
xil_printf(&#8220;init Buttons\t\t Error \r\n&#8221;);<br />
return XST_FAILURE;<br />
}<br />
else xil_printf(&#8220;init Buttons\t\t OK \r\n&#8221;);</p>
<p>XGpio_SetDataDirection(&amp;buttons, 1, 0xFFFFFFFF);<br />
xil_printf(&#8220;Buttons Direction\t Set\r\n&#8221;);</p>
<p>//Timer Init Stuff</p>
<p>status=XTmrCtr_Initialize (&amp;timer, XPAR_XPS_TIMER_1_DEVICE_ID);<br />
if (status != XST_SUCCESS){<br />
xil_printf(&#8220;init Timer\t\t Error \r\n&#8221;);<br />
return XST_FAILURE;<br />
}<br />
else xil_printf(&#8220;init Timer\t\t OK \r\n&#8221;);</p>
<p>//buttons<br />
status=XIntc_Connect (&amp;intc, XPAR_XPS_INTC_0_PUSH_BUTTONS_3BIT_IP2INTC_IRPT_INTR,<br />
&amp;buttons_int_handler, (void *)0);</p>
<p>if (status != XST_SUCCESS){<br />
xil_printf(&#8220;connect buttons\t\t Error \r\n&#8221;);<br />
return XST_FAILURE;<br />
}<br />
else xil_printf(&#8220;connect buttons\t\t OK \r\n&#8221;);</p>
<p>//Timer Options</p>
<p>XTmrCtr_SetOptions(&amp;timer, 0,        //for timer #0 (there are 2 timers in the led_timer device, we&#8217;re only using one)<br />
XTC_DOWN_COUNT_OPTION |     // Count down to 0<br />
XTC_INT_MODE_OPTION |         // When it hits 0, cause an interrupt<br />
XTC_AUTO_RELOAD_OPTION);    // And reload the &#8220;reset&#8221; value and begin counting again</p>
<p>xil_printf(&#8220;Timer Setting\t\t Set\r\n&#8221;);</p>
<p>//Timer<br />
status=XIntc_Connect (&amp;intc, XPAR_XPS_INTC_0_XPS_TIMER_1_INTERRUPT_INTR, &amp;timer_int_handler, (void*)0);</p>
<p>if (status != XST_SUCCESS){<br />
xil_printf(&#8220;connect timer\t\t Error\r\n&#8221;);<br />
return XST_FAILURE;<br />
}<br />
else xil_printf(&#8220;connect timer\t\t OK\r\n&#8221;);</p>
<p>XIntc_Enable (&amp;intc, XPAR_PUSH_BUTTONS_3BIT_DEVICE_ID);<br />
xil_printf(&#8220;Button interrupt\t Enabled\r\n&#8221;);</p>
<p>XIntc_Enable (&amp;intc, XPAR_XPS_TIMER_1_DEVICE_ID);<br />
xil_printf(&#8220;Timer interrupt\t\t Enabled\r\n&#8221;);</p>
<p>//Enable Xgpio Interrupt Stuff ans so on &#8230;</p>
<p>//XGpio_InterruptClear(buttons, XGPIO_IR_CH1_MASK);<br />
xil_printf(&#8220;Buttons Interrupt\t NOT Cleared YET\r\n&#8221;);</p>
<p>XGpio_InterruptEnable (&amp;buttons, XPAR_XPS_INTC_0_PUSH_BUTTONS_3BIT_IP2INTC_IRPT_INTR);<br />
xil_printf(&#8220;XGpio interrupt\t\t Enabled\r\n&#8221;);<br />
XGpio_InterruptGlobalEnable (&amp;buttons);<br />
xil_printf(&#8220;XGpio Global interrupt\t Enabled\r\n&#8221;);</p>
<p>status=XIntc_Start (&amp;intc ,XIN_REAL_MODE);</p>
<p>if (status != XST_SUCCESS){<br />
xil_printf(&#8220;start xintc\t\t Error\r\n&#8221;);<br />
return XST_FAILURE;<br />
}<br />
else xil_printf(&#8220;start xintc\t\t OK\r\n&#8221;);</p>
<p>//Load Value 4 the Timer<br />
XTmrCtr_SetResetValue(&amp;timer, 0, 1000000000);<br />
//Start the timer<br />
XTmrCtr_Start (&amp;timer,0);</p>
<p>xil_printf(&#8220;&lt;&#8212;Entering WHILE(1);&#8212;&gt;\r\n&#8221;);</p>
<p>while(1);</p>
<p>}</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://backblog.betriebswerk-landshut.de/2010/02/25/microblaze-xgpio-interrupts/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
