1
0
Fork 0
mirror of https://github.com/opentx/opentx.git synced 2025-07-17 21:35:27 +03:00

sync external module (SBUS, DSM, MULTI)

This commit is contained in:
Raphael Coeffic 2019-11-05 15:23:25 +01:00 committed by 3djc
parent fe6bd01afe
commit ca60468f12
6 changed files with 35 additions and 22 deletions

View file

@ -76,7 +76,6 @@ void _send_1(uint8_t v)
*extmodulePulsesData.dsm2.ptr++ = v - 1; *extmodulePulsesData.dsm2.ptr++ = v - 1;
extmodulePulsesData.dsm2.index += 1; extmodulePulsesData.dsm2.index += 1;
extmodulePulsesData.dsm2.rest -= v;
} }
void sendByteDsm2(uint8_t b) // max 10 changes 0 10 10 10 10 1 void sendByteDsm2(uint8_t b) // max 10 changes 0 10 10 10 10 1
@ -101,9 +100,9 @@ void sendByteDsm2(uint8_t b) // max 10 changes 0 10 10 10 10 1
void putDsm2Flush() void putDsm2Flush()
{ {
if (extmodulePulsesData.dsm2.index & 1) if (extmodulePulsesData.dsm2.index & 1)
*extmodulePulsesData.dsm2.ptr++ = extmodulePulsesData.dsm2.rest; *extmodulePulsesData.dsm2.ptr++ = 60000;
else else
*(extmodulePulsesData.dsm2.ptr - 1) = extmodulePulsesData.dsm2.rest; *(extmodulePulsesData.dsm2.ptr - 1) = 60000;
} }
#endif #endif
@ -119,7 +118,6 @@ void setupPulsesDSM2()
extmodulePulsesData.dsm2.serialBitCount = 0 ; extmodulePulsesData.dsm2.serialBitCount = 0 ;
#else #else
extmodulePulsesData.dsm2.index = 0; extmodulePulsesData.dsm2.index = 0;
extmodulePulsesData.dsm2.rest = DSM2_PERIOD * 2000;
#endif #endif
extmodulePulsesData.dsm2.ptr = extmodulePulsesData.dsm2.pulses; extmodulePulsesData.dsm2.ptr = extmodulePulsesData.dsm2.pulses;

View file

@ -200,10 +200,8 @@ void setupPulsesMultiExternalModule()
extmodulePulsesData.dsm2.serialByte = 0 ; extmodulePulsesData.dsm2.serialByte = 0 ;
extmodulePulsesData.dsm2.serialBitCount = 0 ; extmodulePulsesData.dsm2.serialBitCount = 0 ;
#else #else
extmodulePulsesData.dsm2.rest = getMultiSyncStatus(EXTERNAL_MODULE).getAdjustedRefreshRate();
extmodulePulsesData.dsm2.index = 0; extmodulePulsesData.dsm2.index = 0;
#endif #endif
extmodulePulsesData.dsm2.ptr = extmodulePulsesData.dsm2.pulses; extmodulePulsesData.dsm2.ptr = extmodulePulsesData.dsm2.pulses;
setupPulsesMulti(EXTERNAL_MODULE); setupPulsesMulti(EXTERNAL_MODULE);

View file

@ -226,7 +226,6 @@ typedef Dsm2SerialPulsesData Dsm2PulsesData;
PACK(struct Dsm2TimerPulsesData { PACK(struct Dsm2TimerPulsesData {
pulse_duration_t pulses[MAX_PULSES_TRANSITIONS]; pulse_duration_t pulses[MAX_PULSES_TRANSITIONS];
pulse_duration_t * ptr; pulse_duration_t * ptr;
uint16_t rest;
uint8_t index; uint8_t index;
}); });
typedef Dsm2TimerPulsesData Dsm2PulsesData; typedef Dsm2TimerPulsesData Dsm2PulsesData;
@ -429,4 +428,4 @@ inline bool isModuleInBeepMode()
return false; return false;
} }
#endif // _PULSES_H_ #endif // _PULSES_H_

View file

