1.新增stm32串口驱动。

This commit is contained in:
MacRsh
2023-10-14 23:20:56 +08:00
parent 1a940136f9
commit af8ad1b349
5 changed files with 513 additions and 0 deletions

320
bsp/st/driver/drv_uart.c Normal file
View File

@@ -0,0 +1,320 @@
/*
* Copyright (c) 2023, mr-library Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2023-10-8 MacRsh first version
*/
#include "drv_uart.h"
#if (MR_CFG_SERIAL == MR_CFG_ENABLE)
enum
{
#ifdef MR_BSP_UART_1
DRV_UART_1_INDEX,
#endif
#ifdef MR_BSP_UART_2
DRV_UART_2_INDEX,
#endif
#ifdef MR_BSP_UART_3
DRV_UART_3_INDEX,
#endif
#ifdef MR_BSP_UART_4
DRV_UART_4_INDEX,
#endif
#ifdef MR_BSP_UART_5
DRV_UART_5_INDEX,
#endif
#ifdef MR_BSP_UART_6
DRV_UART_6_INDEX,
#endif
#ifdef MR_BSP_UART_7
DRV_UART_7_INDEX,
#endif
#ifdef MR_BSP_UART_8
DRV_UART_8_INDEX,
#endif
};
static struct drv_uart_data drv_uart_data[] =
{
#ifdef MR_BSP_UART_1
{"uart1", {0}, USART1, USART1_IRQn},
#endif
#ifdef MR_BSP_UART_2
{"uart2", {0}, USART2, USART2_IRQn},
#endif
#ifdef MR_BSP_UART_3
{"uart3", {0}, USART3, USART3_IRQn},
#endif
#ifdef MR_BSP_UART_4
{"uart4", {0}, UART4, UART4_IRQn},
#endif
#ifdef MR_BSP_UART_5
{"uart5", {0}, UART5, UART5_IRQn},
#endif
#ifdef MR_BSP_UART_6
{"uart6", {0}, USART6, USART6_IRQn},
#endif
#ifdef MR_BSP_UART_7
{"uart7", {0}, UART7, UART7_IRQn},
#endif
#ifdef MR_BSP_UART_8
{"uart8", {0}, UART8, UART8_IRQn},
#endif
};
static struct mr_serial serial_device[mr_array_num(drv_uart_data)];
static mr_err_t drv_serial_configure(mr_serial_t serial, struct mr_serial_config *config)
{
struct drv_uart_data *uart_data = (struct drv_uart_data *)serial->device.data;
uart_data->handle.Instance = uart_data->Instance;
switch (config->data_bits)
{
case MR_SERIAL_DATA_BITS_8:
{
uart_data->handle.Init.WordLength = UART_WORDLENGTH_8B;
break;
}
case MR_SERIAL_DATA_BITS_9:
{
uart_data->handle.Init.WordLength = UART_WORDLENGTH_9B;
break;
}
default:
return MR_ERR_INVALID;
}
switch (config->stop_bits)
{
case MR_SERIAL_STOP_BITS_1:
{
uart_data->handle.Init.StopBits = UART_STOPBITS_1;
break;
}
case MR_SERIAL_STOP_BITS_2:
{
uart_data->handle.Init.StopBits = UART_STOPBITS_2;
break;
}
default:
return MR_ERR_INVALID;
}
switch (config->parity)
{
case MR_SERIAL_PARITY_NONE:
{
uart_data->handle.Init.Parity = UART_PARITY_NONE;
break;
}
case MR_SERIAL_PARITY_ODD:
{
uart_data->handle.Init.Parity = UART_PARITY_ODD;
break;
}
case MR_SERIAL_PARITY_EVEN:
{
uart_data->handle.Init.Parity = UART_PARITY_EVEN;
break;
}
default:
return MR_ERR_INVALID;
}
switch (config->bit_order)
{
case MR_SERIAL_BIT_ORDER_LSB:
{
break;
}
default:
return MR_ERR_INVALID;
}
switch (config->invert)
{
case MR_SERIAL_NRZ_NORMAL:
{
break;
}
default:
return MR_ERR_INVALID;
}
uart_data->handle.Init.BaudRate = config->baud_rate;
uart_data->handle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
uart_data->handle.Init.Mode = UART_MODE_TX_RX;
uart_data->handle.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&uart_data->handle) != HAL_OK)
{
return MR_ERR_GENERIC;
}
HAL_NVIC_SetPriority(uart_data->irq_type, 0, 0);
HAL_NVIC_EnableIRQ(uart_data->irq_type);
__HAL_UART_ENABLE_IT(&uart_data->handle, UART_IT_RXNE);
return MR_ERR_OK;
}
static void drv_serial_write(mr_serial_t serial, mr_uint8_t data)
{
struct drv_uart_data *uart_data = (struct drv_uart_data *)serial->device.data;
mr_size_t i = 0;
while (__HAL_UART_GET_FLAG(&uart_data->handle, UART_FLAG_TC) == RESET)
{
i++;
if (i > MR_UINT16_MAX)
{
return;
}
}
uart_data->Instance->DR = data;
}
static mr_uint8_t drv_serial_read(mr_serial_t serial)
{
struct drv_uart_data *uart_data = (struct drv_uart_data *)serial->device.data;
mr_size_t i = 0;
while (__HAL_UART_GET_FLAG(&uart_data->handle, UART_FLAG_RXNE) == RESET)
{
i++;
if (i > MR_UINT16_MAX)
{
return 0;
}
}
return uart_data->Instance->DR & 0xff;
}
static void drv_serial_start_tx(mr_serial_t serial)
{
struct drv_uart_data *uart_data = (struct drv_uart_data *)serial->device.data;
__HAL_UART_ENABLE_IT(&uart_data->handle, UART_IT_TXE);
}
static void drv_serial_stop_tx(mr_serial_t serial)
{
struct drv_uart_data *uart_data = (struct drv_uart_data *)serial->device.data;
__HAL_UART_DISABLE_IT(&uart_data->handle, UART_IT_TXE);
}
static void drv_serial_isr(mr_serial_t serial)
{
struct drv_uart_data *uart_data = (struct drv_uart_data *)serial->device.data;
if (__HAL_UART_GET_IT_SOURCE(&uart_data->handle, UART_IT_RXNE) != RESET)
{
mr_serial_device_isr(serial, MR_SERIAL_EVENT_RX_INT);
__HAL_UART_CLEAR_FLAG(&uart_data->handle, UART_FLAG_RXNE);
}
if (__HAL_UART_GET_IT_SOURCE(&uart_data->handle, UART_IT_TXE) != RESET)
{
mr_serial_device_isr(serial, MR_SERIAL_EVENT_TX_INT);
__HAL_UART_CLEAR_FLAG(&uart_data->handle, UART_IT_TXE);
}
}
#ifdef MR_BSP_UART_1
void USART1_IRQHandler(void)
{
drv_serial_isr(&serial_device[DRV_UART_1_INDEX]);
}
#endif
#ifdef MR_BSP_UART_2
void USART2_IRQHandler(void)
{
drv_serial_isr(&serial_device[DRV_UART_2_INDEX]);
}
#endif
#ifdef MR_BSP_UART_3
void USART3_IRQHandler(void)
{
drv_serial_isr(&serial_device[DRV_UART_3_INDEX]);
}
#endif
#ifdef MR_BSP_UART_4
void UART4_IRQHandler(void)
{
drv_serial_isr(&serial_device[DRV_UART_4_INDEX]);
}
#endif
#ifdef MR_BSP_UART_5
void UART5_IRQHandler(void)
{
drv_serial_isr(&serial_device[DRV_UART_5_INDEX]);
}
#endif
#ifdef MR_BSP_UART_6
void UART6_IRQHandler(void)
{
drv_serial_isr(&serial_device[DRV_UART_6_INDEX]);
}
#endif
#ifdef MR_BSP_UART_7
void UART7_IRQHandler(void)
{
drv_serial_isr(&serial_device[DRV_UART_7_INDEX]);
}
#endif
#ifdef MR_BSP_UART_8
void UART8_IRQHandler(void)
{
drv_serial_isr(&serial_device[DRV_UART_8_INDEX]);
}
#endif
mr_err_t drv_uart_init(void)
{
static struct mr_serial_ops drv_ops =
{
drv_serial_configure,
drv_serial_write,
drv_serial_read,
drv_serial_start_tx,
drv_serial_stop_tx,
};
mr_size_t count = mr_array_num(serial_device);
mr_err_t ret = MR_ERR_OK;
while (count--)
{
ret = mr_serial_device_add(&serial_device[count], drv_uart_data[count].name, &drv_ops, &drv_uart_data[count]);
MR_ASSERT(ret == MR_ERR_OK);
}
return ret;
}
MR_INIT_DRIVER_EXPORT(drv_uart_init);
#endif

