1
0
mirror of https://github.com/armink/FlashDB.git synced 2025-01-29 04:32:53 +08:00

318 lines
7.4 KiB
C

/*
* Copyright (c) 2006-2019, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2019-11-09 xiangxistu first version
* 2020-05-18 chenyaxing modify stm32_uart_config struct
*/
#include <string.h>
#include <stdlib.h>
#include <stm32f4xx.h>
#include "uart_config.h"
#include <board.h>
static UART_HandleTypeDef handle;
/* stm32 config class */
struct stm32_uart_config
{
const char *name;
USART_TypeDef *Instance;
IRQn_Type irq_type;
const char *tx_pin_name;
const char *rx_pin_name;
};
static struct stm32_uart_config *_uart_config = NULL;
struct stm32_uart_config uart_config[] =
{
#ifdef BSP_USING_UART1
UART1_CONFIG,
#endif
#ifdef BSP_USING_UART2
UART2_CONFIG,
#endif
#ifdef BSP_USING_UART3
UART3_CONFIG,
#endif
#ifdef BSP_USING_UART4
UART4_CONFIG,
#endif
#ifdef BSP_USING_UART5
UART5_CONFIG,
#endif
#ifdef BSP_USING_UART6
UART6_CONFIG,
#endif
#ifdef BSP_USING_UART7
UART7_CONFIG,
#endif
#ifdef BSP_USING_UART8
UART8_CONFIG,
#endif
#ifdef BSP_USING_LPUART1
LPUART1_CONFIG,
#endif
};
static long stm32_uart_clk_enable(struct stm32_uart_config *config)
{
/* check the parameters */
assert_param(IS_UART_INSTANCE(config->Instance));
/* uart clock enable */
switch ((uint32_t)config->Instance)
{
#ifdef BSP_USING_UART1
case (uint32_t)USART1:
__HAL_RCC_USART1_CLK_ENABLE();
break;
#endif /* BSP_USING_UART1 */
#ifdef BSP_USING_UART2
case (uint32_t)USART2:
__HAL_RCC_USART2_CLK_ENABLE();
break;
#endif /* BSP_USING_UART2 */
#ifdef BSP_USING_UART3
case (uint32_t)USART3:
__HAL_RCC_USART3_CLK_ENABLE();
break;
#endif /* BSP_USING_UART3 */
#ifdef BSP_USING_UART4
#if defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32L0) || \
defined(SOC_SERIES_STM32G0)
case (uint32_t)USART4:
__HAL_RCC_USART4_CLK_ENABLE();
#else
case (uint32_t)UART4:
__HAL_RCC_UART4_CLK_ENABLE();
#endif
break;
#endif /* BSP_USING_UART4 */
#ifdef BSP_USING_UART5
#if defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32L0) || \
defined(SOC_SERIES_STM32G0)
case (uint32_t)USART5:
__HAL_RCC_USART5_CLK_ENABLE();
#else
case (uint32_t)UART5:
__HAL_RCC_UART5_CLK_ENABLE();
#endif
break;
#endif /* BSP_USING_UART5 */
#ifdef BSP_USING_UART6
case (uint32_t)USART6:
__HAL_RCC_USART6_CLK_ENABLE();
break;
#endif /* BSP_USING_UART6 */
#ifdef BSP_USING_UART7
#if defined(SOC_SERIES_STM32F0)
case (uint32_t)USART7:
__HAL_RCC_USART7_CLK_ENABLE();
#else
case (uint32_t)UART7:
__HAL_RCC_UART7_CLK_ENABLE();
#endif
break;
#endif /* BSP_USING_UART7 */
#ifdef BSP_USING_UART8
#if defined(SOC_SERIES_STM32F0)
case (uint32_t)USART8:
__HAL_RCC_USART8_CLK_ENABLE();
#else
case (uint32_t)UART8:
__HAL_RCC_UART8_CLK_ENABLE();
#endif
break;
#endif /* BSP_USING_UART8 */
#ifdef BSP_USING_LPUART1
case (uint32_t)LPUART1:
__HAL_RCC_LPUART1_CLK_ENABLE();
break;
#endif /* BSP_USING_LPUART1 */
default:
return -1;
}
return 0;
}
static long stm32_gpio_clk_enable(GPIO_TypeDef *gpiox)
{
/* check the parameters */
assert_param(IS_GPIO_ALL_INSTANCE(gpiox));
/* gpio ports clock enable */
switch ((uint32_t)gpiox)
{
#if defined(__HAL_RCC_GPIOA_CLK_ENABLE)
case (uint32_t)GPIOA:
__HAL_RCC_GPIOA_CLK_ENABLE();
break;
#endif
#if defined(__HAL_RCC_GPIOB_CLK_ENABLE)
case (uint32_t)GPIOB:
__HAL_RCC_GPIOB_CLK_ENABLE();
break;
#endif
#if defined(__HAL_RCC_GPIOC_CLK_ENABLE)
case (uint32_t)GPIOC:
__HAL_RCC_GPIOC_CLK_ENABLE();
break;
#endif
#if defined(__HAL_RCC_GPIOD_CLK_ENABLE)
case (uint32_t)GPIOD:
__HAL_RCC_GPIOD_CLK_ENABLE();
break;
#endif
#if defined(__HAL_RCC_GPIOE_CLK_ENABLE)
case (uint32_t)GPIOE:
__HAL_RCC_GPIOE_CLK_ENABLE();
break;
#endif
#if defined(__HAL_RCC_GPIOF_CLK_ENABLE)
case (uint32_t)GPIOF:
__HAL_RCC_GPIOF_CLK_ENABLE();
break;
#endif
#if defined(__HAL_RCC_GPIOG_CLK_ENABLE)
case (uint32_t)GPIOG:
__HAL_RCC_GPIOG_CLK_ENABLE();
break;
#endif
#if defined(__HAL_RCC_GPIOH_CLK_ENABLE)
case (uint32_t)GPIOH:
__HAL_RCC_GPIOH_CLK_ENABLE();
break;
#endif
#if defined(__HAL_RCC_GPIOI_CLK_ENABLE)
case (uint32_t)GPIOI:
__HAL_RCC_GPIOI_CLK_ENABLE();
break;
#endif
#if defined(__HAL_RCC_GPIOJ_CLK_ENABLE)
case (uint32_t)GPIOJ:
__HAL_RCC_GPIOJ_CLK_ENABLE();
break;
#endif
#if defined(__HAL_RCC_GPIOK_CLK_ENABLE)
case (uint32_t)GPIOK:
__HAL_RCC_GPIOK_CLK_ENABLE();
break;
#endif
default:
return -1;
}
return 0;
}
static int up_char(char * c)
{
if ((*c >= 'a') && (*c <= 'z'))
{
*c = *c - 32;
}
return 0;
}
static void get_pin_by_name(const char* pin_name, GPIO_TypeDef **port, uint16_t *pin)
{
int pin_num = atoi((char*) &pin_name[2]);
char port_name = pin_name[1];
up_char(&port_name);
up_char(&port_name);
*port = ((GPIO_TypeDef *) ((uint32_t) GPIOA
+ (uint32_t) (port_name - 'A') * ((uint32_t) GPIOB - (uint32_t) GPIOA)));
*pin = (GPIO_PIN_0 << pin_num);
}
static long stm32_gpio_configure(struct stm32_uart_config *config)
{
int uart_num = 0;
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_TypeDef *tx_port;
GPIO_TypeDef *rx_port;
uint16_t tx_pin;
uint16_t rx_pin;
uart_num = config->name[4] - '0';
get_pin_by_name(config->rx_pin_name, &rx_port, &rx_pin);
get_pin_by_name(config->tx_pin_name, &tx_port, &tx_pin);
/* gpio ports clock enable */
stm32_gpio_clk_enable(tx_port);
if (tx_port != rx_port)
{
stm32_gpio_clk_enable(rx_port);
}
/* rx pin initialize */
GPIO_InitStruct.Pin = tx_pin;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
#if defined(SOC_SERIES_STM32F2) || defined(SOC_SERIES_STM32F4) || \
defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32G4) || \
defined(SOC_SERIES_STM32L1) || defined(SOC_SERIES_STM32L4)
#define GPIO_AF7 ((uint8_t)0x07)
#define GPIO_AF8 ((uint8_t)0x08)
/* uart1-3 -> AF7, uart4-8 -> AF8 */
if (uart_num <= 3)
{
GPIO_InitStruct.Alternate = GPIO_AF7;
}
else
{
GPIO_InitStruct.Alternate = GPIO_AF8;
}
#endif
HAL_GPIO_Init(tx_port, &GPIO_InitStruct);
/* rx pin initialize */
GPIO_InitStruct.Pin = rx_pin;
HAL_GPIO_Init(rx_port, &GPIO_InitStruct);
return 0;
}
static long stm32_configure(struct stm32_uart_config *config)
{
stm32_uart_clk_enable(config);
handle.Instance = config->Instance;
handle.Init.BaudRate = 115200;
handle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
handle.Init.Mode = UART_MODE_TX_RX;
handle.Init.OverSampling = UART_OVERSAMPLING_16;
handle.Init.WordLength = UART_WORDLENGTH_8B;
handle.Init.StopBits = UART_STOPBITS_1;
handle.Init.Parity = UART_PARITY_NONE;
if (HAL_UART_Init(&handle) != HAL_OK)
{
return -1;
}
return 0;
}
int rt_hw_usart_init(void)
{
_uart_config = &uart_config[0];
stm32_gpio_configure(_uart_config);
stm32_configure(_uart_config);
return 0;
}
void print_char(char c)
{
HAL_UART_Transmit(&handle, (uint8_t *) (&c), 1, 1);
}