diff --git a/Core/main.cc b/Core/main.cc index c2a053a..4b44cd7 100644 --- a/Core/main.cc +++ b/Core/main.cc @@ -5,152 +5,25 @@ #include "delay.h" #include "platform/stm32g0xx/Gpio.h" #include "platform/stm32g0xx/Uart.h" -#include "platform/stm32g0xx/IndependentWatchdog.h" -// NOTE! The independent watchdog is clocked by a separate clock. this one -// isn't controlled by JTAG. That's why the independent watchdog needs to -// be disabled during JTAG debug sessions. -#define JTAG_DEBUG using namespace perinet::platform::stm32g0xx; -Gpio green_led(Gpio::Port::PORT_C, 6, Gpio::Mode::MODE_OUTPUT_PP); Uart uart1(Uart::UartDevice::UART_1, 115200); Uart uart2(Uart::UartDevice::UART_2, 115200); -#ifndef JTAG_DEBUG -IndependentWatchdog watchdog(4095, 4095); -#endif - int main(void) { - unsigned int i = 1, j = 40; - char tx_buf[80]; - -#ifndef JTAG_DEBUG - watchdog.enable(); -#endif - - while (1) { - if (j < 100) { - j += 10; - } - else if (j < 200) { - j += 20; - } - else if (j < 400) { - j += 40; - } - if (j > 800) { - j = 800; - } - sprintf(tx_buf, "%u: Hello World\r\n", i++); + char tx_buf[] = "\r\rProgram: UART bridge\r\n\n Receive on uart2 and transmit it on uart 1\r\n"; + uint8_t rec; uart1.sync_send((const uint8_t *)tx_buf, strlen(tx_buf)); - uart2.sync_send((const uint8_t *)tx_buf, strlen(tx_buf)); - green_led.toggle(); - delay_ms(j); -#ifndef JTAG_DEBUG - watchdog.trigger(); -#endif + while(true) { + if(uart2.sync_receive(&rec)) { + uart1.sync_send(&rec, 1); + } + if(uart1.sync_receive(&rec)) { + uart2.sync_send(&rec, 1); + } } -#if 0 -// 1: - /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ - //HAL_Init(); - - /* Configure Flash prefetch, Instruction cache */ - /* Default configuration at reset is: */ - /* - Prefetch disabled */ - /* - Instruction cache enabled */ - -#if (INSTRUCTION_CACHE_ENABLE == 0U) - __HAL_FLASH_INSTRUCTION_CACHE_DISABLE(); -#endif /* INSTRUCTION_CACHE_ENABLE */ - -#if (PREFETCH_ENABLE != 0U) - __HAL_FLASH_PREFETCH_BUFFER_ENABLE(); -#endif /* PREFETCH_ENABLE */ - - /* Use SysTick as time base source and configure 1ms tick (default clock after Reset is HSI) */ - HAL_InitTick(TICK_INT_PRIORITY); - - PWR_PVDTypeDef sConfigPVD = {0}; - - __HAL_RCC_SYSCFG_CLK_ENABLE(); - __HAL_RCC_PWR_CLK_ENABLE(); - - /* System interrupt init*/ - - /** PVD Configuration*/ - sConfigPVD.Mode = PWR_PVD_MODE_NORMAL; - HAL_PWR_ConfigPVD(&sConfigPVD); - /** Enable the PVD Output*/ - HAL_PWR_EnablePVD(); - -// 2: - /* Configure the system clock */ - //SystemClock_Config(); - -// 3: - /* Initialize all configured peripherals */ - //MX_GPIO_Init(); - -// 4: - //MX_DMA_Init(); - /* DMA controller clock enable */ - __HAL_RCC_DMA1_CLK_ENABLE(); - - /* DMA interrupt init */ - /* DMA1_Channel1_IRQn interrupt configuration */ - HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0); - HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn); - /* DMA1_Channel2_3_IRQn interrupt configuration */ - HAL_NVIC_SetPriority(DMA1_Channel2_3_IRQn, 0, 0); - HAL_NVIC_EnableIRQ(DMA1_Channel2_3_IRQn); - -// 5: - //MX_USART1_UART_Init(); - huart1.Instance = USART1; - huart1.Init.BaudRate = 115200; - huart1.Init.WordLength = UART_WORDLENGTH_8B; - huart1.Init.StopBits = UART_STOPBITS_1; - huart1.Init.Parity = UART_PARITY_NONE; - huart1.Init.Mode = UART_MODE_TX_RX; - huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; - huart1.Init.OverSampling = UART_OVERSAMPLING_16; - huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; - huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1; - huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; - if (HAL_UART_Init(&huart1) != HAL_OK) - { - Error_Handler(); - } - if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK) - { - Error_Handler(); - } - if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK) - { - Error_Handler(); - } - if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK) - { - Error_Handler(); - } - -//6: - //uint8_t buf[] = "Hello World\r\n"; - //HAL_UART_Transmit_DMA(&huart1, buf, strlen((const char *)buf)); - //HAL_UART_Receive_DMA(&huart1, buf, strlen((const char *)buf)); - -#endif } - -#ifdef USE_FULL_ASSERT -void assert_failed(uint8_t *file, uint32_t line) -{ - /* User can add his own implementation to report the file name and line number, - ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ -} -#endif /* USE_FULL_ASSERT */ diff --git a/platform/stm32g0xx/Uart.cc b/platform/stm32g0xx/Uart.cc index 7d7eefa..81c504e 100644 --- a/platform/stm32g0xx/Uart.cc +++ b/platform/stm32g0xx/Uart.cc @@ -72,3 +72,13 @@ void Uart::sync_send(const uint8_t *buffer, uint32_t len) uart->TDR = buffer[i]; } } + +bool Uart::sync_receive(uint8_t* res) +{ + if((uart->ISR & USART_ISR_RXNE_RXFNE) == 0) { + return false; + } + + *res = (uint8_t)(uart->RDR); + return true; +} diff --git a/platform/stm32g0xx/Uart.h b/platform/stm32g0xx/Uart.h index fa673ea..5ee134f 100644 --- a/platform/stm32g0xx/Uart.h +++ b/platform/stm32g0xx/Uart.h @@ -18,6 +18,7 @@ public: Uart(UartDevice, uint32_t); void sync_send(const uint8_t *, uint32_t); + bool sync_receive(uint8_t*); private: USART_TypeDef * uart;