33
bsp/st/driver/drv_uart.h Normal file
View File

@@ -0,0 +1,33 @@
/*
* Copyright (c) 2023, mr-library Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2023-10-8 MacRsh first version
*/
#ifndef _DRV_UART_H_
#define _DRV_UART_H_
#include "device/serial.h"
#include "mrboard.h"
#if (MR_CFG_SERIAL == MR_CFG_ENABLE)
/**
* @struct Driver uart data
*/
struct drv_uart_data
{
const char *name;
UART_HandleTypeDef handle;
USART_TypeDef *Instance;
IRQn_Type irq_type;
};
#endif
#endif /* _DRV_UART_H_ */

22
bsp/st/driver/mrboard.c Normal file
View File

@@ -0,0 +1,22 @@
/*
* Copyright (c) 2023, mr-library Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2023-09-11 MacRsh first version
*/
#include "mrboard.h"
int mr_board_init(void)
{
return MR_ERR_OK;
}
MR_INIT_BOARD_EXPORT(mr_board_init);
void mr_delay_ms(mr_size_t ms)
{
HAL_Delay(ms);
}

90
bsp/st/driver/mrboard.h Normal file
View File

@@ -0,0 +1,90 @@
#ifndef _MR_BOARD_H_
#define _MR_BOARD_H_
#include "mrapi.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* @include bsp head file
*
* like this: #include "stm32f1xx.h"
*/
#warning "Please include bsp head file, then remove this line"
/**
* @def Bsp name
*/
#define MR_BSP_NAME "bsp-name"
/**
* @def Bsp system clock
*/
#define MR_BSP_SYSCLK_FREQ 144000000
/**
* @def Bsp pin number
*/
#define MR_BSP_PIN_NUMBER 144
/**
* @def Bsp uart
*/
#define MR_BSP_UART_1
#define MR_BSP_UART_2
#define MR_BSP_UART_3
#define MR_BSP_UART_4
#define MR_BSP_UART_5
#define MR_BSP_UART_6
#define MR_BSP_UART_7
#define MR_BSP_UART_8
/**
* @def Bsp adc
*/
#define MR_BSP_ADC_1
#define MR_BSP_ADC_2
#define MR_BSP_ADC_3
/**
* @def Bsp dac
*/
#define MR_BSP_DAC_1
#define MR_BSP_DAC_2
#define MR_BSP_DAC_3
/**
* @def Bsp i2c
*/
#define MR_BSP_I2C_1
#define MR_BSP_I2C_2
#define MR_BSP_I2C_3
/**
* @def Bsp spi
*/
#define MR_BSP_SPI_1
#define MR_BSP_SPI_2
#define MR_BSP_SPI_3
/**
* @def Bsp pwm
*/
#define MR_BSP_PWM_1
#define MR_BSP_PWM_2
#define MR_BSP_PWM_3
/**
* @def Bsp timer
*/
#define MR_BSP_TIMER_1
#define MR_BSP_TIMER_2
#define MR_BSP_TIMER_3
#ifdef __cplusplus
}
#endif
#endif /* _MR_BOARD_H_ */

48
bsp/st/driver/mrdrv.h Normal file
View File

@@ -0,0 +1,48 @@
/*
* Copyright (c) 2023, mr-library Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2023-04-23 MacRsh first version
*/
#ifndef _MR_DRV_H_
#define _MR_DRV_H_
#include "mrconfig.h"
#if (MR_CFG_ADC == MR_CFG_ENABLE)
#include "drv_adc.h"
#endif
#if (MR_CFG_DAC == MR_CFG_ENABLE)
#include "drv_dac.h"
#endif
#if (MR_CFG_I2C == MR_CFG_ENABLE)
#include "drv_i2c.h"
#endif
#if (MR_CFG_PIN == MR_CFG_ENABLE)
#include "drv_gpio.h"
#endif
#if (MR_CFG_PWM == MR_CFG_ENABLE)
#include "drv_pwm.h"
#endif
#if (MR_CFG_SERIAL == MR_CFG_ENABLE)
#include "drv_uart.h"
#endif
#if (MR_CFG_SPI == MR_CFG_ENABLE)
#include "drv_spi.h"
#endif
#if (MR_CFG_TIMER == MR_CFG_ENABLE)
#include "drv_timer.h"
#endif
#endif /* _MR_DRV_H_ */