#include #include "Mini58Series.h" #include "myUart.h" #if USE_UART0 static volatile struct { uint16_t tri, twi, tct; uint16_t rri, rwi, rct; uint8_t tbuf[UART0_TXB]; uint8_t rbuf[UART0_RXB]; } Fifo1; void UART0_IRQHandler (void) { uint8_t d; int i; if (UART_GET_INT_FLAG(UART0,UART_INTEN_RDAIEN_Msk)) { /* RXNE is set: Rx ready */ d = UART_READ(UART0); /* Get received byte */ i = Fifo1.rct; if (i < UART0_RXB) { /* Store it into the rx fifo if not full */ Fifo1.rct = ++i; i = Fifo1.rwi; Fifo1.rbuf[i] = d; Fifo1.rwi = ++i % UART0_RXB; } } if (UART_GET_INT_FLAG(UART0,UART_INTEN_THREIEN_Msk)) { /* TXE is set: Tx ready */ i = Fifo1.tct; if (i--) { /* There is any data in the tx fifo */ Fifo1.tct = (uint16_t)i; i = Fifo1.tri; UART_WRITE(UART0,Fifo1.tbuf[i]); Fifo1.tri = ++i % UART0_TXB; } else { /* No data in the tx fifo */ UART_DISABLE_INT(UART0,UART_INTEN_THREIEN_Msk); /* Clear TXEIE - Disable TXE irq */ } } } int uart0_test (void) { return Fifo1.rct; } uint8_t uart0_getc (void) { uint8_t d; int i; /* Wait while rx fifo is empty */ while (!Fifo1.rct) ; i = Fifo1.rri; /* Get a byte from rx fifo */ d = Fifo1.rbuf[i]; Fifo1.rri = ++i % UART0_RXB; NVIC_DisableIRQ(UART0_IRQn); Fifo1.rct--; NVIC_EnableIRQ(UART0_IRQn); return d; } void uart0_putc (uint8_t d) { int i; /* Wait for tx fifo is not full */ while (Fifo1.tct >= UART0_TXB) ; i = Fifo1.twi; /* Put a byte into Tx fifo */ Fifo1.tbuf[i] = d; Fifo1.twi = ++i % UART0_TXB; NVIC_DisableIRQ(UART0_IRQn); Fifo1.tct++; UART_ENABLE_INT(UART0,UART_INTEN_THREIEN_Msk); /* Set TXEIE - Enable TXE irq */ NVIC_EnableIRQ(UART0_IRQn); } void xprintf_init (uint32_t bps) { /* Init uart0 */ CLK_EnableModuleClock(UART0_MODULE); #ifdef UART_USE_P46_P47 SYS->P4_MFP = SYS_MFP_P46_UART1_RXD | SYS_MFP_P47_UART1_TXD; GPIO_ENABLE_DIGITAL_PATH(P4,(1<<6)); #else SYS->P5_MFP = SYS_MFP_P51_UART0_RXD | SYS_MFP_P50_UART0_TXD; GPIO_ENABLE_DIGITAL_PATH(P5,(1<<1)); #endif UART_Open(UART0, bps); UART_ENABLE_INT(UART0, (UART_INTEN_RDAIEN_Msk | UART_INTEN_RXTOIEN_Msk /*| UART_INTEN_THREIEN_Msk*/)); NVIC_EnableIRQ(UART0_IRQn); /* Clear Tx/Rx fifo */ Fifo1.tri = 0; Fifo1.twi = 0; Fifo1.tct = 0; Fifo1.rri = 0; Fifo1.rwi = 0; Fifo1.rct = 0; /* init xprintf with func */ xdev_out(uart0_putc); xdev_in(uart0_getc); } #endif /* USE_UART0 */ #if USE_ERROUT /* Error_out */ void Error_out (uint8_t rc) { const char *str = "OK\0" "AD0_ERR\0" "AD1\0" "AD2\0" "AD3\0" "NO_PATH\0" "INVALID_NAME\0" "DENIED\0" "EXIST\0" "INVALID_OBJECT\0" "WRITE_PROTECTED\0" "INVALID_DRIVE\0" "NOT_ENABLED\0" "NO_FILE_SYSTEM\0" "MKFS_ABORTED\0" "TIMEOUT\0" "LOCKED\0" "NOT_ENOUGH_CORE\0" "TOO_MANY_OPEN_FILES\0" "INVALID_PARAMETER\0"; uint8_t i; for (i = 0; i != rc && *str; i++) { while (*str++) ; } xprintf("Error=%u %s", (uint8_t)rc, str); } // wait_input char Line[16]; /* Console input buffer */ void Uart_wait_input(void) { char *ptr; ptr = Line; switch (*ptr++) { case '?' : /* Show Command List */ xputs(CmdList); break; case 'S' : /* test step */ case 's' : switch (*ptr++) { case '0' : /* S0 */ Error_out(0); break; case '1' : /* S1 */ Error_out(1); break; case '2' : /* S2 */ Error_out(2); break; case '3' : /* S3 */ Error_out(3); break; case '4' : /* S4 */ Error_out(4); break; case '5' : /* S5 */ Error_out(5); break; case '6' : /* S6 */ Error_out(6); break; case '7' : /* S7 */ Error_out(7); break; case '8' : /* S8 */ Error_out(8); break; case '9' : /* S9 */ Error_out(9); break; default: Error_out(10); break; } } } #endif