/* * Serial communication for STM32F042 boards. * * Copyright (C) 2019 Eug Krashtan * This file may be distributed under the terms of the GNU GPLv3 license. * */ #include "stm32f0xx_hal.h" #include #include "autoconf.h" // CONFIG_SERIAL_BAUD #include "board/serial_irq.h" // serial_rx_byte #include "sched.h" // DECL_INIT UART_HandleTypeDef huart2; static uint8_t rxbuf, txbuf; void USART2_IRQHandler(void) { HAL_UART_IRQHandler(&huart2); } /** * @brief USART2 Initialization Function * @param None * @retval None */ void UartInit(void) { huart2.Instance = USART2; huart2.Init.BaudRate = CONFIG_SERIAL_BAUD; 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; huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; HAL_UART_Init(&huart2); HAL_UART_Receive_IT(&huart2,&rxbuf,(uint16_t)1); } DECL_INIT(UartInit); void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart == &huart2) { serial_rx_byte(rxbuf); HAL_UART_Receive_IT(&huart2,&rxbuf,(uint16_t)1); } } void serial_enable_tx_irq(void) { while(huart2.gState != HAL_UART_STATE_READY); if(serial_get_tx_byte(&txbuf) == 0) { HAL_UART_Transmit_IT(&huart2,&txbuf,(uint16_t)1); } } void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) { if (huart == &huart2) serial_enable_tx_irq(); } /** * @brief UART MSP Initialization * @param huart: UART handle pointer * @retval None */ void HAL_UART_MspInit(UART_HandleTypeDef* huart) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if(huart->Instance==USART2) { /* Peripheral clock enable */ __HAL_RCC_USART2_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); /**USART2 GPIO Configuration PA2 ------> USART2_TX PA3 ------> USART2_RX */ 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_FREQ_HIGH; GPIO_InitStruct.Alternate = GPIO_AF1_USART2; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* USART2 interrupt Init */ HAL_NVIC_SetPriority(USART2_IRQn, 0, 0); HAL_NVIC_EnableIRQ(USART2_IRQn); } }