Prosty program demonstrujący transmisję przez UART w trybie obsługi przerwania. Mikrokontroler LPC2148, kompilator GNU ARM.
#include "lpc214x.h" // obsługa przerwania od UART0 void uart0isr(void) __attribute__ ((interrupt("IRQ"))); // program główny int main(void) { volatile int i; // P0.16, P0.17 i P0.18 jako wy podłączone do diód, // diody zgaszone IODIR0 |= 1 < < 16 | 1 << 17 | 1 << 18; IOSET0 |= 1 << 16 | 1 << 17 | 1 << 18; // konfiguracja UART0 PINSEL0 |= 1 << 0 | 1 << 2; // RxD, TxD U0LCR = 1 << 7 | 3; // 8N1, DLAB=0 U0DLM = 0; U0DLL = 15000000/(16*19200); // 19200 kb/s dla PCLK=15MHz U0LCR &= ~(1 << 7); U0IER = 1; // IRQ gdy odebrano dane U0FCR &= 0x3f; // aktywowane 1B odebranym // konfiguracja przerwań VICIntSelect &= ~(1 << 6); // UART0 jako IRQ VICVectCntl0 = 6 | 1 << 5; // UART0, IRQ VICVectAddr0 = (unsigned long) uart0isr; VICIntEnable |= 1 << 6; // włączenie przerwania UART0 // mignięcie diodą P0.18 IOCLR0 = 1 << 18; for (i=0; i < 5000000; i++); IOSET0 = 1 << 18; // miganie diodą P0.16 while(1) { for (i=0; i < 500000; i++) IOSET0 = 1 << 16; for (i=0; i < 500000; i++) IOCLR0 = 1 << 16; } } void uart0isr(void) { volatile int i; // mignięcie diodą P0.17 IOCLR0 = 1 << 17; for (i=0; i < 1000000; i++); IOSET0 = 1 << 17; // dane gotowe do odczytu if (((U0IIR >> 1) & 7) == 2) i = U0RBR; // odczyt danych // sygnalizacja końca obsługi przerwania VICVectAddr = 0; // zapis dowolnej wartości }
Program zapala/gasi jedną diodę jednorazowo po uruchomieniu, drugą diodą miga cały czas, a trzecią zapala/gasi w trybie obsługi przerwania, po odebraniu 1 bajtu przez UART0.
Wszystkie pliki (w tym kod startowy boot.S) potrzebne do uruchomienia: lpc2148uartirq.tgz.
Sprzęt i oprogramowanie opisane w postach: Mikrokontroler NXP Philips LPC2148 oraz LPC214x, programowanie ISP i Linux.