#include "xparameters.h"
#include "stdio.h"
#include "xutil.h"
#include "xuartlite.h"
#include "xuartlite_l.h"
#include "xintc_l.h"
#include "xgpio.h"
//====================================================
// GLOBAL VARIABLES
//====================================================
unsigned int counter = 0;
unsigned int c2 = 0;
int buchstabe;
XGpio leds;
XUartLite serial;
//====================================================
// INTERRUPT HANDLER FUNCTION
//====================================================
void uart_interrupt_handler(void* addr_p)
{
int empty;
XGpio_DiscreteWrite(&leds, 1, 255);
empty = XUartLite_IsReceiveEmpty(XPAR_RS232_SECOND_BASEADDR);
if (empty == FALSE )
buchstabe = XUartLite_RecvByte(XPAR_RS232_SECOND_BASEADDR);
XGpio_DiscreteWrite(&leds, 1, buchstabe);
xil_printf("%c",buchstabe);
}
int main()
{
XGpio_Initialize(&leds, XPAR_LEDS_8BIT_DEVICE_ID);
XGpio_SetDataDirection(&leds, 1,0x0);
XGpio_DiscreteWrite(&leds, 1, 1);
XIntc_RegisterHandler(XPAR_XPS_INTC_0_BASEADDR,
XPAR_INTC_0_UARTLITE_2_VEC_ID,
(XInterruptHandler)uart_interrupt_handler,
(void *)XPAR_RS232_SECOND_BASEADDR);
XGpio_DiscreteWrite(&leds, 1, 2);
XIntc_MasterEnable(XPAR_XPS_INTC_0_BASEADDR);
XGpio_DiscreteWrite(&leds, 1, 3);
XIntc_EnableIntr(XPAR_XPS_INTC_0_BASEADDR, 0x1);
XGpio_DiscreteWrite(&leds, 1, 4);
XIntc_EnableIntr(XPAR_XPS_INTC_0_BASEADDR, XPAR_RS232_SECOND_INTERRUPT_MASK);
XGpio_DiscreteWrite(&leds, 1, 5);
XUartLite_Initialize(&serial,XPAR_RS232_SECOND_DEVICE_ID);
XGpio_DiscreteWrite(&leds, 1, 6);
XUartLite_SetRecvHandler(&serial,
(XUartLite_Handler) uart_interrupt_handler,
(void *)XPAR_RS232_SECOND_BASEADDR);
XGpio_DiscreteWrite(&leds, 1, 7);
XUartLite_EnableInterrupt(&serial);
XGpio_DiscreteWrite(&leds, 1, 8);
microblaze_enable_interrupts();
XGpio_DiscreteWrite(&leds, 1, 9);
while(1);
}
Ez csak annyiban különbözik az ezelőtti verziótól, hogy itt az RS232_SECOND nevű soros porton érkező bitek generálnak egy megszakítást, amit az uart_lite_handler nevű függvény fog lekezelni. Ez a függvény beolvassa az érkezett biteket, berakja egy buchstabe nevű változóba, amit továbbküldünk az első soros porton keresztül. Persze a main()-ben meg kell adni a megfelelő címeket a megszakítások inicializálásához, illetve engedélyezni kell azt, hogy egyáltalán megszakítás érkezhessen.
Ezen kívül meg össze kell kötni az interrupt vezérlőnek (xps_intc_0) az IRQ vonalát a microblaze processzor interrupt vonalával, valamint hozzá kell adni az interrupt vezérlőhöz a soros port interrupt vonalát (lásd ábra). A megfelelő predefinit változók neveit az projekt header állományában találjuk meg, (sajnos a header-nél szebb illetve magyarabb kifejezés nem jut eszembe), de ahhoz, hogy ott minden megjelenjen, először kell egy Build Projekt-et nyomni neki, hogy frissítse a header állományt, illetve írja bele azokat a dolgokat is, amiket megváltoztattunk.
Ezek voltak az összeköttetések, a következő ábrán pedig egy részletet láthatunk a projekt headerből.
A program működésének az eredménye :
0 megjegyzés:
Megjegyzés küldése