mirror of
https://github.com/betaflight/betaflight.git
synced 2025-07-16 21:05:35 +03:00
added single wire half duplex UART
Conflicts: src/main/telemetry/telemetry.h
This commit is contained in:
parent
0000d3e65e
commit
6311dc8f8c
7 changed files with 42 additions and 10 deletions
|
@ -27,6 +27,7 @@ typedef enum portMode_t {
|
||||||
MODE_TX = 1 << 1,
|
MODE_TX = 1 << 1,
|
||||||
MODE_RXTX = MODE_RX | MODE_TX,
|
MODE_RXTX = MODE_RX | MODE_TX,
|
||||||
MODE_SBUS = 1 << 2,
|
MODE_SBUS = 1 << 2,
|
||||||
|
MODE_BIDIR = 1 << 3,
|
||||||
} portMode_t;
|
} portMode_t;
|
||||||
|
|
||||||
typedef void (*serialReceiveCallbackPtr)(uint16_t data); // used by serial drivers to return frames to app
|
typedef void (*serialReceiveCallbackPtr)(uint16_t data); // used by serial drivers to return frames to app
|
||||||
|
|
|
@ -59,6 +59,8 @@ static void uartReconfigure(uartPort_t *uartPort)
|
||||||
USART_InitStructure.USART_Mode |= USART_Mode_Rx;
|
USART_InitStructure.USART_Mode |= USART_Mode_Rx;
|
||||||
if (uartPort->port.mode & MODE_TX)
|
if (uartPort->port.mode & MODE_TX)
|
||||||
USART_InitStructure.USART_Mode |= USART_Mode_Tx;
|
USART_InitStructure.USART_Mode |= USART_Mode_Tx;
|
||||||
|
if (uartPort->port.mode & MODE_BIDIR)
|
||||||
|
USART_InitStructure.USART_Mode |= USART_Mode_Tx | USART_Mode_Rx;
|
||||||
|
|
||||||
USART_Init(uartPort->USARTx, &USART_InitStructure);
|
USART_Init(uartPort->USARTx, &USART_InitStructure);
|
||||||
USART_Cmd(uartPort->USARTx, ENABLE);
|
USART_Cmd(uartPort->USARTx, ENABLE);
|
||||||
|
@ -111,7 +113,7 @@ serialPort_t *uartOpen(USART_TypeDef *USARTx, serialReceiveCallbackPtr callback,
|
||||||
|
|
||||||
// Receive DMA or IRQ
|
// Receive DMA or IRQ
|
||||||
DMA_InitTypeDef DMA_InitStructure;
|
DMA_InitTypeDef DMA_InitStructure;
|
||||||
if (mode & MODE_RX) {
|
if ((mode & MODE_RX) || (mode & MODE_BIDIR)) {
|
||||||
if (s->rxDMAChannel) {
|
if (s->rxDMAChannel) {
|
||||||
DMA_StructInit(&DMA_InitStructure);
|
DMA_StructInit(&DMA_InitStructure);
|
||||||
DMA_InitStructure.DMA_PeripheralBaseAddr = s->rxDMAPeripheralBaseAddr;
|
DMA_InitStructure.DMA_PeripheralBaseAddr = s->rxDMAPeripheralBaseAddr;
|
||||||
|
@ -138,7 +140,7 @@ serialPort_t *uartOpen(USART_TypeDef *USARTx, serialReceiveCallbackPtr callback,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Transmit DMA or IRQ
|
// Transmit DMA or IRQ
|
||||||
if (mode & MODE_TX) {
|
if ((mode & MODE_TX) || (mode & MODE_BIDIR)) {
|
||||||
if (s->txDMAChannel) {
|
if (s->txDMAChannel) {
|
||||||
DMA_StructInit(&DMA_InitStructure);
|
DMA_StructInit(&DMA_InitStructure);
|
||||||
DMA_InitStructure.DMA_PeripheralBaseAddr = s->txDMAPeripheralBaseAddr;
|
DMA_InitStructure.DMA_PeripheralBaseAddr = s->txDMAPeripheralBaseAddr;
|
||||||
|
@ -165,6 +167,11 @@ serialPort_t *uartOpen(USART_TypeDef *USARTx, serialReceiveCallbackPtr callback,
|
||||||
|
|
||||||
USART_Cmd(s->USARTx, ENABLE);
|
USART_Cmd(s->USARTx, ENABLE);
|
||||||
|
|
||||||
|
if (mode & MODE_BIDIR)
|
||||||
|
USART_HalfDuplexCmd(s->USARTx, ENABLE);
|
||||||
|
else
|
||||||
|
USART_HalfDuplexCmd(s->USARTx, DISABLE);
|
||||||
|
|
||||||
return (serialPort_t *)s;
|
return (serialPort_t *)s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -110,6 +110,9 @@ uartPort_t *serialUSART1(uint32_t baudRate, portMode_t mode)
|
||||||
gpio.mode = Mode_AF_PP;
|
gpio.mode = Mode_AF_PP;
|
||||||
if (mode & MODE_TX)
|
if (mode & MODE_TX)
|
||||||
gpioInit(GPIOA, &gpio);
|
gpioInit(GPIOA, &gpio);
|
||||||
|
gpio.mode = Mode_AF_OD;
|
||||||
|
if (mode & MODE_BIDIR)
|
||||||
|
gpioInit(GPIOA, &gpio);
|
||||||
gpio.pin = Pin_10;
|
gpio.pin = Pin_10;
|
||||||
gpio.mode = Mode_IPU;
|
gpio.mode = Mode_IPU;
|
||||||
if (mode & MODE_RX)
|
if (mode & MODE_RX)
|
||||||
|
@ -192,6 +195,9 @@ uartPort_t *serialUSART2(uint32_t baudRate, portMode_t mode)
|
||||||
gpio.mode = Mode_AF_PP;
|
gpio.mode = Mode_AF_PP;
|
||||||
if (mode & MODE_TX)
|
if (mode & MODE_TX)
|
||||||
gpioInit(GPIOA, &gpio);
|
gpioInit(GPIOA, &gpio);
|
||||||
|
gpio.mode = Mode_AF_OD;
|
||||||
|
if (mode & MODE_BIDIR)
|
||||||
|
gpioInit(GPIOA, &gpio);
|
||||||
gpio.pin = Pin_3;
|
gpio.pin = Pin_3;
|
||||||
gpio.mode = Mode_IPU;
|
gpio.mode = Mode_IPU;
|
||||||
if (mode & MODE_RX)
|
if (mode & MODE_RX)
|
||||||
|
@ -254,6 +260,9 @@ uartPort_t *serialUSART3(uint32_t baudRate, portMode_t mode)
|
||||||
gpio.mode = Mode_AF_PP;
|
gpio.mode = Mode_AF_PP;
|
||||||
if (mode & MODE_TX)
|
if (mode & MODE_TX)
|
||||||
gpioInit(USART3_GPIO, &gpio);
|
gpioInit(USART3_GPIO, &gpio);
|
||||||
|
gpio.mode = Mode_AF_OD;
|
||||||
|
if (mode & MODE_BIDIR)
|
||||||
|
gpioInit(USART3_GPIO, &gpio);
|
||||||
gpio.pin = USART3_RX_PIN;
|
gpio.pin = USART3_RX_PIN;
|
||||||
gpio.mode = Mode_IPU;
|
gpio.mode = Mode_IPU;
|
||||||
if (mode & MODE_RX)
|
if (mode & MODE_RX)
|
||||||
|
|
|
@ -106,6 +106,13 @@ uartPort_t *serialUSART1(uint32_t baudRate, portMode_t mode)
|
||||||
GPIO_Init(UART1_GPIO, &GPIO_InitStructure);
|
GPIO_Init(UART1_GPIO, &GPIO_InitStructure);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mode & MODE_BIDIR) {
|
||||||
|
GPIO_InitStructure.GPIO_Pin = UART1_TX_PIN;
|
||||||
|
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
|
||||||
|
GPIO_PinAFConfig(UART1_GPIO, UART1_TX_PINSOURCE, GPIO_AF_7);
|
||||||
|
GPIO_Init(UART1_GPIO, &GPIO_InitStructure);
|
||||||
|
}
|
||||||
|
|
||||||
// DMA TX Interrupt
|
// DMA TX Interrupt
|
||||||
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn;
|
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn;
|
||||||
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_PRIORITY_BASE(NVIC_PRIO_SERIALUART1_TXDMA);
|
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_PRIORITY_BASE(NVIC_PRIO_SERIALUART1_TXDMA);
|
||||||
|
@ -176,6 +183,13 @@ uartPort_t *serialUSART2(uint32_t baudRate, portMode_t mode)
|
||||||
GPIO_Init(UART2_GPIO, &GPIO_InitStructure);
|
GPIO_Init(UART2_GPIO, &GPIO_InitStructure);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mode & MODE_BIDIR) {
|
||||||
|
GPIO_InitStructure.GPIO_Pin = UART2_TX_PIN;
|
||||||
|
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
|
||||||
|
GPIO_PinAFConfig(UART2_GPIO, UART2_TX_PINSOURCE, GPIO_AF_7);
|
||||||
|
GPIO_Init(UART2_GPIO, &GPIO_InitStructure);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef USE_USART2_TX_DMA
|
#ifdef USE_USART2_TX_DMA
|
||||||
// DMA TX Interrupt
|
// DMA TX Interrupt
|
||||||
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel7_IRQn;
|
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel7_IRQn;
|
||||||
|
|
|
@ -80,8 +80,8 @@ static serialPortFunction_t serialPortFunctions[SERIAL_PORT_COUNT] = {
|
||||||
|
|
||||||
static const serialPortConstraint_t serialPortConstraints[SERIAL_PORT_COUNT] = {
|
static const serialPortConstraint_t serialPortConstraints[SERIAL_PORT_COUNT] = {
|
||||||
{SERIAL_PORT_USB_VCP, 9600, 115200, SPF_NONE },
|
{SERIAL_PORT_USB_VCP, 9600, 115200, SPF_NONE },
|
||||||
{SERIAL_PORT_USART1, 9600, 115200, SPF_NONE | SPF_SUPPORTS_SBUS_MODE },
|
{SERIAL_PORT_USART1, 9600, 115200, SPF_NONE | SPF_SUPPORTS_SBUS_MODE | SPF_SUPPORTS_BIDIR_MODE},
|
||||||
{SERIAL_PORT_USART2, 9600, 115200, SPF_SUPPORTS_CALLBACK | SPF_SUPPORTS_SBUS_MODE},
|
{SERIAL_PORT_USART2, 9600, 115200, SPF_SUPPORTS_CALLBACK | SPF_SUPPORTS_SBUS_MODE | SPF_SUPPORTS_BIDIR_MODE},
|
||||||
#if (SERIAL_PORT_COUNT > 3)
|
#if (SERIAL_PORT_COUNT > 3)
|
||||||
{SERIAL_PORT_USART3, 9600, 19200, SPF_SUPPORTS_CALLBACK},
|
{SERIAL_PORT_USART3, 9600, 19200, SPF_SUPPORTS_CALLBACK},
|
||||||
{SERIAL_PORT_USART4, 9600, 19200, SPF_SUPPORTS_CALLBACK}
|
{SERIAL_PORT_USART4, 9600, 19200, SPF_SUPPORTS_CALLBACK}
|
||||||
|
@ -98,8 +98,8 @@ static serialPortFunction_t serialPortFunctions[SERIAL_PORT_COUNT] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static const serialPortConstraint_t serialPortConstraints[SERIAL_PORT_COUNT] = {
|
static const serialPortConstraint_t serialPortConstraints[SERIAL_PORT_COUNT] = {
|
||||||
{SERIAL_PORT_USART1, 9600, 115200, SPF_NONE | SPF_SUPPORTS_SBUS_MODE },
|
{SERIAL_PORT_USART1, 9600, 115200, SPF_NONE | SPF_SUPPORTS_SBUS_MODE | SPF_SUPPORTS_BIDIR_MODE},
|
||||||
{SERIAL_PORT_USART3, 9600, 115200, SPF_SUPPORTS_CALLBACK | SPF_SUPPORTS_SBUS_MODE},
|
{SERIAL_PORT_USART3, 9600, 115200, SPF_SUPPORTS_CALLBACK | SPF_SUPPORTS_SBUS_MODE | SPF_SUPPORTS_BIDIR_MODE},
|
||||||
{SERIAL_PORT_SOFTSERIAL1, 9600, 19200, SPF_SUPPORTS_CALLBACK | SPF_IS_SOFTWARE_INVERTABLE}
|
{SERIAL_PORT_SOFTSERIAL1, 9600, 19200, SPF_SUPPORTS_CALLBACK | SPF_IS_SOFTWARE_INVERTABLE}
|
||||||
};
|
};
|
||||||
#else
|
#else
|
||||||
|
@ -114,8 +114,8 @@ static serialPortFunction_t serialPortFunctions[SERIAL_PORT_COUNT] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static const serialPortConstraint_t serialPortConstraints[SERIAL_PORT_COUNT] = {
|
static const serialPortConstraint_t serialPortConstraints[SERIAL_PORT_COUNT] = {
|
||||||
{SERIAL_PORT_USART1, 9600, 115200, SPF_NONE | SPF_SUPPORTS_SBUS_MODE },
|
{SERIAL_PORT_USART1, 9600, 115200, SPF_NONE | SPF_SUPPORTS_SBUS_MODE | SPF_SUPPORTS_BIDIR_MODE},
|
||||||
{SERIAL_PORT_USART2, 9600, 115200, SPF_SUPPORTS_CALLBACK | SPF_SUPPORTS_SBUS_MODE},
|
{SERIAL_PORT_USART2, 9600, 115200, SPF_SUPPORTS_CALLBACK | SPF_SUPPORTS_SBUS_MODE | SPF_SUPPORTS_BIDIR_MODE},
|
||||||
#if (SERIAL_PORT_COUNT > 2)
|
#if (SERIAL_PORT_COUNT > 2)
|
||||||
{SERIAL_PORT_SOFTSERIAL1, 9600, 19200, SPF_SUPPORTS_CALLBACK | SPF_IS_SOFTWARE_INVERTABLE},
|
{SERIAL_PORT_SOFTSERIAL1, 9600, 19200, SPF_SUPPORTS_CALLBACK | SPF_IS_SOFTWARE_INVERTABLE},
|
||||||
{SERIAL_PORT_SOFTSERIAL2, 9600, 19200, SPF_SUPPORTS_CALLBACK | SPF_IS_SOFTWARE_INVERTABLE}
|
{SERIAL_PORT_SOFTSERIAL2, 9600, 19200, SPF_SUPPORTS_CALLBACK | SPF_IS_SOFTWARE_INVERTABLE}
|
||||||
|
|
|
@ -116,7 +116,8 @@ typedef enum {
|
||||||
SPF_NONE = 0,
|
SPF_NONE = 0,
|
||||||
SPF_SUPPORTS_CALLBACK = (1 << 0),
|
SPF_SUPPORTS_CALLBACK = (1 << 0),
|
||||||
SPF_SUPPORTS_SBUS_MODE = (1 << 1),
|
SPF_SUPPORTS_SBUS_MODE = (1 << 1),
|
||||||
SPF_IS_SOFTWARE_INVERTABLE = (1 << 2)
|
SPF_SUPPORTS_BIDIR_MODE = (1 << 2),
|
||||||
|
SPF_IS_SOFTWARE_INVERTABLE = (1 << 3)
|
||||||
} serialPortFeature_t;
|
} serialPortFeature_t;
|
||||||
|
|
||||||
typedef struct serialPortConstraint_s {
|
typedef struct serialPortConstraint_s {
|
||||||
|
|
|
@ -46,7 +46,7 @@ typedef struct telemetryConfig_s {
|
||||||
telemetryProvider_e telemetry_provider;
|
telemetryProvider_e telemetry_provider;
|
||||||
uint8_t telemetry_switch; // Use aux channel to change serial output & baudrate( MSP / Telemetry ). It disables automatic switching to Telemetry when armed.
|
uint8_t telemetry_switch; // Use aux channel to change serial output & baudrate( MSP / Telemetry ). It disables automatic switching to Telemetry when armed.
|
||||||
serialInversion_e telemetry_inversion; // also shared with smartport inversion
|
serialInversion_e telemetry_inversion; // also shared with smartport inversion
|
||||||
float gpsNoFixLatitude;
|
float gpsNoFixLatitude;
|
||||||
float gpsNoFixLongitude;
|
float gpsNoFixLongitude;
|
||||||
frskyGpsCoordFormat_e frsky_coordinate_format;
|
frskyGpsCoordFormat_e frsky_coordinate_format;
|
||||||
frskyUnit_e frsky_unit;
|
frskyUnit_e frsky_unit;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue