diff --git a/src/uart-transmit/esp32-c3-uart-interface.c b/src/uart-transmit/esp32-c3-uart-interface.c index ba50bcf2ca86ee1d65151a70c3a3d35b2f056eef..a838e2d7a41444bfd47f5cb9343397cabd940a91 100644 --- a/src/uart-transmit/esp32-c3-uart-interface.c +++ b/src/uart-transmit/esp32-c3-uart-interface.c @@ -1,7 +1,10 @@ #include "esp32-c3-uart-interface.h" -#include "esp32-c3-led-helpers.h" #include <stdint.h> #include <stdbool.h> +#include <stddef.h> + +#include <mdk.h> + static void clearBits(volatile uint32_t *registerAddress, uint32_t bitPositions, uint32_t numBits) { uint32_t mask = (uint32_t)(1 << numBits) - 1; // Create a mask with the specified number of bits set to 1 @@ -14,6 +17,15 @@ static void setBit(volatile uint32_t *registerAddress, uint32_t bitPositions) { *registerAddress |= ~mask; } +static void setSpecificBitsInRegister(volatile uint32_t *reg, uint32_t *bits, size_t numBits) { + uint32_t rx_fifo = *reg; + for (size_t i = 0; i < numBits; i++) { + uint32_t bitPos = bits[i]; + rx_fifo |= (1 << bitPos); + } + *reg = rx_fifo; +} + static void init_uart_enable_clk(){ // enable the clock for UART RAM by setting SYSTEM_UART_MEM_CLK_EN to 1; // enable APB_CLK for UARTn by setting SYSTEM_UARTn_CLK_EN to 1; @@ -28,33 +40,33 @@ static void init_uart_toggle_rst(){ // Detailed steps explained in 26.5.2.1 // for resetting and initilizing of uart // get current regestry values - uint32_t rx_filt = *C3_UART_RX_FILT_REG_UART0; - uint32_t core_value = *C3_UART_CLK_CONF_REG_UART0; + uint32_t rx_filt = *C3_UART_RX_FILT_REG(0); + uint32_t core_value = *C3_UART_CLK_CONF_REG(0); // clear UARTn_RST rx_filt &= (uint32_t)~(1<<5); rx_filt &= (uint32_t)~(1<<2); - *C3_UART_RX_FILT_REG_UART0 = rx_filt; + *C3_UART_RX_FILT_REG(0) = rx_filt; // set UART_RST_CORE core_value |= 1<<23; - *C3_UART_CLK_CONF_REG_UART0 = core_value; + *C3_UART_CLK_CONF_REG(0) = core_value; // set UARTn_RST rx_filt |= 1<<5; rx_filt |= 1<<2; - *C3_UART_RX_FILT_REG_UART0 = rx_filt; + *C3_UART_RX_FILT_REG(0) = rx_filt; // clear UARTn_RST rx_filt &= (uint32_t)~(1<<5); rx_filt &= (uint32_t)~(1<<2); - *C3_UART_RX_FILT_REG_UART0 = rx_filt; + *C3_UART_RX_FILT_REG(0) = rx_filt; // clear UART_RST_CORE core_value &= (uint32_t)~(1<<23); - *C3_UART_CLK_CONF_REG_UART0 = core_value; + *C3_UART_CLK_CONF_REG(0) = core_value; } static void init_uart_clear_update(){ // enable register synchronization by clearing UART_UPDATE_CTRL. - uint32_t id_value = *C3_UART_ID_REG_UART0; + uint32_t id_value = *C3_UART_ID_REG(0); id_value &= (uint32_t)~(1<<30); - *C3_UART_ID_REG_UART0 = id_value; + *C3_UART_ID_REG(0) = id_value; } static void config_clock_freq(){ @@ -62,7 +74,7 @@ static void config_clock_freq(){ // baud rate = freq / (UART_CLKDIV + UART_CLKDIV_FRAG / 16) // select the clock source via UART_SCLK_SEL; - uint32_t clockSelect = *C3_UART_CLK_CONF_REG_UART0; + uint32_t clockSelect = *C3_UART_CLK_CONF_REG(0); // making sure we start with 0 clockSelect &= (uint32_t)~(1<<20); clockSelect &= (uint32_t)~(1<<21); @@ -70,7 +82,7 @@ static void config_clock_freq(){ // 10 is RC_FAST_CLK with default of 17.5 MHz // 11 is XTAL_CLK with 40 MHz clockSelect |= 1<<20; - *C3_UART_CLK_CONF_REG_UART0 = clockSelect; + *C3_UART_CLK_CONF_REG(0) = clockSelect; // selected ABP_CLK with 80 MHz // dividing clock to 6 Mhz (divisor should be 13+1/3) @@ -86,35 +98,35 @@ static void config_clock_freq(){ clockSelect |= 1<<1; clockSelect |= 1<<0; - *C3_UART_CLK_CONF_REG_UART0 = clockSelect; + *C3_UART_CLK_CONF_REG(0) = clockSelect; // calculate Baud rate to be 9600 (6Mhz/625) - uint32_t baudRateDivs = *C3_UART_CLKDIV_REG_UART0; + uint32_t baudRateDivs = *C3_UART_CLKDIV_REG(0); baudRateDivs |= 1<<0; baudRateDivs |= 1<<4; baudRateDivs |= 1<<5; baudRateDivs |= 1<<6; baudRateDivs |= 1<<9; - *C3_UART_CLKDIV_REG_UART0 = baudRateDivs; + *C3_UART_CLKDIV_REG(0) = baudRateDivs; } static void disable_parity(){ - uint32_t uart_conf = *C3_UART_CONF0_REG_UART0; + uint32_t uart_conf = *C3_UART_CONF0_REG(0); uart_conf &= (uint32_t)~(1<<0); uart_conf &= (uint32_t)~(1<<1); - *C3_UART_CONF0_REG_UART0 = uart_conf; + *C3_UART_CONF0_REG(0) = uart_conf; } static void set_max_data_lenght(){ - uint32_t uart_conf = *C3_UART_CONF0_REG_UART0; + uint32_t uart_conf = *C3_UART_CONF0_REG(0); uart_conf |= (1<<2); uart_conf |= (1<<3); - *C3_UART_CONF0_REG_UART0 = uart_conf; + *C3_UART_CONF0_REG(0) = uart_conf; } void config_uart(){ - // wait for UART_REG_UART0_UPDATE to become 0, which indicates the completion of the last synchronization; - uint32_t reg_update = *C3_UART_ID_REG_UART0; + // wait for UART_REG(0)_UPDATE to become 0, which indicates the completion of the last synchronization; + uint32_t reg_update = *C3_UART_ID_REG(0); while((bool)(reg_update & (uint32_t)(1<<31))){ __asm__("ADDI x0, x0, 0"); @@ -134,35 +146,41 @@ void config_uart(){ // synchronize the configured values to the Core Clock domain by writing 1 to UART_REG_UPDATE. reg_update |= (uint32_t)(1<<31); - *C3_UART_ID_REG_UART0 = reg_update; + *C3_UART_ID_REG(0) = reg_update; } -static void set_65_to_rd_byte(){ - uint32_t rx_fifo = *C3_UART_FIFO_REG_UART0; - // making sure we start with 0 - rx_fifo |= 1<<0; - rx_fifo |= 1<<6; - *C3_UART_FIFO_REG_UART0 = rx_fifo; +void writeSomething(){ + uint32_t bitPositions[] = {0,1,7}; + size_t numBits = sizeof(bitPositions) / sizeof(bitPositions[0]); + setSpecificBitsInRegister(C3_UART_FIFO_REG(0), bitPositions, numBits); + + //uint32_t rx_fifo = *C3_UART_FIFO_REG(0); + //rx_fifo |= 1<<7; + //rx_fifo |= 1<<6; + //rx_fifo |= 1<<5; + //*C3_UART_FIFO_REG(0) = rx_fifo; } void enable_uart_transmitter(){ - // configure TX FIFO’s empty threshold via UART_TXFIFO_EMPTY_THRHD; - clearBits(C3_UART_CONF1_REG_UART0, 9, 9); - - // disable UART_TXFIFO_EMPTY_INT interrupt by clearing UART_TXFIFO_EMPTY_INT_ENA; - clearBits(C3_UART_INT_ENA_REG_UART0, 1, 1); - - // write data to be sent to UART_RXFIFO_RD_BYTE; - set_65_to_rd_byte(); - - // clear UART_TXFIFO_EMPTY_INT interrupt by setting UART_TXFIFO_EMPTY_INT_CLR; - setBit(C3_UART_INT_CLR_REG_UART0, 1); - - // enable UART_TXFIFO_EMPTY_INT interrupt by setting UART_TXFIFO_EMPTY_INT_ENA; - setBit(C3_UART_INT_ENA_REG_UART0, 1); - - // detect UART_TXFIFO_EMPTY_INT and wait for the completion of data transmission. + for(int i = 0; i < 100; i++){ + delay_ms(10); + // configure TX FIFO’s empty threshold via UART_TXFIFO_EMPTY_THRHD; + clearBits(C3_UART_CONF1_REG(0), 9, 9); + setBit(C3_UART_CONF1_REG(0),3); + + // disable UART_TXFIFO_EMPTY_INT interrupt by clearing UART_TXFIFO_EMPTY_INT_ENA; + clearBits(C3_UART_INT_ENA_REG(0), 1, 1); + + // write data to be sent to UART_RXFIFO_RD_BYTE; + writeSomething(); + + // clear UART_TXFIFO_EMPTY_INT interrupt by setting UART_TXFIFO_EMPTY_INT_CLR; + setBit(C3_UART_INT_CLR_REG(0), 1); + + // enable UART_TXFIFO_EMPTY_INT interrupt by setting UART_TXFIFO_EMPTY_INT_ENA; + setBit(C3_UART_INT_ENA_REG(0), 1); + } } void reset_uart(){ @@ -172,16 +190,8 @@ void reset_uart(){ } void init_uart(){ - uint8_t red[3] = {0,1,0}; - uint8_t blue[3] = {0,0,1}; - uint8_t yellow[3] = {1,1,0}; - uint8_t violet[3] = {0,1,1}; // from technical reference manual 543 f - showColorForDuration(red,1000); init_uart_enable_clk(); - showColorForDuration(blue,1000); init_uart_toggle_rst(); - showColorForDuration(violet,1000); init_uart_clear_update(); - showColorForDuration(yellow,1000); } \ No newline at end of file diff --git a/src/uart-transmit/esp32-c3-uart-interface.h b/src/uart-transmit/esp32-c3-uart-interface.h index 7dfe002d3fb0292099c0833d2109bd55b9ae8466..3d187ad64d60307f6d6eb43c8d7e2720818fce35 100644 --- a/src/uart-transmit/esp32-c3-uart-interface.h +++ b/src/uart-transmit/esp32-c3-uart-interface.h @@ -3,64 +3,57 @@ // all addresses are relative to some other register.... -#define C3_BASE_OFFSET_UART_CONTROLLER_0 ((uint32_t)0x60000000) -#define C3_BASE_OFFSET_UART_CONTROLLER_1 ((uint32_t)0x60010000) -#define C3_BASE_OFFSET_SYSTEM_REGISTERS ((uint32_t)0x600C0000) -#define C3_BASE_OFFSET_SYSTEM_REGISTERS ((uint32_t)0x600C0000) #define C3_BASE_OFFSET_SYSTEM_REGISTERS ((uint32_t)0x600C0000) -#define C3_UART_FIFO_REG_UART0 ((volatile uint32_t *)C3_BASE_OFFSET_UART_CONTROLLER_0+0x0000) -#define C3_UART_FIFO_REG_UART1 ((volatile uint32_t *)C3_BASE_OFFSET_UART_CONTROLLER_1+0x0000) -// UART_RXFIFO_RD_BYTE is from 0 to 7 +#define C3_UART_CONTROLLER_0_BASE ((uint32_t)0x60000000) +#define C3_UART_CONTROLLER_1_BASE ((uint32_t)0x60010000) +#define C3_UART_CONTROLLER_SELECT(base_select) ((volatile uint32_t *)((base_select == 1) ? C3_UART_CONTROLLER_1_BASE : C3_UART_CONTROLLER_0_BASE)) + +#define C3_UART_FIFO_REG(base_select) ((volatile uint32_t *)(C3_UART_CONTROLLER_SELECT((base_select)) + 0x0000)) -#define C3_UART_INT_ENA_REG_UART0 ((volatile uint32_t *)C3_BASE_OFFSET_UART_CONTROLLER_0+0x000C) -#define C3_UART_INT_ENA_REG_UART1 ((volatile uint32_t *)C3_BASE_OFFSET_UART_CONTROLLER_1+0x000C) +#define C3_UART_INT_RAW(base_select) ((volatile uint32_t *)(C3_UART_CONTROLLER_SELECT((base_select)) + 0x0004)) +// UART_TXFIFO_EMPTY_INT_RAW is on 1 + +#define C3_UART_INT_ENA_REG(base_select) ((volatile uint32_t *)(C3_UART_CONTROLLER_SELECT((base_select)) + 0x000C)) // UART_TXFIFO_EMPTY_INT_ENA is on 1 -#define C3_UART_INT_CLR_REG_UART0 ((volatile uint32_t *)C3_BASE_OFFSET_UART_CONTROLLER_0+0x0010) -#define C3_UART_INT_CLR_REG_UART1 ((volatile uint32_t *)C3_BASE_OFFSET_UART_CONTROLLER_1+0x0010) +#define C3_UART_INT_CLR_REG(base_select) ((volatile uint32_t *)(C3_UART_CONTROLLER_SELECT((base_select)) + 0x0010)) // UART_TXFIFO_EMPTY_INT_CLR -#define C3_SYSTEM_PERIP_CLK_EN0_REG ((volatile uint32_t *)C3_BASE_OFFSET_SYSTEM_REGISTERS+0x0010) -// SYSTEM_UART_MEM_CLK_EN is on 24 -// SYSTEM_UARTn_CLK_EN n=0 is on 2, n=1 is on 5 - -#define C3_UART_CLKDIV_REG_UART0 ((volatile uint32_t *)C3_BASE_OFFSET_UART_CONTROLLER_0+0x0014) -#define C3_UART_CLKDIV_REG_UART1 ((volatile uint32_t *)C3_BASE_OFFSET_UART_CONTROLLER_1+0x0014) +#define C3_UART_CLKDIV_REG(base_select) ((volatile uint32_t *)(C3_UART_CONTROLLER_SELECT((base_select)) + 0x0014)) // UART_CLKDIV - integer part of baud rate calculator devisor - 0 to 11 // UART_CLKDIV_FRAG - numerator of devisor in baud rate calculator devisor -#define C3_UART_RX_FILT_REG_UART0 ((volatile uint32_t *)C3_BASE_OFFSET_UART_CONTROLLER_0+0x0018) -#define C3_UART_RX_FILT_REG_UART1 ((volatile uint32_t *)C3_BASE_OFFSET_UART_CONTROLLER_1+0x0018) +#define C3_UART_RX_FILT_REG(base_select) ((volatile uint32_t *)(C3_UART_CONTROLLER_SELECT((base_select)) + 0x0018)) // SYSTEM_UARTn_RST n=0 is on 2, n=1 is on 5 -#define C3_UART_CONF0_REG_UART0 ((volatile uint32_t *)C3_BASE_OFFSET_UART_CONTROLLER_0+0x0020) -#define C3_UART_CONF0_REG_UART1 ((volatile uint32_t *)C3_BASE_OFFSET_UART_CONTROLLER_1+0x0020) +#define C3_UART_CONF0_REG(base_select) ((volatile uint32_t *)(C3_UART_CONTROLLER_SELECT((base_select)) + 0x0020)) // UART_PARITY is on 0 // UART_PARITY_EN is on 1 // UART_BIT_NUM is on 2 and 3 - -#define C3_UART_CONF1_REG_UART0 ((volatile uint32_t *)C3_BASE_OFFSET_UART_CONTROLLER_0+0x0024) -#define C3_UART_CONF1_REG_UART1 ((volatile uint32_t *)C3_BASE_OFFSET_UART_CONTROLLER_1+0x0024) +#define C3_UART_CONF1_REG(base_select) ((volatile uint32_t *)(C3_UART_CONTROLLER_SELECT((base_select)) + 0x0024)) // UART_TXFIFO_EMPTY_THRHD is 9 to 17 -#define C3_UART_CLK_CONF_REG_UART0 ((volatile uint32_t *)C3_BASE_OFFSET_UART_CONTROLLER_0+0x0078) -#define C3_UART_CLK_CONF_REG_UART1 ((volatile uint32_t *)C3_BASE_OFFSET_UART_CONTROLLER_1+0x0078) +#define C3_UART_CLK_CONF_REG(base_select) ((volatile uint32_t *)(C3_UART_CONTROLLER_SELECT((base_select)) + 0x0078)) // UART_RST_CORE is on 23 // UART_SCLK_SEL is on 20 and 21 (2 bits), selcetion is between 1 and 3 // UART_SCLK_DIV_NUM - The integral part of the frequency divisor - 12 to 19 // UART_SCLK_DIV_A - The numerator of the frequency divisor - 6 to 11 // UART_SCLK_DIV_B - The denominator of the frequency divisor - 0 to 5 -#define C3_UART_ID_REG_UART0 ((volatile uint32_t *)C3_BASE_OFFSET_UART_CONTROLLER_0+0x0080) -#define C3_UART_ID_REG_UART1 ((volatile uint32_t *)C3_BASE_OFFSET_UART_CONTROLLER_1+0x0080) +#define C3_UART_ID_REG(base_select) ((volatile uint32_t *)(C3_UART_CONTROLLER_SELECT((base_select)) + 0x0080)) // UART_UPDATE_CTRL is on 30 // UART_REG_UPDATE is on 31 +#define C3_SYSTEM_PERIP_CLK_EN0_REG ((volatile uint32_t *)(C3_BASE_OFFSET_SYSTEM_REGISTERS+0x0010)) +// SYSTEM_UART_MEM_CLK_EN is on 24 +// SYSTEM_UARTn_CLK_EN n=0 is on 2, n=1 is on 5 + void config_uart(); void init_uart(); void reset_uart(); void enable_uart_transmitter(); +void writeSomething(); #endif \ No newline at end of file