@ -55,7 +55,6 @@ static void _send_level(uint8_t v)
*extmodulePulsesData.dsm2.ptr++ = v - 1; *extmodulePulsesData.dsm2.ptr++ = v - 1;
extmodulePulsesData.dsm2.index+=1; extmodulePulsesData.dsm2.index+=1;
extmodulePulsesData.dsm2.rest -=v;
} }
void sendByteSbus(uint8_t b) // max 11 changes 0 10 10 10 10 P 1 void sendByteSbus(uint8_t b) // max 11 changes 0 10 10 10 10 P 1
@ -113,7 +112,6 @@ void setupPulsesSbus()
extmodulePulsesData.dsm2.serialByte = 0; extmodulePulsesData.dsm2.serialByte = 0;
extmodulePulsesData.dsm2.serialBitCount = 0; extmodulePulsesData.dsm2.serialBitCount = 0;
#else #else
extmodulePulsesData.dsm2.rest = SBUS_PERIOD_HALF_US;
extmodulePulsesData.dsm2.index = 0; extmodulePulsesData.dsm2.index = 0;
#endif #endif

View file

@ -179,7 +179,7 @@ void extmoduleSerialStart(uint32_t /*baudrate*/, uint32_t period_half_us, bool i
EXTMODULE_TIMER->ARR = period_half_us; EXTMODULE_TIMER->ARR = period_half_us;
EXTMODULE_TIMER->CCR2 = period_half_us - 4000; EXTMODULE_TIMER->CCR2 = period_half_us - 4000;
EXTMODULE_TIMER->SR &= ~TIM_SR_CC2IF; // Clear flag EXTMODULE_TIMER->SR &= ~TIM_SR_CC2IF; // Clear flag
EXTMODULE_TIMER->DIER |= TIM_DIER_UDE | TIM_DIER_CC2IE; EXTMODULE_TIMER->DIER |= TIM_DIER_UDE;
EXTMODULE_TIMER->CR1 |= TIM_CR1_CEN; EXTMODULE_TIMER->CR1 |= TIM_CR1_CEN;
NVIC_EnableIRQ(EXTMODULE_TIMER_DMA_STREAM_IRQn); NVIC_EnableIRQ(EXTMODULE_TIMER_DMA_STREAM_IRQn);
@ -318,23 +318,36 @@ void extmoduleSendNextFrame()
#if defined(DSM2) #if defined(DSM2)
case PROTOCOL_CHANNELS_SBUS: case PROTOCOL_CHANNELS_SBUS:
#if defined(PCBX10) || PCBREV >= 13
EXTMODULE_TIMER->CCER = TIM_CCER_CC3E | (GET_SBUS_POLARITY(EXTERNAL_MODULE) ? TIM_CCER_CC3P : 0); // reverse polarity for Sbus if needed
#else
EXTMODULE_TIMER->CCER = TIM_CCER_CC1E | (GET_SBUS_POLARITY(EXTERNAL_MODULE) ? TIM_CCER_CC1P : 0); // reverse polarity for Sbus if needed
#endif
// no break
case PROTOCOL_CHANNELS_DSM2_LP45: case PROTOCOL_CHANNELS_DSM2_LP45:
case PROTOCOL_CHANNELS_DSM2_DSM2: case PROTOCOL_CHANNELS_DSM2_DSM2:
case PROTOCOL_CHANNELS_DSM2_DSMX: case PROTOCOL_CHANNELS_DSM2_DSMX:
case PROTOCOL_CHANNELS_MULTIMODULE: case PROTOCOL_CHANNELS_MULTIMODULE:
EXTMODULE_TIMER->CCR2 = *(extmodulePulsesData.dsm2.ptr - 1) - 4000; // 2mS in advance
if (EXTMODULE_TIMER_DMA_STREAM->CR & DMA_SxCR_EN)
return;
if (PROTOCOL_CHANNELS_SBUS == moduleState[EXTERNAL_MODULE].protocol) {
#if defined(PCBX10) || PCBREV >= 13
EXTMODULE_TIMER->CCER = TIM_CCER_CC3E | (GET_SBUS_POLARITY(EXTERNAL_MODULE) ? TIM_CCER_CC3P : 0); // reverse polarity for Sbus if needed
#else
EXTMODULE_TIMER->CCER = TIM_CCER_CC1E | (GET_SBUS_POLARITY(EXTERNAL_MODULE) ? TIM_CCER_CC1P : 0); // reverse polarity for Sbus if needed
#endif
}
// disable timer
EXTMODULE_TIMER->CR1 &= ~TIM_CR1_CEN;
// send DMA request
EXTMODULE_TIMER_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA EXTMODULE_TIMER_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA
EXTMODULE_TIMER_DMA_STREAM->CR |= EXTMODULE_TIMER_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | EXTMODULE_TIMER_DMA_SIZE | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; EXTMODULE_TIMER_DMA_STREAM->CR |= EXTMODULE_TIMER_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | EXTMODULE_TIMER_DMA_SIZE | DMA_SxCR_PL_0 | DMA_SxCR_PL_1;
EXTMODULE_TIMER_DMA_STREAM->PAR = CONVERT_PTR_UINT(&EXTMODULE_TIMER->ARR); EXTMODULE_TIMER_DMA_STREAM->PAR = CONVERT_PTR_UINT(&EXTMODULE_TIMER->ARR);
EXTMODULE_TIMER_DMA_STREAM->M0AR = CONVERT_PTR_UINT(extmodulePulsesData.dsm2.pulses); EXTMODULE_TIMER_DMA_STREAM->M0AR = CONVERT_PTR_UINT(extmodulePulsesData.dsm2.pulses);
EXTMODULE_TIMER_DMA_STREAM->NDTR = extmodulePulsesData.dsm2.ptr - extmodulePulsesData.dsm2.pulses; EXTMODULE_TIMER_DMA_STREAM->NDTR = extmodulePulsesData.dsm2.ptr - extmodulePulsesData.dsm2.pulses;
EXTMODULE_TIMER_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA EXTMODULE_TIMER_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA
// re-init timer
EXTMODULE_TIMER->EGR = 1;
EXTMODULE_TIMER->CR1 |= TIM_CR1_CEN;
break; break;
#endif #endif
@ -390,13 +403,13 @@ extern "C" void EXTMODULE_TIMER_DMA_IRQHandler()
DMA_ClearITPendingBit(EXTMODULE_TIMER_DMA_STREAM, EXTMODULE_TIMER_DMA_FLAG_TC); DMA_ClearITPendingBit(EXTMODULE_TIMER_DMA_STREAM, EXTMODULE_TIMER_DMA_FLAG_TC);
EXTMODULE_TIMER->SR &= ~TIM_SR_CC2IF; // Clear flag EXTMODULE_TIMER->SR &= ~TIM_SR_CC2IF; // Clear flag
EXTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; // Enable this interrupt //EXTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; // Enable this interrupt
} }
extern "C" void EXTMODULE_TIMER_IRQHandler() extern "C" void EXTMODULE_TIMER_IRQHandler()
{ {
EXTMODULE_TIMER->DIER &= ~TIM_DIER_CC2IE; // Stop this interrupt EXTMODULE_TIMER->DIER &= ~TIM_DIER_CC2IE; // Stop this interrupt
EXTMODULE_TIMER->SR &= ~TIM_SR_CC2IF; EXTMODULE_TIMER->SR &= ~TIM_SR_CC2IF;
if (setupPulsesExternalModule()) // if (setupPulsesExternalModule())
extmoduleSendNextFrame(); // extmoduleSendNextFrame();
} }

