commit
9baa9b7e12
2
Makefile
2
Makefile
|
@ -582,6 +582,7 @@ COMMON_SRC = \
|
|||
drivers/rx_pwm.c \
|
||||
drivers/serial.c \
|
||||
drivers/serial_uart.c \
|
||||
drivers/serial_softserial.c \
|
||||
drivers/sound_beeper.c \
|
||||
drivers/stack_check.c \
|
||||
drivers/system.c \
|
||||
|
@ -650,7 +651,6 @@ COMMON_SRC = \
|
|||
drivers/display_ug2864hsweg01.c \
|
||||
drivers/light_ws2811strip.c \
|
||||
drivers/serial_escserial.c \
|
||||
drivers/serial_softserial.c \
|
||||
drivers/sonar_hcsr04.c \
|
||||
drivers/vtx_common.c \
|
||||
flight/navigation.c \
|
||||
|
|
|
@ -96,7 +96,9 @@ static char cmsx_BlackboxDeviceStorageFree[CMS_BLACKBOX_STRING_LENGTH];
|
|||
static void cmsx_Blackbox_GetDeviceStatus()
|
||||
{
|
||||
char * unit = "B";
|
||||
#if defined(USE_SDCARD) || defined(USE_FLASHFS)
|
||||
bool storageDeviceIsWorking = false;
|
||||
#endif
|
||||
uint32_t storageUsed = 0;
|
||||
uint32_t storageFree = 0;
|
||||
|
||||
|
@ -154,7 +156,6 @@ static void cmsx_Blackbox_GetDeviceStatus()
|
|||
#endif
|
||||
|
||||
default:
|
||||
storageDeviceIsWorking = true;
|
||||
snprintf(cmsx_BlackboxStatus, CMS_BLACKBOX_STRING_LENGTH, "---");
|
||||
}
|
||||
|
||||
|
|
|
@ -35,6 +35,7 @@
|
|||
#include "drivers/light_led.h"
|
||||
#include "drivers/flash.h"
|
||||
#include "drivers/display.h"
|
||||
#include "drivers/serial.h"
|
||||
|
||||
#include "fc/rc_adjustments.h"
|
||||
#include "fc/rc_controls.h"
|
||||
|
@ -93,6 +94,7 @@
|
|||
#define mixerConfig(x) (&masterConfig.mixerConfig)
|
||||
#define airplaneConfig(x) (&masterConfig.airplaneConfig)
|
||||
#define failsafeConfig(x) (&masterConfig.failsafeConfig)
|
||||
#define serialPinConfig(x) (&masterConfig.serialPinConfig)
|
||||
#define serialConfig(x) (&masterConfig.serialConfig)
|
||||
#define telemetryConfig(x) (&masterConfig.telemetryConfig)
|
||||
#define ibusTelemetryConfig(x) (&masterConfig.telemetryConfig)
|
||||
|
@ -242,6 +244,7 @@ typedef struct master_s {
|
|||
airplaneConfig_t airplaneConfig;
|
||||
|
||||
failsafeConfig_t failsafeConfig;
|
||||
serialPinConfig_t serialPinConfig;
|
||||
serialConfig_t serialConfig;
|
||||
telemetryConfig_t telemetryConfig;
|
||||
|
||||
|
|
|
@ -193,7 +193,7 @@ void adcInit(const adcConfig_t *config)
|
|||
}
|
||||
}
|
||||
|
||||
HAL_CLEANINVALIDATECACHE((uint32_t*)&adcValues, configuredAdcChannels);
|
||||
//HAL_CLEANINVALIDATECACHE((uint32_t*)&adcValues, configuredAdcChannels);
|
||||
/*##-4- Start the conversion process #######################################*/
|
||||
if(HAL_ADC_Start_DMA(&adc.ADCHandle, (uint32_t*)&adcValues, configuredAdcChannels) != HAL_OK)
|
||||
{
|
||||
|
|
|
@ -390,7 +390,7 @@ DMA_HandleTypeDef* spiSetDMATransmit(DMA_Stream_TypeDef *Stream, uint32_t Channe
|
|||
// DMA TX Interrupt
|
||||
dmaSetHandler(spiHardwareMap[device].dmaIrqHandler, dmaSPIIRQHandler, NVIC_BUILD_PRIORITY(3, 0), (uint32_t)device);
|
||||
|
||||
HAL_CLEANCACHE(pData,Size);
|
||||
//HAL_CLEANCACHE(pData,Size);
|
||||
// And Transmit
|
||||
HAL_SPI_Transmit_DMA(&spiHardwareMap[device].hspi, pData, Size);
|
||||
|
||||
|
|
|
@ -39,8 +39,8 @@ typedef struct dmaChannelDescriptor_s {
|
|||
} dmaChannelDescriptor_t;
|
||||
|
||||
#if defined(STM32F7)
|
||||
#define HAL_CLEANINVALIDATECACHE(addr, size) (SCB_CleanInvalidateDCache_by_Addr((uint32_t*)((uint32_t)addr & ~0x1f), ((uint32_t)(addr + size + 0x1f) & ~0x1f) - ((uint32_t)addr & ~0x1f)))
|
||||
#define HAL_CLEANCACHE(addr, size) (SCB_CleanDCache_by_Addr((uint32_t*)((uint32_t)addr & ~0x1f), ((uint32_t)(addr + size + 0x1f) & ~0x1f) - ((uint32_t)addr & ~0x1f)))
|
||||
//#define HAL_CLEANINVALIDATECACHE(addr, size) (SCB_CleanInvalidateDCache_by_Addr((uint32_t*)((uint32_t)addr & ~0x1f), ((uint32_t)(addr + size + 0x1f) & ~0x1f) - ((uint32_t)addr & ~0x1f)))
|
||||
//#define HAL_CLEANCACHE(addr, size) (SCB_CleanDCache_by_Addr((uint32_t*)((uint32_t)addr & ~0x1f), ((uint32_t)(addr + size + 0x1f) & ~0x1f) - ((uint32_t)addr & ~0x1f)))
|
||||
#endif
|
||||
|
||||
#if defined(STM32F4) || defined(STM32F7)
|
||||
|
|
|
@ -139,7 +139,7 @@ void pwmDigitalMotorHardwareConfig(const timerHardware_t *timerHardware, uint8_t
|
|||
if (output & TIMER_OUTPUT_N_CHANNEL) {
|
||||
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
|
||||
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
|
||||
TIM_OCInitStructure.TIM_OCNPolarity = (output & TIMER_OUTPUT_INVERTED) ? TIM_OCNPolarity_High : TIM_OCNPolarity_Low;
|
||||
TIM_OCInitStructure.TIM_OCNPolarity = (output & TIMER_OUTPUT_INVERTED) ? TIM_OCNPolarity_Low : TIM_OCNPolarity_High;
|
||||
} else {
|
||||
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
|
||||
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
|
||||
|
|
|
@ -17,6 +17,8 @@
|
|||
|
||||
#pragma once
|
||||
|
||||
#include "drivers/io.h"
|
||||
|
||||
typedef enum portMode_t {
|
||||
MODE_RX = 1 << 0,
|
||||
MODE_TX = 1 << 1,
|
||||
|
@ -68,6 +70,21 @@ typedef struct serialPort_s {
|
|||
serialReceiveCallbackPtr rxCallback;
|
||||
} serialPort_t;
|
||||
|
||||
#if defined(USE_SOFTSERIAL1) || defined(USE_SOFTSERIAL2)
|
||||
# ifdef USE_SOFTSERIAL2
|
||||
# define SERIAL_PORT_MAX_INDEX (RESOURCE_SOFT_OFFSET + 2)
|
||||
# else
|
||||
# define SERIAL_PORT_MAX_INDEX (RESOURCE_SOFT_OFFSET + 1)
|
||||
# endif
|
||||
#else
|
||||
# define SERIAL_PORT_MAX_INDEX RESOURCE_SOFT_OFFSET
|
||||
#endif
|
||||
|
||||
typedef struct serialPinConfig_s {
|
||||
ioTag_t ioTagTx[SERIAL_PORT_MAX_INDEX];
|
||||
ioTag_t ioTagRx[SERIAL_PORT_MAX_INDEX];
|
||||
} serialPinConfig_t;
|
||||
|
||||
struct serialPortVTable {
|
||||
void (*serialWrite)(serialPort_t *instance, uint8_t ch);
|
||||
|
||||
|
|
|
@ -15,6 +15,11 @@
|
|||
* along with Cleanflight. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Cleanflight (or Baseflight): original
|
||||
* jflyper: Mono-timer and single-wire half-duplex
|
||||
*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
||||
|
@ -25,8 +30,12 @@
|
|||
#include "build/build_config.h"
|
||||
#include "build/atomic.h"
|
||||
|
||||
#include "build/debug.h"
|
||||
|
||||
#include "common/utils.h"
|
||||
|
||||
#include "config/config_master.h"
|
||||
|
||||
#include "nvic.h"
|
||||
#include "system.h"
|
||||
#include "io.h"
|
||||
|
@ -44,21 +53,34 @@
|
|||
#define MAX_SOFTSERIAL_PORTS 1
|
||||
#endif
|
||||
|
||||
typedef enum {
|
||||
TIMER_MODE_SINGLE,
|
||||
TIMER_MODE_DUAL,
|
||||
} timerMode_e;
|
||||
|
||||
#define ICPOLARITY_RISING true
|
||||
#define ICPOLARITY_FALLING false
|
||||
|
||||
typedef struct softSerial_s {
|
||||
serialPort_t port;
|
||||
|
||||
IO_t rxIO;
|
||||
IO_t txIO;
|
||||
const timerHardware_t *rxTimerHardware;
|
||||
volatile uint8_t rxBuffer[SOFTSERIAL_BUFFER_SIZE];
|
||||
|
||||
const timerHardware_t *txTimerHardware;
|
||||
const timerHardware_t *timerHardware;
|
||||
#ifdef USE_HAL_DRIVER
|
||||
const TIM_HandleTypeDef *timerHandle;
|
||||
#endif
|
||||
const timerHardware_t *exTimerHardware;
|
||||
|
||||
volatile uint8_t rxBuffer[SOFTSERIAL_BUFFER_SIZE];
|
||||
volatile uint8_t txBuffer[SOFTSERIAL_BUFFER_SIZE];
|
||||
|
||||
uint8_t isSearchingForStartBit;
|
||||
uint8_t rxBitIndex;
|
||||
uint8_t rxLastLeadingEdgeAtBitIndex;
|
||||
uint8_t rxEdge;
|
||||
uint8_t rxActive;
|
||||
|
||||
uint8_t isTransmittingData;
|
||||
int8_t bitsLeftToTransmit;
|
||||
|
@ -70,23 +92,20 @@ typedef struct softSerial_s {
|
|||
uint16_t receiveErrors;
|
||||
|
||||
uint8_t softSerialPortIndex;
|
||||
timerMode_e timerMode;
|
||||
|
||||
timerCCHandlerRec_t timerCb;
|
||||
timerOvrHandlerRec_t overCb;
|
||||
timerCCHandlerRec_t edgeCb;
|
||||
} softSerial_t;
|
||||
|
||||
extern timerHardware_t* serialTimerHardware;
|
||||
extern softSerial_t softSerialPorts[];
|
||||
static const struct serialPortVTable softSerialVTable; // Forward
|
||||
|
||||
extern const struct serialPortVTable softSerialVTable[];
|
||||
static softSerial_t softSerialPorts[MAX_SOFTSERIAL_PORTS];
|
||||
|
||||
|
||||
softSerial_t softSerialPorts[MAX_SOFTSERIAL_PORTS];
|
||||
|
||||
void onSerialTimer(timerCCHandlerRec_t *cbRec, captureCompare_t capture);
|
||||
void onSerialTimerOverflow(timerOvrHandlerRec_t *cbRec, captureCompare_t capture);
|
||||
void onSerialRxPinChange(timerCCHandlerRec_t *cbRec, captureCompare_t capture);
|
||||
|
||||
void setTxSignal(softSerial_t *softSerial, uint8_t state)
|
||||
static void setTxSignal(softSerial_t *softSerial, uint8_t state)
|
||||
{
|
||||
if (softSerial->port.options & SERIAL_INVERTED) {
|
||||
state = !state;
|
||||
|
@ -99,20 +118,57 @@ void setTxSignal(softSerial_t *softSerial, uint8_t state)
|
|||
}
|
||||
}
|
||||
|
||||
void serialInputPortConfig(ioTag_t pin, uint8_t portIndex)
|
||||
static void serialInputPortActivate(softSerial_t *softSerial)
|
||||
{
|
||||
IOInit(IOGetByTag(pin), OWNER_SERIAL_RX, RESOURCE_INDEX(portIndex) + RESOURCE_SOFT_OFFSET);
|
||||
if (softSerial->port.options & SERIAL_INVERTED) {
|
||||
#ifdef STM32F1
|
||||
IOConfigGPIO(IOGetByTag(pin), IOCFG_IPU);
|
||||
IOConfigGPIO(softSerial->rxIO, IOCFG_IPD);
|
||||
#else
|
||||
IOConfigGPIO(IOGetByTag(pin), IOCFG_AF_PP_UP);
|
||||
IOConfigGPIO(softSerial->rxIO, IOCFG_AF_PP_PD);
|
||||
#endif
|
||||
} else {
|
||||
#ifdef STM32F1
|
||||
IOConfigGPIO(softSerial->rxIO, IOCFG_IPU);
|
||||
#else
|
||||
IOConfigGPIO(softSerial->rxIO, IOCFG_AF_PP_UP);
|
||||
#endif
|
||||
}
|
||||
|
||||
softSerial->rxActive = true;
|
||||
softSerial->isSearchingForStartBit = true;
|
||||
softSerial->rxBitIndex = 0;
|
||||
|
||||
// Enable input capture
|
||||
|
||||
#ifdef USE_HAL_DRIVER
|
||||
TIM_CCxChannelCmd(softSerial->timerHardware->tim, softSerial->timerHardware->channel, TIM_CCx_ENABLE);
|
||||
#else
|
||||
TIM_CCxCmd(softSerial->timerHardware->tim, softSerial->timerHardware->channel, TIM_CCx_Enable);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void serialOutputPortConfig(ioTag_t pin, uint8_t portIndex)
|
||||
static void serialInputPortDeActivate(softSerial_t *softSerial)
|
||||
{
|
||||
IOInit(IOGetByTag(pin), OWNER_SERIAL_TX, RESOURCE_INDEX(portIndex) + RESOURCE_SOFT_OFFSET);
|
||||
IOConfigGPIO(IOGetByTag(pin), IOCFG_OUT_PP);
|
||||
// Disable input capture
|
||||
|
||||
#ifdef USE_HAL_DRIVER
|
||||
TIM_CCxChannelCmd(softSerial->timerHardware->tim, softSerial->timerHardware->channel, TIM_CCx_DISABLE);
|
||||
#else
|
||||
TIM_CCxCmd(softSerial->timerHardware->tim, softSerial->timerHardware->channel, TIM_CCx_Disable);
|
||||
#endif
|
||||
|
||||
IOConfigGPIO(softSerial->rxIO, IOCFG_IN_FLOATING);
|
||||
softSerial->rxActive = false;
|
||||
}
|
||||
|
||||
static void serialOutputPortActivate(softSerial_t *softSerial)
|
||||
{
|
||||
IOConfigGPIO(softSerial->txIO, IOCFG_OUT_PP);
|
||||
}
|
||||
|
||||
static void serialOutputPortDeActivate(softSerial_t *softSerial)
|
||||
{
|
||||
IOConfigGPIO(softSerial->txIO, IOCFG_IN_FLOATING);
|
||||
}
|
||||
|
||||
static bool isTimerPeriodTooLarge(uint32_t timerPeriod)
|
||||
|
@ -120,10 +176,12 @@ static bool isTimerPeriodTooLarge(uint32_t timerPeriod)
|
|||
return timerPeriod > 0xFFFF;
|
||||
}
|
||||
|
||||
static void serialTimerTxConfig(const timerHardware_t *timerHardwarePtr, uint8_t reference, uint32_t baud)
|
||||
static void serialTimerConfigureTimebase(const timerHardware_t *timerHardwarePtr, uint32_t baud)
|
||||
{
|
||||
uint32_t clock = SystemCoreClock;
|
||||
uint32_t baseClock = SystemCoreClock / timerClockDivisor(timerHardwarePtr->tim);
|
||||
uint32_t clock = baseClock;
|
||||
uint32_t timerPeriod;
|
||||
|
||||
do {
|
||||
timerPeriod = clock / baud;
|
||||
if (isTimerPeriodTooLarge(timerPeriod)) {
|
||||
|
@ -136,12 +194,12 @@ static void serialTimerTxConfig(const timerHardware_t *timerHardwarePtr, uint8_t
|
|||
}
|
||||
} while (isTimerPeriodTooLarge(timerPeriod));
|
||||
|
||||
uint8_t mhz = SystemCoreClock / 1000000;
|
||||
uint8_t mhz = baseClock / 1000000;
|
||||
|
||||
timerConfigure(timerHardwarePtr, timerPeriod, mhz);
|
||||
timerChCCHandlerInit(&softSerialPorts[reference].timerCb, onSerialTimer);
|
||||
timerChConfigCallbacks(timerHardwarePtr, &softSerialPorts[reference].timerCb, NULL);
|
||||
}
|
||||
|
||||
#if 0
|
||||
static void serialICConfig(TIM_TypeDef *tim, uint8_t channel, uint16_t polarity)
|
||||
{
|
||||
TIM_ICInitTypeDef TIM_ICInitStructure;
|
||||
|
@ -155,14 +213,7 @@ static void serialICConfig(TIM_TypeDef *tim, uint8_t channel, uint16_t polarity)
|
|||
|
||||
TIM_ICInit(tim, &TIM_ICInitStructure);
|
||||
}
|
||||
|
||||
static void serialTimerRxConfig(const timerHardware_t *timerHardwarePtr, uint8_t reference, portOptions_t options)
|
||||
{
|
||||
// start bit is usually a FALLING signal
|
||||
serialICConfig(timerHardwarePtr->tim, timerHardwarePtr->channel, (options & SERIAL_INVERTED) ? TIM_ICPolarity_Rising : TIM_ICPolarity_Falling);
|
||||
timerChCCHandlerInit(&softSerialPorts[reference].edgeCb, onSerialRxPinChange);
|
||||
timerChConfigCallbacks(timerHardwarePtr, &softSerialPorts[reference].edgeCb, NULL);
|
||||
}
|
||||
#endif
|
||||
|
||||
static void resetBuffers(softSerial_t *softSerial)
|
||||
{
|
||||
|
@ -177,71 +228,139 @@ static void resetBuffers(softSerial_t *softSerial)
|
|||
softSerial->port.txBufferHead = 0;
|
||||
}
|
||||
|
||||
serialPort_t *openSoftSerial(softSerialPortIndex_e portIndex, serialReceiveCallbackPtr rxCallback, uint32_t baud, portOptions_t options)
|
||||
serialPort_t *openSoftSerial(softSerialPortIndex_e portIndex, serialReceiveCallbackPtr rxCallback, uint32_t baud, portMode_t mode, portOptions_t options)
|
||||
{
|
||||
softSerial_t *softSerial = &(softSerialPorts[portIndex]);
|
||||
|
||||
#ifdef USE_SOFTSERIAL1
|
||||
if (portIndex == SOFTSERIAL1) {
|
||||
softSerial->rxTimerHardware = &(timerHardware[SOFTSERIAL_1_TIMER_RX_HARDWARE]);
|
||||
softSerial->txTimerHardware = &(timerHardware[SOFTSERIAL_1_TIMER_TX_HARDWARE]);
|
||||
}
|
||||
#endif
|
||||
int pinCfgIndex = portIndex + RESOURCE_SOFT_OFFSET;
|
||||
|
||||
#ifdef USE_SOFTSERIAL2
|
||||
if (portIndex == SOFTSERIAL2) {
|
||||
softSerial->rxTimerHardware = &(timerHardware[SOFTSERIAL_2_TIMER_RX_HARDWARE]);
|
||||
softSerial->txTimerHardware = &(timerHardware[SOFTSERIAL_2_TIMER_TX_HARDWARE]);
|
||||
}
|
||||
#endif
|
||||
ioTag_t tagRx = serialPinConfig()->ioTagRx[pinCfgIndex];
|
||||
ioTag_t tagTx = serialPinConfig()->ioTagTx[pinCfgIndex];
|
||||
|
||||
softSerial->port.vTable = softSerialVTable;
|
||||
const timerHardware_t *timerRx = timerGetByTag(tagRx, TIM_USE_ANY);
|
||||
const timerHardware_t *timerTx = timerGetByTag(tagTx, TIM_USE_ANY);
|
||||
|
||||
IO_t rxIO = IOGetByTag(tagRx);
|
||||
IO_t txIO = IOGetByTag(tagTx);
|
||||
|
||||
if (options & SERIAL_BIDIR) {
|
||||
// If RX and TX pins are both assigned, we CAN use either with a timer.
|
||||
// However, for consistency with hardware UARTs, we only use TX pin,
|
||||
// and this pin must have a timer.
|
||||
if (!timerTx)
|
||||
return NULL;
|
||||
|
||||
softSerial->timerHardware = timerTx;
|
||||
softSerial->txIO = txIO;
|
||||
softSerial->rxIO = txIO;
|
||||
IOInit(txIO, OWNER_SERIAL_TX, RESOURCE_INDEX(portIndex) + RESOURCE_SOFT_OFFSET);
|
||||
} else {
|
||||
if (mode & MODE_RX) {
|
||||
// Need a pin & a timer on RX
|
||||
if (!(tagRx && timerRx))
|
||||
return NULL;
|
||||
|
||||
softSerial->rxIO = rxIO;
|
||||
softSerial->timerHardware = timerRx;
|
||||
IOInit(rxIO, OWNER_SERIAL_RX, RESOURCE_INDEX(portIndex) + RESOURCE_SOFT_OFFSET);
|
||||
}
|
||||
|
||||
if (mode & MODE_TX) {
|
||||
// Need a pin on TX
|
||||
if (!tagTx)
|
||||
return NULL;
|
||||
|
||||
softSerial->txIO = txIO;
|
||||
|
||||
if (!(mode & MODE_RX)) {
|
||||
// TX Simplex, must have a timer
|
||||
if (!timerTx)
|
||||
return NULL;
|
||||
softSerial->timerHardware = timerTx;
|
||||
} else {
|
||||
// Duplex
|
||||
softSerial->exTimerHardware = timerTx;
|
||||
}
|
||||
IOInit(txIO, OWNER_SERIAL_TX, RESOURCE_INDEX(portIndex) + RESOURCE_SOFT_OFFSET);
|
||||
}
|
||||
}
|
||||
|
||||
softSerial->port.vTable = &softSerialVTable;
|
||||
softSerial->port.baudRate = baud;
|
||||
softSerial->port.mode = MODE_RXTX;
|
||||
softSerial->port.mode = mode;
|
||||
softSerial->port.options = options;
|
||||
softSerial->port.rxCallback = rxCallback;
|
||||
|
||||
resetBuffers(softSerial);
|
||||
|
||||
softSerial->isTransmittingData = false;
|
||||
|
||||
softSerial->isSearchingForStartBit = true;
|
||||
softSerial->rxBitIndex = 0;
|
||||
softSerial->softSerialPortIndex = portIndex;
|
||||
|
||||
softSerial->transmissionErrors = 0;
|
||||
softSerial->receiveErrors = 0;
|
||||
|
||||
softSerial->softSerialPortIndex = portIndex;
|
||||
softSerial->rxActive = false;
|
||||
softSerial->isTransmittingData = false;
|
||||
|
||||
softSerial->txIO = IOGetByTag(softSerial->txTimerHardware->tag);
|
||||
serialOutputPortConfig(softSerial->txTimerHardware->tag, portIndex);
|
||||
// Configure master timer (on RX); time base and input capture
|
||||
|
||||
softSerial->rxIO = IOGetByTag(softSerial->rxTimerHardware->tag);
|
||||
serialInputPortConfig(softSerial->rxTimerHardware->tag, portIndex);
|
||||
serialTimerConfigureTimebase(softSerial->timerHardware, baud);
|
||||
timerChConfigIC(softSerial->timerHardware, (options & SERIAL_INVERTED) ? ICPOLARITY_RISING : ICPOLARITY_FALLING, 0);
|
||||
|
||||
setTxSignal(softSerial, ENABLE);
|
||||
delay(50);
|
||||
// Initialize callbacks
|
||||
timerChCCHandlerInit(&softSerial->edgeCb, onSerialRxPinChange);
|
||||
timerChOvrHandlerInit(&softSerial->overCb, onSerialTimerOverflow);
|
||||
|
||||
serialTimerTxConfig(softSerial->txTimerHardware, portIndex, baud);
|
||||
serialTimerRxConfig(softSerial->rxTimerHardware, portIndex, options);
|
||||
// Configure bit clock interrupt & handler.
|
||||
// If we have an extra timer (on TX), it is initialized and configured
|
||||
// for overflow interrupt.
|
||||
// Receiver input capture is configured when input is activated.
|
||||
|
||||
if ((mode & MODE_TX) && softSerial->exTimerHardware && softSerial->exTimerHardware->tim != softSerial->timerHardware->tim) {
|
||||
softSerial->timerMode = TIMER_MODE_DUAL;
|
||||
serialTimerConfigureTimebase(softSerial->exTimerHardware, baud);
|
||||
timerChConfigCallbacks(softSerial->exTimerHardware, NULL, &softSerial->overCb);
|
||||
timerChConfigCallbacks(softSerial->timerHardware, &softSerial->edgeCb, NULL);
|
||||
} else {
|
||||
softSerial->timerMode = TIMER_MODE_SINGLE;
|
||||
timerChConfigCallbacks(softSerial->timerHardware, &softSerial->edgeCb, &softSerial->overCb);
|
||||
}
|
||||
|
||||
#ifdef USE_HAL_DRIVER
|
||||
softSerial->timerHandle = timerFindTimerHandle(softSerial->timerHardware->tim);
|
||||
#endif
|
||||
|
||||
if (!(options & SERIAL_BIDIR)) {
|
||||
serialOutputPortActivate(softSerial);
|
||||
setTxSignal(softSerial, ENABLE);
|
||||
}
|
||||
|
||||
serialInputPortActivate(softSerial);
|
||||
|
||||
return &softSerial->port;
|
||||
}
|
||||
|
||||
/*********************************************/
|
||||
|
||||
/*
|
||||
* Serial Engine
|
||||
*/
|
||||
|
||||
void processTxState(softSerial_t *softSerial)
|
||||
{
|
||||
uint8_t mask;
|
||||
|
||||
if (!softSerial->isTransmittingData) {
|
||||
char byteToSend;
|
||||
if (isSoftSerialTransmitBufferEmpty((serialPort_t *)softSerial)) {
|
||||
// Transmit buffer empty.
|
||||
// Start listening if not already in if half-duplex
|
||||
if (!softSerial->rxActive && softSerial->port.options & SERIAL_BIDIR) {
|
||||
serialOutputPortDeActivate(softSerial);
|
||||
serialInputPortActivate(softSerial);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// data to send
|
||||
byteToSend = softSerial->port.txBuffer[softSerial->port.txBufferTail++];
|
||||
uint8_t byteToSend = softSerial->port.txBuffer[softSerial->port.txBufferTail++];
|
||||
if (softSerial->port.txBufferTail >= softSerial->port.txBufferSize) {
|
||||
softSerial->port.txBufferTail = 0;
|
||||
}
|
||||
|
@ -251,6 +370,12 @@ void processTxState(softSerial_t *softSerial)
|
|||
softSerial->bitsLeftToTransmit = TX_TOTAL_BITS;
|
||||
softSerial->isTransmittingData = true;
|
||||
|
||||
if (softSerial->rxActive && (softSerial->port.options & SERIAL_BIDIR)) {
|
||||
// Half-duplex: Deactivate receiver, activate transmitter
|
||||
serialInputPortDeActivate(softSerial);
|
||||
serialOutputPortActivate(softSerial);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -288,11 +413,7 @@ void prepareForNextRxByte(softSerial_t *softSerial)
|
|||
softSerial->isSearchingForStartBit = true;
|
||||
if (softSerial->rxEdge == LEADING) {
|
||||
softSerial->rxEdge = TRAILING;
|
||||
serialICConfig(
|
||||
softSerial->rxTimerHardware->tim,
|
||||
softSerial->rxTimerHardware->channel,
|
||||
(softSerial->port.options & SERIAL_INVERTED) ? TIM_ICPolarity_Rising : TIM_ICPolarity_Falling
|
||||
);
|
||||
timerChConfigIC(softSerial->timerHardware, (softSerial->port.options & SERIAL_INVERTED) ? ICPOLARITY_RISING : ICPOLARITY_FALLING, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -347,60 +468,78 @@ void processRxState(softSerial_t *softSerial)
|
|||
}
|
||||
}
|
||||
|
||||
void onSerialTimer(timerCCHandlerRec_t *cbRec, captureCompare_t capture)
|
||||
void onSerialTimerOverflow(timerOvrHandlerRec_t *cbRec, captureCompare_t capture)
|
||||
{
|
||||
UNUSED(capture);
|
||||
softSerial_t *softSerial = container_of(cbRec, softSerial_t, timerCb);
|
||||
softSerial_t *self = container_of(cbRec, softSerial_t, overCb);
|
||||
|
||||
processTxState(softSerial);
|
||||
processRxState(softSerial);
|
||||
if (self->port.mode & MODE_TX)
|
||||
processTxState(self);
|
||||
|
||||
if (self->port.mode & MODE_RX)
|
||||
processRxState(self);
|
||||
}
|
||||
|
||||
void onSerialRxPinChange(timerCCHandlerRec_t *cbRec, captureCompare_t capture)
|
||||
{
|
||||
UNUSED(capture);
|
||||
|
||||
softSerial_t *softSerial = container_of(cbRec, softSerial_t, edgeCb);
|
||||
bool inverted = softSerial->port.options & SERIAL_INVERTED;
|
||||
softSerial_t *self = container_of(cbRec, softSerial_t, edgeCb);
|
||||
bool inverted = self->port.options & SERIAL_INVERTED;
|
||||
|
||||
if ((softSerial->port.mode & MODE_RX) == 0) {
|
||||
if ((self->port.mode & MODE_RX) == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (softSerial->isSearchingForStartBit) {
|
||||
// synchronise bit counter
|
||||
// FIXME this reduces functionality somewhat as receiving breaks concurrent transmission on all ports because
|
||||
// the next callback to the onSerialTimer will happen too early causing transmission errors.
|
||||
TIM_SetCounter(softSerial->rxTimerHardware->tim, softSerial->rxTimerHardware->tim->ARR / 2);
|
||||
if (softSerial->isTransmittingData) {
|
||||
softSerial->transmissionErrors++;
|
||||
if (self->isSearchingForStartBit) {
|
||||
// Synchronize the bit timing so that it will interrupt at the center
|
||||
// of the bit period.
|
||||
|
||||
#ifdef USE_HAL_DRIVER
|
||||
__HAL_TIM_SetCounter(self->timerHandle, __HAL_TIM_GetAutoreload(self->timerHandle) / 2);
|
||||
#else
|
||||
TIM_SetCounter(self->timerHardware->tim, self->timerHardware->tim->ARR / 2);
|
||||
#endif
|
||||
|
||||
// For a mono-timer full duplex configuration, this may clobber the
|
||||
// transmission because the next callback to the onSerialTimerOverflow
|
||||
// will happen too early causing transmission errors.
|
||||
// For a dual-timer configuration, there is no problem.
|
||||
|
||||
if ((self->timerMode != TIMER_MODE_DUAL) && self->isTransmittingData) {
|
||||
self->transmissionErrors++;
|
||||
}
|
||||
|
||||
serialICConfig(softSerial->rxTimerHardware->tim, softSerial->rxTimerHardware->channel, inverted ? TIM_ICPolarity_Falling : TIM_ICPolarity_Rising);
|
||||
softSerial->rxEdge = LEADING;
|
||||
timerChConfigIC(self->timerHardware, inverted ? ICPOLARITY_FALLING : ICPOLARITY_RISING, 0);
|
||||
self->rxEdge = LEADING;
|
||||
|
||||
softSerial->rxBitIndex = 0;
|
||||
softSerial->rxLastLeadingEdgeAtBitIndex = 0;
|
||||
softSerial->internalRxBuffer = 0;
|
||||
softSerial->isSearchingForStartBit = false;
|
||||
self->rxBitIndex = 0;
|
||||
self->rxLastLeadingEdgeAtBitIndex = 0;
|
||||
self->internalRxBuffer = 0;
|
||||
self->isSearchingForStartBit = false;
|
||||
return;
|
||||
}
|
||||
|
||||
if (softSerial->rxEdge == LEADING) {
|
||||
softSerial->rxLastLeadingEdgeAtBitIndex = softSerial->rxBitIndex;
|
||||
if (self->rxEdge == LEADING) {
|
||||
self->rxLastLeadingEdgeAtBitIndex = self->rxBitIndex;
|
||||
}
|
||||
|
||||
applyChangedBits(softSerial);
|
||||
applyChangedBits(self);
|
||||
|
||||
if (softSerial->rxEdge == TRAILING) {
|
||||
softSerial->rxEdge = LEADING;
|
||||
serialICConfig(softSerial->rxTimerHardware->tim, softSerial->rxTimerHardware->channel, inverted ? TIM_ICPolarity_Falling : TIM_ICPolarity_Rising);
|
||||
if (self->rxEdge == TRAILING) {
|
||||
self->rxEdge = LEADING;
|
||||
timerChConfigIC(self->timerHardware, inverted ? ICPOLARITY_FALLING : ICPOLARITY_RISING, 0);
|
||||
} else {
|
||||
softSerial->rxEdge = TRAILING;
|
||||
serialICConfig(softSerial->rxTimerHardware->tim, softSerial->rxTimerHardware->channel, inverted ? TIM_ICPolarity_Rising : TIM_ICPolarity_Falling);
|
||||
self->rxEdge = TRAILING;
|
||||
timerChConfigIC(self->timerHardware, inverted ? ICPOLARITY_RISING : ICPOLARITY_FALLING, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Standard serial driver API
|
||||
*/
|
||||
|
||||
uint32_t softSerialRxBytesWaiting(const serialPort_t *instance)
|
||||
{
|
||||
if ((instance->mode & MODE_RX) == 0) {
|
||||
|
@ -455,7 +594,10 @@ void softSerialWriteByte(serialPort_t *s, uint8_t ch)
|
|||
void softSerialSetBaudRate(serialPort_t *s, uint32_t baudRate)
|
||||
{
|
||||
softSerial_t *softSerial = (softSerial_t *)s;
|
||||
openSoftSerial(softSerial->softSerialPortIndex, s->rxCallback, baudRate, softSerial->port.options);
|
||||
|
||||
softSerial->port.baudRate = baudRate;
|
||||
|
||||
serialTimerConfigureTimebase(softSerial->timerHardware, baudRate);
|
||||
}
|
||||
|
||||
void softSerialSetMode(serialPort_t *instance, portMode_t mode)
|
||||
|
@ -468,19 +610,17 @@ bool isSoftSerialTransmitBufferEmpty(const serialPort_t *instance)
|
|||
return instance->txBufferHead == instance->txBufferTail;
|
||||
}
|
||||
|
||||
const struct serialPortVTable softSerialVTable[] = {
|
||||
{
|
||||
.serialWrite = softSerialWriteByte,
|
||||
.serialTotalRxWaiting = softSerialRxBytesWaiting,
|
||||
.serialTotalTxFree = softSerialTxBytesFree,
|
||||
.serialRead = softSerialReadByte,
|
||||
.serialSetBaudRate = softSerialSetBaudRate,
|
||||
.isSerialTransmitBufferEmpty = isSoftSerialTransmitBufferEmpty,
|
||||
.setMode = softSerialSetMode,
|
||||
.writeBuf = NULL,
|
||||
.beginWrite = NULL,
|
||||
.endWrite = NULL
|
||||
}
|
||||
static const struct serialPortVTable softSerialVTable = {
|
||||
.serialWrite = softSerialWriteByte,
|
||||
.serialTotalRxWaiting = softSerialRxBytesWaiting,
|
||||
.serialTotalTxFree = softSerialTxBytesFree,
|
||||
.serialRead = softSerialReadByte,
|
||||
.serialSetBaudRate = softSerialSetBaudRate,
|
||||
.isSerialTransmitBufferEmpty = isSoftSerialTransmitBufferEmpty,
|
||||
.setMode = softSerialSetMode,
|
||||
.writeBuf = NULL,
|
||||
.beginWrite = NULL,
|
||||
.endWrite = NULL
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -24,7 +24,7 @@ typedef enum {
|
|||
SOFTSERIAL2
|
||||
} softSerialPortIndex_e;
|
||||
|
||||
serialPort_t *openSoftSerial(softSerialPortIndex_e portIndex, serialReceiveCallbackPtr rxCallback, uint32_t baud, portOptions_t options);
|
||||
serialPort_t *openSoftSerial(softSerialPortIndex_e portIndex, serialReceiveCallbackPtr rxCallback, uint32_t baud, portMode_t mode, portOptions_t options);
|
||||
|
||||
// serialPort API
|
||||
void softSerialWriteByte(serialPort_t *instance, uint8_t ch);
|
||||
|
|
|
@ -266,7 +266,7 @@ void uartStartTxDMA(uartPort_t *s)
|
|||
s->port.txBufferTail = 0;
|
||||
}
|
||||
s->txDMAEmpty = false;
|
||||
HAL_CLEANCACHE((uint8_t *)&s->port.txBuffer[fromwhere],size);
|
||||
//HAL_CLEANCACHE((uint8_t *)&s->port.txBuffer[fromwhere],size);
|
||||
HAL_UART_Transmit_DMA(&s->Handle, (uint8_t *)&s->port.txBuffer[fromwhere], size);
|
||||
}
|
||||
|
||||
|
|
|
@ -518,7 +518,7 @@ static const clivalue_t valueTable[] = {
|
|||
{ "input_filtering_mode", VAR_INT8 | MASTER_VALUE | MODE_LOOKUP, &pwmConfig()->inputFilteringMode, .config.lookup = { TABLE_OFF_ON } },
|
||||
#endif
|
||||
{ "fpv_mix_degrees", VAR_UINT8 | MASTER_VALUE, &rxConfig()->fpvCamAngleDegrees, .config.minmax = { 0, 50 } },
|
||||
{ "max_aux_channels", VAR_UINT8 | MASTER_VALUE, &rxConfig()->max_aux_channel, .config.minmax = { 0, MAX_AUX_CHANNELS } },
|
||||
{ "max_aux_channels", VAR_UINT8 | MASTER_VALUE, &rxConfig()->max_aux_channel, .config.minmax = { 0, MAX_AUX_CHANNEL_COUNT } },
|
||||
{ "debug_mode", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, &systemConfig()->debug_mode, .config.lookup = { TABLE_DEBUG } },
|
||||
|
||||
{ "min_throttle", VAR_UINT16 | MASTER_VALUE, &motorConfig()->minthrottle, .config.minmax = { PWM_RANGE_ZERO, PWM_RANGE_MAX } },
|
||||
|
@ -577,6 +577,9 @@ static const clivalue_t valueTable[] = {
|
|||
#ifdef SERIAL_RX
|
||||
{ "serialrx_provider", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, &rxConfig()->serialrx_provider, .config.lookup = { TABLE_SERIAL_RX } },
|
||||
#endif
|
||||
#ifdef STM32F4
|
||||
{ "serialrx_halfduplex", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, &rxConfig()->halfDuplex, .config.lookup = { TABLE_OFF_ON } },
|
||||
#endif
|
||||
|
||||
{ "sbus_inversion", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, &rxConfig()->sbus_inversion, .config.lookup = { TABLE_OFF_ON } },
|
||||
|
||||
|
@ -715,7 +718,7 @@ static const clivalue_t valueTable[] = {
|
|||
{ "anti_gravity_thresh", VAR_UINT16 | PROFILE_VALUE, &masterConfig.profile[0].pidProfile.itermThrottleThreshold, .config.minmax = {20, 1000 } },
|
||||
{ "anti_gravity_gain", VAR_FLOAT | PROFILE_VALUE, &masterConfig.profile[0].pidProfile.itermAcceleratorGain, .config.minmax = {1, 30 } },
|
||||
{ "setpoint_relax_ratio", VAR_UINT8 | PROFILE_VALUE, &masterConfig.profile[0].pidProfile.setpointRelaxRatio, .config.minmax = {0, 100 } },
|
||||
{ "d_setpoint_weight", VAR_UINT8 | PROFILE_VALUE, &masterConfig.profile[0].pidProfile.dtermSetpointWeight, .config.minmax = {0, 255 } },
|
||||
{ "d_setpoint_weight", VAR_UINT8 | PROFILE_VALUE, &masterConfig.profile[0].pidProfile.dtermSetpointWeight, .config.minmax = {0, 254 } },
|
||||
{ "yaw_accel_limit", VAR_FLOAT | PROFILE_VALUE, &masterConfig.profile[0].pidProfile.yawRateAccelLimit, .config.minmax = {0.1f, 50.0f } },
|
||||
{ "accel_limit", VAR_FLOAT | PROFILE_VALUE, &masterConfig.profile[0].pidProfile.rateAccelLimit, .config.minmax = {0.1f, 50.0f } },
|
||||
|
||||
|
@ -3695,6 +3698,8 @@ const cliResourceValue_t resourceTable[] = {
|
|||
#ifdef LED_STRIP
|
||||
{ OWNER_LED_STRIP, &ledStripConfig()->ioTag, 0 },
|
||||
#endif
|
||||
{ OWNER_SERIAL_TX, &serialPinConfig()->ioTagTx[0], SERIAL_PORT_MAX_INDEX },
|
||||
{ OWNER_SERIAL_RX, &serialPinConfig()->ioTagRx[0], SERIAL_PORT_MAX_INDEX },
|
||||
#endif
|
||||
};
|
||||
|
||||
|
|
|
@ -186,8 +186,8 @@ static void resetPidProfile(pidProfile_t *pidProfile)
|
|||
pidProfile->pidAtMinThrottle = PID_STABILISATION_ON;
|
||||
pidProfile->levelAngleLimit = 55;
|
||||
pidProfile->levelSensitivity = 55;
|
||||
pidProfile->setpointRelaxRatio = 25;
|
||||
pidProfile->dtermSetpointWeight = 190;
|
||||
pidProfile->setpointRelaxRatio = 20;
|
||||
pidProfile->dtermSetpointWeight = 100;
|
||||
pidProfile->yawRateAccelLimit = 10.0f;
|
||||
pidProfile->rateAccelLimit = 0.0f;
|
||||
pidProfile->itermThrottleThreshold = 350;
|
||||
|
@ -442,6 +442,175 @@ void resetBatteryConfig(batteryConfig_t *batteryConfig)
|
|||
batteryConfig->consumptionWarningPercentage = 10;
|
||||
}
|
||||
|
||||
// Default pin (NONE).
|
||||
// XXX Does this mess belong here???
|
||||
#ifdef USE_UART1
|
||||
# if !defined(UART1_RX_PIN)
|
||||
# define UART1_RX_PIN NONE
|
||||
# endif
|
||||
# if !defined(UART1_TX_PIN)
|
||||
# define UART1_TX_PIN NONE
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef USE_UART2
|
||||
# if !defined(UART2_RX_PIN)
|
||||
# define UART2_RX_PIN NONE
|
||||
# endif
|
||||
# if !defined(UART2_TX_PIN)
|
||||
# define UART2_TX_PIN NONE
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef USE_UART3
|
||||
# if !defined(UART3_RX_PIN)
|
||||
# define UART3_RX_PIN NONE
|
||||
# endif
|
||||
# if !defined(UART3_TX_PIN)
|
||||
# define UART3_TX_PIN NONE
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef USE_UART4
|
||||
# if !defined(UART4_RX_PIN)
|
||||
# define UART4_RX_PIN NONE
|
||||
# endif
|
||||
# if !defined(UART4_TX_PIN)
|
||||
# define UART4_TX_PIN NONE
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef USE_UART5
|
||||
# if !defined(UART5_RX_PIN)
|
||||
# define UART5_RX_PIN NONE
|
||||
# endif
|
||||
# if !defined(UART5_TX_PIN)
|
||||
# define UART5_TX_PIN NONE
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef USE_UART6
|
||||
# if !defined(UART6_RX_PIN)
|
||||
# define UART6_RX_PIN NONE
|
||||
# endif
|
||||
# if !defined(UART6_TX_PIN)
|
||||
# define UART6_TX_PIN NONE
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef USE_UART7
|
||||
# if !defined(UART7_RX_PIN)
|
||||
# define UART7_RX_PIN NONE
|
||||
# endif
|
||||
# if !defined(UART7_TX_PIN)
|
||||
# define UART7_TX_PIN NONE
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef USE_UART8
|
||||
# if !defined(UART8_RX_PIN)
|
||||
# define UART8_RX_PIN NONE
|
||||
# endif
|
||||
# if !defined(UART8_TX_PIN)
|
||||
# define UART8_TX_PIN NONE
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef USE_SOFTSERIAL1
|
||||
# if !defined(SOFTSERIAL1_RX_PIN)
|
||||
# define SOFTSERIAL1_RX_PIN NONE
|
||||
# endif
|
||||
# if !defined(SOFTSERIAL1_TX_PIN)
|
||||
# define SOFTSERIAL1_TX_PIN NONE
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef USE_SOFTSERIAL2
|
||||
# if !defined(SOFTSERIAL2_RX_PIN)
|
||||
# define SOFTSERIAL2_RX_PIN NONE
|
||||
# endif
|
||||
# if !defined(SOFTSERIAL2_TX_PIN)
|
||||
# define SOFTSERIAL2_TX_PIN NONE
|
||||
# endif
|
||||
#endif
|
||||
|
||||
void resetSerialPinConfig(serialPinConfig_t *pSerialPinConfig)
|
||||
{
|
||||
for (int port = 0 ; port < SERIAL_PORT_MAX_INDEX ; port++) {
|
||||
pSerialPinConfig->ioTagRx[port] = IO_TAG(NONE);
|
||||
pSerialPinConfig->ioTagTx[port] = IO_TAG(NONE);
|
||||
}
|
||||
|
||||
for (int index = 0 ; index < SERIAL_PORT_COUNT ; index++) {
|
||||
switch (serialPortIdentifiers[index]) {
|
||||
case SERIAL_PORT_USART1:
|
||||
#ifdef USE_UART1
|
||||
pSerialPinConfig->ioTagRx[SERIAL_PORT_IDENTIFIER_TO_RESOURCE_INDEX(SERIAL_PORT_USART1)] = IO_TAG(UART1_RX_PIN);
|
||||
pSerialPinConfig->ioTagTx[SERIAL_PORT_IDENTIFIER_TO_RESOURCE_INDEX(SERIAL_PORT_USART1)] = IO_TAG(UART1_TX_PIN);
|
||||
#endif
|
||||
break;
|
||||
case SERIAL_PORT_USART2:
|
||||
#ifdef USE_UART2
|
||||
pSerialPinConfig->ioTagRx[SERIAL_PORT_IDENTIFIER_TO_RESOURCE_INDEX(SERIAL_PORT_USART2)] = IO_TAG(UART2_RX_PIN);
|
||||
pSerialPinConfig->ioTagTx[SERIAL_PORT_IDENTIFIER_TO_RESOURCE_INDEX(SERIAL_PORT_USART2)] = IO_TAG(UART2_TX_PIN);
|
||||
#endif
|
||||
break;
|
||||
case SERIAL_PORT_USART3:
|
||||
#ifdef USE_UART3
|
||||
pSerialPinConfig->ioTagRx[SERIAL_PORT_IDENTIFIER_TO_RESOURCE_INDEX(SERIAL_PORT_USART3)] = IO_TAG(UART3_RX_PIN);
|
||||
pSerialPinConfig->ioTagTx[SERIAL_PORT_IDENTIFIER_TO_RESOURCE_INDEX(SERIAL_PORT_USART3)] = IO_TAG(UART3_TX_PIN);
|
||||
#endif
|
||||
break;
|
||||
case SERIAL_PORT_USART4:
|
||||
#ifdef USE_UART4
|
||||
pSerialPinConfig->ioTagRx[SERIAL_PORT_IDENTIFIER_TO_RESOURCE_INDEX(SERIAL_PORT_USART4)] = IO_TAG(UART4_RX_PIN);
|
||||
pSerialPinConfig->ioTagTx[SERIAL_PORT_IDENTIFIER_TO_RESOURCE_INDEX(SERIAL_PORT_USART4)] = IO_TAG(UART4_TX_PIN);
|
||||
#endif
|
||||
break;
|
||||
case SERIAL_PORT_USART5:
|
||||
#ifdef USE_UART5
|
||||
pSerialPinConfig->ioTagRx[SERIAL_PORT_IDENTIFIER_TO_RESOURCE_INDEX(SERIAL_PORT_USART5)] = IO_TAG(UART5_RX_PIN);
|
||||
pSerialPinConfig->ioTagTx[SERIAL_PORT_IDENTIFIER_TO_RESOURCE_INDEX(SERIAL_PORT_USART5)] = IO_TAG(UART5_TX_PIN);
|
||||
#endif
|
||||
break;
|
||||
case SERIAL_PORT_USART6:
|
||||
#ifdef USE_UART6
|
||||
pSerialPinConfig->ioTagRx[SERIAL_PORT_IDENTIFIER_TO_RESOURCE_INDEX(SERIAL_PORT_USART6)] = IO_TAG(UART6_RX_PIN);
|
||||
pSerialPinConfig->ioTagTx[SERIAL_PORT_IDENTIFIER_TO_RESOURCE_INDEX(SERIAL_PORT_USART6)] = IO_TAG(UART6_TX_PIN);
|
||||
#endif
|
||||
break;
|
||||
case SERIAL_PORT_USART7:
|
||||
#ifdef USE_UART7
|
||||
pSerialPinConfig->ioTagRx[SERIAL_PORT_IDENTIFIER_TO_RESOURCE_INDEX(SERIAL_PORT_USART7)] = IO_TAG(UART7_RX_PIN);
|
||||
pSerialPinConfig->ioTagTx[SERIAL_PORT_IDENTIFIER_TO_RESOURCE_INDEX(SERIAL_PORT_USART7)] = IO_TAG(UART7_TX_PIN);
|
||||
#endif
|
||||
break;
|
||||
case SERIAL_PORT_USART8:
|
||||
#ifdef USE_UART8
|
||||
pSerialPinConfig->ioTagRx[SERIAL_PORT_IDENTIFIER_TO_RESOURCE_INDEX(SERIAL_PORT_USART8)] = IO_TAG(UART8_RX_PIN);
|
||||
pSerialPinConfig->ioTagTx[SERIAL_PORT_IDENTIFIER_TO_RESOURCE_INDEX(SERIAL_PORT_USART8)] = IO_TAG(UART8_TX_PIN);
|
||||
#endif
|
||||
break;
|
||||
case SERIAL_PORT_SOFTSERIAL1:
|
||||
#ifdef USE_SOFTSERIAL1
|
||||
pSerialPinConfig->ioTagRx[SERIAL_PORT_IDENTIFIER_TO_RESOURCE_INDEX(SERIAL_PORT_SOFTSERIAL1)] = IO_TAG(SOFTSERIAL1_RX_PIN);
|
||||
pSerialPinConfig->ioTagTx[SERIAL_PORT_IDENTIFIER_TO_RESOURCE_INDEX(SERIAL_PORT_SOFTSERIAL1)] = IO_TAG(SOFTSERIAL1_TX_PIN);
|
||||
#endif
|
||||
break;
|
||||
case SERIAL_PORT_SOFTSERIAL2:
|
||||
#ifdef USE_SOFTSERIAL2
|
||||
pSerialPinConfig->ioTagRx[SERIAL_PORT_IDENTIFIER_TO_RESOURCE_INDEX(SERIAL_PORT_SOFTSERIAL2)] = IO_TAG(SOFTSERIAL2_RX_PIN);
|
||||
pSerialPinConfig->ioTagTx[SERIAL_PORT_IDENTIFIER_TO_RESOURCE_INDEX(SERIAL_PORT_SOFTSERIAL2)] = IO_TAG(SOFTSERIAL2_TX_PIN);
|
||||
#endif
|
||||
break;
|
||||
case SERIAL_PORT_USB_VCP:
|
||||
break;
|
||||
case SERIAL_PORT_NONE:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef SWAP_SERIAL_PORT_0_AND_1_DEFAULTS
|
||||
#define FIRST_PORT_INDEX 1
|
||||
#define SECOND_PORT_INDEX 0
|
||||
|
@ -693,6 +862,7 @@ void createDefaultConfig(master_t *config)
|
|||
#else
|
||||
config->rxConfig.serialrx_provider = 0;
|
||||
#endif
|
||||
config->rxConfig.halfDuplex = 0;
|
||||
config->rxConfig.rx_spi_protocol = RX_SPI_DEFAULT_PROTOCOL;
|
||||
config->rxConfig.sbus_inversion = 1;
|
||||
config->rxConfig.spektrum_sat_bind = 0;
|
||||
|
@ -716,7 +886,7 @@ void createDefaultConfig(master_t *config)
|
|||
config->rxConfig.rcInterpolationChannels = 0;
|
||||
config->rxConfig.rcInterpolationInterval = 19;
|
||||
config->rxConfig.fpvCamAngleDegrees = 0;
|
||||
config->rxConfig.max_aux_channel = MAX_AUX_CHANNELS;
|
||||
config->rxConfig.max_aux_channel = DEFAULT_AUX_CHANNEL_COUNT;
|
||||
config->rxConfig.airModeActivateThreshold = 1350;
|
||||
|
||||
resetAllRxChannelRangeConfigurations(config->rxConfig.channelRanges);
|
||||
|
@ -752,6 +922,8 @@ void createDefaultConfig(master_t *config)
|
|||
config->gpsConfig.autoBaud = GPS_AUTOBAUD_OFF;
|
||||
#endif
|
||||
|
||||
resetSerialPinConfig(&config->serialPinConfig);
|
||||
|
||||
resetSerialConfig(&config->serialConfig);
|
||||
|
||||
resetProfile(&config->profile[0]);
|
||||
|
@ -1017,7 +1189,7 @@ void validateAndFixGyroConfig(void)
|
|||
#endif
|
||||
} else {
|
||||
#if defined(STM32F1)
|
||||
gyroConfigMutable()->gyro_sync_denom = MAX(gyroConfig()->gyro_sync_denom, 4);
|
||||
gyroConfigMutable()->gyro_sync_denom = MAX(gyroConfig()->gyro_sync_denom, 3);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
@ -400,7 +400,7 @@ void processRx(timeUs_t currentTimeUs)
|
|||
LED1_OFF;
|
||||
}
|
||||
|
||||
#ifdef MAG
|
||||
#if defined(ACC) || defined(MAG)
|
||||
if (sensors(SENSOR_ACC) || sensors(SENSOR_MAG)) {
|
||||
if (IS_RC_MODE_ACTIVE(BOXMAG)) {
|
||||
if (!FLIGHT_MODE(MAG_MODE)) {
|
||||
|
|
|
@ -427,7 +427,7 @@ void init(void)
|
|||
LED1_OFF;
|
||||
|
||||
// gyro.targetLooptime set in sensorsAutodetect(), so we are ready to call pidSetTargetLooptime()
|
||||
pidSetTargetLooptime((gyro.targetLooptime + LOOPTIME_SUSPEND_TIME) * pidConfig()->pid_process_denom); // Initialize pid looptime
|
||||
pidSetTargetLooptime(gyro.targetLooptime * pidConfig()->pid_process_denom); // Initialize pid looptime
|
||||
pidInitFilters(¤tProfile->pidProfile);
|
||||
pidInitConfig(¤tProfile->pidProfile);
|
||||
|
||||
|
|
|
@ -55,6 +55,7 @@
|
|||
#define EXTERNAL_DSHOT_CONVERSION_OFFSET 977
|
||||
#define EXTERNAL_CONVERSION_MIN_VALUE 1000
|
||||
#define EXTERNAL_CONVERSION_MAX_VALUE 2000
|
||||
#define EXTERNAL_CONVERSION_3D_MID_VALUE 1500
|
||||
|
||||
static uint8_t motorCount;
|
||||
static float motorMixRange;
|
||||
|
@ -538,6 +539,14 @@ uint16_t convertExternalToMotor(uint16_t externalValue)
|
|||
#ifdef USE_DSHOT
|
||||
if (isMotorProtocolDshot()) {
|
||||
motorValue = externalValue <= EXTERNAL_CONVERSION_MIN_VALUE ? DSHOT_DISARM_COMMAND : constrain((externalValue - EXTERNAL_DSHOT_CONVERSION_OFFSET) * EXTERNAL_DSHOT_CONVERSION_FACTOR, DSHOT_MIN_THROTTLE, DSHOT_MAX_THROTTLE);
|
||||
|
||||
if (feature(FEATURE_3D)) {
|
||||
if (externalValue == EXTERNAL_CONVERSION_3D_MID_VALUE) {
|
||||
motorValue = DSHOT_DISARM_COMMAND;
|
||||
} else if (motorValue >= DSHOT_MIN_THROTTLE && motorValue <= DSHOT_3D_DEADBAND_LOW) {
|
||||
motorValue = DSHOT_MIN_THROTTLE + (DSHOT_3D_DEADBAND_LOW - motorValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -549,7 +558,15 @@ uint16_t convertMotorToExternal(uint16_t motorValue)
|
|||
uint16_t externalValue = motorValue;
|
||||
#ifdef USE_DSHOT
|
||||
if (isMotorProtocolDshot()) {
|
||||
if (feature(FEATURE_3D) && motorValue >= DSHOT_MIN_THROTTLE && motorValue <= DSHOT_3D_DEADBAND_LOW) {
|
||||
motorValue = DSHOT_MIN_THROTTLE + (DSHOT_3D_DEADBAND_LOW - motorValue);
|
||||
}
|
||||
|
||||
externalValue = motorValue < DSHOT_MIN_THROTTLE ? EXTERNAL_CONVERSION_MIN_VALUE : constrain((motorValue / EXTERNAL_DSHOT_CONVERSION_FACTOR) + EXTERNAL_DSHOT_CONVERSION_OFFSET, EXTERNAL_CONVERSION_MIN_VALUE + 1, EXTERNAL_CONVERSION_MAX_VALUE);
|
||||
|
||||
if (feature(FEATURE_3D) && motorValue == DSHOT_DISARM_COMMAND) {
|
||||
externalValue = EXTERNAL_CONVERSION_3D_MID_VALUE;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
@ -99,9 +99,11 @@ void pidInitFilters(const pidProfile_t *pidProfile)
|
|||
static firFilterDenoise_t denoisingFilter[2];
|
||||
static pt1Filter_t pt1FilterYaw;
|
||||
|
||||
uint32_t pidFrequencyNyquist = (1.0f / dT) / 2; // No rounding needed
|
||||
|
||||
BUILD_BUG_ON(FD_YAW != 2); // only setting up Dterm filters on roll and pitch axes, so ensure yaw axis is 2
|
||||
|
||||
if (pidProfile->dterm_notch_hz == 0) {
|
||||
if (pidProfile->dterm_notch_hz == 0 || pidProfile->dterm_notch_hz > pidFrequencyNyquist) {
|
||||
dtermNotchFilterApplyFn = nullFilterApply;
|
||||
} else {
|
||||
dtermNotchFilterApplyFn = (filterApplyFnPtr)biquadFilterApply;
|
||||
|
@ -112,7 +114,7 @@ void pidInitFilters(const pidProfile_t *pidProfile)
|
|||
}
|
||||
}
|
||||
|
||||
if (pidProfile->dterm_lpf_hz == 0) {
|
||||
if (pidProfile->dterm_lpf_hz == 0 || pidProfile->dterm_lpf_hz > pidFrequencyNyquist) {
|
||||
dtermLpfApplyFn = nullFilterApply;
|
||||
} else {
|
||||
switch (pidProfile->dterm_filter_type) {
|
||||
|
@ -143,7 +145,7 @@ void pidInitFilters(const pidProfile_t *pidProfile)
|
|||
}
|
||||
}
|
||||
|
||||
if (pidProfile->yaw_lpf_hz == 0) {
|
||||
if (pidProfile->yaw_lpf_hz == 0 || pidProfile->yaw_lpf_hz > pidFrequencyNyquist) {
|
||||
ptermYawFilterApplyFn = nullFilterApply;
|
||||
} else {
|
||||
ptermYawFilterApplyFn = (filterApplyFnPtr)pt1FilterApply;
|
||||
|
@ -163,7 +165,7 @@ void pidInitConfig(const pidProfile_t *pidProfile) {
|
|||
Ki[axis] = ITERM_SCALE * pidProfile->I8[axis];
|
||||
Kd[axis] = DTERM_SCALE * pidProfile->D8[axis];
|
||||
}
|
||||
dtermSetpointWeight = pidProfile->dtermSetpointWeight / 100.0f;
|
||||
dtermSetpointWeight = pidProfile->dtermSetpointWeight / 127.0f;
|
||||
relaxFactor = 1.0f / (pidProfile->setpointRelaxRatio / 100.0f);
|
||||
levelGain = pidProfile->P8[PIDLEVEL] / 10.0f;
|
||||
horizonGain = pidProfile->I8[PIDLEVEL] / 10.0f;
|
||||
|
|
|
@ -90,6 +90,7 @@ PG_REGISTER_WITH_RESET_FN(specialColorIndexes_t, specialColors, PG_SPECIAL_COLOR
|
|||
|
||||
static bool ledStripInitialised = false;
|
||||
static bool ledStripEnabled = true;
|
||||
static ledStripConfig_t * currentLedStripConfig;
|
||||
|
||||
static void ledStripDisable(void);
|
||||
|
||||
|
@ -140,13 +141,12 @@ const hsvColor_t hsv[] = {
|
|||
// macro to save typing on default colors
|
||||
#define HSV(color) (hsv[COLOR_ ## color])
|
||||
|
||||
STATIC_UNIT_TESTED uint8_t ledGridWidth;
|
||||
STATIC_UNIT_TESTED uint8_t ledGridHeight;
|
||||
STATIC_UNIT_TESTED uint8_t ledGridRows;
|
||||
// grid offsets
|
||||
STATIC_UNIT_TESTED uint8_t highestYValueForNorth;
|
||||
STATIC_UNIT_TESTED uint8_t lowestYValueForSouth;
|
||||
STATIC_UNIT_TESTED uint8_t highestXValueForWest;
|
||||
STATIC_UNIT_TESTED uint8_t lowestXValueForEast;
|
||||
STATIC_UNIT_TESTED int8_t highestYValueForNorth;
|
||||
STATIC_UNIT_TESTED int8_t lowestYValueForSouth;
|
||||
STATIC_UNIT_TESTED int8_t highestXValueForWest;
|
||||
STATIC_UNIT_TESTED int8_t lowestXValueForEast;
|
||||
|
||||
STATIC_UNIT_TESTED ledCounts_t ledCounts;
|
||||
|
||||
|
@ -177,27 +177,41 @@ static int scaledAux;
|
|||
|
||||
static void updateLedRingCounts(void);
|
||||
|
||||
STATIC_UNIT_TESTED void determineLedStripDimensions(void)
|
||||
STATIC_UNIT_TESTED void updateDimensions(void)
|
||||
{
|
||||
int maxX = 0;
|
||||
int minX = LED_XY_MASK;
|
||||
int maxY = 0;
|
||||
int minY = LED_XY_MASK;
|
||||
|
||||
for (int ledIndex = 0; ledIndex < ledCounts.count; ledIndex++) {
|
||||
const ledConfig_t *ledConfig = &ledStripConfig()->ledConfigs[ledIndex];
|
||||
const ledConfig_t *ledConfig = ¤tLedStripConfig->ledConfigs[ledIndex];
|
||||
|
||||
maxX = MAX(ledGetX(ledConfig), maxX);
|
||||
maxY = MAX(ledGetY(ledConfig), maxY);
|
||||
int ledX = ledGetX(ledConfig);
|
||||
maxX = MAX(ledX, maxX);
|
||||
minX = MIN(ledX, minX);
|
||||
int ledY = ledGetY(ledConfig);
|
||||
maxY = MAX(ledY, maxY);
|
||||
minY = MIN(ledY, minY);
|
||||
}
|
||||
|
||||
ledGridRows = maxY - minY + 1;
|
||||
|
||||
if (minX < maxX) {
|
||||
lowestXValueForEast = (minX + maxX) / 2 + 1;
|
||||
highestXValueForWest = (minX + maxX - 1) / 2;
|
||||
} else {
|
||||
lowestXValueForEast = LED_XY_MASK / 2;
|
||||
highestXValueForWest = lowestXValueForEast - 1;
|
||||
}
|
||||
if (minY < maxY) {
|
||||
lowestYValueForSouth = (minY + maxY) / 2 + 1;
|
||||
highestYValueForNorth = (minY + maxY - 1) / 2;
|
||||
} else {
|
||||
lowestYValueForSouth = LED_XY_MASK / 2;
|
||||
highestYValueForNorth = lowestYValueForSouth - 1;
|
||||
}
|
||||
ledGridWidth = maxX + 1;
|
||||
ledGridHeight = maxY + 1;
|
||||
}
|
||||
|
||||
STATIC_UNIT_TESTED void determineOrientationLimits(void)
|
||||
{
|
||||
highestYValueForNorth = MAX((ledGridHeight / 2) - 1, 0);
|
||||
lowestYValueForSouth = (ledGridHeight + 1) / 2;
|
||||
highestXValueForWest = MAX((ledGridWidth / 2) - 1, 0);
|
||||
lowestXValueForEast = (ledGridWidth + 1) / 2;
|
||||
}
|
||||
|
||||
STATIC_UNIT_TESTED void updateLedCount(void)
|
||||
|
@ -205,7 +219,7 @@ STATIC_UNIT_TESTED void updateLedCount(void)
|
|||
int count = 0, countRing = 0, countScanner= 0;
|
||||
|
||||
for (int ledIndex = 0; ledIndex < LED_MAX_STRIP_LENGTH; ledIndex++) {
|
||||
const ledConfig_t *ledConfig = &ledStripConfig()->ledConfigs[ledIndex];
|
||||
const ledConfig_t *ledConfig = ¤tLedStripConfig->ledConfigs[ledIndex];
|
||||
|
||||
if (!(*ledConfig))
|
||||
break;
|
||||
|
@ -227,15 +241,14 @@ STATIC_UNIT_TESTED void updateLedCount(void)
|
|||
void reevaluateLedConfig(void)
|
||||
{
|
||||
updateLedCount();
|
||||
determineLedStripDimensions();
|
||||
determineOrientationLimits();
|
||||
updateDimensions();
|
||||
updateLedRingCounts();
|
||||
}
|
||||
|
||||
// get specialColor by index
|
||||
static const hsvColor_t* getSC(ledSpecialColorIds_e index)
|
||||
static hsvColor_t* getSC(ledSpecialColorIds_e index)
|
||||
{
|
||||
return &ledStripConfig()->colors[ledStripConfig()->specialColors.color[index]];
|
||||
return ¤tLedStripConfig->colors[currentLedStripConfig->specialColors.color[index]];
|
||||
}
|
||||
|
||||
static const char directionCodes[LED_DIRECTION_COUNT] = { 'N', 'E', 'S', 'W', 'U', 'D' };
|
||||
|
@ -259,7 +272,7 @@ bool parseLedStripConfig(int ledIndex, const char *config)
|
|||
};
|
||||
static const char chunkSeparators[PARSE_STATE_COUNT] = {',', ':', ':', ':', '\0'};
|
||||
|
||||
ledConfig_t *ledConfig = &ledStripConfigMutable()->ledConfigs[ledIndex];
|
||||
ledConfig_t *ledConfig = ¤tLedStripConfig->ledConfigs[ledIndex];
|
||||
memset(ledConfig, 0, sizeof(ledConfig_t));
|
||||
|
||||
int x = 0, y = 0, color = 0; // initialize to prevent warnings
|
||||
|
@ -366,19 +379,11 @@ typedef enum {
|
|||
QUADRANT_SOUTH = 1 << 1,
|
||||
QUADRANT_EAST = 1 << 2,
|
||||
QUADRANT_WEST = 1 << 3,
|
||||
QUADRANT_NORTH_EAST = 1 << 4,
|
||||
QUADRANT_SOUTH_EAST = 1 << 5,
|
||||
QUADRANT_NORTH_WEST = 1 << 6,
|
||||
QUADRANT_SOUTH_WEST = 1 << 7,
|
||||
QUADRANT_NONE = 1 << 8,
|
||||
QUADRANT_NOTDIAG = 1 << 9, // not in NE/SE/NW/SW
|
||||
// values for test
|
||||
QUADRANT_ANY = QUADRANT_NORTH | QUADRANT_SOUTH | QUADRANT_EAST | QUADRANT_WEST | QUADRANT_NONE,
|
||||
} quadrant_e;
|
||||
|
||||
static quadrant_e getLedQuadrant(const int ledIndex)
|
||||
{
|
||||
const ledConfig_t *ledConfig = &ledStripConfig()->ledConfigs[ledIndex];
|
||||
const ledConfig_t *ledConfig = ¤tLedStripConfig->ledConfigs[ledIndex];
|
||||
|
||||
int x = ledGetX(ledConfig);
|
||||
int y = ledGetY(ledConfig);
|
||||
|
@ -393,43 +398,20 @@ static quadrant_e getLedQuadrant(const int ledIndex)
|
|||
else if (x <= highestXValueForWest)
|
||||
quad |= QUADRANT_WEST;
|
||||
|
||||
if ((quad & (QUADRANT_NORTH | QUADRANT_SOUTH))
|
||||
&& (quad & (QUADRANT_EAST | QUADRANT_WEST)) ) { // is led in one of NE/SE/NW/SW?
|
||||
quad |= 1 << (4 + ((quad & QUADRANT_SOUTH) ? 1 : 0) + ((quad & QUADRANT_WEST) ? 2 : 0));
|
||||
} else {
|
||||
quad |= QUADRANT_NOTDIAG;
|
||||
}
|
||||
|
||||
if ((quad & (QUADRANT_NORTH | QUADRANT_SOUTH | QUADRANT_EAST | QUADRANT_WEST)) == 0)
|
||||
quad |= QUADRANT_NONE;
|
||||
|
||||
return quad;
|
||||
}
|
||||
|
||||
static const struct {
|
||||
uint8_t dir; // ledDirectionId_e
|
||||
uint16_t quadrantMask; // quadrant_e
|
||||
} directionQuadrantMap[] = {
|
||||
{LED_DIRECTION_SOUTH, QUADRANT_SOUTH},
|
||||
{LED_DIRECTION_NORTH, QUADRANT_NORTH},
|
||||
{LED_DIRECTION_EAST, QUADRANT_EAST},
|
||||
{LED_DIRECTION_WEST, QUADRANT_WEST},
|
||||
{LED_DIRECTION_DOWN, QUADRANT_ANY},
|
||||
{LED_DIRECTION_UP, QUADRANT_ANY},
|
||||
};
|
||||
|
||||
static const hsvColor_t* getDirectionalModeColor(const int ledIndex, const modeColorIndexes_t *modeColors)
|
||||
static hsvColor_t* getDirectionalModeColor(const int ledIndex, const modeColorIndexes_t *modeColors)
|
||||
{
|
||||
const ledConfig_t *ledConfig = &ledStripConfig()->ledConfigs[ledIndex];
|
||||
const ledConfig_t *ledConfig = ¤tLedStripConfig->ledConfigs[ledIndex];
|
||||
const int ledDirection = ledGetDirection(ledConfig);
|
||||
|
||||
quadrant_e quad = getLedQuadrant(ledIndex);
|
||||
for (unsigned i = 0; i < ARRAYLEN(directionQuadrantMap); i++) {
|
||||
ledDirectionId_e dir = directionQuadrantMap[i].dir;
|
||||
quadrant_e quadMask = directionQuadrantMap[i].quadrantMask;
|
||||
|
||||
if (ledGetDirectionBit(ledConfig, dir) && (quad & quadMask))
|
||||
return &ledStripConfig()->colors[modeColors->color[dir]];
|
||||
for (unsigned i = 0; i < LED_DIRECTION_COUNT; i++) {
|
||||
if (ledDirection & (1 << i)) {
|
||||
return ¤tLedStripConfig->colors[modeColors->color[i]];
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -454,7 +436,7 @@ static const struct {
|
|||
static void applyLedFixedLayers()
|
||||
{
|
||||
for (int ledIndex = 0; ledIndex < ledCounts.count; ledIndex++) {
|
||||
const ledConfig_t *ledConfig = &ledStripConfig()->ledConfigs[ledIndex];
|
||||
const ledConfig_t *ledConfig = ¤tLedStripConfig->ledConfigs[ledIndex];
|
||||
hsvColor_t color = *getSC(LED_SCOLOR_BACKGROUND);
|
||||
|
||||
int fn = ledGetFunction(ledConfig);
|
||||
|
@ -462,13 +444,13 @@ static void applyLedFixedLayers()
|
|||
|
||||
switch (fn) {
|
||||
case LED_FUNCTION_COLOR:
|
||||
color = ledStripConfig()->colors[ledGetColor(ledConfig)];
|
||||
color = currentLedStripConfig->colors[ledGetColor(ledConfig)];
|
||||
break;
|
||||
|
||||
case LED_FUNCTION_FLIGHT_MODE:
|
||||
for (unsigned i = 0; i < ARRAYLEN(flightModeToLed); i++)
|
||||
if (!flightModeToLed[i].flightMode || FLIGHT_MODE(flightModeToLed[i].flightMode)) {
|
||||
const hsvColor_t *directionalColor = getDirectionalModeColor(ledIndex, &ledStripConfig()->modeColors[flightModeToLed[i].ledMode]);
|
||||
hsvColor_t *directionalColor = getDirectionalModeColor(ledIndex, ¤tLedStripConfig->modeColors[flightModeToLed[i].ledMode]);
|
||||
if (directionalColor) {
|
||||
color = *directionalColor;
|
||||
}
|
||||
|
@ -509,7 +491,7 @@ static void applyLedFixedLayers()
|
|||
static void applyLedHsv(uint32_t mask, const hsvColor_t *color)
|
||||
{
|
||||
for (int ledIndex = 0; ledIndex < ledCounts.count; ledIndex++) {
|
||||
const ledConfig_t *ledConfig = &ledStripConfig()->ledConfigs[ledIndex];
|
||||
const ledConfig_t *ledConfig = ¤tLedStripConfig->ledConfigs[ledIndex];
|
||||
if ((*ledConfig & mask) == mask)
|
||||
setLedHsv(ledIndex, color);
|
||||
}
|
||||
|
@ -597,7 +579,7 @@ static void applyLedBatteryLayer(bool updateNow, timeUs_t *timer)
|
|||
*timer += timerDelayUs;
|
||||
|
||||
if (!flash) {
|
||||
const hsvColor_t *bgc = getSC(LED_SCOLOR_BACKGROUND);
|
||||
hsvColor_t *bgc = getSC(LED_SCOLOR_BACKGROUND);
|
||||
applyLedHsv(LED_MOV_FUNCTION(LED_FUNCTION_BATTERY), bgc);
|
||||
}
|
||||
}
|
||||
|
@ -626,7 +608,7 @@ static void applyLedRssiLayer(bool updateNow, timeUs_t *timer)
|
|||
*timer += timerDelay;
|
||||
|
||||
if (!flash) {
|
||||
const hsvColor_t *bgc = getSC(LED_SCOLOR_BACKGROUND);
|
||||
hsvColor_t *bgc = getSC(LED_SCOLOR_BACKGROUND);
|
||||
applyLedHsv(LED_MOV_FUNCTION(LED_FUNCTION_RSSI), bgc);
|
||||
}
|
||||
}
|
||||
|
@ -696,18 +678,18 @@ static void applyLedIndicatorLayer(bool updateNow, timeUs_t *timer)
|
|||
|
||||
quadrant_e quadrants = 0;
|
||||
if (rcCommand[ROLL] > INDICATOR_DEADBAND) {
|
||||
quadrants |= QUADRANT_NORTH_EAST | QUADRANT_SOUTH_EAST;
|
||||
quadrants |= QUADRANT_EAST;
|
||||
} else if (rcCommand[ROLL] < -INDICATOR_DEADBAND) {
|
||||
quadrants |= QUADRANT_NORTH_WEST | QUADRANT_SOUTH_WEST;
|
||||
quadrants |= QUADRANT_WEST;
|
||||
}
|
||||
if (rcCommand[PITCH] > INDICATOR_DEADBAND) {
|
||||
quadrants |= QUADRANT_NORTH_EAST | QUADRANT_NORTH_WEST;
|
||||
quadrants |= QUADRANT_NORTH;
|
||||
} else if (rcCommand[PITCH] < -INDICATOR_DEADBAND) {
|
||||
quadrants |= QUADRANT_SOUTH_EAST | QUADRANT_SOUTH_WEST;
|
||||
quadrants |= QUADRANT_SOUTH;
|
||||
}
|
||||
|
||||
for (int ledIndex = 0; ledIndex < ledCounts.count; ledIndex++) {
|
||||
const ledConfig_t *ledConfig = &ledStripConfig()->ledConfigs[ledIndex];
|
||||
const ledConfig_t *ledConfig = ¤tLedStripConfig->ledConfigs[ledIndex];
|
||||
if (ledGetOverlayBit(ledConfig, LED_OVERLAY_INDICATOR)) {
|
||||
if (getLedQuadrant(ledIndex) & quadrants)
|
||||
setLedHsv(ledIndex, flashColor);
|
||||
|
@ -747,7 +729,7 @@ static void applyLedThrustRingLayer(bool updateNow, timeUs_t *timer)
|
|||
}
|
||||
|
||||
for (int ledIndex = 0; ledIndex < ledCounts.count; ledIndex++) {
|
||||
const ledConfig_t *ledConfig = &ledStripConfig()->ledConfigs[ledIndex];
|
||||
const ledConfig_t *ledConfig = ¤tLedStripConfig->ledConfigs[ledIndex];
|
||||
if (ledGetFunction(ledConfig) == LED_FUNCTION_THRUST_RING) {
|
||||
|
||||
bool applyColor;
|
||||
|
@ -758,7 +740,7 @@ static void applyLedThrustRingLayer(bool updateNow, timeUs_t *timer)
|
|||
}
|
||||
|
||||
if (applyColor) {
|
||||
const hsvColor_t *ringColor = &ledStripConfig()->colors[ledGetColor(ledConfig)];
|
||||
const hsvColor_t *ringColor = ¤tLedStripConfig->colors[ledGetColor(ledConfig)];
|
||||
setLedHsv(ledIndex, ringColor);
|
||||
}
|
||||
|
||||
|
@ -860,7 +842,7 @@ static void applyLedBlinkLayer(bool updateNow, timeUs_t *timer)
|
|||
static void applyLedAnimationLayer(bool updateNow, timeUs_t *timer)
|
||||
{
|
||||
static uint8_t frameCounter = 0;
|
||||
const int animationFrames = ledGridHeight;
|
||||
const int animationFrames = ledGridRows;
|
||||
if(updateNow) {
|
||||
frameCounter = (frameCounter + 1 < animationFrames) ? frameCounter + 1 : 0;
|
||||
*timer += HZ_TO_US(20);
|
||||
|
@ -874,7 +856,7 @@ static void applyLedAnimationLayer(bool updateNow, timeUs_t *timer)
|
|||
int nextRow = (frameCounter + 1 < animationFrames) ? frameCounter + 1 : 0;
|
||||
|
||||
for (int ledIndex = 0; ledIndex < ledCounts.count; ledIndex++) {
|
||||
const ledConfig_t *ledConfig = &ledStripConfig()->ledConfigs[ledIndex];
|
||||
const ledConfig_t *ledConfig = ¤tLedStripConfig->ledConfigs[ledIndex];
|
||||
|
||||
if (ledGetY(ledConfig) == previousRow) {
|
||||
setLedHsv(ledIndex, getSC(LED_SCOLOR_ANIMATION));
|
||||
|
@ -936,7 +918,7 @@ void ledStripUpdate(timeUs_t currentTimeUs)
|
|||
return;
|
||||
}
|
||||
|
||||
if (IS_RC_MODE_ACTIVE(BOXLEDLOW) && !(ledStripConfig()->ledstrip_visual_beeper && isBeeperOn())) {
|
||||
if (IS_RC_MODE_ACTIVE(BOXLEDLOW) && !(currentLedStripConfig->ledstrip_visual_beeper && isBeeperOn())) {
|
||||
if (ledStripEnabled) {
|
||||
ledStripDisable();
|
||||
ledStripEnabled = false;
|
||||
|
@ -967,7 +949,7 @@ void ledStripUpdate(timeUs_t currentTimeUs)
|
|||
// apply all layers; triggered timed functions has to update timers
|
||||
|
||||
scaledThrottle = ARMING_FLAG(ARMED) ? scaleRange(rcData[THROTTLE], PWM_RANGE_MIN, PWM_RANGE_MAX, 0, 100) : 0;
|
||||
scaledAux = scaleRange(rcData[ledStripConfig()->ledstrip_aux_channel], PWM_RANGE_MIN, PWM_RANGE_MAX, 0, HSV_HUE_MAX + 1);
|
||||
scaledAux = scaleRange(rcData[currentLedStripConfig->ledstrip_aux_channel], PWM_RANGE_MIN, PWM_RANGE_MAX, 0, HSV_HUE_MAX + 1);
|
||||
|
||||
applyLedFixedLayers();
|
||||
|
||||
|
@ -983,7 +965,7 @@ bool parseColor(int index, const char *colorConfig)
|
|||
{
|
||||
const char *remainingCharacters = colorConfig;
|
||||
|
||||
hsvColor_t *color = &ledStripConfigMutable()->colors[index];
|
||||
hsvColor_t *color = ¤tLedStripConfig->colors[index];
|
||||
|
||||
bool result = true;
|
||||
static const uint16_t hsv_limit[HSV_COLOR_COMPONENT_COUNT] = {
|
||||
|
@ -1036,15 +1018,15 @@ bool setModeColor(ledModeIndex_e modeIndex, int modeColorIndex, int colorIndex)
|
|||
if (modeIndex < LED_MODE_COUNT) { // modeIndex_e is unsigned, so one-sided test is enough
|
||||
if(modeColorIndex < 0 || modeColorIndex >= LED_DIRECTION_COUNT)
|
||||
return false;
|
||||
ledStripConfigMutable()->modeColors[modeIndex].color[modeColorIndex] = colorIndex;
|
||||
currentLedStripConfig->modeColors[modeIndex].color[modeColorIndex] = colorIndex;
|
||||
} else if (modeIndex == LED_SPECIAL) {
|
||||
if (modeColorIndex < 0 || modeColorIndex >= LED_SPECIAL_COLOR_COUNT)
|
||||
return false;
|
||||
ledStripConfigMutable()->specialColors.color[modeColorIndex] = colorIndex;
|
||||
currentLedStripConfig->specialColors.color[modeColorIndex] = colorIndex;
|
||||
} else if (modeIndex == LED_AUX_CHANNEL) {
|
||||
if (modeColorIndex < 0 || modeColorIndex >= 1)
|
||||
return false;
|
||||
ledStripConfigMutable()->ledstrip_aux_channel = colorIndex;
|
||||
currentLedStripConfig->ledstrip_aux_channel = colorIndex;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
|
@ -1112,10 +1094,13 @@ void ledStripInit()
|
|||
|
||||
void ledStripEnable(void)
|
||||
{
|
||||
if (currentLedStripConfig == NULL) {
|
||||
return;
|
||||
}
|
||||
reevaluateLedConfig();
|
||||
ledStripInitialised = true;
|
||||
|
||||
ws2811LedStripInit(ledStripConfig()->ioTag);
|
||||
ws2811LedStripInit(currentLedStripConfig->ioTag);
|
||||
}
|
||||
|
||||
static void ledStripDisable(void)
|
||||
|
|
|
@ -327,7 +327,7 @@ static void osdDrawSingleElement(uint8_t item)
|
|||
pitchAngle = (pitchAngle / 8) - 41; // 41 = 4 * 9 + 5
|
||||
|
||||
for (int8_t x = -4; x <= 4; x++) {
|
||||
int y = (rollAngle * x) / 64;
|
||||
int y = (-rollAngle * x) / 64;
|
||||
y -= pitchAngle;
|
||||
// y += 41; // == 4 * 9 + 5
|
||||
if (y >= 0 && y <= 81) {
|
||||
|
|
|
@ -353,14 +353,12 @@ serialPort_t *openSerialPort(
|
|||
#endif
|
||||
#ifdef USE_SOFTSERIAL1
|
||||
case SERIAL_PORT_SOFTSERIAL1:
|
||||
serialPort = openSoftSerial(SOFTSERIAL1, rxCallback, baudRate, options);
|
||||
serialSetMode(serialPort, mode);
|
||||
serialPort = openSoftSerial(SOFTSERIAL1, rxCallback, baudRate, mode, options);
|
||||
break;
|
||||
#endif
|
||||
#ifdef USE_SOFTSERIAL2
|
||||
case SERIAL_PORT_SOFTSERIAL2:
|
||||
serialPort = openSoftSerial(SOFTSERIAL2, rxCallback, baudRate, options);
|
||||
serialSetMode(serialPort, mode);
|
||||
serialPort = openSoftSerial(SOFTSERIAL2, rxCallback, baudRate, mode, options);
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
|
|
|
@ -85,6 +85,8 @@ typedef enum {
|
|||
|
||||
extern const serialPortIdentifier_e serialPortIdentifiers[SERIAL_PORT_COUNT];
|
||||
|
||||
#define SERIAL_PORT_IDENTIFIER_TO_RESOURCE_INDEX(x) (((x) <= SERIAL_PORT_USART8) ? (x) : (RESOURCE_SOFT_OFFSET + ((x) - SERIAL_PORT_SOFTSERIAL1)))
|
||||
|
||||
//
|
||||
// runtime
|
||||
//
|
||||
|
|
|
@ -236,7 +236,13 @@ bool crsfRxInit(const rxConfig_t *rxConfig, rxRuntimeConfig_t *rxRuntimeConfig)
|
|||
return false;
|
||||
}
|
||||
|
||||
serialPort = openSerialPort(portConfig->identifier, FUNCTION_RX_SERIAL, crsfDataReceive, CRSF_BAUDRATE, CRSF_PORT_MODE, CRSF_PORT_OPTIONS);
|
||||
serialPort = openSerialPort(portConfig->identifier,
|
||||
FUNCTION_RX_SERIAL,
|
||||
crsfDataReceive,
|
||||
CRSF_BAUDRATE,
|
||||
CRSF_PORT_MODE,
|
||||
CRSF_PORT_OPTIONS | (rxConfig->halfDuplex ? SERIAL_BIDIR : 0)
|
||||
);
|
||||
|
||||
return serialPort != NULL;
|
||||
}
|
||||
|
|
|
@ -167,7 +167,13 @@ bool ibusInit(const rxConfig_t *rxConfig, rxRuntimeConfig_t *rxRuntimeConfig)
|
|||
bool portShared = false;
|
||||
#endif
|
||||
|
||||
serialPort_t *ibusPort = openSerialPort(portConfig->identifier, FUNCTION_RX_SERIAL, ibusDataReceive, IBUS_BAUDRATE, portShared ? MODE_RXTX : MODE_RX, SERIAL_NOT_INVERTED);
|
||||
serialPort_t *ibusPort = openSerialPort(portConfig->identifier,
|
||||
FUNCTION_RX_SERIAL,
|
||||
ibusDataReceive,
|
||||
IBUS_BAUDRATE,
|
||||
portShared ? MODE_RXTX : MODE_RX,
|
||||
SERIAL_NOT_INVERTED | (rxConfig->halfDuplex ? SERIAL_BIDIR : 0)
|
||||
);
|
||||
|
||||
#ifdef TELEMETRY
|
||||
if (portShared) {
|
||||
|
|
|
@ -601,7 +601,13 @@ bool jetiExBusInit(const rxConfig_t *rxConfig, rxRuntimeConfig_t *rxRuntimeConfi
|
|||
return false;
|
||||
}
|
||||
|
||||
jetiExBusPort = openSerialPort(portConfig->identifier, FUNCTION_RX_SERIAL, jetiExBusDataReceive, JETIEXBUS_BAUDRATE, MODE_RXTX, JETIEXBUS_OPTIONS );
|
||||
jetiExBusPort = openSerialPort(portConfig->identifier,
|
||||
FUNCTION_RX_SERIAL,
|
||||
jetiExBusDataReceive,
|
||||
JETIEXBUS_BAUDRATE,
|
||||
MODE_RXTX,
|
||||
JETIEXBUS_OPTIONS | (rxConfig->halfDuplex ? SERIAL_BIDIR : 0)
|
||||
);
|
||||
serialSetMode(jetiExBusPort, MODE_RX);
|
||||
return jetiExBusPort != NULL;
|
||||
}
|
||||
|
|
|
@ -119,7 +119,8 @@ typedef struct rxConfig_s {
|
|||
uint8_t rcmap[MAX_MAPPABLE_RX_INPUTS]; // mapping of radio channels to internal RPYTA+ order
|
||||
uint8_t serialrx_provider; // type of UART-based receiver (0 = spek 10, 1 = spek 11, 2 = sbus). Must be enabled by FEATURE_RX_SERIAL first.
|
||||
uint8_t sbus_inversion; // default sbus (Futaba, FrSKY) is inverted. Support for uninverted OpenLRS (and modified FrSKY) receivers.
|
||||
uint8_t rx_spi_protocol; // type of nrf24 protocol (0 = v202 250kbps). Must be enabled by FEATURE_RX_NRF24 first.
|
||||
uint8_t halfDuplex; // allow rx to operate in half duplex mode on F4, ignored for F1 and F3.
|
||||
uint8_t rx_spi_protocol; // type of nrf24 protocol (0 = v202 250kbps). Must be enabled by FEATURE_RX_NRF24 first.
|
||||
uint32_t rx_spi_id;
|
||||
uint8_t rx_spi_rf_channel_count;
|
||||
uint8_t spektrum_sat_bind; // number of bind pulses for Spektrum satellite receivers
|
||||
|
|
|
@ -248,8 +248,13 @@ bool sbusInit(const rxConfig_t *rxConfig, rxRuntimeConfig_t *rxRuntimeConfig)
|
|||
bool portShared = false;
|
||||
#endif
|
||||
|
||||
portOptions_t options = (rxConfig->sbus_inversion) ? (SBUS_PORT_OPTIONS | SERIAL_INVERTED) : SBUS_PORT_OPTIONS;
|
||||
serialPort_t *sBusPort = openSerialPort(portConfig->identifier, FUNCTION_RX_SERIAL, sbusDataReceive, SBUS_BAUDRATE, portShared ? MODE_RXTX : MODE_RX, options);
|
||||
serialPort_t *sBusPort = openSerialPort(portConfig->identifier,
|
||||
FUNCTION_RX_SERIAL,
|
||||
sbusDataReceive,
|
||||
SBUS_BAUDRATE,
|
||||
portShared ? MODE_RXTX : MODE_RX,
|
||||
SBUS_PORT_OPTIONS | (rxConfig->sbus_inversion ? SERIAL_INVERTED : 0) | (rxConfig->halfDuplex ? SERIAL_BIDIR : 0)
|
||||
);
|
||||
|
||||
#ifdef TELEMETRY
|
||||
if (portShared) {
|
||||
|
|
|
@ -303,7 +303,8 @@ bool spektrumInit(const rxConfig_t *rxConfig, rxRuntimeConfig_t *rxRuntimeConfig
|
|||
spektrumDataReceive,
|
||||
SPEKTRUM_BAUDRATE,
|
||||
portShared || srxlEnabled ? MODE_RXTX : MODE_RX,
|
||||
SERIAL_NOT_INVERTED | (srxlEnabled ? SERIAL_BIDIR : 0));
|
||||
SERIAL_NOT_INVERTED | ((srxlEnabled || rxConfig->halfDuplex) ? SERIAL_BIDIR : 0)
|
||||
);
|
||||
|
||||
#ifdef TELEMETRY
|
||||
if (portShared) {
|
||||
|
|
|
@ -179,7 +179,13 @@ bool sumdInit(const rxConfig_t *rxConfig, rxRuntimeConfig_t *rxRuntimeConfig)
|
|||
bool portShared = false;
|
||||
#endif
|
||||
|
||||
serialPort_t *sumdPort = openSerialPort(portConfig->identifier, FUNCTION_RX_SERIAL, sumdDataReceive, SUMD_BAUDRATE, portShared ? MODE_RXTX : MODE_RX, SERIAL_NOT_INVERTED);
|
||||
serialPort_t *sumdPort = openSerialPort(portConfig->identifier,
|
||||
FUNCTION_RX_SERIAL,
|
||||
sumdDataReceive,
|
||||
SUMD_BAUDRATE,
|
||||
portShared ? MODE_RXTX : MODE_RX,
|
||||
SERIAL_NOT_INVERTED | (rxConfig->halfDuplex ? SERIAL_BIDIR : 0)
|
||||
);
|
||||
|
||||
#ifdef TELEMETRY
|
||||
if (portShared) {
|
||||
|
|
|
@ -329,7 +329,13 @@ bool xBusInit(const rxConfig_t *rxConfig, rxRuntimeConfig_t *rxRuntimeConfig)
|
|||
bool portShared = false;
|
||||
#endif
|
||||
|
||||
serialPort_t *xBusPort = openSerialPort(portConfig->identifier, FUNCTION_RX_SERIAL, xBusDataReceive, baudRate, portShared ? MODE_RXTX : MODE_RX, SERIAL_NOT_INVERTED);
|
||||
serialPort_t *xBusPort = openSerialPort(portConfig->identifier,
|
||||
FUNCTION_RX_SERIAL,
|
||||
xBusDataReceive,
|
||||
baudRate,
|
||||
portShared ? MODE_RXTX : MODE_RX,
|
||||
SERIAL_NOT_INVERTED | (rxConfig->halfDuplex ? SERIAL_BIDIR : 0)
|
||||
);
|
||||
|
||||
#ifdef TELEMETRY
|
||||
if (portShared) {
|
||||
|
|
|
@ -319,7 +319,9 @@ void gyroInitFilters(void)
|
|||
notchFilter1ApplyFn = nullFilterApply;
|
||||
notchFilter2ApplyFn = nullFilterApply;
|
||||
|
||||
if (gyroConfig()->gyro_soft_lpf_hz) { // Initialisation needs to happen once samplingrate is known
|
||||
uint32_t gyroFrequencyNyquist = (1.0f / (gyro.targetLooptime * 0.000001f)) / 2; // No rounding needed
|
||||
|
||||
if (gyroConfig()->gyro_soft_lpf_hz && gyroConfig()->gyro_soft_lpf_hz <= gyroFrequencyNyquist) { // Initialisation needs to happen once samplingrate is known
|
||||
if (gyroConfig()->gyro_soft_lpf_type == FILTER_BIQUAD) {
|
||||
softLpfFilterApplyFn = (filterApplyFnPtr)biquadFilterApply;
|
||||
for (int axis = 0; axis < 3; axis++) {
|
||||
|
@ -342,7 +344,7 @@ void gyroInitFilters(void)
|
|||
}
|
||||
}
|
||||
|
||||
if (gyroConfig()->gyro_soft_notch_hz_1) {
|
||||
if (gyroConfig()->gyro_soft_notch_hz_1 && gyroConfig()->gyro_soft_notch_hz_1 <= gyroFrequencyNyquist) {
|
||||
notchFilter1ApplyFn = (filterApplyFnPtr)biquadFilterApply;
|
||||
const float gyroSoftNotchQ1 = filterGetNotchQ(gyroConfig()->gyro_soft_notch_hz_1, gyroConfig()->gyro_soft_notch_cutoff_1);
|
||||
for (int axis = 0; axis < 3; axis++) {
|
||||
|
@ -350,7 +352,7 @@ void gyroInitFilters(void)
|
|||
biquadFilterInit(notchFilter1[axis], gyroConfig()->gyro_soft_notch_hz_1, gyro.targetLooptime, gyroSoftNotchQ1, FILTER_NOTCH);
|
||||
}
|
||||
}
|
||||
if (gyroConfig()->gyro_soft_notch_hz_2) {
|
||||
if (gyroConfig()->gyro_soft_notch_hz_2 && gyroConfig()->gyro_soft_notch_hz_2 <= gyroFrequencyNyquist) {
|
||||
notchFilter2ApplyFn = (filterApplyFnPtr)biquadFilterApply;
|
||||
const float gyroSoftNotchQ2 = filterGetNotchQ(gyroConfig()->gyro_soft_notch_hz_2, gyroConfig()->gyro_soft_notch_cutoff_2);
|
||||
for (int axis = 0; axis < 3; axis++) {
|
||||
|
|
|
@ -60,7 +60,9 @@
|
|||
#define USE_UART1
|
||||
#define USE_UART2
|
||||
#define USE_UART3
|
||||
#define SERIAL_PORT_COUNT 4
|
||||
#define USE_SOFTSERIAL1
|
||||
#define USE_SOFTSERIAL2
|
||||
#define SERIAL_PORT_COUNT 6
|
||||
|
||||
#define USE_ESCSERIAL
|
||||
#define ESCSERIAL_TIMER_TX_HARDWARE 0 // PWM 1
|
||||
|
|
|
@ -63,12 +63,11 @@
|
|||
#define USE_ESCSERIAL
|
||||
#define ESCSERIAL_TIMER_TX_HARDWARE 0 // PWM 1
|
||||
|
||||
#define SOFTSERIAL_1_TIMER TIM3
|
||||
#define SOFTSERIAL_1_TIMER_RX_HARDWARE 4 // PWM 5
|
||||
#define SOFTSERIAL_1_TIMER_TX_HARDWARE 5 // PWM 6
|
||||
#define SOFTSERIAL_2_TIMER TIM3
|
||||
#define SOFTSERIAL_2_TIMER_RX_HARDWARE 6 // PWM 7
|
||||
#define SOFTSERIAL_2_TIMER_TX_HARDWARE 7 // PWM 8
|
||||
#define SOFTSERIAL1_RX_PIN PA6 // PWM 5
|
||||
#define SOFTSERIAL1_TX_PIN PA7 // PWM 6
|
||||
|
||||
#define SOFTSERIAL2_RX_PIN PB6 // PWM 7
|
||||
#define SOFTSERIAL2_TX_PIN PB1 // PWM 8
|
||||
|
||||
#define UART1_TX_PIN PA9
|
||||
#define UART1_RX_PIN PA10
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
|
||||
#include <platform.h>
|
||||
|
||||
#ifdef TARGET_CONFIG
|
||||
#include "drivers/pwm_esc_detect.h"
|
||||
#include "drivers/pwm_output.h"
|
||||
|
||||
|
@ -62,3 +63,4 @@ void targetConfiguration(master_t *config)
|
|||
config->customMotorMixer[6] = (motorMixer_t){ 1.0f, -1.0f, 0.414178f, 1.0f }; // MIDREAR_R
|
||||
config->customMotorMixer[7] = (motorMixer_t){ 1.0f, 1.0f, 0.414178f, -1.0f }; // MIDREAR_L
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -45,7 +45,9 @@
|
|||
#define USE_UART1
|
||||
#define USE_UART2
|
||||
#define USE_UART3
|
||||
#define SERIAL_PORT_COUNT 3
|
||||
#define USE_SOFTSERIAL1
|
||||
#define USE_SOFTSERIAL2
|
||||
#define SERIAL_PORT_COUNT 5
|
||||
|
||||
#define UART3_RX_PIN PB11
|
||||
#define UART3_TX_PIN PB10
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
|
||||
#include <platform.h>
|
||||
|
||||
#ifdef TARGET_CONFIG
|
||||
#include "common/axis.h"
|
||||
|
||||
#include "drivers/compass.h"
|
||||
|
@ -105,3 +106,4 @@ void targetConfiguration(master_t *config)
|
|||
config->customMotorMixer[6] = (motorMixer_t){ 1.0f, -1.0f, 0.414178f, 1.0f }; // MIDREAR_R
|
||||
config->customMotorMixer[7] = (motorMixer_t){ 1.0f, 1.0f, 0.414178f, -1.0f }; // MIDREAR_L
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -70,7 +70,11 @@
|
|||
#define USE_UART1 // Not connected - TX (PB6) RX PB7 (AF7)
|
||||
#define USE_UART2 // Receiver - RX (PA3)
|
||||
#define USE_UART3 // Not connected - 10/RX (PB11) 11/TX (PB10)
|
||||
#define SERIAL_PORT_COUNT 4
|
||||
#define USE_SOFTSERIAL1
|
||||
#define USE_SOFTSERIAL2
|
||||
|
||||
#define SERIAL_PORT_COUNT 6
|
||||
|
||||
#define AVOID_UART2_FOR_PWM_PPM
|
||||
|
||||
#define USE_ESCSERIAL
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
|
||||
#include <platform.h>
|
||||
|
||||
#ifdef TARGET_CONFIG
|
||||
#include "common/axis.h"
|
||||
|
||||
#include "drivers/sensor.h"
|
||||
|
@ -96,3 +97,4 @@ void targetConfiguration(master_t *config)
|
|||
config->customMotorMixer[6] = (motorMixer_t){ 1.0f, -1.0f, 0.414178f, 1.0f }; // MIDREAR_R
|
||||
config->customMotorMixer[7] = (motorMixer_t){ 1.0f, 1.0f, 0.414178f, -1.0f }; // MIDREAR_L
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -121,7 +121,10 @@
|
|||
//#define UART5_RX_PIN PD2
|
||||
//#define UART5_TX_PIN PC12
|
||||
|
||||
#define SERIAL_PORT_COUNT 4
|
||||
#define USE_SOFTSERIAL1
|
||||
#define USE_SOFTSERIAL2
|
||||
|
||||
#define SERIAL_PORT_COUNT 6
|
||||
|
||||
#define USE_ESCSERIAL
|
||||
#define ESCSERIAL_TIMER_TX_HARDWARE 0 // PWM 1
|
||||
|
|
|
@ -94,7 +94,10 @@
|
|||
#define UART8_RX_PIN PE0
|
||||
#define UART8_TX_PIN PE1
|
||||
|
||||
#define SERIAL_PORT_COUNT 9 //VCP, USART1, USART2, USART3, UART4, UART5, USART6, USART7, USART8
|
||||
#define USE_SOFTSERIAL1
|
||||
#define USE_SOFTSERIAL2
|
||||
|
||||
#define SERIAL_PORT_COUNT 11 //VCP, USART1, USART2, USART3, UART4, UART5, USART6, USART7, USART8, SOFTSERIAL x 2
|
||||
|
||||
#define USE_SPI
|
||||
#define USE_SPI_DEVICE_1
|
||||
|
|
|
@ -20,11 +20,12 @@
|
|||
|
||||
#include <platform.h>
|
||||
|
||||
#ifdef TARGET_CONFIG
|
||||
#include "config/config_master.h"
|
||||
#include "config/feature.h"
|
||||
|
||||
void targetConfiguration(master_t *config)
|
||||
{
|
||||
config->batteryConfig.currentMeterScale = 235;
|
||||
config->batteryConfig.currentMeterScale = 220;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -55,8 +55,10 @@
|
|||
#define USE_UART1
|
||||
#define USE_UART2
|
||||
#define USE_UART3
|
||||
#define USE_SOFTSERIAL1
|
||||
#define USE_SOFTSERIAL2
|
||||
#define SERIAL_PORT_COUNT 5
|
||||
|
||||
#define SERIAL_PORT_COUNT 6
|
||||
|
||||
#define USE_ESCSERIAL
|
||||
#define ESCSERIAL_TIMER_TX_HARDWARE 0 // PWM 1
|
||||
|
@ -70,9 +72,8 @@
|
|||
#define UART3_TX_PIN PB10
|
||||
#define UART3_RX_PIN PB11
|
||||
|
||||
#define SOFTSERIAL_2_TIMER TIM3
|
||||
#define SOFTSERIAL_2_TIMER_RX_HARDWARE 6 // PWM 5
|
||||
#define SOFTSERIAL_2_TIMER_TX_HARDWARE 7 // PWM 6
|
||||
#define SOFTSERIAL1_RX_PIN PB0 // PWM 5
|
||||
#define SOFTSERIAL1_TX_PIN PB1 // PWM 6
|
||||
|
||||
#undef USE_I2C
|
||||
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
|
||||
#include <platform.h>
|
||||
|
||||
#ifdef TARGET_CONFIG
|
||||
#include "blackbox/blackbox_io.h"
|
||||
|
||||
#include "config/config_master.h"
|
||||
|
@ -58,3 +59,4 @@ void targetValidateConfiguration(master_t *config)
|
|||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -113,19 +113,16 @@
|
|||
#define UART6_TX_PIN PC6
|
||||
|
||||
#define USE_SOFTSERIAL1
|
||||
#define SERIAL_PORT_COUNT 5
|
||||
#define SOFTSERIAL1_RX_PIN PB0 // PWM5
|
||||
#define SOFTSERIAL1_TX_PIN PB1 // PWM6
|
||||
|
||||
#define USE_SOFTSERIAL2
|
||||
|
||||
#define SERIAL_PORT_COUNT 6
|
||||
|
||||
#define USE_ESCSERIAL
|
||||
#define ESCSERIAL_TIMER_TX_HARDWARE 0 // PWM 1
|
||||
|
||||
#define SOFTSERIAL_1_TIMER TIM3
|
||||
#define SOFTSERIAL_1_TIMER_RX_HARDWARE 4 // PWM 5
|
||||
#define SOFTSERIAL_1_TIMER_TX_HARDWARE 5 // PWM 6
|
||||
|
||||
|
||||
#define USE_ESCSERIAL
|
||||
#define ESCSERIAL_TIMER_TX_HARDWARE 0
|
||||
|
||||
#define USE_SPI
|
||||
|
||||
#define USE_SPI_DEVICE_1
|
||||
|
|
|
@ -71,22 +71,20 @@
|
|||
#define USE_VCP
|
||||
#define USE_UART1
|
||||
#define USE_UART3
|
||||
|
||||
#ifdef CC3D_OPBL
|
||||
#define SERIAL_PORT_COUNT 3
|
||||
#else
|
||||
#define USE_SOFTSERIAL1
|
||||
#define SERIAL_PORT_COUNT 4
|
||||
#define USE_SOFTSERIAL2
|
||||
|
||||
#define SERIAL_PORT_COUNT 5
|
||||
|
||||
#ifndef CC3D_OPBL
|
||||
#define SOFTSERIAL1_TX_PIN PB5 // PWM 2
|
||||
#define SOFTSERIAL1_RX_PIN PB0 // PWM 3
|
||||
#endif
|
||||
|
||||
#ifdef USE_UART1_RX_DMA
|
||||
#undef USE_UART1_RX_DMA
|
||||
#endif
|
||||
|
||||
#define SOFTSERIAL_1_TIMER TIM3
|
||||
#define SOFTSERIAL_1_TIMER_TX_HARDWARE 1 // PWM 2
|
||||
#define SOFTSERIAL_1_TIMER_RX_HARDWARE 2 // PWM 3
|
||||
|
||||
#define UART3_RX_PIN PB11
|
||||
#define UART3_TX_PIN PB10
|
||||
|
||||
|
|
|
@ -91,7 +91,10 @@
|
|||
#define USE_VCP
|
||||
#define USE_UART1
|
||||
#define USE_UART2
|
||||
#define SERIAL_PORT_COUNT 3
|
||||
#define USE_SOFTSERIAL1
|
||||
#define USE_SOFTSERIAL2
|
||||
|
||||
#define SERIAL_PORT_COUNT 5
|
||||
|
||||
#define USE_ESCSERIAL
|
||||
#define ESCSERIAL_TIMER_TX_HARDWARE 0 // PWM 1
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
|
||||
#include "platform.h"
|
||||
|
||||
#ifdef TARGET_CONFIG
|
||||
#include "drivers/serial.h"
|
||||
|
||||
#include "fc/rc_controls.h"
|
||||
|
@ -35,7 +36,6 @@
|
|||
#include "config/config_profile.h"
|
||||
#include "config/config_master.h"
|
||||
|
||||
|
||||
// alternative defaults settings for Colibri/Gemini targets
|
||||
void targetConfiguration(master_t *config)
|
||||
{
|
||||
|
@ -54,3 +54,4 @@ void targetConfiguration(master_t *config)
|
|||
config->profile[0].controlRateProfile[0].tpa_breakpoint = 1700;
|
||||
config->serialConfig.portConfigs[2].functionMask = FUNCTION_RX_SERIAL;
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -93,7 +93,10 @@
|
|||
#define UART5_RX_PIN PD2
|
||||
#define UART5_TX_PIN PC12
|
||||
|
||||
#define SERIAL_PORT_COUNT 4 //VCP, UART1, UART2, UART3
|
||||
#define USE_SOFTSERIAL1
|
||||
#define USE_SOFTSERIAL2
|
||||
|
||||
#define SERIAL_PORT_COUNT 6 //VCP, UART1, UART2, UART3, SOFTSERIAL x 2
|
||||
|
||||
#define USE_ESCSERIAL
|
||||
#define ESCSERIAL_TIMER_TX_HARDWARE 0 // PWM 1
|
||||
|
|
|
@ -20,6 +20,8 @@
|
|||
|
||||
#include <platform.h>
|
||||
|
||||
#ifdef TARGET_CONFIG
|
||||
|
||||
#include "common/maths.h"
|
||||
#include "common/utils.h"
|
||||
|
||||
|
@ -98,7 +100,6 @@ void targetConfiguration(master_t *config)
|
|||
config->profile[0].controlRateProfile[0].rates[FD_YAW] = 80;
|
||||
|
||||
targetApplyDefaultLedStripConfig(config->ledStripConfig.ledConfigs);
|
||||
|
||||
}
|
||||
|
||||
void targetValidateConfiguration(master_t *config)
|
||||
|
@ -111,4 +112,5 @@ void targetValidateConfiguration(master_t *config)
|
|||
featureClear(FEATURE_RX_MSP);
|
||||
featureSet(FEATURE_RX_PPM);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -81,7 +81,10 @@
|
|||
#define USE_UART1
|
||||
#define USE_UART2
|
||||
#define USE_UART3
|
||||
#define SERIAL_PORT_COUNT 4
|
||||
#define USE_SOFTSERIAL1
|
||||
#define USE_SOFTSERIAL2
|
||||
|
||||
#define SERIAL_PORT_COUNT 6
|
||||
|
||||
#define USE_ESCSERIAL
|
||||
#define ESCSERIAL_TIMER_TX_HARDWARE 0 // PWM 1
|
||||
|
|
|
@ -96,7 +96,10 @@
|
|||
#define USE_UART1
|
||||
#define USE_UART2
|
||||
#define USE_UART3
|
||||
#define SERIAL_PORT_COUNT 4
|
||||
#define USE_SOFTSERIAL1
|
||||
#define USE_SOFTSERIAL2
|
||||
|
||||
#define SERIAL_PORT_COUNT 6
|
||||
|
||||
#define USE_ESCSERIAL
|
||||
#define ESCSERIAL_TIMER_TX_HARDWARE 0 // PWM 1
|
||||
|
|
|
@ -76,7 +76,10 @@
|
|||
//#define UART5_RX_PIN PD2
|
||||
//#define UART5_TX_PIN PC12
|
||||
|
||||
#define SERIAL_PORT_COUNT 3
|
||||
#define USE_SOFTSERIAL1
|
||||
#define USE_SOFTSERIAL2
|
||||
|
||||
#define SERIAL_PORT_COUNT 5
|
||||
|
||||
#define USE_SPI
|
||||
|
||||
|
|
|
@ -100,7 +100,10 @@
|
|||
#define UART6_RX_PIN PC7
|
||||
#define UART6_TX_PIN PC6
|
||||
|
||||
#define SERIAL_PORT_COUNT 6 //VCP, UART1, UART2, UART3, UART4, UART5, UART6
|
||||
#define USE_SOFTSERIAL1
|
||||
#define USE_SOFTSERIAL2
|
||||
|
||||
#define SERIAL_PORT_COUNT 8 //VCP, UART1, UART2, UART3, UART4, UART6, SOFTSERIAL x 2
|
||||
|
||||
#define USE_ESCSERIAL
|
||||
#define ESCSERIAL_TIMER_TX_HARDWARE 8 // PWM 9
|
||||
|
|
|
@ -66,7 +66,10 @@
|
|||
#define UART6_RX_PIN PC7
|
||||
#define UART6_TX_PIN PC6
|
||||
|
||||
#define SERIAL_PORT_COUNT 4 // VCP, USART1, USART3, USART6
|
||||
#define USE_SOFTSERIAL1
|
||||
#define USE_SOFTSERIAL2
|
||||
|
||||
#define SERIAL_PORT_COUNT 6 // VCP, USART1, USART3, USART6, SOFTSERIAL x 2
|
||||
|
||||
#define USE_ESCSERIAL
|
||||
#define ESCSERIAL_TIMER_TX_HARDWARE 0 // PWM 1
|
||||
|
|
|
@ -115,7 +115,9 @@
|
|||
#define USE_UART2
|
||||
#define USE_UART3
|
||||
#define USE_SOFTSERIAL1
|
||||
#define SERIAL_PORT_COUNT 5
|
||||
#define USE_SOFTSERIAL2
|
||||
|
||||
#define SERIAL_PORT_COUNT 6
|
||||
|
||||
#define USE_ESCSERIAL
|
||||
#define ESCSERIAL_TIMER_TX_HARDWARE 0 // PWM 1
|
||||
|
@ -129,9 +131,8 @@
|
|||
#define UART3_TX_PIN PB10 // PB10 (AF7)
|
||||
#define UART3_RX_PIN PB11 // PB11 (AF7)
|
||||
|
||||
#define SOFTSERIAL_1_TIMER TIM3
|
||||
#define SOFTSERIAL_1_TIMER_RX_HARDWARE 1
|
||||
#define SOFTSERIAL_1_TIMER_TX_HARDWARE 2
|
||||
#define SOFTSERIAL1_RX_PIN PB0
|
||||
#define SOFTSERIAL1_TX_PIN PB1
|
||||
|
||||
#define USE_I2C
|
||||
#define I2C_DEVICE (I2CDEV_1) // SDA (PB9/AF4), SCL (PB8/AF4)
|
||||
|
|
|
@ -130,7 +130,10 @@
|
|||
#define UART6_RX_PIN PC7
|
||||
#define UART6_TX_PIN PC6
|
||||
|
||||
#define SERIAL_PORT_COUNT 4 //VCP, USART1, USART3, USART6
|
||||
#define USE_SOFTSERIAL1
|
||||
#define USE_SOFTSERIAL2
|
||||
|
||||
#define SERIAL_PORT_COUNT 6 //VCP, USART1, USART3, USART6, SOFTSERIAL x 2
|
||||
|
||||
#define USE_ESCSERIAL
|
||||
#define ESCSERIAL_TIMER_TX_HARDWARE 0 // PWM 1
|
||||
|
|
|
@ -118,7 +118,10 @@
|
|||
#define UART6_RX_PIN PC7
|
||||
#define UART6_TX_PIN PC6
|
||||
|
||||
#define SERIAL_PORT_COUNT 4 //VCP, USART1, USART3, USART6
|
||||
#define USE_SOFTSERIAL1
|
||||
#define USE_SOFTSERIAL2
|
||||
|
||||
#define SERIAL_PORT_COUNT 6 //VCP, USART1, USART3, USART6, SOFTSERIAL x 2
|
||||
|
||||
#define USE_I2C
|
||||
#define I2C_DEVICE (I2CDEV_1) // PB6-SCL, PB7-SDA
|
||||
|
|
|
@ -54,7 +54,10 @@
|
|||
#define USE_UART1
|
||||
#define USE_UART2
|
||||
#define USE_UART3
|
||||
#define SERIAL_PORT_COUNT 4
|
||||
#define USE_SOFTSERIAL1
|
||||
#define USE_SOFTSERIAL2
|
||||
|
||||
#define SERIAL_PORT_COUNT 6
|
||||
|
||||
#define USE_ESCSERIAL
|
||||
#define ESCSERIAL_TIMER_TX_HARDWARE 0 // PWM 1
|
||||
|
|
|
@ -45,7 +45,10 @@
|
|||
#define USE_UART1
|
||||
#define USE_UART2
|
||||
#define USE_UART3
|
||||
#define SERIAL_PORT_COUNT 3
|
||||
#define USE_SOFTSERIAL1
|
||||
#define USE_SOFTSERIAL2
|
||||
|
||||
#define SERIAL_PORT_COUNT 5
|
||||
|
||||
#define USE_ESCSERIAL
|
||||
#define ESCSERIAL_TIMER_TX_HARDWARE 0 // PWM 1
|
||||
|
|
|
@ -73,12 +73,11 @@
|
|||
#define UART3_TX_PIN PB10 // PB10 (AF7)
|
||||
#define UART3_RX_PIN PB11 // PB11 (AF7)
|
||||
|
||||
#define SOFTSERIAL_1_TIMER TIM3
|
||||
#define SOFTSERIAL_1_TIMER_RX_HARDWARE 4 // PWM 5
|
||||
#define SOFTSERIAL_1_TIMER_TX_HARDWARE 5 // PWM 6
|
||||
#define SOFTSERIAL_2_TIMER TIM3
|
||||
#define SOFTSERIAL_2_TIMER_RX_HARDWARE 6 // PWM 7
|
||||
#define SOFTSERIAL_2_TIMER_TX_HARDWARE 7 // PWM 8
|
||||
#define SOFTSERIAL1_RX_PIN PB4 // PWM 5
|
||||
#define SOFTSERIAL1_TX_PIN PB5 // PWM 6
|
||||
|
||||
#define SOFTSERIAL2_RX_PIN PB0 // PWM 7
|
||||
#define SOFTSERIAL2_TX_PIN PB1 // PWM 8
|
||||
|
||||
#define USE_I2C
|
||||
#define I2C_DEVICE (I2CDEV_1) // PB6/SCL, PB7/SDA
|
||||
|
|
|
@ -23,18 +23,6 @@
|
|||
#include "drivers/timer.h"
|
||||
#include "drivers/timer_def.h"
|
||||
|
||||
/*
|
||||
const timerHardware_t timerHardware[USABLE_TIMER_CHANNEL_COUNT] = {
|
||||
{ TIM8, IO_TAG(PC7), TIM_Channel_2, 0, GPIO_AF_TIM8, NULL, 0, 0 }, // PPM IN
|
||||
{ TIM3, IO_TAG(PB0), TIM_Channel_3, 1, GPIO_AF_TIM3, DMA1_Stream7, DMA_Channel_5, DMA1_ST7_HANDLER }, // S1_OUT
|
||||
{ TIM3, IO_TAG(PB1), TIM_Channel_4, 1, GPIO_AF_TIM3, DMA1_Stream2, DMA_Channel_5, DMA1_ST2_HANDLER }, // S2_OUT
|
||||
{ TIM2, IO_TAG(PA3), TIM_Channel_4, 1, GPIO_AF_TIM2, DMA1_Stream6, DMA_Channel_3, DMA1_ST6_HANDLER }, // S3_OUT
|
||||
{ TIM2, IO_TAG(PA2), TIM_Channel_3, 1, GPIO_AF_TIM2, DMA1_Stream1, DMA_Channel_3, DMA1_ST1_HANDLER }, // S4_OUT
|
||||
{ TIM5, IO_TAG(PA1), TIM_Channel_2, 1, GPIO_AF_TIM5, DMA1_Stream4, DMA_Channel_6, DMA1_ST4_HANDLER }, // S5_OUT
|
||||
{ TIM8, IO_TAG(PC8), TIM_Channel_3, 1, GPIO_AF_TIM8, DMA2_Stream4, DMA_Channel_7, DMA2_ST4_HANDLER }, // S6_OUT
|
||||
};
|
||||
*/
|
||||
|
||||
const timerHardware_t timerHardware[USABLE_TIMER_CHANNEL_COUNT] = {
|
||||
DEF_TIM(TIM8, CH2, PC7, TIM_USE_PPM, TIMER_INPUT_ENABLED, 0), // PPM IN
|
||||
DEF_TIM(TIM3, CH3, PB0, TIM_USE_MOTOR, TIMER_OUTPUT_ENABLED, 0), // S1_OUT - DMA1_ST7
|
||||
|
@ -43,4 +31,5 @@ const timerHardware_t timerHardware[USABLE_TIMER_CHANNEL_COUNT] = {
|
|||
DEF_TIM(TIM2, CH3, PA2, TIM_USE_MOTOR, TIMER_OUTPUT_ENABLED, 0), // S4_OUT - DMA1_ST1
|
||||
DEF_TIM(TIM5, CH2, PA1, TIM_USE_MOTOR, TIMER_OUTPUT_ENABLED, 0), // S5_OUT - DMA1_ST4
|
||||
DEF_TIM(TIM8, CH3, PC8, TIM_USE_MOTOR, TIMER_OUTPUT_ENABLED, 1), // S6_OUT - DMA2_ST4
|
||||
DEF_TIM(TIM5, CH1, PA0, TIM_USE_LED, TIMER_OUTPUT_ENABLED, 0), // LED_STRIP - DMA1_ST2
|
||||
};
|
|
@ -91,7 +91,10 @@
|
|||
#define UART6_RX_PIN PC7
|
||||
#define UART6_TX_PIN PC6
|
||||
|
||||
#define SERIAL_PORT_COUNT 4
|
||||
#define USE_SOFTSERIAL1
|
||||
#define USE_SOFTSERIAL2
|
||||
|
||||
#define SERIAL_PORT_COUNT 6
|
||||
|
||||
#define USE_ESCSERIAL
|
||||
#define ESCSERIAL_TIMER_TX_HARDWARE 0 // PWM 1
|
||||
|
@ -126,7 +129,6 @@
|
|||
#define RSSI_ADC_CHANNEL ADC_Channel_11
|
||||
|
||||
#define LED_STRIP
|
||||
#define LED_STRIP_TIMER TIM5
|
||||
|
||||
#define DEFAULT_FEATURES (FEATURE_BLACKBOX | FEATURE_OSD)
|
||||
#define DEFAULT_RX_FEATURE FEATURE_RX_SERIAL
|
||||
|
@ -139,6 +141,6 @@
|
|||
#define TARGET_IO_PORTB 0xffff
|
||||
#define TARGET_IO_PORTC 0xffff
|
||||
|
||||
#define USABLE_TIMER_CHANNEL_COUNT 7
|
||||
#define USABLE_TIMER_CHANNEL_COUNT 8
|
||||
#define USED_TIMERS ( TIM_N(2) | TIM_N(3) | TIM_N(5) | TIM_N(8))
|
||||
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
|
||||
#include <platform.h>
|
||||
|
||||
#ifdef TARGET_CONFIG
|
||||
#include "common/utils.h"
|
||||
|
||||
#include "drivers/io.h"
|
||||
|
@ -37,7 +38,6 @@
|
|||
|
||||
#include "sensors/boardalignment.h"
|
||||
|
||||
|
||||
void targetConfiguration(master_t *config)
|
||||
{
|
||||
UNUSED(config);
|
||||
|
@ -49,4 +49,4 @@ void targetConfiguration(master_t *config)
|
|||
config->boardAlignment.yawDegrees = 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -32,21 +32,18 @@ const timerHardware_t timerHardware[USABLE_TIMER_CHANNEL_COUNT] = {
|
|||
DEF_TIM(TIM1, CH1, PA8, TIM_USE_MOTOR, TIMER_OUTPUT_ENABLED),
|
||||
DEF_TIM(TIM3, CH1, PA6, TIM_USE_MOTOR, TIMER_OUTPUT_ENABLED),
|
||||
DEF_TIM(TIM17,CH1, PA7, TIM_USE_MOTOR, TIMER_OUTPUT_ENABLED),
|
||||
DEF_TIM(TIM2, CH2, PB3, TIM_USE_PWM | TIM_USE_PPM, TIMER_INPUT_ENABLED),
|
||||
DEF_TIM(TIM2, CH1, PA15, TIM_USE_PWM, TIMER_INPUT_ENABLED),
|
||||
DEF_TIM(TIM2, CH3, PA2, TIM_USE_PWM, TIMER_INPUT_ENABLED),
|
||||
DEF_TIM(TIM2, CH4, PB11, TIM_USE_PWM, TIMER_INPUT_ENABLED),
|
||||
//DEF_TIM(TIM16,CH1N,PA13, TIM_USE_PWM, TIMER_INPUT_ENABLED), // KISSCC bidirectional softserial needs to be added
|
||||
DEF_TIM(TIM16,CH1N,PA13, TIM_USE_PWM, TIMER_INPUT_ENABLED),
|
||||
#else
|
||||
DEF_TIM(TIM1, CH2N,PB14, TIM_USE_MOTOR, TIMER_OUTPUT_ENABLED),
|
||||
DEF_TIM(TIM8, CH2N,PB0, TIM_USE_MOTOR, TIMER_OUTPUT_ENABLED),
|
||||
DEF_TIM(TIM15,CH1N,PB15, TIM_USE_MOTOR, TIMER_OUTPUT_ENABLED),
|
||||
DEF_TIM(TIM1, CH1, PA8, TIM_USE_MOTOR, TIMER_OUTPUT_ENABLED | TIMER_OUTPUT_INVERTED),
|
||||
DEF_TIM(TIM3, CH1, PA6, TIM_USE_MOTOR, TIMER_OUTPUT_ENABLED | TIMER_OUTPUT_INVERTED),
|
||||
DEF_TIM(TIM3, CH1, PA6, TIM_USE_MOTOR | TIM_USE_LED, TIMER_OUTPUT_ENABLED | TIMER_OUTPUT_INVERTED),
|
||||
DEF_TIM(TIM17,CH1, PA7, TIM_USE_MOTOR, TIMER_OUTPUT_ENABLED | TIMER_OUTPUT_INVERTED),
|
||||
DEF_TIM(TIM4, CH3, PA13, TIM_USE_PWM, TIMER_INPUT_ENABLED), // On KISSFC TIM16 did not work, using TIM4 works
|
||||
#endif
|
||||
DEF_TIM(TIM2, CH2, PB3, TIM_USE_PWM | TIM_USE_PPM, TIMER_INPUT_ENABLED),
|
||||
DEF_TIM(TIM2, CH1, PA15, TIM_USE_PWM, TIMER_INPUT_ENABLED),
|
||||
DEF_TIM(TIM2, CH3, PA2, TIM_USE_PWM, TIMER_INPUT_ENABLED),
|
||||
DEF_TIM(TIM2, CH4, PB11, TIM_USE_PWM, TIMER_INPUT_ENABLED),
|
||||
#endif
|
||||
};
|
||||
|
|
|
@ -56,14 +56,18 @@
|
|||
#define ACC
|
||||
#define USE_ACC_MPU6050
|
||||
#define ACC_MPU6050_ALIGN CW180_DEG
|
||||
|
||||
#define LED_STRIP
|
||||
#endif
|
||||
|
||||
#define USE_SOFTSERIAL
|
||||
#define USE_VCP
|
||||
#define USE_UART1
|
||||
#define USE_UART2
|
||||
#define USE_UART3
|
||||
#define SERIAL_PORT_COUNT 4
|
||||
#define USE_SOFTSERIAL1
|
||||
#define USE_SOFTSERIAL2
|
||||
|
||||
#define SERIAL_PORT_COUNT 6
|
||||
|
||||
#define UART1_TX_PIN PA9
|
||||
#define UART1_RX_PIN PA10
|
||||
|
@ -74,13 +78,12 @@
|
|||
#define UART3_TX_PIN PB10 // PB10 (AF7)
|
||||
#define UART3_RX_PIN PB11 // PB11 (AF7)
|
||||
|
||||
/* Fix this when Softserial is supported on single pin and add 1 more serial port
|
||||
#ifdef KISSCC
|
||||
#define SOFTSERIAL_1_TIMER TIM16
|
||||
#define SOFTSERIAL_1_TIMER_RX_HARDWARE 11
|
||||
#define SOFTSERIAL_1_TIMER_TX_HARDWARE 11
|
||||
#define SOFTSERIAL1_TX_PIN PA13
|
||||
#else
|
||||
#define SOFTSERIAL1_TX_PIN PA13 // AUX1
|
||||
#define SOFTSERIAL2_TX_PIN PA15 // ROLL
|
||||
#endif
|
||||
*/
|
||||
|
||||
#define USE_I2C
|
||||
#define I2C_DEVICE (I2CDEV_1) // PB6/SCL, PB7/SDA
|
||||
|
@ -89,7 +92,7 @@
|
|||
#define VBAT_SCALE_DEFAULT 160
|
||||
#define ADC_INSTANCE ADC1
|
||||
#define VBAT_ADC_PIN PA0
|
||||
//#define CURRENT_METER_ADC_PIN PA5
|
||||
#define CURRENT_METER_ADC_PIN PA2
|
||||
//#define RSSI_ADC_PIN PB2
|
||||
|
||||
#define DEFAULT_FEATURES FEATURE_VBAT
|
||||
|
@ -108,5 +111,5 @@
|
|||
#define TARGET_IO_PORTD 0xffff
|
||||
#define TARGET_IO_PORTF (BIT(4))
|
||||
|
||||
#define USABLE_TIMER_CHANNEL_COUNT 10
|
||||
#define USABLE_TIMER_CHANNEL_COUNT 11
|
||||
#define USED_TIMERS (TIM_N(1) | TIM_N(2) | TIM_N(3) | TIM_N(4) | TIM_N(8) | TIM_N(15) | TIM_N(16) | TIM_N(17))
|
||||
|
|
|
@ -79,7 +79,10 @@
|
|||
#define UART6_RX_PIN PC7
|
||||
#define UART6_TX_PIN PC6
|
||||
|
||||
#define SERIAL_PORT_COUNT 4 //VCP, USART1, USART3, USART6
|
||||
#define USE_SOFTSERIAL1
|
||||
#define USE_SOFTSERIAL2
|
||||
|
||||
#define SERIAL_PORT_COUNT 6 //VCP, USART1, USART3, USART6, SOFTSERIAL x 2
|
||||
|
||||
#define USE_ESCSERIAL
|
||||
#define ESCSERIAL_TIMER_TX_HARDWARE 0 // PWM 1
|
||||
|
|
|
@ -119,12 +119,14 @@
|
|||
#define USE_UART1
|
||||
#define USE_UART2
|
||||
#define USE_UART3
|
||||
#define USE_SOFTSERIAL1
|
||||
#define USE_SOFTSERIAL2
|
||||
#ifdef LUXV2_RACE
|
||||
#define USE_UART4
|
||||
#define USE_UART5
|
||||
#define SERIAL_PORT_COUNT 6
|
||||
# define USE_UART4
|
||||
# define USE_UART5
|
||||
# define SERIAL_PORT_COUNT 8
|
||||
#else
|
||||
#define SERIAL_PORT_COUNT 4
|
||||
# define SERIAL_PORT_COUNT 6
|
||||
#endif
|
||||
|
||||
#define UART1_TX_PIN PC4
|
||||
|
|
|
@ -20,12 +20,13 @@
|
|||
|
||||
#include <platform.h>
|
||||
|
||||
#ifdef TARGET_CONFIG
|
||||
#include "config/config_master.h"
|
||||
|
||||
|
||||
// Motolab target supports 2 different type of boards Tornado / Cyclone.
|
||||
void targetConfiguration(master_t *config)
|
||||
{
|
||||
config->gyroConfig.gyro_sync_denom = 4;
|
||||
config->pidConfig.pid_process_denom = 1;
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -59,7 +59,10 @@
|
|||
#define USE_UART1
|
||||
#define USE_UART2
|
||||
#define USE_UART3
|
||||
#define SERIAL_PORT_COUNT 4
|
||||
#define USE_SOFTSERIAL1
|
||||
#define USE_SOFTSERIAL2
|
||||
|
||||
#define SERIAL_PORT_COUNT 6
|
||||
|
||||
#define USE_ESCSERIAL
|
||||
#define ESCSERIAL_TIMER_TX_HARDWARE 0 // PWM 1
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
|
||||
#include <platform.h>
|
||||
|
||||
#ifdef TARGET_CONFIG
|
||||
#include "common/axis.h"
|
||||
#include "common/maths.h"
|
||||
|
||||
|
@ -84,5 +85,5 @@ void targetConfiguration(master_t *config)
|
|||
|
||||
config->profile[0].controlRateProfile[0].rcRate8 = 70;
|
||||
config->profile[0].pidProfile.I8[PIDLEVEL] = 40;
|
||||
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -64,9 +64,10 @@
|
|||
#define USE_UART1
|
||||
#define USE_UART2
|
||||
#define USE_UART3
|
||||
//#define USE_SOFTSERIAL1
|
||||
//#define USE_SOFTSERIAL2
|
||||
#define SERIAL_PORT_COUNT 3
|
||||
#define USE_SOFTSERIAL1
|
||||
#define USE_SOFTSERIAL2
|
||||
|
||||
#define SERIAL_PORT_COUNT 5
|
||||
|
||||
#define USE_ESCSERIAL
|
||||
#define ESCSERIAL_TIMER_TX_HARDWARE 0 // PWM 1
|
||||
|
@ -81,12 +82,11 @@
|
|||
#define UART3_RX_PIN PB11 // PB11 (AF7)
|
||||
|
||||
/*
|
||||
#define SOFTSERIAL_1_TIMER TIM3
|
||||
#define SOFTSERIAL_1_TIMER_RX_HARDWARE 4 // PWM 5
|
||||
#define SOFTSERIAL_1_TIMER_TX_HARDWARE 5 // PWM 6
|
||||
#define SOFTSERIAL_2_TIMER TIM3
|
||||
#define SOFTSERIAL_2_TIMER_RX_HARDWARE 6 // PWM 7
|
||||
#define SOFTSERIAL_2_TIMER_TX_HARDWARE 7 // PWM 8
|
||||
#define SOFTSERIAL1_RX_PIN PB4 // PWM 5
|
||||
#define SOFTSERIAL1_TX_PIN PB5 // PWM 6
|
||||
|
||||
#define SOFTSERIAL2_RX_PIN PB0 // PWM 7
|
||||
#define SOFTSERIAL2_TX_PIN PB1 // PWM 8
|
||||
*/
|
||||
|
||||
#define USE_I2C
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
|
||||
#include <platform.h>
|
||||
|
||||
#ifdef TARGET_CONFIG
|
||||
#include "common/utils.h"
|
||||
|
||||
#include "drivers/io.h"
|
||||
|
@ -112,3 +113,4 @@ void targetValidateConfiguration(master_t *config)
|
|||
config->accelerometerConfig.acc_hardware = ACC_NONE;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -119,12 +119,11 @@
|
|||
#define USE_SOFTSERIAL2
|
||||
#define SERIAL_PORT_COUNT 4
|
||||
|
||||
#define SOFTSERIAL_1_TIMER TIM3
|
||||
#define SOFTSERIAL_1_TIMER_RX_HARDWARE 4 // PWM 5
|
||||
#define SOFTSERIAL_1_TIMER_TX_HARDWARE 5 // PWM 6
|
||||
#define SOFTSERIAL_2_TIMER TIM3
|
||||
#define SOFTSERIAL_2_TIMER_RX_HARDWARE 6 // PWM 7
|
||||
#define SOFTSERIAL_2_TIMER_TX_HARDWARE 7 // PWM 8
|
||||
#define SOFTSERIAL1_RX_PIN PA6 // PWM 5
|
||||
#define SOFTSERIAL1_TX_PIN PA7 // PWM 6
|
||||
|
||||
#define SOFTSERIAL2_RX_PIN PB0 // PWM 7
|
||||
#define SOFTSERIAL2_TX_PIN PB1 // PWM 8
|
||||
|
||||
#define UART3_RX_PIN PB11
|
||||
#define UART3_TX_PIN PB10
|
||||
|
|
|
@ -88,7 +88,10 @@
|
|||
#define UART6_RX_PIN PC7
|
||||
#define UART6_TX_PIN PC6
|
||||
|
||||
#define SERIAL_PORT_COUNT 4
|
||||
#define USE_SOFTSERIAL1
|
||||
#define USE_SOFTSERIAL2
|
||||
|
||||
#define SERIAL_PORT_COUNT 6
|
||||
|
||||
//#define USE_ESCSERIAL //TODO: make ESC serial F7 compatible
|
||||
//#define ESCSERIAL_TIMER_TX_HARDWARE 0 // PWM 1
|
||||
|
|
|
@ -93,7 +93,10 @@
|
|||
#define UART8_RX_PIN PE0
|
||||
#define UART8_TX_PIN PE1
|
||||
|
||||
#define SERIAL_PORT_COUNT 8 //VCP, USART2, USART3, UART4, UART5, USART6, USART7, USART8
|
||||
#define USE_SOFTSERIAL1
|
||||
#define USE_SOFTSERIAL2
|
||||
|
||||
#define SERIAL_PORT_COUNT 10 //VCP, USART2, USART3, UART4, UART5, USART6, USART7, USART8, SOFTSERIAL x 2
|
||||
|
||||
#define USE_SPI
|
||||
#define USE_SPI_DEVICE_1
|
||||
|
|
|
@ -68,7 +68,10 @@
|
|||
#define USE_UART1
|
||||
#define USE_UART2
|
||||
#define USE_UART3
|
||||
#define SERIAL_PORT_COUNT 4
|
||||
#define USE_SOFTSERIAL1
|
||||
#define USE_SOFTSERIAL2
|
||||
|
||||
#define SERIAL_PORT_COUNT 6
|
||||
|
||||
#define UART1_TX_PIN PA9
|
||||
#define UART1_RX_PIN PA10
|
||||
|
@ -79,8 +82,9 @@
|
|||
#define UART3_TX_PIN PB10 // PB10 (AF7)
|
||||
#define UART3_RX_PIN PB11 // PB11 (AF7)
|
||||
|
||||
#define USE_I2C
|
||||
#define I2C_DEVICE (I2CDEV_1) // PB6/SCL, PB7/SDA
|
||||
#undef USE_I2C
|
||||
//#define USE_I2C
|
||||
//#define I2C_DEVICE (I2CDEV_1) // PB6/SCL, PB7/SDA
|
||||
|
||||
#define USE_ESCSERIAL
|
||||
#define ESCSERIAL_TIMER_TX_HARDWARE 0 // PWM 1
|
||||
|
|
|
@ -125,11 +125,14 @@
|
|||
#define UART6_RX_PIN PC7
|
||||
#define UART6_TX_PIN PC6
|
||||
|
||||
#define USE_SOFTSERIAL1
|
||||
#define USE_SOFTSERIAL2
|
||||
|
||||
#define SERIAL_PORT_COUNT 6 //VCP, USART1, USART3, USART6, SOFTSERIAL x 2
|
||||
|
||||
#define USE_ESCSERIAL
|
||||
#define ESCSERIAL_TIMER_TX_HARDWARE 0 // PWM 1
|
||||
|
||||
#define SERIAL_PORT_COUNT 4 //VCP, USART1, USART3, USART6
|
||||
|
||||
#define USE_SPI
|
||||
|
||||
#define USE_SPI_DEVICE_1
|
||||
|
@ -169,6 +172,9 @@
|
|||
|
||||
#define AVOID_UART1_FOR_PWM_PPM
|
||||
|
||||
#define SPEKTRUM_BIND
|
||||
#define BIND_PIN UART1_RX_PIN
|
||||
|
||||
#define USE_SERIAL_4WAY_BLHELI_INTERFACE
|
||||
|
||||
#define TARGET_IO_PORTA (0xffff & ~(BIT(14)|BIT(13)))
|
||||
|
|
|
@ -19,8 +19,10 @@
|
|||
|
||||
#include <platform.h>
|
||||
|
||||
#ifdef TARGET_CONFIG
|
||||
#include "config/config_master.h"
|
||||
|
||||
void targetConfiguration(master_t *config) {
|
||||
config->batteryConfig.currentMeterScale = 125;
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -51,7 +51,10 @@
|
|||
#define USE_UART1
|
||||
#define USE_UART2
|
||||
#define USE_UART3
|
||||
#define SERIAL_PORT_COUNT 4
|
||||
#define USE_SOFTSERIAL1
|
||||
#define USE_SOFTSERIAL2
|
||||
|
||||
#define SERIAL_PORT_COUNT 6
|
||||
|
||||
#define USE_ESCSERIAL
|
||||
#define ESCSERIAL_TIMER_TX_HARDWARE 0 // PWM 1
|
||||
|
|
|
@ -20,11 +20,11 @@
|
|||
|
||||
#include <platform.h>
|
||||
|
||||
#ifdef TARGET_CONFIG
|
||||
#include "rx/rx.h"
|
||||
|
||||
#include "config/config_master.h"
|
||||
|
||||
|
||||
// alternative defaults settings for COLIBRI RACE targets
|
||||
void targetConfiguration(master_t *config)
|
||||
{
|
||||
|
@ -32,3 +32,4 @@ void targetConfiguration(master_t *config)
|
|||
config->rxConfig.rssi_scale = 19;
|
||||
config->rxConfig.serialrx_provider = SERIALRX_SBUS;
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -52,7 +52,10 @@
|
|||
#define USE_UART1
|
||||
#define USE_UART2
|
||||
#define USE_UART3
|
||||
#define SERIAL_PORT_COUNT 3
|
||||
#define USE_SOFTSERIAL1
|
||||
#define USE_SOFTSERIAL2
|
||||
|
||||
#define SERIAL_PORT_COUNT 5
|
||||
|
||||
#define USE_ESCSERIAL
|
||||
#define ESCSERIAL_TIMER_TX_HARDWARE 0 // PWM 1
|
||||
|
|
|
@ -64,7 +64,10 @@
|
|||
#define USE_UART1
|
||||
#define USE_UART2
|
||||
#define USE_UART3
|
||||
#define SERIAL_PORT_COUNT 4
|
||||
#define USE_SOFTSERIAL1
|
||||
#define USE_SOFTSERIAL2
|
||||
|
||||
#define SERIAL_PORT_COUNT 6
|
||||
|
||||
#define USE_ESCSERIAL
|
||||
#define ESCSERIAL_TIMER_TX_HARDWARE 0 // PWM 1
|
||||
|
|
|
@ -157,7 +157,10 @@
|
|||
#define UART6_RX_PIN PC7
|
||||
#define UART6_TX_PIN PC6
|
||||
|
||||
#define SERIAL_PORT_COUNT 4 //VCP, USART1, USART3, USART6
|
||||
#define USE_SOFTSERIAL1
|
||||
#define USE_SOFTSERIAL2
|
||||
|
||||
#define SERIAL_PORT_COUNT 6 //VCP, USART1, USART3, USART6, SOFTSERIAL x 2
|
||||
|
||||
#define USE_ESCSERIAL
|
||||
#define ESCSERIAL_TIMER_TX_HARDWARE 0 // PWM 1
|
||||
|
@ -208,8 +211,13 @@
|
|||
|
||||
#ifdef REVOLT
|
||||
#define USABLE_TIMER_CHANNEL_COUNT 11
|
||||
#define USED_TIMERS ( TIM_N(2) | TIM_N(3) | TIM_N(4) | TIM_N(8) | TIM_N(12) )
|
||||
#else
|
||||
#define USABLE_TIMER_CHANNEL_COUNT 12
|
||||
#endif
|
||||
#ifdef AIRBOTF4
|
||||
#define USED_TIMERS ( TIM_N(1) | TIM_N(2) | TIM_N(3) | TIM_N(5) | TIM_N(8) | TIM_N(12) )
|
||||
#else
|
||||
#define USED_TIMERS ( TIM_N(2) | TIM_N(3) | TIM_N(5) | TIM_N(8) | TIM_N(12) )
|
||||
#endif // AIRBOTF4
|
||||
#endif // REVOLT
|
||||
|
||||
#define USED_TIMERS ( TIM_N(2) | TIM_N(3) | TIM_N(5) | TIM_N(12) | TIM_N(8) | TIM_N(9) )
|
||||
|
|
|
@ -64,7 +64,10 @@
|
|||
#define UART2_RX_PIN PA3
|
||||
#define UART2_TX_PIN PA2
|
||||
|
||||
#define SERIAL_PORT_COUNT 3
|
||||
#define USE_SOFTSERIAL1
|
||||
#define USE_SOFTSERIAL2
|
||||
|
||||
#define SERIAL_PORT_COUNT 5
|
||||
|
||||
#define USE_ESCSERIAL
|
||||
#define ESCSERIAL_TIMER_TX_HARDWARE 0
|
||||
|
|
|
@ -19,9 +19,11 @@
|
|||
|
||||
#include <platform.h>
|
||||
|
||||
#ifdef TARGET_CONFIG
|
||||
#include "config/config_master.h"
|
||||
|
||||
void targetConfiguration(master_t *config) {
|
||||
config->batteryConfig.vbatmaxcellvoltage = 45;
|
||||
config->batteryConfig.vbatscale = VBAT_SCALE_DEFAULT;
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -86,7 +86,10 @@
|
|||
#define USE_UART3
|
||||
#define USE_UART4
|
||||
#define USE_UART5
|
||||
#define SERIAL_PORT_COUNT 6
|
||||
#define USE_SOFTSERIAL1
|
||||
#define USE_SOFTSERIAL2
|
||||
|
||||
#define SERIAL_PORT_COUNT 8
|
||||
|
||||
#define UART1_TX_PIN PC4
|
||||
#define UART1_RX_PIN PC5
|
||||
|
|
|
@ -45,7 +45,9 @@
|
|||
#define USE_UART2 // Input - TX (NC) RX (PA15)
|
||||
#define USE_UART3 // Solder Pads - TX (PB10) RX (PB11)
|
||||
#define USE_SOFTSERIAL1 // Telemetry
|
||||
#define SERIAL_PORT_COUNT 5
|
||||
#define USE_SOFTSERIAL2
|
||||
|
||||
#define SERIAL_PORT_COUNT 6
|
||||
|
||||
#define USE_ESCSERIAL
|
||||
#define ESCSERIAL_TIMER_TX_HARDWARE 0 // PWM 1
|
||||
|
@ -59,10 +61,8 @@
|
|||
#define UART3_TX_PIN PB10
|
||||
#define UART3_RX_PIN PB11
|
||||
|
||||
|
||||
#define SOFTSERIAL_1_TIMER TIM15
|
||||
#define SOFTSERIAL_1_TIMER_RX_HARDWARE 7 //Not connected
|
||||
#define SOFTSERIAL_1_TIMER_TX_HARDWARE 8
|
||||
#define SOFTSERIAL1_RX_PIN PA2 //Not connected
|
||||
#define SOFTSERIAL1_TX_PIN PA3
|
||||
|
||||
#define USE_I2C
|
||||
#define I2C_DEVICE (I2CDEV_1) // PB6/SCL, PB7/SDA
|
||||
|
|
|
@ -59,7 +59,10 @@
|
|||
#define USE_UART1
|
||||
#define USE_UART2
|
||||
#define USE_UART3
|
||||
#define SERIAL_PORT_COUNT 4
|
||||
#define USE_SOFTSERIAL1
|
||||
#define USE_SOFTSERIAL2
|
||||
|
||||
#define SERIAL_PORT_COUNT 6
|
||||
|
||||
#define USE_ESCSERIAL
|
||||
#define ESCSERIAL_TIMER_TX_HARDWARE 0 // PWM 1
|
||||
|
|
|
@ -55,7 +55,11 @@
|
|||
#define USE_UART1 // Conn 1 - TX (PB6) RX PB7 (AF7)
|
||||
#define USE_UART2 // Input - RX (PA3)
|
||||
#define USE_UART3 // Servo out - 10/RX (PB11) 11/TX (PB10)
|
||||
#define SERIAL_PORT_COUNT 4
|
||||
#define USE_SOFTSERIAL1
|
||||
#define USE_SOFTSERIAL2
|
||||
|
||||
#define SERIAL_PORT_COUNT 6
|
||||
|
||||
#define AVOID_UART2_FOR_PWM_PPM
|
||||
|
||||
#define USE_ESCSERIAL
|
||||
|
|
|
@ -91,7 +91,10 @@
|
|||
#define UART6_RX_PIN PC7
|
||||
#define UART6_TX_PIN PC6 //inverter
|
||||
|
||||
#define SERIAL_PORT_COUNT 4
|
||||
#define USE_SOFTSERIAL1
|
||||
#define USE_SOFTSERIAL2
|
||||
|
||||
#define SERIAL_PORT_COUNT 6
|
||||
|
||||
#define USE_ESCSERIAL
|
||||
#define ESCSERIAL_TIMER_TX_HARDWARE 0 // PWM 1
|
||||
|
|
|
@ -126,21 +126,18 @@
|
|||
#define USE_UART1
|
||||
#define USE_UART2
|
||||
#define USE_UART3
|
||||
|
||||
#if defined(ZCOREF3)
|
||||
#define SERIAL_PORT_COUNT 3
|
||||
|
||||
#else
|
||||
#define USE_SOFTSERIAL1
|
||||
#define USE_SOFTSERIAL2
|
||||
|
||||
#define SERIAL_PORT_COUNT 5
|
||||
|
||||
#define SOFTSERIAL_1_TIMER TIM3
|
||||
#define SOFTSERIAL_1_TIMER_RX_HARDWARE 4 // PWM 5
|
||||
#define SOFTSERIAL_1_TIMER_TX_HARDWARE 5 // PWM 6
|
||||
#define SOFTSERIAL_2_TIMER TIM3
|
||||
#define SOFTSERIAL_2_TIMER_RX_HARDWARE 6 // PWM 7
|
||||
#define SOFTSERIAL_2_TIMER_TX_HARDWARE 7 // PWM 8
|
||||
#if !defined(ZCOREF3)
|
||||
#define SOFTSERIAL1_RX_PIN PB4 // PWM 5
|
||||
#define SOFTSERIAL1_TX_PIN PB5 // PWM 6
|
||||
|
||||
#define SOFTSERIAL2_RX_PIN PB0 // PWM 7
|
||||
#define SOFTSERIAL2_TX_PIN PB1 // PWM 8
|
||||
|
||||
#define SONAR_SOFTSERIAL2_EXCLUSIVE
|
||||
#endif
|
||||
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
/*
|
||||
* This file is part of Cleanflight.
|
||||
*
|
||||
* Cleanflight is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Cleanflight is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with Cleanflight. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <platform.h>
|
||||
|
||||
#ifdef TARGET_CONFIG
|
||||
#include "config/config_master.h"
|
||||
|
||||
void targetConfiguration(master_t *config)
|
||||
{
|
||||
// Temporary workaround: Disable SDCard DMA by default since it causes errors on this target
|
||||
config->sdcardConfig.useDma = false;
|
||||
}
|
||||
#endif
|
|
@ -21,6 +21,8 @@
|
|||
#define TARGET_BOARD_IDENTIFIER "ARF3"
|
||||
#else
|
||||
#define TARGET_BOARD_IDENTIFIER "SPEV"
|
||||
|
||||
#define TARGET_CONFIG
|
||||
#endif
|
||||
|
||||
#define CONFIG_FASTLOOP_PREFERRED_ACC ACC_DEFAULT
|
||||
|
@ -69,11 +71,17 @@
|
|||
#define USE_UART1
|
||||
#define USE_UART2
|
||||
#define USE_UART3
|
||||
#define SERIAL_PORT_COUNT 4
|
||||
#define USE_SOFTSERIAL1
|
||||
#define USE_SOFTSERIAL2
|
||||
|
||||
#define SERIAL_PORT_COUNT 6
|
||||
|
||||
#define USE_ESCSERIAL
|
||||
#define ESCSERIAL_TIMER_TX_HARDWARE 0 // PWM 1
|
||||
|
||||
#undef USE_SOFTSERIAL1
|
||||
#undef USE_SOFTSERIAL2
|
||||
|
||||
#define UART1_TX_PIN PA9
|
||||
#define UART1_RX_PIN PA10
|
||||
|
||||
|
|
|
@ -85,6 +85,14 @@
|
|||
#define USE_UART2
|
||||
#define USE_UART3
|
||||
|
||||
#ifdef TINYBEEF3
|
||||
#define SERIAL_PORT_COUNT 4
|
||||
#else
|
||||
#define USE_SOFTSERIAL1
|
||||
#define USE_SOFTSERIAL2
|
||||
#define SERIAL_PORT_COUNT 6
|
||||
#endif
|
||||
|
||||
#define USE_ESCSERIAL
|
||||
#define ESCSERIAL_TIMER_TX_HARDWARE 0 // PWM 1
|
||||
|
||||
|
@ -99,25 +107,14 @@
|
|||
#define UART3_TX_PIN PB10 // PB10 (AF7)
|
||||
#define UART3_RX_PIN PB11 // PB11 (AF7)
|
||||
|
||||
#define SPEKTRUM_BIND
|
||||
// USART3,
|
||||
#define BIND_PIN PB11
|
||||
|
||||
#ifdef TINYBEEF3
|
||||
#define SERIAL_PORT_COUNT 4
|
||||
#else
|
||||
#define USB_CABLE_DETECTION
|
||||
#define USB_DETECT_PIN PB5
|
||||
|
||||
#define USE_SOFTSERIAL1
|
||||
#define SOFTSERIAL_1_TIMER TIM2
|
||||
#define SOFTSERIAL_1_TIMER_RX_HARDWARE 9 // PA0 / PAD3
|
||||
#define SOFTSERIAL_1_TIMER_TX_HARDWARE 10 // PA1 / PAD4
|
||||
#define SONAR_SOFTSERIAL1_EXCLUSIVE
|
||||
|
||||
#define SERIAL_PORT_COUNT 5
|
||||
#ifndef TINYBEEF3
|
||||
#define SOFTSERIAL1_RX_PIN PA0 // PA0 / PAD3
|
||||
#define SOFTSERIAL1_TX_PIN PA1 // PA1 / PAD4
|
||||
#endif
|
||||
|
||||
#define SONAR_SOFTSERIAL1_EXCLUSIVE
|
||||
|
||||
#define USE_SPI
|
||||
|
||||
#ifdef TINYBEEF3
|
||||
|
|
|
@ -61,7 +61,9 @@
|
|||
#define USE_UART3
|
||||
#define USE_UART4
|
||||
#define USE_UART5
|
||||
#define SERIAL_PORT_COUNT 6
|
||||
#define USE_SOFTSERIAL1
|
||||
#define USE_SOFTSERIAL2
|
||||
#define SERIAL_PORT_COUNT 8
|
||||
|
||||
#define UART1_TX_PIN PA9
|
||||
#define UART1_RX_PIN PA10
|
||||
|
|
|
@ -151,6 +151,9 @@
|
|||
#define USE_UART3
|
||||
#define USE_UART4
|
||||
#define USE_UART5
|
||||
//#define USE_SOFTSERIAL1
|
||||
//#define USE_SOFTSERIAL2
|
||||
|
||||
#define SERIAL_PORT_COUNT 6
|
||||
|
||||
#define USE_ESCSERIAL
|
||||
|
|
|
@ -18,6 +18,8 @@
|
|||
#include <stdint.h>
|
||||
|
||||
#include <platform.h>
|
||||
|
||||
#ifdef TARGET_CONFIG
|
||||
#include "drivers/io.h"
|
||||
|
||||
#include "drivers/timer.h"
|
||||
|
@ -53,4 +55,4 @@ void targetConfiguration(master_t *config)
|
|||
|
||||
intFeatureSet(FEATURE_CURRENT_METER | FEATURE_VBAT, &config->featureConfig.enabledFeatures);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -48,14 +48,16 @@
|
|||
#define USE_VCP
|
||||
#define USB_IO
|
||||
#define USBD_PRODUCT_STRING "tinyFISH"
|
||||
#define SERIAL_PORT_COUNT 4
|
||||
#define SERIAL_PORT_COUNT 6
|
||||
#else
|
||||
#define SERIAL_PORT_COUNT 3
|
||||
#define SERIAL_PORT_COUNT 5
|
||||
#endif
|
||||
|
||||
#define USE_UART1
|
||||
#define USE_UART2
|
||||
#define USE_UART3
|
||||
#define USE_SOFTSERIAL1
|
||||
#define USE_SOFTSERIAL2
|
||||
|
||||
#define UART1_TX_PIN PB6
|
||||
#define UART1_RX_PIN PB7
|
||||
|
|
|
@ -116,10 +116,12 @@
|
|||
|
||||
#define USE_SOFTSERIAL1
|
||||
|
||||
#define SOFTSERIAL_1_TIMER TIM1
|
||||
#define SOFTSERIAL_1_TIMER_RX_HARDWARE 2 // PWM 3
|
||||
#define SOFTSERIAL_1_TIMER_TX_HARDWARE 1 // PWM 2
|
||||
#define SERIAL_PORT_COUNT 6 //VCP, USART1, USART2, USART3, USART6, SOFTSERIAL1
|
||||
#define SOFTSERIAL1_RX_PIN PE13 // PWM 3
|
||||
#define SOFTSERIAL1_TX_PIN PE11 // PWM 2
|
||||
|
||||
#define USE_SOFTSERIAL2
|
||||
|
||||
#define SERIAL_PORT_COUNT 8 //VCP, USART1, USART2, USART3, USART6, SOFTSERIAL x 2
|
||||
|
||||
#define USE_ESCSERIAL
|
||||
#define ESCSERIAL_TIMER_TX_HARDWARE 0 // PWM 1
|
||||
|
|
|
@ -21,7 +21,7 @@ const timerHardware_t timerHardware[USABLE_TIMER_CHANNEL_COUNT] = {
|
|||
DEF_TIM(TIM4, CH1, PA11, TIM_USE_MOTOR, 1), // PWM3 - PA11
|
||||
DEF_TIM(TIM4, CH2, PA12, TIM_USE_MOTOR, 1), // PWM4 - PA12
|
||||
DEF_TIM(TIM4, CH3, PB8, TIM_USE_MOTOR, 1), // PWM5 - PB8
|
||||
DEF_TIM(TIM4, CH4, PB9, TIM_USE_MOTOR, 1), // PWM6 - PB9
|
||||
DEF_TIM(TIM8, CH3, PB9, TIM_USE_MOTOR, 1), // PWM6 - PB9
|
||||
DEF_TIM(TIM15, CH1, PA2, TIM_USE_MOTOR, 1), // PWM7 - PA2
|
||||
DEF_TIM(TIM15, CH2, PA3, TIM_USE_MOTOR, 1), // PWM8 - PA3
|
||||
DEF_TIM(TIM1, CH1, PA8, TIM_USE_MOTOR | TIM_USE_LED, 1), // GPIO_TIMER / LED_STRIP
|
||||
|
|
|
@ -54,7 +54,9 @@
|
|||
#define USE_UART2
|
||||
#define USE_UART3
|
||||
#define USE_SOFTSERIAL1
|
||||
#define SERIAL_PORT_COUNT 4
|
||||
#define USE_SOFTSERIAL2
|
||||
|
||||
#define SERIAL_PORT_COUNT 5
|
||||
|
||||
#define USE_ESCSERIAL
|
||||
#define ESCSERIAL_TIMER_TX_HARDWARE 0 // PWM 1
|
||||
|
@ -68,9 +70,8 @@
|
|||
#define UART3_TX_PIN PB10 // PB10 (AF7)
|
||||
#define UART3_RX_PIN PB11 // PB11 (AF7)
|
||||
|
||||
#define SOFTSERIAL_1_TIMER TIM3
|
||||
#define SOFTSERIAL_1_TIMER_RX_HARDWARE 4 // PWM 5
|
||||
#define SOFTSERIAL_1_TIMER_TX_HARDWARE 5 // PWM 6
|
||||
#define SOFTSERIAL1_RX_PIN PB0 // PWM 5
|
||||
#define SOFTSERIAL1_TX_PIN PB1 // PWM 6
|
||||
#define SONAR_SOFTSERIAL1_EXCLUSIVE
|
||||
|
||||
#define USE_I2C
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue