#define UART_BASE 0x00300000 #define UART_LCR 0x0030000C // Used for setting Divisor Latch Access Bit (DLAB); Used for setting data format (no. of bits we transmit, enabling parity, setting no. of stop bits (1 or 2 for Tx., and 1 for Rx.) #define UART_DLL 0x00300000 // DLL and DLM are used for setting Baud divisor value to set the appropriate Baud Rate #define UART_DLM 0x00300004 #define UART_THR 0x00300000 // THR is used for Tx. #define UART_RBR 0x00300000 // RBR is for Rx. #define UART_IER 0x00300004 // IER is set to interrupt the processor #define UART_FCR 0x00300008 // FCR is used to clear the FIFO #define UART_IIR 0x00300008 #define REG_STATUS 0x00400000 // BASEREG #define REG_CLKDIV 0x00400010 #define REG_SPICMD 0x00400020 #define REG_SPIADR 0x00400030 #define REG_SPILEN 0x00400040 #define REG_SPIDUM 0x00400050 #define REG_TXFIFO 0x00400060 #define REG_RXFIFO 0x00400080 #define REG_INTCFG 0x00400090 #define REG_INTSTA 0x004000A0 #define DEV_WRITE(addr, val) (*((volatile uint32_t *)(addr)) = val) #define DEV_READ(addr) (*((volatile uint32_t *)(addr))) #define GPIO_READ (*((volatile uint32_t *)(0x00200000))) #define GPIO_WRITE(val) (*((volatile uint32_t *)(0x00200000)) = val) void uart_init() { DEV_WRITE(UART_LCR, 0x00000081); DEV_WRITE(UART_DLL, 0x000007DA); //Divider = decimal 2010 to achieve baud rate of "57600" for clock of 59.98 MHz DEV_WRITE(UART_DLM, 0x00000003); DEV_WRITE(UART_LCR, 0x00000003); //Trying to send just 8 bits DEV_WRITE(UART_THR, 0x0000000A); DEV_WRITE(UART_THR, 0x0000000A); DEV_WRITE(UART_THR, 0x0000000A); DEV_WRITE(UART_THR, 0x0000000A); DEV_WRITE(UART_THR, 0x0000000A); DEV_WRITE(UART_THR, 0x0000000A); } void delay(int n) { // Simple delay loop (adjust based on your system clock) volatile int i; for (i = 0; i < n * 100; i++) {} } // void spi_write(uint32_t cmd){ // DEV_WRITE(REG_INTCFG, 0xC1000100); //Enabling the Tx. Interrupt // DEV_WRITE(REG_SPICMD, cmd); //8 bits of CMD we want to send to LCD // DEV_WRITE(REG_SPIADR, cmd); //8 bits of ADDR we want to send to LCD // DEV_WRITE(REG_TXFIFO, cmd); // DEV_WRITE(REG_STATUS, 0x00000102); //Enable the clk to peripheral (SPI clk). Bit [1] set to enable spi_wr mode, and bit [8] set to chip select LCD. // DEV_WRITE(REG_INTCFG, 0x00000000); // delay(10); // } void printUart(int num) { // Recursively print the digits of the number if (num / 10 != 0) { printUart(num / 10); } // Print the last digit as a character DEV_WRITE(UART_THR, ('0' + (num % 10))); } void printUartSpace() { DEV_WRITE(UART_THR, 0x00000020); // add a space after the number } void printUartNewLine(){ DEV_WRITE(UART_THR, '\n'); }