View file

@ -87,6 +87,12 @@ bool isModuleSynchronous(uint8_t module)
#endif #endif
#if defined(INTMODULE_USART) || defined(EXTMODULE_USART) #if defined(INTMODULE_USART) || defined(EXTMODULE_USART)
case PROTOCOL_CHANNELS_PXX1_SERIAL: case PROTOCOL_CHANNELS_PXX1_SERIAL:
#endif
#if defined(DSM2)
case PROTOCOL_CHANNELS_SBUS:
case PROTOCOL_CHANNELS_DSM2_LP45:
case PROTOCOL_CHANNELS_DSM2_DSM2:
case PROTOCOL_CHANNELS_DSM2_DSMX:
#endif #endif
return true; return true;
} }
@ -108,7 +114,7 @@ void sendSynchronousPulses()
} }
} }
#define DEBUG_MIXER_SCHEDULER //#define DEBUG_MIXER_SCHEDULER
uint32_t nextMixerTime[NUM_MODULES]; uint32_t nextMixerTime[NUM_MODULES];
@ -194,6 +200,7 @@ TASK_FUNCTION(mixerTask)
if (t0 > maxMixerDuration) if (t0 > maxMixerDuration)
maxMixerDuration = t0; maxMixerDuration = t0;
serialPrint("cnt = %d", EXTMODULE_TIMER->CNT);
sendSynchronousPulses(); sendSynchronousPulses();
} }
} }