1.新增stm32串口驱动。
This commit is contained in:
320
bsp/st/driver/drv_uart.c
Normal file
320
bsp/st/driver/drv_uart.c
Normal 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
33
bsp/st/driver/drv_uart.h
Normal 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
22
bsp/st/driver/mrboard.c
Normal 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
90
bsp/st/driver/mrboard.h
Normal 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
48
bsp/st/driver/mrdrv.h
Normal 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_ */
|
||||
Reference in New Issue
Block a user