enable PPM timer for in/out mode and disable accordingly,

This commit is contained in:
janek
2025-01-19 20:49:27 +01:00
committed by Janek
parent e99e8b4d13
commit 0ec4be28ef
5 changed files with 44 additions and 37 deletions
+2 -2
View File
@@ -38,9 +38,9 @@
#define EEPROM_VER 222
#define FIRST_CONV_EEPROM_VER 216
#define GET_PPM_POLARITY(idx) g_model.moduleData[idx].ppm.pulsePol
#define GET_MODULE_PPM_POLARITY(idx) g_model.moduleData[idx].ppm.pulsePol
#define GET_SBUS_POLARITY(idx) g_model.moduleData[idx].sbus.noninverted
#define GET_PPM_DELAY(idx) (g_model.moduleData[idx].ppm.delay * 50 + 300)
#define GET_MODULE_PPM_DELAY(idx) (g_model.moduleData[idx].ppm.delay * 50 + 300)
#define SET_DEFAULT_PPM_FRAME_LENGTH(idx) g_model.moduleData[idx].ppm.frameLength = 4 * max((int8_t)0, g_model.moduleData[idx].channelsCount)
#if defined(PCBHORUS)
+1
View File
@@ -147,6 +147,7 @@ void intmodulePxx1SerialStart();
void intmoduleAfhds2aStart();
void extmodulePxx1PulsesStart();
void extmodulePxx1SerialStart();
void extmoduleTimerStart(); // non standard, for shared PPM in/out use
void extmodulePpmStart();
void intmoduleStop();
void extmoduleStop();
+30 -32
View File
@@ -22,24 +22,28 @@
void extmoduleSendNextFrame();
void extmoduleStop() {
void extmoduleStop()
{
TRACE("extmoduleStop");
EXTERNAL_MODULE_OFF();
CLEAR_BIT(EXTMODULE_TIMER->DIER, TIM_DIER_CC2IE);
CLEAR_BIT(EXTMODULE_TIMER->CCER, TIM_CCER_CC2E);
// Keep timer running because PPM IN uses the same one
// Keep timer running because PPM IN uses the same timer
// NVIC_DisableIRQ(EXTMODULE_TIMER_IRQn);
EXTERNAL_MODULE_OFF();
}
void extmoduleTimerStart(uint32_t period, uint8_t state) {
/**
* EXTMODULE_TIMER is shared between PPM out and PPM in trainer
* - init is the same.
* - is never disabled, but rather channel outputs are disabled/enabled
*/
void extmoduleTimerStart()
{
TRACE("extmoduleTimerStart");
if (state)
EXTERNAL_MODULE_ON();
else
EXTERNAL_MODULE_OFF();
// GPIO_PinAFConfig(EXTMODULE_TX_GPIO, EXTMODULE_TX_GPIO_PinSource, 0);
// GPIO_InitTypeDef GPIO_InitStructure;
@@ -51,34 +55,27 @@ void extmoduleTimerStart(uint32_t period, uint8_t state) {
// GPIO_Init(EXTMODULE_TX_GPIO, &GPIO_InitStructure);
// GPIO_SetBits(EXTMODULE_TX_GPIO, EXTMODULE_TX_GPIO_PIN); // Set high
// EXTMODULE_TIMER->CR1 &= ~TIM_CR1_CEN;
// EXTMODULE_TIMER->PSC = EXTMODULE_TIMER_FREQ / 2000000 - 1; // 0.5uS (2Mhz)
// EXTMODULE_TIMER->ARR = (2000 * period);
// EXTMODULE_TIMER->CCR2 = (2000 * period) - 1000;
// EXTMODULE_TIMER->EGR = 1; // Restart
// EXTMODULE_TIMER->SR &= ~TIM_SR_CC2IF;
// EXTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; // Enable this interrupt
// EXTMODULE_TIMER->CR1 |= TIM_CR1_CEN;
// NVIC_EnableIRQ(EXTMODULE_TIMER_IRQn);
// NVIC_SetPriority(EXTMODULE_TIMER_IRQn, 7);
EXTMODULE_TIMER->CR1 &= ~TIM_CR1_CEN;
EXTMODULE_TIMER->PSC = EXTMODULE_TIMER_FREQ / 2000000 - 1; // 0.5uS
EXTMODULE_TIMER->ARR = 65535;
EXTMODULE_TIMER->CCR2 = GET_PPM_DELAY(EXTERNAL_MODULE) * 2;
EXTMODULE_TIMER->CCR2 = GET_MODULE_PPM_DELAY(EXTERNAL_MODULE) * 2;
EXTMODULE_TIMER->CCMR1 = TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_0;
EXTMODULE_TIMER->BDTR |= TIM_BDTR_MOE;
// Channel 1: PPM IN CC1 as input | frequency used to sample input
EXTMODULE_TIMER->CCMR1 |= TIM_CCMR1_CC1S_0 | TIM_CCMR1_IC1F_1 | TIM_CCMR1_IC1F_0;
EXTMODULE_TIMER->CCER |= TIM_CCER_CC1E | TIM_CCER_CC1P; // 01: inverted/falling edge
EXTMODULE_TIMER->EGR = 1; // Restart
WRITE_REG(EXTMODULE_TIMER->SR, ~(TIM_SR_CC1IF)); // Clear capture interrupt flag (PPMIN)
EXTMODULE_TIMER->DIER |= TIM_DIER_CC1IE; // Enable capture interrupt (PPMIN)
if (g_model.trainerMode == TRAINER_MODE_MASTER_TRAINER_JACK) {
WRITE_REG(EXTMODULE_TIMER->SR, ~(TIM_SR_CC1IF)); // Clear capture interrupt flag (PPMIN)
EXTMODULE_TIMER->DIER |= TIM_DIER_CC1IE; // Enable capture interrupt (PPMIN)
EXTMODULE_TIMER->CCER |= TIM_CCER_CC1E | TIM_CCER_CC1P; // 01: inverted/falling edge
}
WRITE_REG(EXTMODULE_TIMER->SR, ~(TIM_SR_CC2IF)); // Clear compare interrupt flag (PPMOUT)
EXTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; // Enable compare interrupt (PPMOUT)
if (moduleState[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PPM) {
WRITE_REG(EXTMODULE_TIMER->SR, ~(TIM_SR_CC2IF)); // Clear compare interrupt flag (PPMOUT)
EXTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; // Enable compare interrupt (PPMOUT)
EXTMODULE_TIMER->CCER |= TIM_CCER_CC2E;
}
NVIC_EnableIRQ(EXTMODULE_TIMER_IRQn);
NVIC_SetPriority(EXTMODULE_TIMER_IRQn, 2);
@@ -106,13 +103,13 @@ void extmodulePpmStart()
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(EXTMODULE_TX_GPIO, &GPIO_InitStructure);
EXTMODULE_TIMER->CCER |= TIM_CCER_CC2E;
extmoduleTimerStart();
}
inline void extmoduleSendNextFrame()
{
static bool delay = true;
static uint16_t delay_halfus = GET_PPM_DELAY(EXTERNAL_MODULE) * 2;
static uint16_t delay_halfus = GET_MODULE_PPM_DELAY(EXTERNAL_MODULE) * 2;
if (moduleState[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_PPM) {
//TRACE("extmodulePulsesData.ppm: %p",(void*)&extmodulePulsesData.ppm);
//DUMP((uint8_t*)(extmodulePulsesData.ppm.pulses), 40);
@@ -130,9 +127,9 @@ inline void extmoduleSendNextFrame()
pulsePtr = extmodulePulsesData.ppm.pulses;
// polarity 1 +
// polarity 0 -
EXTMODULE_TIMER->CCER = TIM_CCER_CC2E | (GET_PPM_POLARITY(EXTERNAL_MODULE) ? 0 : TIM_CCER_CC2P);
EXTMODULE_TIMER->CCER = TIM_CCER_CC2E | (GET_MODULE_PPM_POLARITY(EXTERNAL_MODULE) ? 0 : TIM_CCER_CC2P);
EXTMODULE_TIMER->CCR2 = EXTMODULE_TIMER->CCR2 + delay_halfus;
delay_halfus = GET_PPM_DELAY(EXTERNAL_MODULE) * 2;
delay_halfus = GET_MODULE_PPM_DELAY(EXTERNAL_MODULE) * 2;
setupPulsesExternalModule();
}
delay = !delay;
@@ -149,7 +146,8 @@ inline void extmoduleSendNextFrame()
}
}
extern "C" void EXTMODULE_TIMER_IRQHandler() {
extern "C" void EXTMODULE_TIMER_IRQHandler()
{
if (EXTMODULE_TIMER->SR & TIM_SR_CC2IF) { // Compare PPM-OUT
EXTMODULE_TIMER->SR &= ~TIM_SR_CC2IF; // Clears interrupt on ch2
if ((moduleState[EXTERNAL_MODULE].protocol == PROTOCOL_CHANNELS_CROSSFIRE && g_model.moduleData[EXTERNAL_MODULE].type != MODULE_TYPE_CROSSFIRE) ||
@@ -97,7 +97,8 @@ void intmoduleAfhds2aStart() {
}
// handler for RADIO GIO2 (FALLING AGE)
extern "C" void EXTI2_3_IRQHandler() {
extern "C" void EXTI2_3_IRQHandler()
{
if (EXTI->PR & RF_GIO2_PIN) {
WRITE_REG(EXTI->PR, RF_GIO2_PIN);
DisableGIO();
@@ -106,7 +107,8 @@ extern "C" void EXTI2_3_IRQHandler() {
}
}
extern "C" void INTMODULE_TIMER_IRQHandler() {
extern "C" void INTMODULE_TIMER_IRQHandler()
{
WRITE_REG(INTMODULE_TIMER->SR, ~(TIM_SR_UIF)); // Clear the update interrupt flag (UIF)
if (setupPulsesInternalModule()) {
SETBIT(RadioState, CALLER, TIM_CALL);
+7 -1
View File
@@ -30,12 +30,18 @@ void init_trainer_capture() {
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // erfly6: GPIO_PuPd_UP
GPIO_Init(TRAINER_GPIO, &GPIO_InitStructure);
extmoduleTimerStart();
}
void stop_trainer_capture()
{
// disable PPM input capture
// nothing to do because it would stop EXTMODULE_TIMER
CLEAR_BIT(EXTMODULE_TIMER->CCER, TIM_CCER_CC1E);
CLEAR_BIT(EXTMODULE_TIMER->DIER, TIM_DIER_CC1IE);
// Keep timer running because PPM OUT uses the same timer
// NVIC_DisableIRQ(EXTMODULE_TIMER_IRQn);
}
#if defined(SBUS_TRAINER)