X-Git-Url: https://robinkrens.nl/gitweb/?a=blobdiff_plain;f=uart.c;h=86bf9fee596f202a9fed48fc9ab4b3aa09e8fb5b;hb=a4ce13373a288b4496299396e26c2608852b713f;hp=a3905c4e0cd4f0e1eb1533a16baf02ee9d1cc41b;hpb=3f9ee85c250250580f0ceb38525ddb99ebc6d36e;p=cortex-from-scratch diff --git a/uart.c b/uart.c index a3905c4..86bf9fe 100644 --- a/uart.c +++ b/uart.c @@ -4,14 +4,40 @@ #include #include +#define RXNE ((*USART1_SR >> 5) & 0x1) + +#define O_WRITE 0x01 +#define SET 0x02 +#define CLEAR 0x03 + +void * uart_handler() { + + uart_puts("echo: "); + while (RXNE) { + char echochar = *USART1_DR; + //regw_u32(USART1_DR, echochar, 0, O_WRITE); + uart_putc(echochar); + } + uart_putc('\n'); + + +} void uart_init() { + // global interrupt setup +// regw_u32(EXTI_IMR, 0x000FFFFF, 0, O_WRITE); +// regw_u32(EXTI_RTSR, 0x000FFFFF, 0, O_WRITE); + + + regw_u32(RCC_APB2ENR, 0x4005, 0, SET);// enable clock to UART1, AFIO and GPIOA - *RCC_APB2ENR = 0x4005; // enable clock to UART1, AFIO and GPIOA - *GPIOA_CRH = 0x444444D4; // (after enable GPIOA), on PA9&PA10 and set mode to alternative output - *AFIO_EVCR = 0x89; // (after enable) set event control register, output on PA, Pin 9 + /* (after enable GPIOA), on PA9&PA10 and set mode + * to alternative output */ + regw_u32(GPIOA_CRH, 0x444444D4, 0, O_WRITE); + regw_u8(AFIO_EVCR, 0x89, 0, O_WRITE);// set event control register, output on PA, Pin 9 - *USART1_CR1 = (0 << 13); // disable temporarily to set values + //disable temporarily to set values + regw_u8(USART1_CR1, 0x0, 13, SET); /* baud rate 115200, 8MHz / (16 * USARTDIV) * USARTDIV = 4.34 @@ -19,28 +45,17 @@ void uart_init() { * MANTISSA: 0d4.34 0d4 -> 0x4 * USART_BRR = 0x45*/ - /* baud rate 2400 - * - * 16 * 0.33 -> 0x5 - * 208 -> 0x34 */ - - *USART1_BRR = (volatile uint32_t) 0x00000045; + regw_u32(USART1_BRR, 0x00000045, 0, O_WRITE); + regw_u32(USART1_CR2, 0x0000, 0, O_WRITE); //set stop bit, default is 1 stop bit 0x00 - *USART1_CR2 = (volatile uint32_t) 0x0000; // set stop bit, default is 1 stop bit 0x00 - // enable DMA - // *USART1_CR3 = 0x0C0; /* parity = 8 bit, UART1 enabled, * TX and RX enabled, interrupts enabled */ - *USART1_CR1 = (volatile uint32_t) 0x000030AC; - -/* - * Configure UART0: - 1. Disable the UART by clearing the UARTEN bit in the UARTCTL register. - 2. Write the integer portion of the BRD to the UARTIBRD register. - 3. Write the fractional portion of the BRD to the UARTFBRD register. - 4. Write the desired serial parameters to the UARTLCRH register - 5. Enable the UART by setting the UARTEN bit in the UARTCTL register. -*/ + //regw_u32(USART1_CR1, 0x000030AC, 0, O_WRITE); + regw_u32(USART1_CR1, 0x0000302C, 0, O_WRITE); + + ivt_set_gate(53, uart_handler, 0); + + *NVIC_ISER1 = (1 << 5); // Enable UART interrupt at NVIC } void wait() { @@ -51,34 +66,33 @@ extern void uart_putc(unsigned char ch) { if (ch == '\n') { while (*USART1_SR & 0x0C) { } // transmit data register empty and complete - *USART1_DR = 0x0D; // return line + regw_u8(USART1_DR, 0x0D, 0, O_WRITE); // return line } - while (*USART1_SR & 0x0C) {} - *USART1_DR = ch; - + regw_u8(USART1_DR, ch, 0, O_WRITE); - wait(); } -extern void uart_puts(unsigned char *str) -{ - +extern void uart_puts(unsigned char *str) { int i; - - for (i = 0; i < strlen(str); i++) - { + for (i = 0; i < strlen(str); i++) { uart_putc(str[i]); } } -char * uart_read() { +char uart_read() { - return NULL; + /* while (buffer not empty) + * read() + * uart_putc(ch) // echo + * if ch = enter + * process inquiry. + */ + }