aboutsummaryrefslogtreecommitdiffstats
path: root/src/stm32f0/serial.c
diff options
context:
space:
mode:
authorEugene Krashtan <Eugene.Krashtan@opensynergy.com>2019-03-11 12:47:58 +0200
committerKevin O'Connor <kevin@koconnor.net>2019-03-24 12:10:11 -0400
commitb822f389237981043a8033aa4232e8b084137b2c (patch)
treefec159e50a3314cabbe18352e26c10db39c6f621 /src/stm32f0/serial.c
parent74c6a85cde9327b13a52b1d142b698e00e2d6122 (diff)
downloadkutter-b822f389237981043a8033aa4232e8b084137b2c.tar.gz
kutter-b822f389237981043a8033aa4232e8b084137b2c.tar.xz
kutter-b822f389237981043a8033aa4232e8b084137b2c.zip
stm32f0: New target STM32F0 added.
Signed-off-by: Eugene Krashtan <Eugene.Krashtan@opensynergy.com>
Diffstat (limited to 'src/stm32f0/serial.c')
-rw-r--r--src/stm32f0/serial.c98
1 files changed, 98 insertions, 0 deletions
diff --git a/src/stm32f0/serial.c b/src/stm32f0/serial.c
new file mode 100644
index 00000000..103a0d70
--- /dev/null
+++ b/src/stm32f0/serial.c
@@ -0,0 +1,98 @@
+/*
+ * Serial communication for STM32F042 boards.
+ *
+ * Copyright (C) 2019 Eug Krashtan <eug.krashtan@gmail.com>
+ * This file may be distributed under the terms of the GNU GPLv3 license.
+ *
+ */
+
+#include "stm32f0xx_hal.h"
+#include <string.h>
+#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);
+ }
+}