diff options
Diffstat (limited to '02-usart/src/main.c')
-rw-r--r-- | 02-usart/src/main.c | 115 |
1 files changed, 21 insertions, 94 deletions
diff --git a/02-usart/src/main.c b/02-usart/src/main.c index b4f7dd7..b293202 100644 --- a/02-usart/src/main.c +++ b/02-usart/src/main.c @@ -1,4 +1,6 @@ +#include "isr_vector.h" +#include "lib.h" #include "string.h" #include "mem.h" #include "dma.h" @@ -8,117 +10,42 @@ #include "gpio.h" #include "spin.h" #include "usart.h" +#include "system.h" -volatile uint32_t delay_amt = 20000000 / 4; -int setup_usart2(uint32_t baud_rate) -{ - __IO gpio_port_t* port_a = enable_gpio(GPIO_PORT_A); - enable_hsi(&RCC, true); - - // Turn on the clock for the USART2 peripheral - set_usart2_clock_src(&RCC, USART_CLK_SRC_HSI16); - set_usart2_clock_enabled(&RCC, true); - - // Configure the I/O pins. Will use PA2 as TX and PA15 as RX so setup for - // alternate function - set_gpio_pin_mode(port_a, PIN_2, MODE_ALTERNATE); - set_gpio_pin_mode(port_a, PIN_15, MODE_ALTERNATE); - set_gpio_alternate_function(port_a, PIN_2, AFN_7); - set_gpio_alternate_function(port_a, PIN_15, AFN_3); - - // De-assert reset of USART2 - RCC.apb1rst1_r &= ~BIT(17); - - // Configure the USART - // disable USART first to allow setting of other control bits - // This also disables parity checking and enables 16 times oversampling - - USART2.c_r1 = 0; - USART2.c_r2 = 0; - USART2.c_r3 = 0; - - usart_set_divisor(&USART2, 16000000 / baud_rate); -} +#ifdef ARCH_STM32L4 -int enable_usart1(uint32_t baud_rate) +/** Overrides the default systick irq handler. */ +void on_systick() { - /* Enable the GPIO bus. */ - __IO gpio_port_t* port_b = enable_gpio(GPIO_PORT_B); - - /* Enable the USART clock. */ - RCC.apb2en_r |= BIT(14); - - /* == Configure the IO Pins. == */ - - /* GPIO D5 (Port B pin 6) is USART1 Tx, - * GPIO D6 (Port B pin 7) is USART1 Rx. */ - set_gpio_pin_mode(port_b, PIN_6, MODE_ALTERNATE); - set_gpio_pin_mode(port_b, PIN_7, MODE_ALTERNATE); - - /* Set the GPIO pins to use the USART alternate function. */ - set_gpio_alternate_function(port_b, PIN_6, AFN_7); - set_gpio_alternate_function(port_b, PIN_7, AFN_7); + static int is_on = 0; - RCC.apb2rst_r &= ~BIT(14); /* De-assert reset of USART1 */ - - uint32_t baud_rate_div = 80000000 / baud_rate; - USART1.c_r1 = 0; - USART1.c_r2 = 0; - USART1.c_r3 = 0; - USART1.br_r = baud_rate_div; + __IO gpio_port_t* port_b = enable_gpio(GPIO_PORT_B); + gpio_output_pin_t pin3 = set_gpio_pin_output(port_b, PIN_3); - USART1.c_r1 |= BIT(3) | BIT(2); - USART1.c_r1 |= BIT(0); + if (is_on) { + pin_off(pin3); + } else { + pin_on(pin3); + } - /* Enable the transmitter and the receiver. */ - usart_set_enabled(&USART1, USART_ENABLE_TX); - enable_interrupts(); + is_on = ! is_on; } -#ifdef ARCH_STM32L4 - /* Main function. This gets executed from the interrupt vector defined above. */ int main() { - /* Enable the GPIO port B. */ - - __IO gpio_port_t* port_b = enable_gpio(GPIO_PORT_B); - gpio_output_pin_t pin3 = set_gpio_pin_output(port_b, PIN_3); - gpio_output_pin_t pin1 = set_gpio_pin_output(port_b, PIN_1); - /* Enable a higher clock frequency. */ set_system_clock_MHz(80); - setup_usart2(115200); - - - char* into = (char*) (SRAM1_BASE + 50); - const char* hello = "Hello, Chester Cheeto!\r\n"; - int len = strlen(hello); - memcpy(into, hello, len + 1); - - usart_enable_dma(&USART2, USART_ENABLE_TX); - usart_set_enabled(&USART2, USART_ENABLE_TX | USART_ENABLE_RX); - - pin_on(pin3); - - RCC.ahb1en_bf.dma1en = 1; /* Enable DMA1 Clock. */ - DMA1.csel_bf.c7s = 0x2; /* Select USART2_TX for the sel. */ - DMA1.channel_config[6].cc_r = 0; - DMA1.channel_config[6].cc_bf.dir = READ_FROM_MEMORY; - DMA1.channel_config[6].cc_bf.minc = 1; - DMA1.channel_config[6].cc_bf.pl = DMA_PRIORITY_LEVEL_VERY_HIGH; - DMA1.channel_config[6].cndt_bf.ndt = len; - DMA1.channel_config[6].cpa_r = ptr2reg(&USART2.td_r); - DMA1.channel_config[6].cma_r = ptr2reg(into); + /* Set the countdown to start from 1,000,0000. */ + SCB.strv_r = 10000000; - USART2.ic_bf.tccf = 1; - DMA1.channel_config[6].cc_bf.en = 1; + /* Enable interrupts. */ + SCB.stcs_bf.tickint = 1; - pin_on(pin3); - // usart_transmit_str_sync(&USART2, into); - for(;;); + /* Start the systick. */ + SCB.stcs_bf.enable = 1; } #endif |