1 #include "pic32_c.h" 2 #include "init.h" 3 4 static void uart_write(char c) 5 { 6 while (REG(U1STA) & (1 << 9)); /* UTXBF (buffer full) */ 7 8 REG(U1TXREG) = c; 9 } 10 11 static void bits(uint32_t reg) 12 { 13 uint32_t mask; 14 15 for (mask = (1 << 31); mask; mask >>= 1) 16 if (REG(reg) & mask) 17 uart_write('1'); 18 else 19 uart_write('0'); 20 21 uart_write('\r'); 22 uart_write('\n'); 23 } 24 25 static void blink(uint32_t delay, uint32_t port, uint32_t pins) 26 { 27 uint32_t counter; 28 29 /* Clear outputs (LED). */ 30 31 CLR_REG(port, pins); 32 33 while (1) 34 { 35 counter = delay; 36 37 while (counter--) __asm__(""); /* retain loop */ 38 39 /* Invert outputs (LED). */ 40 41 INV_REG(port, pins); 42 bits(IFS1); 43 } 44 } 45 46 void main(void) 47 { 48 init_memory(); 49 init_pins(); 50 init_outputs(); 51 52 unlock_config(); 53 config_uart(); 54 lock_config(); 55 56 init_uart(7, 3); 57 58 interrupts_on(); 59 60 blink(3 << 24, PORTA, 1 << 3); 61 } 62 63 void exception_handler(void) 64 { 65 blink(3 << 12, PORTA, 1 << 3); 66 } 67 68 void interrupt_handler(void) 69 { 70 /* Check for a UART receive interrupt condition (U1RIF). */ 71 72 if (!(REG(IFS1) & (1 << 8))) 73 return; 74 75 /* Write the received data back. */ 76 77 INV_REG(PORTA, 1 << 2); 78 79 while (REG(U1STA) & 1) 80 uart_write((char) REG(U1RXREG)); 81 82 /* Clear the UART interrupt condition. */ 83 84 CLR_REG(IFS1, 1 << 8); 85 }