uart functionality (delay) + interrupt tested
[cortex-from-scratch] / uart.c
diff --git a/uart.c b/uart.c
index 20a8d5e..93b2c91 100644 (file)
--- a/uart.c
+++ b/uart.c
@@ -6,24 +6,31 @@
 
 void uart_init() {
 
-       // enable clock to UART1
-       *RCC_APB2ENR = 0x4005;
-       *GPIOA_CRH = 0x444444D4;
-       *AFIO_EVCR = 0x89;
        
-       *USART1_CR1 = (0 << 13); // disable control register
-       *USART1_CR3 = 0xC0;
+       *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
 
-       /* baud rate 9600 
-        * 115200 = 8MHz / (16 * USARTDIV)
+       *USART1_CR1 = (0 << 13); // disable temporarily to set values
+
+       /* baud rate 115200,  8MHz / (16 * USARTDIV)
         * USARTDIV = 4.34
         * FRACTION: 16 x 0.34 = 0d5.44 0d5 -> 0x5
         * MANTISSA: 0d4.34 0d4 -> 0x4 
         * USART_BRR = 0x45*/
 
-       *USART1_BRR = 0x00000045;
+       /* baud rate 2400 
+        * 
+        * 16 * 0.33 -> 0x5
+        * 208 -> 0x34 */
 
-       /* parity = 8 bit, UART1 enabled, TX and RX enabled, interrupts enabled */
+       *USART1_BRR = (volatile uint32_t) 0x00000045;
+       
+       *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; 
 
 /* 
@@ -34,35 +41,24 @@ void uart_init() {
        4. Write the desired serial parameters to the UARTLCRH register
        5. Enable the UART by setting the UARTEN bit in the UARTCTL register.
 */
-
-/* TODO: bitrate: How fast is CPU running?*/
-
-/* *UART0_CTRL = 0;
-*UART0_IBRD = 27; 
-*UART0_FBRD = 9;
-*UART0_LCRH = 0x60; 
-*UART0_CTRL = 0x301;
-
-*UART1_CTRL = 0;
-*UART1_IBRD = 27; 
-*UART1_FBRD = 9;
-*UART1_LCRH = 0x60; 
-*UART1_CTRL = 0x301;
-*/
-
 }
 
+
 extern void uart_putc(unsigned char ch) {
        
-//     if (ch == '\n') {
-//             while ((*UART1_DR & 0x8)); // busy bit
-//             *USART1_DR = 0x0D; // return line
-//     }
-//     
-//     while ((*UART0_FLAG & 0x8)); // busy bit
-       *USART1_DR = ch;
+       if (ch == '\n') {
+               while (*USART1_SR & 0x0C) { } // transmit data register empty and complete
+               *USART1_DR = 0x0D; // return line
+       }
+       
+       while ((*USART1_SR & 0xFF) == 0x0C) {} // busy bit  
+               *USART1_DR = ch;
+
 }
 
+void wait() {
+       for (int i = 0; i < 100; i++);
+}
 extern void uart_puts(unsigned char *str)
 {
 
@@ -70,11 +66,13 @@ extern void uart_puts(unsigned char *str)
 
     for (i = 0; i < strlen(str); i++)
     {
+       wait();
         uart_putc(str[i]);
     }
 }
 
 
+
 char * uart_read() {
 
        return NULL;