diff options
-rw-r--r-- | README.md | 21 | ||||
-rw-r--r-- | src/entropy/main.c | 40 | ||||
-rw-r--r-- | src/entropy/stm32f4xx_hal_msp.c | 18 | ||||
-rw-r--r-- | src/entropy/stm32f4xx_it.c | 16 | ||||
-rw-r--r-- | src/entropy/stm_init.c | 34 | ||||
-rw-r--r-- | src/entropy/stm_init.h | 1 | ||||
-rw-r--r-- | src/uart-test/main.c | 25 | ||||
-rw-r--r-- | src/uart-test/stm32f4xx_hal_msp.c | 20 | ||||
-rw-r--r-- | src/uart-test/stm32f4xx_it.c | 25 | ||||
-rw-r--r-- | src/uart-test/stm_init.c | 50 | ||||
-rw-r--r-- | src/uart-test/stm_init.h | 1 |
11 files changed, 183 insertions, 68 deletions
@@ -67,13 +67,30 @@ statically at the beginning of main(): MODE_DELTAS and MODE_ENTROPY. MODE_ENTROPY is the default, and means the microcontroller will send entropy as binary data as fast as it can get it, which is about 24 kB/s in the current version of hardware and software. To get some entropy -and perform rudimentary analysis of it, and assuming the device was -enumerated as ttyUSB0, do +and perform rudimentary analysis of it, and assuming USB is used and +the device was enumerated as ttyUSB0, do ldattach -8 -n -1 -s 460800 tty /dev/ttyUSB0 + echo > /dev/ttyUSB0 cat /dev/ttyUSB0 | rngtest -c 10 cat /dev/ttyUSB0 | head -c 100000 | ent +For Raspberry-Pi, follow any of the guides on the internet for how to +enable the serial port on the GPIO pin header and then try + + ldattach -s 115200 -8 -n -1 tty /dev/ttyAMA0 + echo > /dev/ttyAMA0 + cat /dev/ttyAMA0 | rngtest -c 10 + cat /dev/ttyAMA0 | head -c 100000 | ent + +(the baud rate used with the R-Pi could probably be increased with a +little hardware debugging effort). + +Which UART on the board that will receive the entropy is controlled +by the sending of a newline to the UART ('echo > /dev/ttyUSB0' and +'echo > /dev/ttyAMA0' in the examples above). The power on default is +the USB UART. + MODE_DELTAS is a quality assurance mode, and outputs the raw Timer IC values captured for analysis. The stand alone program in src/delta16/ diff --git a/src/entropy/main.c b/src/entropy/main.c index e29e00c..f7663f5 100644 --- a/src/entropy/main.c +++ b/src/entropy/main.c @@ -42,6 +42,7 @@ extern DMA_HandleTypeDef hdma_tim; +UART_HandleTypeDef *huart; __IO ITStatus UartReady = RESET; static union { @@ -79,6 +80,7 @@ inline uint32_t get_one_bit(void) __attribute__((__always_inline__)); volatile uint32_t *restart_DMA(void); inline volatile uint32_t *get_DMA_read_buf(void); inline uint32_t safe_get_counter(volatile uint32_t *dmabuf, const uint32_t dmabuf_idx); +void check_uart_rx(UART_HandleTypeDef *this); /* static void Error_Handler(void); */ @@ -86,7 +88,7 @@ inline uint32_t safe_get_counter(volatile uint32_t *dmabuf, const uint32_t dmabu int main() { - uint32_t count = 0, send_bytes, idx = 255, send_sync_bytes_in = 0, i; + uint32_t count = 0, send_bytes, idx = 255, send_sync_bytes_in = 0, i, timeout; uint32_t mode = MODE_ENTROPY; /* Initialize buffers */ @@ -101,6 +103,8 @@ main() restart_DMA(); restart_DMA(); + huart = &huart1; + /* Toggle GREEN LED to show we've initialized */ { for (i = 0; i < 10; i++) { @@ -144,7 +148,8 @@ main() } /* Send buf on UART (non blocking interrupt driven send). */ - if (HAL_UART_Transmit_IT(&huart1, (uint8_t *) buf.rnd + idx, (uint16_t) send_bytes) == HAL_OK) { + UartReady = RESET; + if (HAL_UART_Transmit_IT(huart, (uint8_t *) buf.rnd + idx, (uint16_t) send_bytes) == HAL_OK) { if (mode == MODE_ENTROPY) { /* Flip-flop idx between the value 0 and the value BYTES_PER_CHUNK. @@ -155,15 +160,21 @@ main() get_entropy32(send_bytes / 4, idx / 4); } - while (UartReady != SET) { ; } - UartReady = RESET; - } else { - /* Turn on RED LED for one second */ + timeout = 0xffff; + while (UartReady != SET && timeout) { timeout--; } + } + + if (UartReady != SET) { + /* Failed to send, turn on RED LED for one second */ HAL_GPIO_WritePin(LED_PORT, LED_RED, GPIO_PIN_SET); HAL_Delay(1000); HAL_GPIO_WritePin(LED_PORT, LED_RED, GPIO_PIN_RESET); } + /* Check for UART change request */ + check_uart_rx(&huart1); + check_uart_rx(&huart2); + count++; } @@ -347,12 +358,27 @@ inline uint32_t safe_get_counter(volatile uint32_t *dmabuf, const uint32_t dmabu /* UART transmit complete callback */ void HAL_UART_TxCpltCallback(UART_HandleTypeDef *UH) { - if (UH->Instance == USART1) { + if ((UH->Instance == USART1 && huart->Instance == USART1) || + (UH->Instance == USART2 && huart->Instance == USART2)) { /* Signal UART transmit complete to the code in the main loop. */ UartReady = SET; } } +/* + * If a newline is received on UART1 or UART2, redirect output to that UART. + */ +void check_uart_rx(UART_HandleTypeDef *this) { + uint8_t rx = 0; + if (HAL_UART_Receive(this, &rx, 1, 0) == HAL_OK) { + if (rx == '\n') { + huart = this; + /* Signal UART transmit complete to the code in the main loop. */ + UartReady = SET; + } + } +} + /** * @brief This function is executed in case of error occurrence. * @param None diff --git a/src/entropy/stm32f4xx_hal_msp.c b/src/entropy/stm32f4xx_hal_msp.c index fc27e04..536a78c 100644 --- a/src/entropy/stm32f4xx_hal_msp.c +++ b/src/entropy/stm32f4xx_hal_msp.c @@ -58,7 +58,7 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart) */ GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_10; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FAST; GPIO_InitStruct.Alternate = GPIO_AF7_USART1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); @@ -66,6 +66,19 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart) /* NVIC for interrupt mode */ HAL_NVIC_SetPriority(USART1_IRQn, 0, 1); HAL_NVIC_EnableIRQ(USART1_IRQn); + } else if (huart->Instance == USART2) { + /* Peripheral clock enable */ + __USART2_CLK_ENABLE(); + GPIO_InitStruct.Pin = GPIO_PIN_2 | GPIO_PIN_3; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FAST; + GPIO_InitStruct.Alternate = GPIO_AF7_USART2; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* NVIC for interrupt mode */ + HAL_NVIC_SetPriority(USART2_IRQn, 0, 1); + HAL_NVIC_EnableIRQ(USART2_IRQn); } } @@ -80,6 +93,9 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart) PA10 ------> USART1_RX */ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9 | GPIO_PIN_10); + } else if (huart->Instance == USART2) { + __USART2_CLK_DISABLE(); + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2 | GPIO_PIN_3); } } diff --git a/src/entropy/stm32f4xx_it.c b/src/entropy/stm32f4xx_it.c index 231b4fc..d60a229 100644 --- a/src/entropy/stm32f4xx_it.c +++ b/src/entropy/stm32f4xx_it.c @@ -41,8 +41,6 @@ #include "stm32f4xx_it.h" #include "stm_init.h" -extern TIM_HandleTypeDef htim2; - /** @addtogroup STM32F4xx_HAL_Examples * @{ */ @@ -171,8 +169,7 @@ void SysTick_Handler(void) * @brief This function handles UART interrupt request. * @param None * @retval None - * @Note This function is redefined in "main.h" and related to DMA stream - * used for USART data transmission + * @Note HAL_UART_IRQHandler will call HAL_UART_TxCpltCallback in main.c. */ void USART1_IRQHandler(void) { @@ -180,6 +177,17 @@ void USART1_IRQHandler(void) } /** + * @brief This function handles UART interrupt request. + * @param None + * @retval None + * @Note HAL_UART_IRQHandler will call HAL_UART_TxCpltCallback in main.c. + */ +void USART2_IRQHandler(void) +{ + HAL_UART_IRQHandler(&huart2); +} + +/** * @brief This function handles DMA1 Stream 6 interrupt request. * @param None * @retval None diff --git a/src/entropy/stm_init.c b/src/entropy/stm_init.c index 4bf35b5..5f69760 100644 --- a/src/entropy/stm_init.c +++ b/src/entropy/stm_init.c @@ -38,9 +38,6 @@ /* Includes ------------------------------------------------------------------*/ #include "stm_init.h" -//#include "stm32f4xx_hal.h" -//#include "stm32f4xx_hal_rcc.h" - /** @addtogroup STM32F4xx_HAL_Examples * @{ @@ -54,6 +51,7 @@ /* Private define ------------------------------------------------------------*/ #define UART1_BAUD_RATE 460800 +#define UART2_BAUD_RATE 115200 /* Private macro -------------------------------------------------------------*/ @@ -62,6 +60,7 @@ static GPIO_InitTypeDef GPIO_InitStruct; TIM_HandleTypeDef htim2; UART_HandleTypeDef huart1; +UART_HandleTypeDef huart2; DMA_HandleTypeDef hdma_tim; /* Private function prototypes -----------------------------------------------*/ @@ -70,6 +69,7 @@ static void Error_Handler(void); static void MX_GPIO_Init(void); static void MX_TIM2_Init(uint32_t *counters_buf, uint16_t counters); static void MX_USART1_UART_Init(void); +static void MX_USART2_UART_Init(void); /* Private functions ---------------------------------------------------------*/ /** @@ -103,6 +103,7 @@ void stm_init(uint32_t *buf0, uint16_t counters) MX_GPIO_Init(); MX_TIM2_Init(buf0, counters); MX_USART1_UART_Init(); + MX_USART2_UART_Init(); } @@ -153,7 +154,7 @@ static void SystemClock_Config(void) RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV8; RCC_OscInitStruct.PLL.PLLQ = 7; - if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } @@ -163,7 +164,7 @@ static void SystemClock_Config(void) RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; /* AHB prescaler */ RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; /* APB1 prescaler /1 gives 42 MHz APB1 */ RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; /* APB2 prescaler /1 gives 42 MHz APB2 */ - if(HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) { + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) { Error_Handler(); } @@ -251,13 +252,12 @@ void MX_TIM2_Init(uint32_t *counters_buf, uint16_t counters) */ void MX_USART1_UART_Init(void) { - huart1.Instance = USART1; huart1.Init.BaudRate = UART1_BAUD_RATE; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; - huart1.Init.Mode = UART_MODE_TX; /* Only Transmit */ + huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; @@ -267,6 +267,24 @@ void MX_USART1_UART_Init(void) } } +/* USART2 init function */ +void MX_USART2_UART_Init(void) +{ + huart2.Instance = USART2; + huart2.Init.BaudRate = UART2_BAUD_RATE; + huart2.Init.WordLength = UART_WORDLENGTH_8B; + huart2.Init.StopBits = UART_STOPBITS_1; + huart2.Init.Parity = UART_PARITY_NONE; + huart2.Init.Mode = UART_MODE_TX_RX; + huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; + huart2.Init.OverSampling = UART_OVERSAMPLING_16; + + if (HAL_UART_Init(&huart2) != HAL_OK) { + /* Initialization Error */ + Error_Handler(); + } +} + /** * @brief This function is executed in case of error occurrence. @@ -276,7 +294,7 @@ void MX_USART1_UART_Init(void) static void Error_Handler(void) { HAL_GPIO_WritePin(LED_PORT, LED_RED, GPIO_PIN_SET); - while(1) { ; } + while(1) { ; } } #ifdef USE_FULL_ASSERT diff --git a/src/entropy/stm_init.h b/src/entropy/stm_init.h index 6a5de19..d58c254 100644 --- a/src/entropy/stm_init.h +++ b/src/entropy/stm_init.h @@ -10,6 +10,7 @@ #define LED_BLUE GPIO_PIN_15 extern UART_HandleTypeDef huart1; +extern UART_HandleTypeDef huart2; extern DMA_HandleTypeDef hdma_tim; extern void stm_init(uint32_t *buf0, uint16_t counters); diff --git a/src/uart-test/main.c b/src/uart-test/main.c index 77c17f4..55ec6fb 100644 --- a/src/uart-test/main.c +++ b/src/uart-test/main.c @@ -9,24 +9,45 @@ #define DELAY() HAL_Delay(250) +UART_HandleTypeDef *huart; + +/* + * If a newline is received on UART1 or UART2, redirect output to that UART. + */ +void check_uart_rx(UART_HandleTypeDef *this) { + uint8_t rx = 0; + if (HAL_UART_Receive(this, &rx, 1, 0) == HAL_OK) { + if (rx == '\n') { + HAL_GPIO_TogglePin(LED_PORT, LED_GREEN); + + huart = this; + } + } +} + int main() { uint8_t c = 'a'; - uint32_t i = 0; stm_init(); + huart = &huart1; + while (1) { HAL_GPIO_TogglePin(LED_PORT, LED_YELLOW); - HAL_UART_Transmit(&huart1, (uint8_t *) &c, 1, 0xff); + HAL_UART_Transmit(huart, (uint8_t *) &c, 1, 0xff); DELAY(); if (c++ == 'z') { c = 'a'; HAL_GPIO_TogglePin(LED_PORT, LED_BLUE); } + + /* Check for UART change request */ + check_uart_rx(&huart1); + check_uart_rx(&huart2); } } diff --git a/src/uart-test/stm32f4xx_hal_msp.c b/src/uart-test/stm32f4xx_hal_msp.c index 7cee9ce..4416195 100644 --- a/src/uart-test/stm32f4xx_hal_msp.c +++ b/src/uart-test/stm32f4xx_hal_msp.c @@ -5,6 +5,8 @@ * * PA9: USART1_TX * PA10: USART1_RX + * PA2: USART2_TX + * PA3: USART2_RX */ #include "stm32f4xx_hal.h" @@ -19,14 +21,19 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart) __USART1_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_10; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FAST; GPIO_InitStruct.Alternate = GPIO_AF7_USART1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - /* NVIC for interrupt mode */ - HAL_NVIC_SetPriority(USART1_IRQn, 0, 1); - HAL_NVIC_EnableIRQ(USART1_IRQn); + } else if (huart->Instance == USART2) { + /* Peripheral clock enable */ + __USART2_CLK_ENABLE(); + GPIO_InitStruct.Pin = GPIO_PIN_2 | GPIO_PIN_3; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FAST; + GPIO_InitStruct.Alternate = GPIO_AF7_USART2; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } } @@ -37,6 +44,9 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart) if (huart->Instance == USART1) { __USART1_CLK_DISABLE(); HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9 | GPIO_PIN_10); + } else if (huart->Instance == USART2) { + __USART2_CLK_DISABLE(); + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2 | GPIO_PIN_3); } } diff --git a/src/uart-test/stm32f4xx_it.c b/src/uart-test/stm32f4xx_it.c index 4e5bd89..73e7735 100644 --- a/src/uart-test/stm32f4xx_it.c +++ b/src/uart-test/stm32f4xx_it.c @@ -53,10 +53,6 @@ /* Private define ------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ - -/* UART handler declared in "stm_init.h" file */ -//extern UART_HandleTypeDef huart2; - /* Private function prototypes -----------------------------------------------*/ /* Private functions ---------------------------------------------------------*/ @@ -170,27 +166,6 @@ void SysTick_Handler(void) /******************************************************************************/ /** - * @brief This function handles UART interrupt request. - * @param None - * @retval None - * @Note This function is redefined in "main.h" and related to DMA stream - * used for USART data transmission - */ -void USART1_IRQHandler(void) -{ - HAL_UART_IRQHandler(&huart1); -} - -/** - * @brief This function handles PPP interrupt request. - * @param None - * @retval None - */ -/*void PPP_IRQHandler(void) -{ -}*/ - -/** * @} */ diff --git a/src/uart-test/stm_init.c b/src/uart-test/stm_init.c index ad39080..384c4f8 100644 --- a/src/uart-test/stm_init.c +++ b/src/uart-test/stm_init.c @@ -40,11 +40,13 @@ #include "stm_init.h" UART_HandleTypeDef huart1; +UART_HandleTypeDef huart2; /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ #define UART1_BAUD_RATE 460800 +#define UART2_BAUD_RATE 115200 /* Private macro -------------------------------------------------------------*/ @@ -57,6 +59,7 @@ static void SystemClock_Config(void); static void Error_Handler(void); static void MX_GPIO_Init(void); static void MX_USART1_UART_Init(void); +static void MX_USART2_UART_Init(void); /* Private functions ---------------------------------------------------------*/ /** @@ -89,6 +92,7 @@ void stm_init(void) /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_USART1_UART_Init(); + MX_USART2_UART_Init(); } @@ -138,8 +142,7 @@ static void SystemClock_Config(void) RCC_OscInitStruct.PLL.PLLN = 336; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV8; RCC_OscInitStruct.PLL.PLLQ = 7; - if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) - { + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } @@ -149,8 +152,7 @@ static void SystemClock_Config(void) RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; /* AHB prescaler */ RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; /* APB1 prescaler /1 gives 42 MHz APB1 */ RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; /* APB2 prescaler /1 gives 42 MHz APB2 */ - if(HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) - { + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) { Error_Handler(); } @@ -179,11 +181,11 @@ void MX_GPIO_Init(void) __GPIOC_CLK_ENABLE(); /*Configure LED GPIO pins PB12==red, PB13==yellow, PB14==green, PB15==blue */ - GPIO_InitStruct.Pin = GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15; + GPIO_InitStruct.Pin = LED_RED | LED_YELLOW | LED_GREEN | LED_BLUE; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_LOW; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + HAL_GPIO_Init(LED_PORT, &GPIO_InitStruct); /*Configure GPIO pin : PC9 (RCC_MCO_2) */ GPIO_InitStruct.Pin = GPIO_PIN_9; @@ -209,22 +211,42 @@ void MX_GPIO_Init(void) void MX_USART1_UART_Init(void) { - huart1.Instance = USART1; - huart1.Init.BaudRate = UART1_BAUD_RATE; - 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.Instance = USART1; + huart1.Init.BaudRate = UART1_BAUD_RATE; + 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; - if(HAL_UART_Init(&huart1) != HAL_OK) { + if (HAL_UART_Init(&huart1) != HAL_OK) { /* Initialization Error */ Error_Handler(); } } +/* USART2 init function */ +void MX_USART2_UART_Init(void) +{ + + huart2.Instance = USART2; + huart2.Init.BaudRate = UART2_BAUD_RATE; + huart2.Init.WordLength = UART_WORDLENGTH_8B; + huart2.Init.StopBits = UART_STOPBITS_1; + huart2.Init.Parity = UART_PARITY_NONE; + huart2.Init.Mode = UART_MODE_TX_RX; + huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; + huart2.Init.OverSampling = UART_OVERSAMPLING_16; + + if (HAL_UART_Init(&huart2) != HAL_OK) { + /* Initialization Error */ + Error_Handler(); + } +} + + /** * @brief This function is executed in case of error occurrence. * @param None diff --git a/src/uart-test/stm_init.h b/src/uart-test/stm_init.h index e1cdfb8..838ca77 100644 --- a/src/uart-test/stm_init.h +++ b/src/uart-test/stm_init.h @@ -10,6 +10,7 @@ #define LED_BLUE GPIO_PIN_15 extern UART_HandleTypeDef huart1; +extern UART_HandleTypeDef huart2; extern void stm_init(void); |