From fea93d48577ddae362517fd87424617e7ab20471 Mon Sep 17 00:00:00 2001 From: hoogendijkta Date: Tue, 19 Feb 2019 23:28:13 +0100 Subject: [PATCH 01/51] First try fixing hardware timers STM32F407VE --- speeduino/board_stm32.h | 16 +- speeduino/board_stm32.ino | 142 +++--- speeduino/cancomms.h | 3 +- speeduino/globals.h | 2 +- .../src/HardwareTimers/HardwareTimer.cpp_test | 415 ++++++++++++++++++ .../src/HardwareTimers/HardwareTimer.h_test | 123 ++++++ 6 files changed, 632 insertions(+), 69 deletions(-) create mode 100644 speeduino/src/HardwareTimers/HardwareTimer.cpp_test create mode 100644 speeduino/src/HardwareTimers/HardwareTimer.h_test diff --git a/speeduino/board_stm32.h b/speeduino/board_stm32.h index 81835bca..f1e1b7b9 100644 --- a/speeduino/board_stm32.h +++ b/speeduino/board_stm32.h @@ -1,6 +1,15 @@ #ifndef STM32_H #define STM32_H #if defined(CORE_STM32) +#if defined(STM32F4) + //These should really be in the stm32GENERIC libs, but for somereason they only have timers 1-4 +// #include +// #include "src/HardwareTimers/HardwareTimer.h" +// HardwareTimer Timer5(TIM5, chip_tim5, sizeof(chip_tim5) / sizeof(chip_tim5[0])); +// HardwareTimer Timer8(TIM8, chip_tim8, sizeof(chip_tim8) / sizeof(chip_tim8[0])); +#else + #include "HardwareTimer.h" +#endif /* *********************************************************************************************************** @@ -8,10 +17,13 @@ */ #define PORT_TYPE uint8_t #define micros_safe() micros() //timer5 method is not used on anything but AVR, the micros_safe() macro is simply an alias for the normal micros() + #define USE_SERIAL3 void initBoard(); uint16_t freeRam(); - + extern void oneMSIntervalIRQ(stimer_t *Timer); + + extern void EmptyIRQCallback(stimer_t *Timer, uint32_t channel); #if defined(USE_STM32GENERIC) #define Serial Serial1 #endif @@ -292,4 +304,4 @@ */ #endif //CORE_STM32 -#endif //STM32_H \ No newline at end of file +#endif //STM32_H diff --git a/speeduino/board_stm32.ino b/speeduino/board_stm32.ino index 0b9242e5..8f14ab2b 100644 --- a/speeduino/board_stm32.ino +++ b/speeduino/board_stm32.ino @@ -4,22 +4,47 @@ #include "auxiliaries.h" #include "idle.h" #include "scheduler.h" -#include "HardwareTimer.h" #if defined(STM32F4) + #define NR_OFF_TIMERS 9 + //stimer_t HardwareTimers[NR_OFF_TIMERS + 1]; + stimer_t HardwareTimers_1; + stimer_t HardwareTimers_2; + stimer_t HardwareTimers_3; + stimer_t HardwareTimers_4; + stimer_t HardwareTimers_5; + stimer_t HardwareTimers_8; + //These should really be in the stm32GENERIC libs, but for somereason they only have timers 1-4 - #include - HardwareTimer Timer5(TIM5, chip_tim5, sizeof(chip_tim5) / sizeof(chip_tim5[0])); - HardwareTimer Timer8(TIM8, chip_tim8, sizeof(chip_tim8) / sizeof(chip_tim8[0])); +// #include +// #include "src/HardwareTimers/HardwareTimer.h" +// HardwareTimer Timer5(TIM5, chip_tim5, sizeof(chip_tim5) / sizeof(chip_tim5[0])); +// HardwareTimer Timer8(TIM8, chip_tim8, sizeof(chip_tim8) / sizeof(chip_tim8[0])); +#else + #include "HardwareTimer.h" #endif +extern void oneMSIntervalIRQ(stimer_t *Timer){oneMSInterval();} +extern void EmptyIRQCallback(stimer_t *Timer, uint32_t channel){} + void initBoard() { + /* + * Initialize timers + */ + + HardwareTimers_1.timer = TIM1; + HardwareTimers_2.timer = TIM2; + HardwareTimers_3.timer = TIM3; + HardwareTimers_4.timer = TIM4; + + HardwareTimers_5.timer = TIM5; + HardwareTimers_8.timer = TIM8; + /* *********************************************************************************************************** * General */ - #define FLASH_LENGTH 8192 - + #define FLASH_LENGTH 8192 /* *********************************************************************************************************** @@ -31,10 +56,10 @@ void initBoard() } //This must happen at the end of the idle init - Timer1.setMode(4, TIMER_OUTPUT_COMPARE); + //Timer1.setMode(4, TIMER_OUTPUT_COMPARE); //timer_set_mode(TIMER1, 4, TIMER_OUTPUT_COMPARE; - if(idle_pwm_max_count > 0) { Timer1.attachInterrupt(4, idleInterrupt);} //on first flash the configPage4.iacAlgorithm is invalid - Timer1.resume(); + //if(idle_pwm_max_count > 0) { Timer1.attachInterrupt(4, idleInterrupt);} //on first flash the configPage4.iacAlgorithm is invalid + //Timer1.resume(); /* @@ -42,10 +67,8 @@ void initBoard() * Timers */ #if defined(ARDUINO_BLACK_F407VE) || defined(STM32F4) || defined(_STM32F4_) - Timer8.setPeriod(1000); // Set up period - Timer8.setMode(1, TIMER_OUTPUT_COMPARE); - Timer8.attachInterrupt(1, oneMSInterval); - Timer8.resume(); //Start Timer + TimerHandleInit(&HardwareTimers_8, 1000, 168); + attachIntHandle(&HardwareTimers_8, oneMSIntervalIRQ); #else Timer4.setPeriod(1000); // Set up period Timer4.setMode(1, TIMER_OUTPUT_COMPARE); @@ -63,11 +86,11 @@ void initBoard() vvt_pwm_max_count = 1000000L / (2 * configPage6.vvtFreq * 2); //Converts the frequency in Hz to the number of ticks (at 2uS) it takes to complete 1 cycle //Need to be initialised last due to instant interrupt - Timer1.setMode(2, TIMER_OUTPUT_COMPARE); - Timer1.setMode(3, TIMER_OUTPUT_COMPARE); - if(boost_pwm_max_count > 0) { Timer1.attachInterrupt(2, boostInterrupt);} - if(vvt_pwm_max_count > 0) { Timer1.attachInterrupt(3, vvtInterrupt);} - Timer1.resume(); +// Timer1.setMode(2, TIMER_OUTPUT_COMPARE); +// Timer1.setMode(3, TIMER_OUTPUT_COMPARE); +// if(boost_pwm_max_count > 0) { Timer1.attachInterrupt(2, boostInterrupt);} +// if(vvt_pwm_max_count > 0) { Timer1.attachInterrupt(3, vvtInterrupt);} +// Timer1.resume(); /* *********************************************************************************************************** @@ -75,9 +98,9 @@ void initBoard() */ #if defined(ARDUINO_ARCH_STM32) // STM32GENERIC core //see https://github.com/rogerclarkmelbourne/Arduino_STM32/blob/754bc2969921f1ef262bd69e7faca80b19db7524/STM32F1/system/libmaple/include/libmaple/timer.h#L444 - Timer1.setPrescaleFactor((HAL_RCC_GetHCLKFreq() * 2U)-1); //2us resolution - Timer2.setPrescaleFactor((HAL_RCC_GetHCLKFreq() * 2U)-1); //2us resolution - Timer3.setPrescaleFactor((HAL_RCC_GetHCLKFreq() * 2U)-1); //2us resolution +// Timer1.setPrescaleFactor((HAL_RCC_GetHCLKFreq() * 2U)-1); //2us resolution +// Timer2.setPrescaleFactor((HAL_RCC_GetHCLKFreq() * 2U)-1); //2us resolution +// Timer3.setPrescaleFactor((HAL_RCC_GetHCLKFreq() * 2U)-1); //2us resolution #else //libmaple core aka STM32DUINO //see https://github.com/rogerclarkmelbourne/Arduino_STM32/blob/754bc2969921f1ef262bd69e7faca80b19db7524/STM32F1/system/libmaple/include/libmaple/timer.h#L444 #if defined (STM32F1) || defined(__STM32F1__) @@ -94,71 +117,60 @@ void initBoard() Timer3.setPrescaleFactor((42 * 2U)-1); //2us resolution #endif #endif - Timer2.setMode(1, TIMER_OUTPUT_COMPARE); - Timer2.setMode(2, TIMER_OUTPUT_COMPARE); - Timer2.setMode(3, TIMER_OUTPUT_COMPARE); - Timer2.setMode(4, TIMER_OUTPUT_COMPARE); + + TimerPulseInit(&HardwareTimers_2, 0xFFFF, 500, EmptyIRQCallback); + attachIntHandleOC(&HardwareTimers_2, fuelSchedule1Interrupt, 1, 0); + attachIntHandleOC(&HardwareTimers_2, fuelSchedule2Interrupt, 2, 0); + attachIntHandleOC(&HardwareTimers_2, fuelSchedule3Interrupt, 3, 0); + attachIntHandleOC(&HardwareTimers_2, fuelSchedule4Interrupt, 4, 0); - Timer3.setMode(1, TIMER_OUTPUT_COMPARE); - Timer3.setMode(2, TIMER_OUTPUT_COMPARE); - Timer3.setMode(3, TIMER_OUTPUT_COMPARE); - Timer3.setMode(4, TIMER_OUTPUT_COMPARE); - Timer1.setMode(1, TIMER_OUTPUT_COMPARE); + TimerPulseInit(&HardwareTimers_3, 0xFFFF, 500, EmptyIRQCallback); + attachIntHandleOC(&HardwareTimers_3, ignitionSchedule1Interrupt, 1, 0); + attachIntHandleOC(&HardwareTimers_3, ignitionSchedule2Interrupt, 2, 0); + attachIntHandleOC(&HardwareTimers_3, ignitionSchedule3Interrupt, 3, 0); + attachIntHandleOC(&HardwareTimers_3, ignitionSchedule4Interrupt, 4, 0); + +// Timer1.setMode(1, TIMER_OUTPUT_COMPARE); //Attach interupt functions //Injection - Timer2.attachInterrupt(1, fuelSchedule1Interrupt); - Timer2.attachInterrupt(2, fuelSchedule2Interrupt); - Timer2.attachInterrupt(3, fuelSchedule3Interrupt); - Timer2.attachInterrupt(4, fuelSchedule4Interrupt); + + TimerPulseInit(&HardwareTimers_5, 0xFFFF, 0, EmptyIRQCallback); #if (INJ_CHANNELS >= 5) - Timer5.attachInterrupt(1, fuelSchedule5Interrupt); + attachIntHandleOC(&HardwareTimers_5, fuelSchedule5Interrupt, 1, 0); +//Timer5.attachInterrupt(1, fuelSchedule5Interrupt); #endif #if (INJ_CHANNELS >= 6) - Timer5.attachInterrupt(2, fuelSchedule6Interrupt); + attachIntHandleOC(&HardwareTimers_5, fuelSchedule6Interrupt, 2, 0); + //Timer5.attachInterrupt(2, fuelSchedule6Interrupt); #endif #if (INJ_CHANNELS >= 7) - Timer5.attachInterrupt(3, fuelSchedule7Interrupt); + attachIntHandleOC(&HardwareTimers_5, fuelSchedule7Interrupt, 3, 0); + //Timer5.attachInterrupt(3, fuelSchedule7Interrupt); #endif #if (INJ_CHANNELS >= 8) - Timer5.attachInterrupt(4, fuelSchedule8Interrupt); + attachIntHandleOC(&HardwareTimers_5, fuelSchedule8Interrupt, 4, 0); + //Timer5.attachInterrupt(4, fuelSchedule8Interrupt); #endif - //Ignition - #if (IGN_CHANNELS >= 1) - Timer3.attachInterrupt(1, ignitionSchedule1Interrupt); - #endif - #if (IGN_CHANNELS >= 2) - Timer3.attachInterrupt(2, ignitionSchedule2Interrupt); - #endif - #if (IGN_CHANNELS >= 3) - Timer3.attachInterrupt(3, ignitionSchedule3Interrupt); - #endif - #if (IGN_CHANNELS >= 4) - Timer3.attachInterrupt(4, ignitionSchedule4Interrupt); - #endif + TimerPulseInit(&HardwareTimers_4, 0xFFFF, 0, EmptyIRQCallback); #if (IGN_CHANNELS >= 5) - Timer4.attachInterrupt(1, ignitionSchedule5Interrupt); + attachIntHandleOC(&HardwareTimers_4, ignitionSchedule5Interrupt, 1, 0); + //Timer4.attachInterrupt(1, ignitionSchedule5Interrupt); #endif #if (IGN_CHANNELS >= 6) - Timer4.attachInterrupt(2, ignitionSchedule6Interrupt); + attachIntHandleOC(&HardwareTimers_4, ignitionSchedule6Interrupt, 2, 0); + //Timer4.attachInterrupt(2, ignitionSchedule6Interrupt); #endif #if (IGN_CHANNELS >= 7) - Timer4.attachInterrupt(3, ignitionSchedule7Interrupt); + attachIntHandleOC(&HardwareTimers_4, ignitionSchedule7Interrupt, 3, 0); + //Timer4.attachInterrupt(3, ignitionSchedule7Interrupt); #endif #if (IGN_CHANNELS >= 8) - Timer4.attachInterrupt(4, ignitionSchedule8Interrupt); + attachIntHandleOC(&HardwareTimers_4, ignitionSchedule8Interrupt, 4, 0); + //Timer4.attachInterrupt(4, ignitionSchedule8Interrupt); #endif - Timer1.resume(); - Timer2.resume(); - Timer3.resume(); - #if (IGN_CHANNELS >= 5) - Timer4.resume(); - #endif - #if (INJ_CHANNELS >= 5) - Timer5.resume(); - #endif } uint16_t freeRam() @@ -167,4 +179,4 @@ uint16_t freeRam() return &top - reinterpret_cast(sbrk(0)); } -#endif \ No newline at end of file +#endif diff --git a/speeduino/cancomms.h b/speeduino/cancomms.h index 08ca00f3..3c62cf02 100644 --- a/speeduino/cancomms.h +++ b/speeduino/cancomms.h @@ -16,7 +16,8 @@ uint8_t Glow, Ghigh; HardwareSerial &CANSerial = Serial3; #elif defined(CORE_STM32) #if defined(ARDUINO_ARCH_STM32) // STM32GENERIC core - SerialUART &CANSerial = Serial2; + HardwareSerial CANSerial(PD6,PD5); + //SerialUART &CANSerial = Serial2; #else //libmaple core aka STM32DUINO HardwareSerial &CANSerial = Serial2; #endif diff --git a/speeduino/globals.h b/speeduino/globals.h index 105095ad..dd0ea6f4 100644 --- a/speeduino/globals.h +++ b/speeduino/globals.h @@ -50,7 +50,7 @@ extern "C" char* sbrk(int incr); //Used to freeRam #if defined(ARDUINO_ARCH_STM32) // STM32GENERIC core - inline unsigned char digitalPinToInterrupt(unsigned char Interrupt_pin) { return Interrupt_pin; } //This isn't included in the stm32duino libs (yet) + //inline unsigned char digitalPinToInterrupt(unsigned char Interrupt_pin) { return Interrupt_pin; } //This isn't included in the stm32duino libs (yet) #define portOutputRegister(port) (volatile byte *)( &(port->ODR) ) #define portInputRegister(port) (volatile byte *)( &(port->IDR) ) #else //libmaple core aka STM32DUINO diff --git a/speeduino/src/HardwareTimers/HardwareTimer.cpp_test b/speeduino/src/HardwareTimers/HardwareTimer.cpp_test new file mode 100644 index 00000000..96c470c9 --- /dev/null +++ b/speeduino/src/HardwareTimers/HardwareTimer.cpp_test @@ -0,0 +1,415 @@ +/* + Copyright (c) 2017 Daniel Fekete + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#include "HardwareTimer.h" + +//#include CHIP_PERIPHERAL_INCLUDE + +HardwareTimer *interruptTimers[18]; + +void (*pwm_callback_func)(); +static void handleInterrupt(HardwareTimer *timer); + +static const uint32_t OCMODE_NOT_USED = 0xFFFF; + +HardwareTimer::HardwareTimer(TIM_TypeDef* timer) { + // this->tim_pin_list = pin_list; + // this->tim_pin_list_size = pin_list_size; + _timer.timer = timer; + //handle.Instance = timer; + + // for(int i=0; i<4; i++) { + // channelOC[i].OCMode = OCMODE_NOT_USED; + // channelOC[i].OCPolarity = TIM_OCPOLARITY_HIGH; + // channelOC[i].OCNPolarity = TIM_OCNPOLARITY_HIGH; + // channelOC[i].OCFastMode = TIM_OCFAST_DISABLE; + // channelOC[i].OCIdleState = TIM_OCIDLESTATE_RESET; + // channelOC[i].OCNIdleState = TIM_OCNIDLESTATE_RESET; + + // channelIC[i].ICPolarity = OCMODE_NOT_USED; + // channelIC[i].ICSelection = TIM_ICSELECTION_DIRECTTI; + // channelIC[i].ICPrescaler = TIM_ICPSC_DIV1; + // channelIC[i].ICFilter = 0; + // } + +} + +void HardwareTimer::pause() { + HAL_TIM_Base_Stop(&(_timer.handle)); +} + +void HardwareTimer::resume() { + + HAL_TIM_Base_MspInit(_timer) + + + handle.Init.CounterMode = TIM_COUNTERMODE_UP; + handle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + handle.Init.RepetitionCounter = 0; + + HAL_TIM_Base_Init(&handle); + + if (callbacks[0] != NULL) { + HAL_TIM_Base_Start_IT(&handle); + } else { + + HAL_TIM_Base_Start(&handle); + } + + resumeChannel(1, TIM_CHANNEL_1); + resumeChannel(2, TIM_CHANNEL_2); + resumeChannel(3, TIM_CHANNEL_3); + resumeChannel(4, TIM_CHANNEL_4); +} + +void HardwareTimer::resumeChannel(int channel, int timChannel) { + + if (channelOC[channel - 1].OCMode != OCMODE_NOT_USED) { + HAL_TIM_OC_ConfigChannel(&handle, &channelOC[channel - 1], timChannel); + + if (callbacks[channel] != NULL) { + HAL_TIM_OC_Start_IT(&handle, timChannel); + } else { + HAL_TIM_OC_Start(&handle, timChannel); + } + } + + if (channelIC[channel - 1].ICPolarity != OCMODE_NOT_USED) { + HAL_TIM_IC_ConfigChannel(&handle, &channelIC[channel - 1], timChannel); + + if (callbacks[channel] != NULL) { + HAL_TIM_IC_Start_IT(&handle, timChannel); + } else { + HAL_TIM_IC_Start(&handle, timChannel); + } + } +} + +uint32_t HardwareTimer::getPrescaleFactor() { + return handle.Init.Prescaler; +} + +void HardwareTimer::setPrescaleFactor(uint32_t prescaler) { + handle.Init.Prescaler = prescaler; +} + +uint32_t HardwareTimer::getOverflow() { + return handle.Init.Period; +} + +void HardwareTimer::setOverflow(uint32_t overflow) { + handle.Init.Period = overflow; +} + +uint32_t HardwareTimer::getCount(void) { + return __HAL_TIM_GET_COUNTER(&handle); +} + +void HardwareTimer::setCount(uint32_t counter) { + __HAL_TIM_SET_COUNTER(&handle, counter); +} + +#define MAX_RELOAD ((1 << 16) - 1) // Not always! 32 bit timers! + +uint32_t HardwareTimer::getBaseFrequency() { + int freqMul = 2; + int freq2Mul = 2; + uint32_t pFreq = HAL_RCC_GetPCLK1Freq(); + +#ifdef STM32F1 + freq2Mul = 1; +#endif + +#ifdef TIM1 + if (handle.Instance == TIM1) { + pFreq = HAL_RCC_GetPCLK2Freq(); + freqMul = freq2Mul; + } +#endif +#ifdef TIM8 + if (handle.Instance == TIM8) { + pFreq = HAL_RCC_GetPCLK2Freq(); + freqMul = freq2Mul; + } +#endif +#ifdef TIM9 + if (handle.Instance == TIM9) { + pFreq = HAL_RCC_GetPCLK2Freq(); + freqMul = freq2Mul; + } +#endif +#ifdef TIM10 + if (handle.Instance == TIM10) { + pFreq = HAL_RCC_GetPCLK2Freq(); + freqMul = freq2Mul; + } +#endif +#ifdef TIM11 + if (handle.Instance == TIM11) { + pFreq = HAL_RCC_GetPCLK2Freq(); + freqMul = freq2Mul; + } +#endif + + return pFreq * freqMul; +} + +uint32_t HardwareTimer::setPeriod(uint32_t microseconds) { + if (!microseconds) { + this->setPrescaleFactor(1); + this->setOverflow(1); + return this->getOverflow(); + } + + uint32_t period_cyc = microseconds * (getBaseFrequency() / 1000000); //TODO! + + uint32_t prescaler = (uint32_t)(period_cyc / MAX_RELOAD + 1); + + uint32_t overflow = (uint32_t)((period_cyc + (prescaler / 2)) / prescaler); + + this->setPrescaleFactor(prescaler); + this->setOverflow(overflow); + return overflow; +} + +static bool isSameChannel(int channel, uint8_t signal) { + // switch(signal) { + // case TIM_CH1: + // case TIM_CH1N: + // return channel == 1; + // case TIM_CH2: + // case TIM_CH2N: + // return channel == 2; + // case TIM_CH3: + // case TIM_CH3N: + // return channel == 3; + // case TIM_CH4: + // case TIM_CH4N: + // return channel == 4; + // } + return false; +} + +static const uint32_t PIN_NOT_USED = 0xFF; + +void HardwareTimer::setMode(int channel, TIMER_MODES mode, uint8_t pin) { + int pinMode = PIN_NOT_USED; + int pull = GPIO_NOPULL; + + switch(mode) { + case TIMER_PWM: + channelOC[channel - 1].OCMode = TIM_OCMODE_PWM1; + pinMode = GPIO_MODE_AF_PP; + break; + + case TIMER_OUTPUT_COMPARE: + channelOC[channel - 1].OCMode = TIM_OCMODE_TIMING; + break; + + case TIMER_OUTPUT_COMPARE_ACTIVE: + channelOC[channel - 1].OCMode = TIM_OCMODE_ACTIVE; + pinMode = GPIO_MODE_AF_PP; + break; + + case TIMER_OUTPUT_COMPARE_INACTIVE: + channelOC[channel - 1].OCMode = TIM_OCMODE_ACTIVE; + pinMode = GPIO_MODE_AF_PP; + break; + + case TIMER_OUTPUT_COMPARE_TOGGLE: + channelOC[channel - 1].OCMode = TIM_OCMODE_TOGGLE; + pinMode = GPIO_MODE_AF_PP; + break; + + case TIMER_OUTPUT_COMPARE_PWM1: + channelOC[channel - 1].OCMode = TIM_OCMODE_PWM1; + pinMode = GPIO_MODE_AF_PP; + break; + + case TIMER_OUTPUT_COMPARE_PWM2: + channelOC[channel - 1].OCMode = TIM_OCMODE_PWM2; + pinMode = GPIO_MODE_AF_PP; + break; + + case TIMER_OUTPUT_COMPARE_FORCED_ACTIVE: + channelOC[channel - 1].OCMode = TIM_OCMODE_FORCED_ACTIVE; + pinMode = GPIO_MODE_AF_PP; + break; + + case TIMER_OUTPUT_COMPARE_FORCED_INACTIVE: + channelOC[channel - 1].OCMode = TIM_OCMODE_FORCED_INACTIVE; + pinMode = GPIO_MODE_AF_PP; + break; + + case TIMER_INPUT_CAPTURE_RISING: + channelIC[channel - 1].ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING; + pinMode = GPIO_MODE_AF_PP; + pull = GPIO_PULLDOWN; + break; + + case TIMER_INPUT_CAPTURE_FALLING: + channelIC[channel - 1].ICPolarity = TIM_INPUTCHANNELPOLARITY_FALLING; + pinMode = GPIO_MODE_AF_PP; + pull = GPIO_PULLDOWN; + break; + } + + if (pinMode != PIN_NOT_USED) { + //for(int i=0; ihandle, TIM_FLAG_UPDATE) != RESET) { + __HAL_TIM_CLEAR_IT(&timer->handle, TIM_IT_UPDATE); + if (timer->callbacks[0] != NULL) timer->callbacks[0](); + } + + if(__HAL_TIM_GET_FLAG(&timer->handle, TIM_FLAG_CC1) != RESET) { + __HAL_TIM_CLEAR_IT(&timer->handle, TIM_IT_CC1); + if (timer->callbacks[1] != NULL) timer->callbacks[1](); + } + + if(__HAL_TIM_GET_FLAG(&timer->handle, TIM_FLAG_CC2) != RESET) { + __HAL_TIM_CLEAR_IT(&timer->handle, TIM_IT_CC2); + if (timer->callbacks[2] != NULL) timer->callbacks[2](); + } + + if(__HAL_TIM_GET_FLAG(&timer->handle, TIM_FLAG_CC3) != RESET) { + __HAL_TIM_CLEAR_IT(&timer->handle, TIM_IT_CC3); + if (timer->callbacks[3] != NULL) timer->callbacks[3](); + } + + if(__HAL_TIM_GET_FLAG(&timer->handle, TIM_FLAG_CC4) != RESET) { + __HAL_TIM_CLEAR_IT(&timer->handle, TIM_IT_CC4); + if (timer->callbacks[4] != NULL) timer->callbacks[4](); + } +} + +#ifdef TIM1 + HardwareTimer Timer1(TIM1); +#endif + +#ifdef TIM2 + HardwareTimer Timer2(TIM2); +#endif + +#ifdef TIM3 + HardwareTimer Timer3(TIM3); +#endif + +#ifdef TIM4 + HardwareTimer Timer4(TIM4); +#endif + +#ifdef TIM5 + HardwareTimer Timer5(TIM5); +#endif + +#ifdef TIM8 + HardwareTimer Timer8(TIM8); +#endif + +//Timer interrupts: + +// extern "C" void TIM1_CC_IRQHandler(void) { +// if (interruptTimers[0] != NULL) handleInterrupt(interruptTimers[0]); +// } +// extern "C" void TIM1_UP_IRQHandler(void) { +// if (interruptTimers[0] != NULL) handleInterrupt(interruptTimers[0]); +// } +// #ifndef TIM1_UP_TIM10_IRQHandler +// extern "C" void TIM1_UP_TIM10_IRQHandler(void) { +// if (interruptTimers[0] != NULL) handleInterrupt(interruptTimers[0]); +// if (interruptTimers[9] != NULL) handleInterrupt(interruptTimers[9]); +// } +// #endif + +// in stm32_PWM.c +/* +extern "C" void TIM2_IRQHandler(void) { + handleInterrupt(interruptTimers[1]); +}*/ + +// extern "C" void TIM3_IRQHandler(void) { +// if (interruptTimers[2] != NULL) handleInterrupt(interruptTimers[2]); +// } +// extern "C" void TIM4_IRQHandler(void) { +// if (interruptTimers[3] != NULL) handleInterrupt(interruptTimers[3]); +// } diff --git a/speeduino/src/HardwareTimers/HardwareTimer.h_test b/speeduino/src/HardwareTimers/HardwareTimer.h_test new file mode 100644 index 00000000..1cbaaefa --- /dev/null +++ b/speeduino/src/HardwareTimers/HardwareTimer.h_test @@ -0,0 +1,123 @@ +#ifndef HARDWARETIMER_H_ +#define HARDWARETIMER_H_ + +#include "Arduino.h" +#include "timer.h" +//#include "stm32_gpio_af.h" + +typedef enum { + //libmaple: // HAL compatible + TIMER_DISABLED, + TIMER_PWM, // == TIM_OCMODE_PWM1 + TIMER_OUTPUT_COMPARE, // == TIM_OCMODE_TIMING no output, useful for only-interrupt + + //other: + TIMER_OUTPUT_COMPARE_ACTIVE, // == TIM_OCMODE_ACTIVE pin is set high when counter == channel compare + TIMER_OUTPUT_COMPARE_INACTIVE, // == TIM_OCMODE_INACTIVE pin is set low when counter == channel compare + TIMER_OUTPUT_COMPARE_TOGGLE, // == TIM_OCMODE_TOGGLE pin toggles when counter == channel compare + TIMER_OUTPUT_COMPARE_PWM1, // == TIM_OCMODE_PWM1 pin high when counter < channel compare, low otherwise + TIMER_OUTPUT_COMPARE_PWM2, // == TIM_OCMODE_PWM2 pin low when counter < channel compare, high otherwise + TIMER_OUTPUT_COMPARE_FORCED_ACTIVE, // == TIM_OCMODE_FORCED_ACTIVE pin always high + TIMER_OUTPUT_COMPARE_FORCED_INACTIVE, // == TIM_OCMODE_FORCED_INACTIVE pin always low + + //Input capture + TIMER_INPUT_CAPTURE_RISING, // == TIM_INPUTCHANNELPOLARITY_RISING + TIMER_INPUT_CAPTURE_FALLING, // == TIM_INPUTCHANNELPOLARITY_FALLING + + //PWM input capture on channel 1 + channel 2 + //TIMER_INPUT_CAPTURE_PWM, // == TIM_INPUTCHANNELPOLARITY_RISING (channel 1) + TIM_INPUTCHANNELPOLARITY_FALLING (channel 2) + + //Encoder mode + //TIMER_ENCODER // == TIM_ENCODERMODE_TI1 +} TIMER_MODES; + +#define TIMER_DEFAULT_PIN 0xFF + +class HardwareTimer { +public: + HardwareTimer(TIM_TypeDef* timer); + + void pause(void); + + void resume(void); + + uint32_t getPrescaleFactor(); + + void setPrescaleFactor(uint32_t factor); + + uint32_t getOverflow(); + + void setOverflow(uint32_t val); + + uint32_t getCount(void); + + void setCount(uint32_t val); + + uint32_t setPeriod(uint32_t microseconds); + + void setMode(int channel, TIMER_MODES mode, uint8_t pin = TIMER_DEFAULT_PIN); + + uint32_t getCompare(int channel); + + void setCompare(int channel, uint32_t compare); + + //Add interrupt to period update + void attachInterrupt(void (*handler)(void)); + + void detachInterrupt(); + + //Add interrupt to channel + void attachInterrupt(int channel, void (*handler)(void)); + + void detachInterrupt(int channel); + + void refresh(void); + + uint32_t getBaseFrequency(); + + TIM_HandleTypeDef handle = {0}; + + TIM_OC_InitTypeDef channelOC[4]; + + TIM_IC_InitTypeDef channelIC[4]; + + //Callbacks: 0 for update, 1-4 for channels + void (*callbacks[5])(void); + + stimer_t _timer; + + // //const stm32_tim_pin_list_type *tim_pin_list; + + // int tim_pin_list_size; + +private: + void resumeChannel(int channel, int timChannel); + +}; + +#ifdef TIM1 + extern HardwareTimer Timer1; +#endif + +#ifdef TIM2 + extern HardwareTimer Timer2; +#endif + +#ifdef TIM3 + extern HardwareTimer Timer3; +#endif + +#ifdef TIM4 + extern HardwareTimer Timer4; +#endif + +#ifdef TIM5 + extern HardwareTimer Timer5; +#endif + +#ifdef TIM8 + extern HardwareTimer Timer8; +#endif + + +#endif From 9c3067fdaebdfa67e391545ef761f99d32573fe4 Mon Sep 17 00:00:00 2001 From: hoogendijkta Date: Wed, 20 Feb 2019 13:45:38 +0100 Subject: [PATCH 02/51] Sram battery backuped used as EEPROM on the BLACK_STM32F407VE boards --- .../src/BackupSram/BackupSramAsEEPROM.cpp | 76 +++++++++++++++++++ speeduino/src/BackupSram/BackupSramAsEEPROM.h | 30 ++++++++ speeduino/storage.ino | 5 +- speeduino/updates.ino | 4 +- 4 files changed, 113 insertions(+), 2 deletions(-) create mode 100644 speeduino/src/BackupSram/BackupSramAsEEPROM.cpp create mode 100644 speeduino/src/BackupSram/BackupSramAsEEPROM.h diff --git a/speeduino/src/BackupSram/BackupSramAsEEPROM.cpp b/speeduino/src/BackupSram/BackupSramAsEEPROM.cpp new file mode 100644 index 00000000..865b5f7c --- /dev/null +++ b/speeduino/src/BackupSram/BackupSramAsEEPROM.cpp @@ -0,0 +1,76 @@ +#if defined(ARDUINO_BLACK_F407VE) +#include "BackupSramAsEEPROM.h" + + BackupSramAsEEPROM::BackupSramAsEEPROM(){} + int8_t BackupSramAsEEPROM::write_byte( uint8_t *data, uint16_t bytes, uint16_t offset ) { + uint8_t* base_addr = (uint8_t *) BKPSRAM_BASE; + uint16_t i; + if( bytes + offset >= backup_size ) { + /* ERROR : the last byte is outside the backup SRAM region */ + return -1; + } + + //Enable the power interface clock + RCC->APB1ENR |= RCC_APB1ENR_PWREN; + + //Enable the backup SRAM clock by setting BKPSRAMEN bit i + RCC->AHB1ENR |= RCC_AHB1ENR_BKPSRAMEN; + + /* disable backup domain write protection */ + //Set the Disable Backup Domain write protection (DBP) bit in PWR power control register + PWR->CR |= PWR_CR_DBP; + + /** enable the backup regulator (used to maintain the backup SRAM content in + * standby and Vbat modes). NOTE : this bit is not reset when the device + * wakes up from standby, system reset or power reset. You can check that + * the backup regulator is ready on PWR->CSR.brr, see rm p144 */ + //enable backup power regulator this makes sram backup posible. bit is not reset by software! + PWR->CSR |= PWR_CSR_BRE; + + for( i = 0; i < bytes; i++ ) { + *(base_addr + offset + i) = *(data + i); + } + //Enable write protection backup sram when finished + PWR->CR &= ~PWR_CR_DBP; + return 0; + } + + int8_t BackupSramAsEEPROM::read_byte( uint8_t *data, uint16_t bytes, uint16_t offset ) { + + uint8_t* base_addr = (uint8_t *) BKPSRAM_BASE; + uint16_t i; + if( bytes + offset >= backup_size ) { + /* ERROR : the last byte is outside the backup SRAM region */ + return -1; + } + //Enable the backup SRAM clock by setting BKPSRAMEN bit i + RCC->AHB1ENR |= RCC_AHB1ENR_BKPSRAMEN; + + for( i = 0; i < bytes; i++ ) { + *(data + i) = *(base_addr + offset + i); + } + return 0; + } + + uint8_t BackupSramAsEEPROM::read(uint16_t address) { + + uint8_t val = 0; + read_byte(&val, 1, address); + + return val; + } + + int8_t BackupSramAsEEPROM::write(uint16_t address, uint8_t val) { + write_byte(&val, 1, address); + return 0; + } + + int8_t BackupSramAsEEPROM::update(uint16_t address, uint8_t val) { + write_byte(&val, 1, address); + return 0; + } + +BackupSramAsEEPROM EEPROM; + +#endif + diff --git a/speeduino/src/BackupSram/BackupSramAsEEPROM.h b/speeduino/src/BackupSram/BackupSramAsEEPROM.h new file mode 100644 index 00000000..14c0fcde --- /dev/null +++ b/speeduino/src/BackupSram/BackupSramAsEEPROM.h @@ -0,0 +1,30 @@ +//Backup sram stores data in the battery backuped sram portion. +//The backup battery is available on the ebay stm32F407VET6 black boards. + + +//UGLY HACK TO PREVENT EEPROM LIBRARY BEING IMPORTED FIRST!! +#ifndef EEPROM_h +#define EEPROM_h + +#if defined(ARDUINO_BLACK_F407VE) + +#include +#include "stm32f407xx.h" + +class BackupSramAsEEPROM { + private: + const uint16_t backup_size = 0x4000; //maximum of 4kb backuped sram available. + int8_t write_byte( uint8_t *data, uint16_t bytes, uint16_t offset ); + int8_t read_byte( uint8_t *data, uint16_t bytes, uint16_t offset ); + + public: + BackupSramAsEEPROM(); + uint8_t read(uint16_t address); + int8_t write(uint16_t address, uint8_t val); + int8_t update(uint16_t address, uint8_t val); +}; + +extern BackupSramAsEEPROM EEPROM; + +#endif +#endif diff --git a/speeduino/storage.ino b/speeduino/storage.ino index 9451e842..0a333bd0 100644 --- a/speeduino/storage.ino +++ b/speeduino/storage.ino @@ -10,10 +10,13 @@ A full copy of the license may be found in the projects root directory #include "comms.h" #if defined(CORE_SAMD21) #include "src/FlashStorage/FlashAsEEPROM.h" +#elif defined(ARDUINO_BLACK_F407VE) + #include "src/BackupSram/BackupSramAsEEPROM.h" #else #include #endif #include "storage.h" + void writeAllConfig() { writeConfig(1); @@ -654,4 +657,4 @@ byte readLastBaro() { return EEPROM.read(EEPROM_LAST_BARO); } void storeLastBaro(byte newValue) { EEPROM.update(EEPROM_LAST_BARO, newValue); } void storeCalibrationValue(uint16_t location, byte value) { EEPROM.update(location, value); } //This is essentially just an abstraction for EEPROM.update() byte readEEPROMVersion() { return EEPROM.read(EEPROM_DATA_VERSION); } -void storeEEPROMVersion(byte newVersion) { EEPROM.update(EEPROM_DATA_VERSION, newVersion); } \ No newline at end of file +void storeEEPROMVersion(byte newVersion) { EEPROM.update(EEPROM_DATA_VERSION, newVersion); } diff --git a/speeduino/updates.ino b/speeduino/updates.ino index 6873f21f..4bdc27e7 100644 --- a/speeduino/updates.ino +++ b/speeduino/updates.ino @@ -8,8 +8,10 @@ #include "storage.h" #if defined(CORE_SAMD21) #include "src/FlashStorage/FlashAsEEPROM.h" +#elif defined(ARDUINO_BLACK_F407VE) + #include "src/BackupSram/BackupSramAsEEPROM.h" #else -#include + #include #endif void doUpdates() From 85c8e1dbdb5380e3e17891e7a883aea9c960da32 Mon Sep 17 00:00:00 2001 From: hoogendijkta Date: Wed, 20 Feb 2019 15:47:48 +0100 Subject: [PATCH 03/51] moved pin definitions to board files instead of init.ino --- speeduino/board_avr2560.ino | 523 +++++++++++++++++++++++- speeduino/board_stm32.h | 44 +-- speeduino/board_stm32.ino | 636 +++++++++++++++++++++++++++++ speeduino/board_teensy35.ino | 746 +++++++++++++++++++++++++++++++++++ speeduino/init.ino | 746 ----------------------------------- 5 files changed, 1906 insertions(+), 789 deletions(-) diff --git a/speeduino/board_avr2560.ino b/speeduino/board_avr2560.ino index 864fa7bb..bb6de349 100644 --- a/speeduino/board_avr2560.ino +++ b/speeduino/board_avr2560.ino @@ -77,5 +77,526 @@ static inline unsigned long micros_safe() return newMicros; } #endif +void setPinMapping(byte boardID) +{ + switch (boardID) + { + case 0: + //Pin mappings as per the v0.1 shield + pinInjector1 = 8; //Output pin injector 1 is on + pinInjector2 = 9; //Output pin injector 2 is on + pinInjector3 = 11; //Output pin injector 3 is on + pinInjector4 = 10; //Output pin injector 4 is on + pinInjector5 = 12; //Output pin injector 5 is on + pinCoil1 = 6; //Pin for coil 1 + pinCoil2 = 7; //Pin for coil 2 + pinCoil3 = 12; //Pin for coil 3 + pinCoil4 = 13; //Pin for coil 4 + pinCoil5 = 14; //Pin for coil 5 + pinTrigger = 2; //The CAS pin + pinTrigger2 = 3; //The CAS pin + pinTPS = A0; //TPS input pin + pinMAP = A1; //MAP sensor pin + pinIAT = A2; //IAT sensor pin + pinCLT = A3; //CLS sensor pin + pinO2 = A4; //O2 Sensor pin + pinIdle1 = 46; //Single wire idle control + pinIdle2 = 47; //2 wire idle control + pinStepperDir = 16; //Direction pin for DRV8825 driver + pinStepperStep = 17; //Step pin for DRV8825 driver + pinFan = 47; //Pin for the fan output + pinFuelPump = 4; //Fuel pump output + pinTachOut = 49; //Tacho output pin + pinFlex = 19; // Flex sensor (Must be external interrupt enabled) + pinResetControl = 43; //Reset control output + break; + case 1: + //Pin mappings as per the v0.2 shield + pinInjector1 = 8; //Output pin injector 1 is on + pinInjector2 = 9; //Output pin injector 2 is on + pinInjector3 = 10; //Output pin injector 3 is on + pinInjector4 = 11; //Output pin injector 4 is on + pinInjector5 = 12; //Output pin injector 5 is on + pinCoil1 = 28; //Pin for coil 1 + pinCoil2 = 24; //Pin for coil 2 + pinCoil3 = 40; //Pin for coil 3 + pinCoil4 = 36; //Pin for coil 4 + pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now + pinTrigger = 20; //The CAS pin + pinTrigger2 = 21; //The Cam Sensor pin + pinTPS = A2; //TPS input pin + pinMAP = A3; //MAP sensor pin + pinIAT = A0; //IAT sensor pin + pinCLT = A1; //CLS sensor pin + pinO2 = A8; //O2 Sensor pin + pinBat = A4; //Battery reference voltage pin + pinDisplayReset = 48; // OLED reset pin + pinTachOut = 49; //Tacho output pin + pinIdle1 = 30; //Single wire idle control + pinIdle2 = 31; //2 wire idle control + pinStepperDir = 16; //Direction pin for DRV8825 driver + pinStepperStep = 17; //Step pin for DRV8825 driver + pinFan = 47; //Pin for the fan output + pinFuelPump = 4; //Fuel pump output + pinFlex = 2; // Flex sensor (Must be external interrupt enabled) + pinResetControl = 43; //Reset control output + break; + case 2: + //Pin mappings as per the v0.3 shield + pinInjector1 = 8; //Output pin injector 1 is on + pinInjector2 = 9; //Output pin injector 2 is on + pinInjector3 = 10; //Output pin injector 3 is on + pinInjector4 = 11; //Output pin injector 4 is on + pinInjector5 = 12; //Output pin injector 5 is on + pinCoil1 = 28; //Pin for coil 1 + pinCoil2 = 24; //Pin for coil 2 + pinCoil3 = 40; //Pin for coil 3 + pinCoil4 = 36; //Pin for coil 4 + pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now + pinTrigger = 19; //The CAS pin + pinTrigger2 = 18; //The Cam Sensor pin + pinTPS = A2;//TPS input pin + pinMAP = A3; //MAP sensor pin + pinIAT = A0; //IAT sensor pin + pinCLT = A1; //CLS sensor pin + pinO2 = A8; //O2 Sensor pin + pinBat = A4; //Battery reference voltage pin + pinDisplayReset = 48; // OLED reset pin + pinTachOut = 49; //Tacho output pin + pinIdle1 = 5; //Single wire idle control + pinIdle2 = 53; //2 wire idle control + pinBoost = 7; //Boost control + pinVVT_1 = 6; //Default VVT output + pinFuelPump = 4; //Fuel pump output + pinStepperDir = 16; //Direction pin for DRV8825 driver + pinStepperStep = 17; //Step pin for DRV8825 driver + pinStepperEnable = 26; //Enable pin for DRV8825 + pinFan = A13; //Pin for the fan output + pinLaunch = 51; //Can be overwritten below + pinFlex = 2; // Flex sensor (Must be external interrupt enabled) + pinResetControl = 50; //Reset control output + break; -#endif \ No newline at end of file + case 3: + //Pin mappings as per the v0.4 shield + pinInjector1 = 8; //Output pin injector 1 is on + pinInjector2 = 9; //Output pin injector 2 is on + pinInjector3 = 10; //Output pin injector 3 is on + pinInjector4 = 11; //Output pin injector 4 is on + pinInjector5 = 12; //Output pin injector 5 is on + pinInjector6 = 50; //CAUTION: Uses the same as Coil 4 below. + pinCoil1 = 40; //Pin for coil 1 + pinCoil2 = 38; //Pin for coil 2 + pinCoil3 = 52; //Pin for coil 3 + pinCoil4 = 50; //Pin for coil 4 + pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now + pinTrigger = 19; //The CAS pin + pinTrigger2 = 18; //The Cam Sensor pin + pinTPS = A2;//TPS input pin + pinMAP = A3; //MAP sensor pin + pinIAT = A0; //IAT sensor pin + pinCLT = A1; //CLS sensor pin + pinO2 = A8; //O2 Sensor pin + pinBat = A4; //Battery reference voltage pin + pinDisplayReset = 48; // OLED reset pin + pinTachOut = 49; //Tacho output pin (Goes to ULN2803) + pinIdle1 = 5; //Single wire idle control + pinIdle2 = 6; //2 wire idle control + pinBoost = 7; //Boost control + pinVVT_1 = 4; //Default VVT output + pinFuelPump = 45; //Fuel pump output (Goes to ULN2803) + pinStepperDir = 16; //Direction pin for DRV8825 driver + pinStepperStep = 17; //Step pin for DRV8825 driver + pinStepperEnable = 24; //Enable pin for DRV8825 + pinFan = 47; //Pin for the fan output (Goes to ULN2803) + pinLaunch = 51; //Can be overwritten below + pinFlex = 2; // Flex sensor (Must be external interrupt enabled) + pinResetControl = 43; //Reset control output + + break; + + case 9: + //Pin mappings as per the MX5 PNP shield + pinInjector1 = 11; //Output pin injector 1 is on + pinInjector2 = 10; //Output pin injector 2 is on + pinInjector3 = 9; //Output pin injector 3 is on + pinInjector4 = 8; //Output pin injector 4 is on + pinInjector5 = 14; //Output pin injector 5 is on + pinCoil1 = 39; //Pin for coil 1 + pinCoil2 = 41; //Pin for coil 2 + pinCoil3 = 32; //Pin for coil 3 + pinCoil4 = 33; //Pin for coil 4 + pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now + pinTrigger = 19; //The CAS pin + pinTrigger2 = 18; //The Cam Sensor pin + pinTPS = A2;//TPS input pin + pinMAP = A5; //MAP sensor pin + pinIAT = A0; //IAT sensor pin + pinCLT = A1; //CLS sensor pin + pinO2 = A3; //O2 Sensor pin + pinBat = A4; //Battery reference voltage pin + pinDisplayReset = 48; // OLED reset pin + pinTachOut = 49; //Tacho output pin (Goes to ULN2803) + pinIdle1 = 2; //Single wire idle control + pinBoost = 4; + pinIdle2 = 4; //2 wire idle control (Note this is shared with boost!!!) + pinFuelPump = 37; //Fuel pump output + pinStepperDir = 16; //Direction pin for DRV8825 driver + pinStepperStep = 17; //Step pin for DRV8825 driver + pinFan = 35; //Pin for the fan output + pinLaunch = 12; //Can be overwritten below + pinFlex = 3; // Flex sensor (Must be external interrupt enabled) + pinResetControl = 44; //Reset control output + + break; + + case 10: + + //Pin mappings for user turtanas PCB + pinInjector1 = 4; //Output pin injector 1 is on + pinInjector2 = 5; //Output pin injector 2 is on + pinInjector3 = 6; //Output pin injector 3 is on + pinInjector4 = 7; //Output pin injector 4 is on + pinInjector5 = 8; //Placeholder only - NOT USED + pinInjector6 = 9; //Placeholder only - NOT USED + pinInjector7 = 10; //Placeholder only - NOT USED + pinInjector8 = 11; //Placeholder only - NOT USED + pinCoil1 = 24; //Pin for coil 1 + pinCoil2 = 28; //Pin for coil 2 + pinCoil3 = 36; //Pin for coil 3 + pinCoil4 = 40; //Pin for coil 4 + pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now + pinTrigger = 18; //The CAS pin + pinTrigger2 = 19; //The Cam Sensor pin + pinTPS = A2;//TPS input pin + pinMAP = A3; //MAP sensor pin + pinMAP2 = A8; //MAP2 sensor pin + pinIAT = A0; //IAT sensor pin + pinCLT = A1; //CLS sensor pin + pinO2 = A4; //O2 Sensor pin + pinBat = A7; //Battery reference voltage pin + pinDisplayReset = 48; // OLED reset pin + pinSpareTemp1 = A6; + pinSpareTemp2 = A5; + pinTachOut = 41; //Tacho output pin transistori puuttuu 2n2222 tähän ja 1k 12v + pinFuelPump = 42; //Fuel pump output 2n2222 + pinFan = 47; //Pin for the fan output + pinTachOut = 49; //Tacho output pin + pinFlex = 2; // Flex sensor (Must be external interrupt enabled) + pinResetControl = 26; //Reset control output + + + break; + + case 20: + //Pin mappings as per the Plazomat In/Out shields Rev 0.1 + pinInjector1 = 8; //Output pin injector 1 is on + pinInjector2 = 9; //Output pin injector 2 is on + pinInjector3 = 10; //Output pin injector 3 is on + pinInjector4 = 11; //Output pin injector 4 is on + pinInjector5 = 12; //Output pin injector 5 is on + pinCoil1 = 28; //Pin for coil 1 + pinCoil2 = 24; //Pin for coil 2 + pinCoil3 = 40; //Pin for coil 3 + pinCoil4 = 36; //Pin for coil 4 + pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now + pinSpareOut1 = 4; //Spare LSD Output 1(PWM) + pinSpareOut2 = 5; //Spare LSD Output 2(PWM) + pinSpareOut3 = 6; //Spare LSD Output 3(PWM) + pinSpareOut4 = 7; //Spare LSD Output 4(PWM) + pinSpareOut5 = 50; //Spare LSD Output 5(digital) + pinSpareOut6 = 52; //Spare LSD Output 6(digital) + pinTrigger = 20; //The CAS pin + pinTrigger2 = 21; //The Cam Sensor pin + pinSpareTemp2 = A15; //spare Analog input 2 + pinSpareTemp1 = A14; //spare Analog input 1 + pinO2 = A8; //O2 Sensor pin + pinBat = A4; //Battery reference voltage pin + pinMAP = A3; //MAP sensor pin + pinTPS = A2;//TPS input pin + pinCLT = A1; //CLS sensor pin + pinIAT = A0; //IAT sensor pin + pinFan = 47; //Pin for the fan output + pinFuelPump = 4; //Fuel pump output + pinTachOut = 49; //Tacho output pin + pinResetControl = 26; //Reset control output + break; + + case 30: + //Pin mappings as per the dazv6 shield + pinInjector1 = 8; //Output pin injector 1 is on + pinInjector2 = 9; //Output pin injector 2 is on + pinInjector3 = 10; //Output pin injector 3 is on + pinInjector4 = 11; //Output pin injector 4 is on + pinInjector5 = 12; //Output pin injector 5 is on + pinCoil1 = 40; //Pin for coil 1 + pinCoil2 = 38; //Pin for coil 2 + pinCoil3 = 50; //Pin for coil 3 + pinCoil4 = 52; //Pin for coil 4 + pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now + pinTrigger = 19; //The CAS pin + pinTrigger2 = 18; //The Cam Sensor pin + pinTrigger3 = 17; // cam sensor 2 pin + pinTPS = A2;//TPS input pin + pinMAP = A3; //MAP sensor pin + pinIAT = A0; //IAT sensor pin + pinCLT = A1; //CLS sensor pin + pinO2 = A8; //O2 Sensor pin + pinO2_2 = A9; //O2 sensor pin (second sensor) + pinBat = A4; //Battery reference voltage pin + pinDisplayReset = 48; // OLED reset pin + pinTachOut = 49; //Tacho output pin + pinIdle1 = 5; //Single wire idle control + pinFuelPump = 45; //Fuel pump output + pinStepperDir = 20; //Direction pin for DRV8825 driver + pinStepperStep = 21; //Step pin for DRV8825 driver + pinSpareHOut1 = 4; // high current output spare1 + pinSpareHOut2 = 6; // high current output spare2 + pinBoost = 7; + pinSpareLOut1 = 43; //low current output spare1 + pinSpareLOut2 = 47; + pinSpareLOut3 = 49; + pinSpareLOut4 = 51; + pinSpareLOut5 = 53; + pinFan = 47; //Pin for the fan output + break; + + case 40: + //Pin mappings as per the NO2C shield + pinInjector1 = 8; //Output pin injector 1 is on + pinInjector2 = 9; //Output pin injector 2 is on + pinInjector3 = 11; //Output pin injector 3 is on - NOT USED + pinInjector4 = 12; //Output pin injector 4 is on - NOT USED + pinInjector5 = 13; //Placeholder only - NOT USED + pinCoil1 = 23; //Pin for coil 1 + pinCoil2 = 22; //Pin for coil 2 + pinCoil3 = 2; //Pin for coil 3 - ONLY WITH DB2 + pinCoil4 = 3; //Pin for coil 4 - ONLY WITH DB2 + pinCoil5 = 46; //Placeholder only - NOT USED + pinTrigger = 19; //The CAS pin + pinTrigger2 = 18; //The Cam Sensor pin + pinTPS = A3; //TPS input pin + pinMAP = A0; //MAP sensor pin + pinIAT = A5; //IAT sensor pin + pinCLT = A4; //CLT sensor pin + pinO2 = A2; //O2 sensor pin + pinBat = A1; //Battery reference voltage pin + pinBaro = A6; //Baro sensor pin - ONLY WITH DB + pinSpareTemp1 = A7; //spare Analog input 1 - ONLY WITH DB + pinDisplayReset = 48; // OLED reset pin - NOT USED + pinTachOut = 38; //Tacho output pin + pinIdle1 = 5; //Single wire idle control + pinIdle2 = 47; //2 wire idle control - NOT USED + pinBoost = 7; //Boost control + pinVVT_1 = 6; //Default VVT output + pinFuelPump = 4; //Fuel pump output + pinStepperDir = 25; //Direction pin for DRV8825 driver + pinStepperStep = 24; //Step pin for DRV8825 driver + pinStepperEnable = 27; //Enable pin for DRV8825 driver + pinLaunch = 10; //Can be overwritten below + pinFlex = 20; // Flex sensor (Must be external interrupt enabled) - ONLY WITH DB + pinFan = 30; //Pin for the fan output - ONLY WITH DB + pinSpareLOut1 = 32; //low current output spare1 - ONLY WITH DB + pinSpareLOut2 = 34; //low current output spare2 - ONLY WITH DB + pinSpareLOut3 = 36; //low current output spare3 - ONLY WITH DB + pinResetControl = 26; //Reset control output + break; + + case 41: + //Pin mappings as per the UA4C shield + pinInjector1 = 8; //Output pin injector 1 is on + pinInjector2 = 7; //Output pin injector 2 is on + pinInjector3 = 6; //Output pin injector 3 is on + pinInjector4 = 5; //Output pin injector 4 is on + pinInjector5 = 45; //Output pin injector 5 is on PLACEHOLDER value for now + pinCoil1 = 35; //Pin for coil 1 + pinCoil2 = 36; //Pin for coil 2 + pinCoil3 = 33; //Pin for coil 3 + pinCoil4 = 34; //Pin for coil 4 + pinCoil5 = 44; //Pin for coil 5 PLACEHOLDER value for now + pinTrigger = 19; //The CAS pin + pinTrigger2 = 18; //The Cam Sensor pin + pinFlex = 20; // Flex sensor + pinTPS = A3; //TPS input pin + pinMAP = A0; //MAP sensor pin + pinBaro = A7; //Baro sensor pin + pinIAT = A5; //IAT sensor pin + pinCLT = A4; //CLS sensor pin + pinO2 = A1; //O2 Sensor pin + pinO2_2 = A9; //O2 sensor pin (second sensor) + pinBat = A2; //Battery reference voltage pin + pinSpareTemp1 = A8; //spare Analog input 1 + pinLaunch = 37; //Can be overwritten below + pinDisplayReset = 48; // OLED reset pin PLACEHOLDER value for now + pinTachOut = 22; //Tacho output pin + pinIdle1 = 9; //Single wire idle control + pinIdle2 = 10; //2 wire idle control + pinFuelPump = 23; //Fuel pump output + pinVVT_1 = 11; //Default VVT output + pinStepperDir = 32; //Direction pin for DRV8825 driver + pinStepperStep = 31; //Step pin for DRV8825 driver + pinStepperEnable = 30; //Enable pin for DRV8825 driver + pinBoost = 12; //Boost control + pinSpareLOut1 = 26; //low current output spare1 + pinSpareLOut2 = 27; //low current output spare2 + pinSpareLOut3 = 28; //low current output spare3 + pinSpareLOut4 = 29; //low current output spare4 + pinFan = 24; //Pin for the fan output + pinResetControl = 46; //Reset control output PLACEHOLDER value for now + break; + + default: + //Pin mappings as per the v0.2 shield + pinInjector1 = 8; //Output pin injector 1 is on + pinInjector2 = 9; //Output pin injector 2 is on + pinInjector3 = 10; //Output pin injector 3 is on + pinInjector4 = 11; //Output pin injector 4 is on + pinInjector5 = 12; //Output pin injector 5 is on + pinCoil1 = 28; //Pin for coil 1 + pinCoil2 = 24; //Pin for coil 2 + pinCoil3 = 40; //Pin for coil 3 + pinCoil4 = 36; //Pin for coil 4 + pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now + pinTrigger = 20; //The CAS pin + pinTrigger2 = 21; //The Cam Sensor pin + pinTPS = A2; //TPS input pin + pinMAP = A3; //MAP sensor pin + pinIAT = A0; //IAT sensor pin + pinCLT = A1; //CLS sensor pin + pinO2 = A8; //O2 Sensor pin + pinBat = A4; //Battery reference voltage pin + pinStepperDir = 16; //Direction pin for DRV8825 driver + pinStepperStep = 17; //Step pin for DRV8825 driver + pinDisplayReset = 48; // OLED reset pin + pinFan = 47; //Pin for the fan output + pinFuelPump = 4; //Fuel pump output + pinTachOut = 49; //Tacho output pin + pinFlex = 3; // Flex sensor (Must be external interrupt enabled) + pinBoost = 5; + pinIdle1 = 6; + pinResetControl = 43; //Reset control output + break; + } + + //Setup any devices that are using selectable pins + + if ( (configPage6.launchPin != 0) && (configPage6.launchPin < BOARD_NR_GPIO_PINS) ) { pinLaunch = pinTranslate(configPage6.launchPin); } + if ( (configPage4.ignBypassPin != 0) && (configPage4.ignBypassPin < BOARD_NR_GPIO_PINS) ) { pinIgnBypass = pinTranslate(configPage4.ignBypassPin); } + if ( (configPage2.tachoPin != 0) && (configPage2.tachoPin < BOARD_NR_GPIO_PINS) ) { pinTachOut = pinTranslate(configPage2.tachoPin); } + if ( (configPage4.fuelPumpPin != 0) && (configPage4.fuelPumpPin < BOARD_NR_GPIO_PINS) ) { pinFuelPump = pinTranslate(configPage4.fuelPumpPin); } + if ( (configPage6.fanPin != 0) && (configPage6.fanPin < BOARD_NR_GPIO_PINS) ) { pinFan = pinTranslate(configPage6.fanPin); } + if ( (configPage6.boostPin != 0) && (configPage6.boostPin < BOARD_NR_GPIO_PINS) ) { pinBoost = pinTranslate(configPage6.boostPin); } + if ( (configPage6.vvtPin != 0) && (configPage6.vvtPin < BOARD_NR_GPIO_PINS) ) { pinVVT_1 = pinTranslate(configPage6.vvtPin); } + if ( (configPage6.useExtBaro != 0) && (configPage6.baroPin < BOARD_NR_GPIO_PINS) ) { pinBaro = configPage6.baroPin + A0; } + if ( (configPage6.useEMAP != 0) && (configPage10.EMAPPin < BOARD_NR_GPIO_PINS) ) { pinEMAP = configPage10.EMAPPin + A0; } + + //Currently there's no default pin for Idle Up + pinIdleUp = pinTranslate(configPage2.idleUpPin); + + /* Reset control is a special case. If reset control is enabled, it needs its initial state set BEFORE its pinMode. + If that doesn't happen and reset control is in "Serial Command" mode, the Arduino will end up in a reset loop + because the control pin will go low as soon as the pinMode is set to OUTPUT. */ + if ( (configPage4.resetControl != 0) && (configPage4.resetControlPin < BOARD_NR_GPIO_PINS) ) + { + resetControl = configPage4.resetControl; + pinResetControl = pinTranslate(configPage4.resetControlPin); + setResetControlPinState(); + pinMode(pinResetControl, OUTPUT); + } + + //Finally, set the relevant pin modes for outputs + pinMode(pinCoil1, OUTPUT); + pinMode(pinCoil2, OUTPUT); + pinMode(pinCoil3, OUTPUT); + pinMode(pinCoil4, OUTPUT); + pinMode(pinCoil5, OUTPUT); + pinMode(pinInjector1, OUTPUT); + pinMode(pinInjector2, OUTPUT); + pinMode(pinInjector3, OUTPUT); + pinMode(pinInjector4, OUTPUT); + pinMode(pinInjector5, OUTPUT); + pinMode(pinTachOut, OUTPUT); + pinMode(pinIdle1, OUTPUT); + pinMode(pinIdle2, OUTPUT); + pinMode(pinFuelPump, OUTPUT); + pinMode(pinIgnBypass, OUTPUT); + pinMode(pinFan, OUTPUT); + pinMode(pinStepperDir, OUTPUT); + pinMode(pinStepperStep, OUTPUT); + pinMode(pinStepperEnable, OUTPUT); + pinMode(pinBoost, OUTPUT); + pinMode(pinVVT_1, OUTPUT); + + inj1_pin_port = portOutputRegister(digitalPinToPort(pinInjector1)); + inj1_pin_mask = digitalPinToBitMask(pinInjector1); + inj2_pin_port = portOutputRegister(digitalPinToPort(pinInjector2)); + inj2_pin_mask = digitalPinToBitMask(pinInjector2); + inj3_pin_port = portOutputRegister(digitalPinToPort(pinInjector3)); + inj3_pin_mask = digitalPinToBitMask(pinInjector3); + inj4_pin_port = portOutputRegister(digitalPinToPort(pinInjector4)); + inj4_pin_mask = digitalPinToBitMask(pinInjector4); + inj5_pin_port = portOutputRegister(digitalPinToPort(pinInjector5)); + inj5_pin_mask = digitalPinToBitMask(pinInjector5); + inj6_pin_port = portOutputRegister(digitalPinToPort(pinInjector6)); + inj6_pin_mask = digitalPinToBitMask(pinInjector6); + inj7_pin_port = portOutputRegister(digitalPinToPort(pinInjector7)); + inj7_pin_mask = digitalPinToBitMask(pinInjector7); + inj8_pin_port = portOutputRegister(digitalPinToPort(pinInjector8)); + inj8_pin_mask = digitalPinToBitMask(pinInjector8); + + ign1_pin_port = portOutputRegister(digitalPinToPort(pinCoil1)); + ign1_pin_mask = digitalPinToBitMask(pinCoil1); + ign2_pin_port = portOutputRegister(digitalPinToPort(pinCoil2)); + ign2_pin_mask = digitalPinToBitMask(pinCoil2); + ign3_pin_port = portOutputRegister(digitalPinToPort(pinCoil3)); + ign3_pin_mask = digitalPinToBitMask(pinCoil3); + ign4_pin_port = portOutputRegister(digitalPinToPort(pinCoil4)); + ign4_pin_mask = digitalPinToBitMask(pinCoil4); + ign5_pin_port = portOutputRegister(digitalPinToPort(pinCoil5)); + ign5_pin_mask = digitalPinToBitMask(pinCoil5); + ign6_pin_port = portOutputRegister(digitalPinToPort(pinCoil6)); + ign6_pin_mask = digitalPinToBitMask(pinCoil6); + ign7_pin_port = portOutputRegister(digitalPinToPort(pinCoil7)); + ign7_pin_mask = digitalPinToBitMask(pinCoil7); + ign8_pin_port = portOutputRegister(digitalPinToPort(pinCoil8)); + ign8_pin_mask = digitalPinToBitMask(pinCoil8); + + tach_pin_port = portOutputRegister(digitalPinToPort(pinTachOut)); + tach_pin_mask = digitalPinToBitMask(pinTachOut); + pump_pin_port = portOutputRegister(digitalPinToPort(pinFuelPump)); + pump_pin_mask = digitalPinToBitMask(pinFuelPump); + + pinMode(pinTrigger, INPUT); + pinMode(pinTrigger2, INPUT); + pinMode(pinTrigger3, INPUT); + + //Each of the below are only set when their relevant function is enabled. This can help prevent pin conflicts that users aren't aware of with unused functions + if(configPage2.flexEnabled > 0) + { + pinMode(pinFlex, INPUT); //Standard GM / Continental flex sensor requires pullup, but this should be onboard. The internal pullup will not work (Requires ~3.3k)! + } + if(configPage6.launchEnabled > 0) + { + if (configPage6.lnchPullRes == true) { pinMode(pinLaunch, INPUT_PULLUP); } + else { pinMode(pinLaunch, INPUT); } //If Launch Pull Resistor is not set make input float. + } + if(configPage2.idleUpEnabled > 0) + { + if (configPage2.idleUpPolarity == 0) { pinMode(pinIdleUp, INPUT_PULLUP); } //Normal setting + else { pinMode(pinIdleUp, INPUT); } //inverted setting + } + + + //These must come after the above pinMode statements + triggerPri_pin_port = portInputRegister(digitalPinToPort(pinTrigger)); + triggerPri_pin_mask = digitalPinToBitMask(pinTrigger); + triggerSec_pin_port = portInputRegister(digitalPinToPort(pinTrigger2)); + triggerSec_pin_mask = digitalPinToBitMask(pinTrigger2); + + //Set default values + digitalWrite(pinMAP, HIGH); + //digitalWrite(pinO2, LOW); + digitalWrite(pinTPS, LOW); + +} +#endif diff --git a/speeduino/board_stm32.h b/speeduino/board_stm32.h index f1e1b7b9..608c60a0 100644 --- a/speeduino/board_stm32.h +++ b/speeduino/board_stm32.h @@ -21,54 +21,14 @@ #define USE_SERIAL3 void initBoard(); uint16_t freeRam(); - extern void oneMSIntervalIRQ(stimer_t *Timer); +// extern void oneMSIntervalIRQ(stimer_t *Timer); extern void EmptyIRQCallback(stimer_t *Timer, uint32_t channel); #if defined(USE_STM32GENERIC) #define Serial Serial1 #endif - //Much of the below is not correct, but included to allow compilation - //STM32F1/variants/.../board.cpp - #if defined (STM32F4) - #define A0 PA0 - #define A1 PA1 - #define A2 PA2 - #define A3 PA3 - #define A4 PA4 - #define A5 PA5 - #define A6 PA6 - #define A7 PA7 - #define A8 PB0 - #define A9 PB1 - #define A10 PC0 - #define A11 PC1 - #define A12 PC2 - #define A13 PC3 - #define A14 PC4 - #define A15 PC5 - #else - #define A0 PB0 - #define A1 PA7 - #define A2 PA6 - #define A3 PA5 - #define A4 PA4 - #define A5 PA3 - #define A6 PA2 - #define A7 PA1 - #define A8 PA0 - //STM32F1 have only 9 12bit adc - #define A9 PB0 - #define A10 PA7 - #define A11 PA6 - #define A12 PA5 - #define A13 PA4 - #define A14 PA3 - #define A15 PA2 - #endif - - -/* + /* *********************************************************************************************************** * Schedules */ diff --git a/speeduino/board_stm32.ino b/speeduino/board_stm32.ino index 8f14ab2b..0a832850 100644 --- a/speeduino/board_stm32.ino +++ b/speeduino/board_stm32.ino @@ -178,5 +178,641 @@ uint16_t freeRam() char top = 't'; return &top - reinterpret_cast(sbrk(0)); } +void setPinMapping(byte boardID) +{ + switch (boardID) + { + case 0: + #ifndef SMALL_FLASH_MODE //No support for bluepill here anyway + //Pin mappings as per the v0.1 shield + pinInjector1 = 8; //Output pin injector 1 is on + pinInjector2 = 9; //Output pin injector 2 is on + pinInjector3 = 11; //Output pin injector 3 is on + pinInjector4 = 10; //Output pin injector 4 is on + pinInjector5 = 12; //Output pin injector 5 is on + pinCoil1 = 6; //Pin for coil 1 + pinCoil2 = 7; //Pin for coil 2 + pinCoil3 = 12; //Pin for coil 3 + pinCoil4 = 13; //Pin for coil 4 + pinCoil5 = 14; //Pin for coil 5 + pinTrigger = 2; //The CAS pin + pinTrigger2 = 3; //The CAS pin + pinTPS = A0; //TPS input pin + pinMAP = A1; //MAP sensor pin + pinIAT = A2; //IAT sensor pin + pinCLT = A3; //CLS sensor pin + pinO2 = A4; //O2 Sensor pin + pinIdle1 = 46; //Single wire idle control + pinIdle2 = 47; //2 wire idle control + pinStepperDir = 16; //Direction pin for DRV8825 driver + pinStepperStep = 17; //Step pin for DRV8825 driver + pinFan = 47; //Pin for the fan output + pinFuelPump = 4; //Fuel pump output + pinTachOut = 49; //Tacho output pin + pinFlex = 19; // Flex sensor (Must be external interrupt enabled) + pinResetControl = 43; //Reset control output + #endif + break; + case 1: + #ifndef SMALL_FLASH_MODE //No support for bluepill here anyway + //Pin mappings as per the v0.2 shield + pinInjector1 = 8; //Output pin injector 1 is on + pinInjector2 = 9; //Output pin injector 2 is on + pinInjector3 = 10; //Output pin injector 3 is on + pinInjector4 = 11; //Output pin injector 4 is on + pinInjector5 = 12; //Output pin injector 5 is on + pinCoil1 = 28; //Pin for coil 1 + pinCoil2 = 24; //Pin for coil 2 + pinCoil3 = 40; //Pin for coil 3 + pinCoil4 = 36; //Pin for coil 4 + pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now + pinTrigger = 20; //The CAS pin + pinTrigger2 = 21; //The Cam Sensor pin + pinTPS = A2; //TPS input pin + pinMAP = A3; //MAP sensor pin + pinIAT = A0; //IAT sensor pin + pinCLT = A1; //CLS sensor pin + pinO2 = A8; //O2 Sensor pin + pinBat = A4; //Battery reference voltage pin + pinDisplayReset = 48; // OLED reset pin + pinTachOut = 49; //Tacho output pin + pinIdle1 = 30; //Single wire idle control + pinIdle2 = 31; //2 wire idle control + pinStepperDir = 16; //Direction pin for DRV8825 driver + pinStepperStep = 17; //Step pin for DRV8825 driver + pinFan = 47; //Pin for the fan output + pinFuelPump = 4; //Fuel pump output + pinFlex = 2; // Flex sensor (Must be external interrupt enabled) + pinResetControl = 43; //Reset control output + break; + #endif + case 2: + #ifndef SMALL_FLASH_MODE //No support for bluepill here anyway + //Pin mappings as per the v0.3 shield + pinInjector1 = 8; //Output pin injector 1 is on + pinInjector2 = 9; //Output pin injector 2 is on + pinInjector3 = 10; //Output pin injector 3 is on + pinInjector4 = 11; //Output pin injector 4 is on + pinInjector5 = 12; //Output pin injector 5 is on + pinCoil1 = 28; //Pin for coil 1 + pinCoil2 = 24; //Pin for coil 2 + pinCoil3 = 40; //Pin for coil 3 + pinCoil4 = 36; //Pin for coil 4 + pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now + pinTrigger = 19; //The CAS pin + pinTrigger2 = 18; //The Cam Sensor pin + pinTPS = A2;//TPS input pin + pinMAP = A3; //MAP sensor pin + pinIAT = A0; //IAT sensor pin + pinCLT = A1; //CLS sensor pin + pinO2 = A8; //O2 Sensor pin + pinBat = A4; //Battery reference voltage pin + pinDisplayReset = 48; // OLED reset pin + pinTachOut = 49; //Tacho output pin + pinIdle1 = 5; //Single wire idle control + pinIdle2 = 53; //2 wire idle control + pinBoost = 7; //Boost control + pinVVT_1 = 6; //Default VVT output + pinFuelPump = 4; //Fuel pump output + pinStepperDir = 16; //Direction pin for DRV8825 driver + pinStepperStep = 17; //Step pin for DRV8825 driver + pinStepperEnable = 26; //Enable pin for DRV8825 + pinFan = A13; //Pin for the fan output + pinLaunch = 51; //Can be overwritten below + pinFlex = 2; // Flex sensor (Must be external interrupt enabled) + pinResetControl = 50; //Reset control output + #endif + break; + case 3: + //Pin mappings as per the v0.4 shield + pinInjector1 = 8; //Output pin injector 1 is on + pinInjector2 = 9; //Output pin injector 2 is on + pinInjector3 = 10; //Output pin injector 3 is on + pinInjector4 = 11; //Output pin injector 4 is on + pinInjector5 = 12; //Output pin injector 5 is on + pinInjector6 = 50; //CAUTION: Uses the same as Coil 4 below. + pinCoil1 = 40; //Pin for coil 1 + pinCoil2 = 38; //Pin for coil 2 + pinCoil3 = 52; //Pin for coil 3 + pinCoil4 = 50; //Pin for coil 4 + pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now + pinTrigger = 19; //The CAS pin + pinTrigger2 = 18; //The Cam Sensor pin + pinTPS = A2;//TPS input pin + pinMAP = A3; //MAP sensor pin + pinIAT = A0; //IAT sensor pin + pinCLT = A1; //CLS sensor pin + pinO2 = A8; //O2 Sensor pin + pinBat = A4; //Battery reference voltage pin + pinDisplayReset = 48; // OLED reset pin + pinTachOut = 49; //Tacho output pin (Goes to ULN2803) + pinIdle1 = 5; //Single wire idle control + pinIdle2 = 6; //2 wire idle control + pinBoost = 7; //Boost control + pinVVT_1 = 4; //Default VVT output + pinFuelPump = 45; //Fuel pump output (Goes to ULN2803) + pinStepperDir = 16; //Direction pin for DRV8825 driver + pinStepperStep = 17; //Step pin for DRV8825 driver + pinStepperEnable = 24; //Enable pin for DRV8825 + pinFan = 47; //Pin for the fan output (Goes to ULN2803) + pinLaunch = 51; //Can be overwritten below + pinFlex = 2; // Flex sensor (Must be external interrupt enabled) + pinResetControl = 43; //Reset control output + + //Black F407VE http://wiki.stm32duino.com/index.php?title=STM32F407 + //PC8~PC12 SDio + //PA13~PA15 & PB4 SWD(debug) pins + //PB0 EEPROM CS pin + //PD5 & PD6 Serial2 + pinInjector1 = PE7; //Output pin injector 1 is on + pinInjector2 = PE8; //Output pin injector 2 is on + pinInjector3 = PE9; //Output pin injector 3 is on + pinInjector4 = PE10; //Output pin injector 4 is on + pinInjector5 = PE11; //Output pin injector 5 is on + pinInjector6 = PE12; //Output pin injector 6 is on + pinCoil1 = PB5; //Pin for coil 1 + pinCoil2 = PB6; //Pin for coil 2 + pinCoil3 = PB7; //Pin for coil 3 + pinCoil4 = PB8; //Pin for coil 4 + pinCoil5 = PB9; //Pin for coil 5 + pinTPS = A0; //TPS input pin + pinMAP = A1; //MAP sensor pin + pinIAT = A2; //IAT sensor pin + pinCLT = A3; //CLT sensor pin + pinO2 = A4; //O2 Sensor pin + pinBat = A5; //Battery reference voltage pin + pinBaro = A10; + pinIdle1 = PB8; //Single wire idle control + pinIdle2 = PB9; //2 wire idle control + pinBoost = PE0; //Boost control + pinVVT_1 = PE1; //Default VVT output + pinStepperDir = PD8; //Direction pin for DRV8825 driver + pinStepperStep = PB15; //Step pin for DRV8825 driver + pinStepperEnable = PD9; //Enable pin for DRV8825 + pinDisplayReset = PE1; // OLED reset pin + pinFan = PE2; //Pin for the fan output + pinFuelPump = PA6; //Fuel pump output + pinTachOut = PA7; //Tacho output pin + //external interrupt enabled pins + //external interrupts could be enalbed in any pin, except same port numbers (PA4,PE4) + pinFlex = PE2; // Flex sensor (Must be external interrupt enabled) + pinTrigger = PE3; //The CAS pin + pinTrigger2 = PE4; //The Cam Sensor pin + + +// #if defined(CORE_STM32) +// //blue pill http://wiki.stm32duino.com/index.php?title=Blue_Pill +// //Maple mini http://wiki.stm32duino.com/index.php?title=Maple_Mini +// //pins PA12, PA11 are used for USB or CAN couldn't be used for GPIO +// pinInjector1 = PB7; //Output pin injector 1 is on +// pinInjector2 = PB6; //Output pin injector 2 is on +// pinInjector3 = PB5; //Output pin injector 3 is on +// pinInjector4 = PB4; //Output pin injector 4 is on +// pinCoil1 = PB3; //Pin for coil 1 +// pinCoil2 = PA15; //Pin for coil 2 +// pinCoil3 = PA14; //Pin for coil 3 +// pinCoil4 = PA9; //Pin for coil 4 +// pinCoil5 = PA8; //Pin for coil 5 +// pinTPS = A0; //TPS input pin +// pinMAP = A1; //MAP sensor pin +// pinIAT = A2; //IAT sensor pin +// pinCLT = A3; //CLS sensor pin +// pinO2 = A4; //O2 Sensor pin +// pinBat = A5; //Battery reference voltage pin +// pinBaro = pinMAP; +// pinIdle1 = PB2; //Single wire idle control +// pinIdle2 = PA2; //2 wire idle control +// pinBoost = PA1; //Boost control +// pinVVT_1 = PA0; //Default VVT output +// pinStepperDir = PC15; //Direction pin for DRV8825 driver +// pinStepperStep = PC14; //Step pin for DRV8825 driver +// pinStepperEnable = PC13; //Enable pin for DRV8825 +// pinDisplayReset = PB2; // OLED reset pin +// pinFan = PB1; //Pin for the fan output +// pinFuelPump = PB11; //Fuel pump output +// pinTachOut = PB10; //Tacho output pin +// //external interrupt enabled pins +// pinFlex = PB8; // Flex sensor (Must be external interrupt enabled) +// pinTrigger = PA10; //The CAS pin +// pinTrigger2 = PA13; //The Cam Sensor pin +// #endif + break; + + case 9: + //Pin mappings as per the MX5 PNP shield + pinInjector1 = 11; //Output pin injector 1 is on + pinInjector2 = 10; //Output pin injector 2 is on + pinInjector3 = 9; //Output pin injector 3 is on + pinInjector4 = 8; //Output pin injector 4 is on + pinInjector5 = 14; //Output pin injector 5 is on + pinCoil1 = 39; //Pin for coil 1 + pinCoil2 = 41; //Pin for coil 2 + pinCoil3 = 32; //Pin for coil 3 + pinCoil4 = 33; //Pin for coil 4 + pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now + pinTrigger = 19; //The CAS pin + pinTrigger2 = 18; //The Cam Sensor pin + pinTPS = A2;//TPS input pin + pinMAP = A5; //MAP sensor pin + pinIAT = A0; //IAT sensor pin + pinCLT = A1; //CLS sensor pin + pinO2 = A3; //O2 Sensor pin + pinBat = A4; //Battery reference voltage pin + pinDisplayReset = 48; // OLED reset pin + pinTachOut = 49; //Tacho output pin (Goes to ULN2803) + pinIdle1 = 2; //Single wire idle control + pinBoost = 4; + pinIdle2 = 4; //2 wire idle control (Note this is shared with boost!!!) + pinFuelPump = 37; //Fuel pump output + pinStepperDir = 16; //Direction pin for DRV8825 driver + pinStepperStep = 17; //Step pin for DRV8825 driver + pinFan = 35; //Pin for the fan output + pinLaunch = 12; //Can be overwritten below + pinFlex = 3; // Flex sensor (Must be external interrupt enabled) + pinResetControl = 44; //Reset control output + + break; + + case 10: + #ifndef SMALL_FLASH_MODE //No support for bluepill here anyway + //Pin mappings for user turtanas PCB + pinInjector1 = 4; //Output pin injector 1 is on + pinInjector2 = 5; //Output pin injector 2 is on + pinInjector3 = 6; //Output pin injector 3 is on + pinInjector4 = 7; //Output pin injector 4 is on + pinInjector5 = 8; //Placeholder only - NOT USED + pinInjector6 = 9; //Placeholder only - NOT USED + pinInjector7 = 10; //Placeholder only - NOT USED + pinInjector8 = 11; //Placeholder only - NOT USED + pinCoil1 = 24; //Pin for coil 1 + pinCoil2 = 28; //Pin for coil 2 + pinCoil3 = 36; //Pin for coil 3 + pinCoil4 = 40; //Pin for coil 4 + pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now + pinTrigger = 18; //The CAS pin + pinTrigger2 = 19; //The Cam Sensor pin + pinTPS = A2;//TPS input pin + pinMAP = A3; //MAP sensor pin + pinMAP2 = A8; //MAP2 sensor pin + pinIAT = A0; //IAT sensor pin + pinCLT = A1; //CLS sensor pin + pinO2 = A4; //O2 Sensor pin + pinBat = A7; //Battery reference voltage pin + pinDisplayReset = 48; // OLED reset pin + pinSpareTemp1 = A6; + pinSpareTemp2 = A5; + pinTachOut = 41; //Tacho output pin transistori puuttuu 2n2222 tähän ja 1k 12v + pinFuelPump = 42; //Fuel pump output 2n2222 + pinFan = 47; //Pin for the fan output + pinTachOut = 49; //Tacho output pin + pinFlex = 2; // Flex sensor (Must be external interrupt enabled) + pinResetControl = 26; //Reset control output + + #endif + break; + + case 20: +// #ifndef SMALL_FLASH_MODE //No support for bluepill here anyway +// //Pin mappings as per the Plazomat In/Out shields Rev 0.1 +// pinInjector1 = 8; //Output pin injector 1 is on +// pinInjector2 = 9; //Output pin injector 2 is on +// pinInjector3 = 10; //Output pin injector 3 is on +// pinInjector4 = 11; //Output pin injector 4 is on +// pinInjector5 = 12; //Output pin injector 5 is on +// pinCoil1 = 28; //Pin for coil 1 +// pinCoil2 = 24; //Pin for coil 2 +// pinCoil3 = 40; //Pin for coil 3 +// pinCoil4 = 36; //Pin for coil 4 +// pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now +// pinSpareOut1 = 4; //Spare LSD Output 1(PWM) +// pinSpareOut2 = 5; //Spare LSD Output 2(PWM) +// pinSpareOut3 = 6; //Spare LSD Output 3(PWM) +// pinSpareOut4 = 7; //Spare LSD Output 4(PWM) +// pinSpareOut5 = 50; //Spare LSD Output 5(digital) +// pinSpareOut6 = 52; //Spare LSD Output 6(digital) +// pinTrigger = 20; //The CAS pin +// pinTrigger2 = 21; //The Cam Sensor pin +// pinSpareTemp2 = A15; //spare Analog input 2 +// pinSpareTemp1 = A14; //spare Analog input 1 +// pinO2 = A8; //O2 Sensor pin +// pinBat = A4; //Battery reference voltage pin +// pinMAP = A3; //MAP sensor pin +// pinTPS = A2;//TPS input pin +// pinCLT = A1; //CLS sensor pin +// pinIAT = A0; //IAT sensor pin +// pinFan = 47; //Pin for the fan output +// pinFuelPump = 4; //Fuel pump output +// pinTachOut = 49; //Tacho output pin +// pinResetControl = 26; //Reset control output +// #endif + break; + + case 30: + #ifndef SMALL_FLASH_MODE //No support for bluepill here anyway + //Pin mappings as per the dazv6 shield + pinInjector1 = 8; //Output pin injector 1 is on + pinInjector2 = 9; //Output pin injector 2 is on + pinInjector3 = 10; //Output pin injector 3 is on + pinInjector4 = 11; //Output pin injector 4 is on + pinInjector5 = 12; //Output pin injector 5 is on + pinCoil1 = 40; //Pin for coil 1 + pinCoil2 = 38; //Pin for coil 2 + pinCoil3 = 50; //Pin for coil 3 + pinCoil4 = 52; //Pin for coil 4 + pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now + pinTrigger = 19; //The CAS pin + pinTrigger2 = 18; //The Cam Sensor pin + pinTrigger3 = 17; // cam sensor 2 pin + pinTPS = A2;//TPS input pin + pinMAP = A3; //MAP sensor pin + pinIAT = A0; //IAT sensor pin + pinCLT = A1; //CLS sensor pin + pinO2 = A8; //O2 Sensor pin + pinO2_2 = A9; //O2 sensor pin (second sensor) + pinBat = A4; //Battery reference voltage pin + pinDisplayReset = 48; // OLED reset pin + pinTachOut = 49; //Tacho output pin + pinIdle1 = 5; //Single wire idle control + pinFuelPump = 45; //Fuel pump output + pinStepperDir = 20; //Direction pin for DRV8825 driver + pinStepperStep = 21; //Step pin for DRV8825 driver + pinSpareHOut1 = 4; // high current output spare1 + pinSpareHOut2 = 6; // high current output spare2 + pinBoost = 7; + pinSpareLOut1 = 43; //low current output spare1 + pinSpareLOut2 = 47; + pinSpareLOut3 = 49; + pinSpareLOut4 = 51; + pinSpareLOut5 = 53; + pinFan = 47; //Pin for the fan output + #endif + break; + + case 40: + //Pin mappings as per the NO2C shield + pinInjector1 = 8; //Output pin injector 1 is on + pinInjector2 = 9; //Output pin injector 2 is on + pinInjector3 = 11; //Output pin injector 3 is on - NOT USED + pinInjector4 = 12; //Output pin injector 4 is on - NOT USED + pinInjector5 = 13; //Placeholder only - NOT USED + pinCoil1 = 23; //Pin for coil 1 + pinCoil2 = 22; //Pin for coil 2 + pinCoil3 = 2; //Pin for coil 3 - ONLY WITH DB2 + pinCoil4 = 3; //Pin for coil 4 - ONLY WITH DB2 + pinCoil5 = 46; //Placeholder only - NOT USED + pinTrigger = 19; //The CAS pin + pinTrigger2 = 18; //The Cam Sensor pin + pinTPS = A3; //TPS input pin + pinMAP = A0; //MAP sensor pin + pinIAT = A5; //IAT sensor pin + pinCLT = A4; //CLT sensor pin + pinO2 = A2; //O2 sensor pin + pinBat = A1; //Battery reference voltage pin + pinBaro = A6; //Baro sensor pin - ONLY WITH DB + pinSpareTemp1 = A7; //spare Analog input 1 - ONLY WITH DB + pinDisplayReset = 48; // OLED reset pin - NOT USED + pinTachOut = 38; //Tacho output pin + pinIdle1 = 5; //Single wire idle control + pinIdle2 = 47; //2 wire idle control - NOT USED + pinBoost = 7; //Boost control + pinVVT_1 = 6; //Default VVT output + pinFuelPump = 4; //Fuel pump output + pinStepperDir = 25; //Direction pin for DRV8825 driver + pinStepperStep = 24; //Step pin for DRV8825 driver + pinStepperEnable = 27; //Enable pin for DRV8825 driver + pinLaunch = 10; //Can be overwritten below + pinFlex = 20; // Flex sensor (Must be external interrupt enabled) - ONLY WITH DB + pinFan = 30; //Pin for the fan output - ONLY WITH DB + pinSpareLOut1 = 32; //low current output spare1 - ONLY WITH DB + pinSpareLOut2 = 34; //low current output spare2 - ONLY WITH DB + pinSpareLOut3 = 36; //low current output spare3 - ONLY WITH DB + pinResetControl = 26; //Reset control output + break; + + case 41: + #ifndef SMALL_FLASH_MODE //No support for bluepill here anyway + //Pin mappings as per the UA4C shield + pinInjector1 = 8; //Output pin injector 1 is on + pinInjector2 = 7; //Output pin injector 2 is on + pinInjector3 = 6; //Output pin injector 3 is on + pinInjector4 = 5; //Output pin injector 4 is on + pinInjector5 = 45; //Output pin injector 5 is on PLACEHOLDER value for now + pinCoil1 = 35; //Pin for coil 1 + pinCoil2 = 36; //Pin for coil 2 + pinCoil3 = 33; //Pin for coil 3 + pinCoil4 = 34; //Pin for coil 4 + pinCoil5 = 44; //Pin for coil 5 PLACEHOLDER value for now + pinTrigger = 19; //The CAS pin + pinTrigger2 = 18; //The Cam Sensor pin + pinFlex = 20; // Flex sensor + pinTPS = A3; //TPS input pin + pinMAP = A0; //MAP sensor pin + pinBaro = A7; //Baro sensor pin + pinIAT = A5; //IAT sensor pin + pinCLT = A4; //CLS sensor pin + pinO2 = A1; //O2 Sensor pin + pinO2_2 = A9; //O2 sensor pin (second sensor) + pinBat = A2; //Battery reference voltage pin + pinSpareTemp1 = A8; //spare Analog input 1 + pinLaunch = 37; //Can be overwritten below + pinDisplayReset = 48; // OLED reset pin PLACEHOLDER value for now + pinTachOut = 22; //Tacho output pin + pinIdle1 = 9; //Single wire idle control + pinIdle2 = 10; //2 wire idle control + pinFuelPump = 23; //Fuel pump output + pinVVT_1 = 11; //Default VVT output + pinStepperDir = 32; //Direction pin for DRV8825 driver + pinStepperStep = 31; //Step pin for DRV8825 driver + pinStepperEnable = 30; //Enable pin for DRV8825 driver + pinBoost = 12; //Boost control + pinSpareLOut1 = 26; //low current output spare1 + pinSpareLOut2 = 27; //low current output spare2 + pinSpareLOut3 = 28; //low current output spare3 + pinSpareLOut4 = 29; //low current output spare4 + pinFan = 24; //Pin for the fan output + pinResetControl = 46; //Reset control output PLACEHOLDER value for now + #endif + break; + + default: + #ifndef SMALL_FLASH_MODE //No support for bluepill here anyway + //Pin mappings as per the v0.2 shield + pinInjector1 = 8; //Output pin injector 1 is on + pinInjector2 = 9; //Output pin injector 2 is on + pinInjector3 = 10; //Output pin injector 3 is on + pinInjector4 = 11; //Output pin injector 4 is on + pinInjector5 = 12; //Output pin injector 5 is on + pinCoil1 = 28; //Pin for coil 1 + pinCoil2 = 24; //Pin for coil 2 + pinCoil3 = 40; //Pin for coil 3 + pinCoil4 = 36; //Pin for coil 4 + pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now + pinTrigger = 20; //The CAS pin + pinTrigger2 = 21; //The Cam Sensor pin + pinTPS = A2; //TPS input pin + pinMAP = A3; //MAP sensor pin + pinIAT = A0; //IAT sensor pin + pinCLT = A1; //CLS sensor pin + pinO2 = A8; //O2 Sensor pin + pinBat = A4; //Battery reference voltage pin + pinStepperDir = 16; //Direction pin for DRV8825 driver + pinStepperStep = 17; //Step pin for DRV8825 driver + pinDisplayReset = 48; // OLED reset pin + pinFan = 47; //Pin for the fan output + pinFuelPump = 4; //Fuel pump output + pinTachOut = 49; //Tacho output pin + pinFlex = 3; // Flex sensor (Must be external interrupt enabled) + pinBoost = 5; + pinIdle1 = 6; + pinResetControl = 43; //Reset control output + #endif + break; + } + + //Setup any devices that are using selectable pins + + if ( (configPage6.launchPin != 0) && (configPage6.launchPin < BOARD_NR_GPIO_PINS) ) { pinLaunch = pinTranslate(configPage6.launchPin); } + if ( (configPage4.ignBypassPin != 0) && (configPage4.ignBypassPin < BOARD_NR_GPIO_PINS) ) { pinIgnBypass = pinTranslate(configPage4.ignBypassPin); } + if ( (configPage2.tachoPin != 0) && (configPage2.tachoPin < BOARD_NR_GPIO_PINS) ) { pinTachOut = pinTranslate(configPage2.tachoPin); } + if ( (configPage4.fuelPumpPin != 0) && (configPage4.fuelPumpPin < BOARD_NR_GPIO_PINS) ) { pinFuelPump = pinTranslate(configPage4.fuelPumpPin); } + if ( (configPage6.fanPin != 0) && (configPage6.fanPin < BOARD_NR_GPIO_PINS) ) { pinFan = pinTranslate(configPage6.fanPin); } + if ( (configPage6.boostPin != 0) && (configPage6.boostPin < BOARD_NR_GPIO_PINS) ) { pinBoost = pinTranslate(configPage6.boostPin); } + if ( (configPage6.vvtPin != 0) && (configPage6.vvtPin < BOARD_NR_GPIO_PINS) ) { pinVVT_1 = pinTranslate(configPage6.vvtPin); } + if ( (configPage6.useExtBaro != 0) && (configPage6.baroPin < BOARD_NR_GPIO_PINS) ) { pinBaro = configPage6.baroPin + A0; } + if ( (configPage6.useEMAP != 0) && (configPage10.EMAPPin < BOARD_NR_GPIO_PINS) ) { pinEMAP = configPage10.EMAPPin + A0; } + + //Currently there's no default pin for Idle Up + pinIdleUp = pinTranslate(configPage2.idleUpPin); + + /* Reset control is a special case. If reset control is enabled, it needs its initial state set BEFORE its pinMode. + If that doesn't happen and reset control is in "Serial Command" mode, the Arduino will end up in a reset loop + because the control pin will go low as soon as the pinMode is set to OUTPUT. */ + if ( (configPage4.resetControl != 0) && (configPage4.resetControlPin < BOARD_NR_GPIO_PINS) ) + { + resetControl = configPage4.resetControl; + pinResetControl = pinTranslate(configPage4.resetControlPin); + setResetControlPinState(); + pinMode(pinResetControl, OUTPUT); + } + + //Finally, set the relevant pin modes for outputs + pinMode(pinCoil1, OUTPUT); + pinMode(pinCoil2, OUTPUT); + pinMode(pinCoil3, OUTPUT); + pinMode(pinCoil4, OUTPUT); + pinMode(pinCoil5, OUTPUT); + pinMode(pinInjector1, OUTPUT); + pinMode(pinInjector2, OUTPUT); + pinMode(pinInjector3, OUTPUT); + pinMode(pinInjector4, OUTPUT); + pinMode(pinInjector5, OUTPUT); + pinMode(pinTachOut, OUTPUT); + pinMode(pinIdle1, OUTPUT); + pinMode(pinIdle2, OUTPUT); + pinMode(pinFuelPump, OUTPUT); + pinMode(pinIgnBypass, OUTPUT); + pinMode(pinFan, OUTPUT); + pinMode(pinStepperDir, OUTPUT); + pinMode(pinStepperStep, OUTPUT); + pinMode(pinStepperEnable, OUTPUT); + pinMode(pinBoost, OUTPUT); + pinMode(pinVVT_1, OUTPUT); + + inj1_pin_port = portOutputRegister(digitalPinToPort(pinInjector1)); + inj1_pin_mask = digitalPinToBitMask(pinInjector1); + inj2_pin_port = portOutputRegister(digitalPinToPort(pinInjector2)); + inj2_pin_mask = digitalPinToBitMask(pinInjector2); + inj3_pin_port = portOutputRegister(digitalPinToPort(pinInjector3)); + inj3_pin_mask = digitalPinToBitMask(pinInjector3); + inj4_pin_port = portOutputRegister(digitalPinToPort(pinInjector4)); + inj4_pin_mask = digitalPinToBitMask(pinInjector4); + inj5_pin_port = portOutputRegister(digitalPinToPort(pinInjector5)); + inj5_pin_mask = digitalPinToBitMask(pinInjector5); + inj6_pin_port = portOutputRegister(digitalPinToPort(pinInjector6)); + inj6_pin_mask = digitalPinToBitMask(pinInjector6); + inj7_pin_port = portOutputRegister(digitalPinToPort(pinInjector7)); + inj7_pin_mask = digitalPinToBitMask(pinInjector7); + inj8_pin_port = portOutputRegister(digitalPinToPort(pinInjector8)); + inj8_pin_mask = digitalPinToBitMask(pinInjector8); + + ign1_pin_port = portOutputRegister(digitalPinToPort(pinCoil1)); + ign1_pin_mask = digitalPinToBitMask(pinCoil1); + ign2_pin_port = portOutputRegister(digitalPinToPort(pinCoil2)); + ign2_pin_mask = digitalPinToBitMask(pinCoil2); + ign3_pin_port = portOutputRegister(digitalPinToPort(pinCoil3)); + ign3_pin_mask = digitalPinToBitMask(pinCoil3); + ign4_pin_port = portOutputRegister(digitalPinToPort(pinCoil4)); + ign4_pin_mask = digitalPinToBitMask(pinCoil4); + ign5_pin_port = portOutputRegister(digitalPinToPort(pinCoil5)); + ign5_pin_mask = digitalPinToBitMask(pinCoil5); + ign6_pin_port = portOutputRegister(digitalPinToPort(pinCoil6)); + ign6_pin_mask = digitalPinToBitMask(pinCoil6); + ign7_pin_port = portOutputRegister(digitalPinToPort(pinCoil7)); + ign7_pin_mask = digitalPinToBitMask(pinCoil7); + ign8_pin_port = portOutputRegister(digitalPinToPort(pinCoil8)); + ign8_pin_mask = digitalPinToBitMask(pinCoil8); + + tach_pin_port = portOutputRegister(digitalPinToPort(pinTachOut)); + tach_pin_mask = digitalPinToBitMask(pinTachOut); + pump_pin_port = portOutputRegister(digitalPinToPort(pinFuelPump)); + pump_pin_mask = digitalPinToBitMask(pinFuelPump); + + //And for inputs + #if defined(CORE_STM32) + #ifndef ARDUINO_ARCH_STM32 //libmaple core aka STM32DUINO + pinMode(pinMAP, INPUT_ANALOG); + pinMode(pinO2, INPUT_ANALOG); + pinMode(pinO2_2, INPUT_ANALOG); + pinMode(pinTPS, INPUT_ANALOG); + pinMode(pinIAT, INPUT_ANALOG); + pinMode(pinCLT, INPUT_ANALOG); + pinMode(pinBat, INPUT_ANALOG); + pinMode(pinBaro, INPUT_ANALOG); + #else + pinMode(pinMAP, INPUT); + pinMode(pinO2, INPUT); + pinMode(pinO2_2, INPUT); + pinMode(pinTPS, INPUT); + pinMode(pinIAT, INPUT); + pinMode(pinCLT, INPUT); + pinMode(pinBat, INPUT); + pinMode(pinBaro, INPUT); + #endif + #endif + pinMode(pinTrigger, INPUT); + pinMode(pinTrigger2, INPUT); + pinMode(pinTrigger3, INPUT); + + //Each of the below are only set when their relevant function is enabled. This can help prevent pin conflicts that users aren't aware of with unused functions + if(configPage2.flexEnabled > 0) + { + pinMode(pinFlex, INPUT); //Standard GM / Continental flex sensor requires pullup, but this should be onboard. The internal pullup will not work (Requires ~3.3k)! + } + if(configPage6.launchEnabled > 0) + { + if (configPage6.lnchPullRes == true) { pinMode(pinLaunch, INPUT_PULLUP); } + else { pinMode(pinLaunch, INPUT); } //If Launch Pull Resistor is not set make input float. + } + if(configPage2.idleUpEnabled > 0) + { + if (configPage2.idleUpPolarity == 0) { pinMode(pinIdleUp, INPUT_PULLUP); } //Normal setting + else { pinMode(pinIdleUp, INPUT); } //inverted setting + } + + + //These must come after the above pinMode statements + triggerPri_pin_port = portInputRegister(digitalPinToPort(pinTrigger)); + triggerPri_pin_mask = digitalPinToBitMask(pinTrigger); + triggerSec_pin_port = portInputRegister(digitalPinToPort(pinTrigger2)); + triggerSec_pin_mask = digitalPinToBitMask(pinTrigger2); + + #if defined(CORE_STM32) + #else + //Set default values + digitalWrite(pinMAP, HIGH); + //digitalWrite(pinO2, LOW); + digitalWrite(pinTPS, LOW); + #endif +} #endif diff --git a/speeduino/board_teensy35.ino b/speeduino/board_teensy35.ino index 79e7328e..fb3f45b2 100644 --- a/speeduino/board_teensy35.ino +++ b/speeduino/board_teensy35.ino @@ -259,5 +259,751 @@ uint16_t freeRam() // The difference is the free, available ram. return (uint16_t)stackTop - heapTop; } +void setPinMapping(byte boardID) +{ + switch (boardID) + { + case 0: + #ifndef SMALL_FLASH_MODE //No support for bluepill here anyway + //Pin mappings as per the v0.1 shield + pinInjector1 = 8; //Output pin injector 1 is on + pinInjector2 = 9; //Output pin injector 2 is on + pinInjector3 = 11; //Output pin injector 3 is on + pinInjector4 = 10; //Output pin injector 4 is on + pinInjector5 = 12; //Output pin injector 5 is on + pinCoil1 = 6; //Pin for coil 1 + pinCoil2 = 7; //Pin for coil 2 + pinCoil3 = 12; //Pin for coil 3 + pinCoil4 = 13; //Pin for coil 4 + pinCoil5 = 14; //Pin for coil 5 + pinTrigger = 2; //The CAS pin + pinTrigger2 = 3; //The CAS pin + pinTPS = A0; //TPS input pin + pinMAP = A1; //MAP sensor pin + pinIAT = A2; //IAT sensor pin + pinCLT = A3; //CLS sensor pin + pinO2 = A4; //O2 Sensor pin + pinIdle1 = 46; //Single wire idle control + pinIdle2 = 47; //2 wire idle control + pinStepperDir = 16; //Direction pin for DRV8825 driver + pinStepperStep = 17; //Step pin for DRV8825 driver + pinFan = 47; //Pin for the fan output + pinFuelPump = 4; //Fuel pump output + pinTachOut = 49; //Tacho output pin + pinFlex = 19; // Flex sensor (Must be external interrupt enabled) + pinResetControl = 43; //Reset control output + #endif + break; + case 1: + #ifndef SMALL_FLASH_MODE //No support for bluepill here anyway + //Pin mappings as per the v0.2 shield + pinInjector1 = 8; //Output pin injector 1 is on + pinInjector2 = 9; //Output pin injector 2 is on + pinInjector3 = 10; //Output pin injector 3 is on + pinInjector4 = 11; //Output pin injector 4 is on + pinInjector5 = 12; //Output pin injector 5 is on + pinCoil1 = 28; //Pin for coil 1 + pinCoil2 = 24; //Pin for coil 2 + pinCoil3 = 40; //Pin for coil 3 + pinCoil4 = 36; //Pin for coil 4 + pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now + pinTrigger = 20; //The CAS pin + pinTrigger2 = 21; //The Cam Sensor pin + pinTPS = A2; //TPS input pin + pinMAP = A3; //MAP sensor pin + pinIAT = A0; //IAT sensor pin + pinCLT = A1; //CLS sensor pin + pinO2 = A8; //O2 Sensor pin + pinBat = A4; //Battery reference voltage pin + pinDisplayReset = 48; // OLED reset pin + pinTachOut = 49; //Tacho output pin + pinIdle1 = 30; //Single wire idle control + pinIdle2 = 31; //2 wire idle control + pinStepperDir = 16; //Direction pin for DRV8825 driver + pinStepperStep = 17; //Step pin for DRV8825 driver + pinFan = 47; //Pin for the fan output + pinFuelPump = 4; //Fuel pump output + pinFlex = 2; // Flex sensor (Must be external interrupt enabled) + pinResetControl = 43; //Reset control output + break; + #endif + case 2: + #ifndef SMALL_FLASH_MODE //No support for bluepill here anyway + //Pin mappings as per the v0.3 shield + pinInjector1 = 8; //Output pin injector 1 is on + pinInjector2 = 9; //Output pin injector 2 is on + pinInjector3 = 10; //Output pin injector 3 is on + pinInjector4 = 11; //Output pin injector 4 is on + pinInjector5 = 12; //Output pin injector 5 is on + pinCoil1 = 28; //Pin for coil 1 + pinCoil2 = 24; //Pin for coil 2 + pinCoil3 = 40; //Pin for coil 3 + pinCoil4 = 36; //Pin for coil 4 + pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now + pinTrigger = 19; //The CAS pin + pinTrigger2 = 18; //The Cam Sensor pin + pinTPS = A2;//TPS input pin + pinMAP = A3; //MAP sensor pin + pinIAT = A0; //IAT sensor pin + pinCLT = A1; //CLS sensor pin + pinO2 = A8; //O2 Sensor pin + pinBat = A4; //Battery reference voltage pin + pinDisplayReset = 48; // OLED reset pin + pinTachOut = 49; //Tacho output pin + pinIdle1 = 5; //Single wire idle control + pinIdle2 = 53; //2 wire idle control + pinBoost = 7; //Boost control + pinVVT_1 = 6; //Default VVT output + pinFuelPump = 4; //Fuel pump output + pinStepperDir = 16; //Direction pin for DRV8825 driver + pinStepperStep = 17; //Step pin for DRV8825 driver + pinStepperEnable = 26; //Enable pin for DRV8825 + pinFan = A13; //Pin for the fan output + pinLaunch = 51; //Can be overwritten below + pinFlex = 2; // Flex sensor (Must be external interrupt enabled) + pinResetControl = 50; //Reset control output + #if defined(CORE_TEENSY) + pinTrigger = 23; + pinStepperDir = 33; + pinStepperStep = 34; + pinCoil1 = 31; + pinTachOut = 28; + pinFan = 27; + pinCoil4 = 21; + pinCoil3 = 30; + pinO2 = A22; + #endif + #endif + break; + + case 3: + //Pin mappings as per the v0.4 shield + pinInjector1 = 8; //Output pin injector 1 is on + pinInjector2 = 9; //Output pin injector 2 is on + pinInjector3 = 10; //Output pin injector 3 is on + pinInjector4 = 11; //Output pin injector 4 is on + pinInjector5 = 12; //Output pin injector 5 is on + pinInjector6 = 50; //CAUTION: Uses the same as Coil 4 below. + pinCoil1 = 40; //Pin for coil 1 + pinCoil2 = 38; //Pin for coil 2 + pinCoil3 = 52; //Pin for coil 3 + pinCoil4 = 50; //Pin for coil 4 + pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now + pinTrigger = 19; //The CAS pin + pinTrigger2 = 18; //The Cam Sensor pin + pinTPS = A2;//TPS input pin + pinMAP = A3; //MAP sensor pin + pinIAT = A0; //IAT sensor pin + pinCLT = A1; //CLS sensor pin + pinO2 = A8; //O2 Sensor pin + pinBat = A4; //Battery reference voltage pin + pinDisplayReset = 48; // OLED reset pin + pinTachOut = 49; //Tacho output pin (Goes to ULN2803) + pinIdle1 = 5; //Single wire idle control + pinIdle2 = 6; //2 wire idle control + pinBoost = 7; //Boost control + pinVVT_1 = 4; //Default VVT output + pinFuelPump = 45; //Fuel pump output (Goes to ULN2803) + pinStepperDir = 16; //Direction pin for DRV8825 driver + pinStepperStep = 17; //Step pin for DRV8825 driver + pinStepperEnable = 24; //Enable pin for DRV8825 + pinFan = 47; //Pin for the fan output (Goes to ULN2803) + pinLaunch = 51; //Can be overwritten below + pinFlex = 2; // Flex sensor (Must be external interrupt enabled) + pinResetControl = 43; //Reset control output + + #if defined(CORE_TEENSY) + pinInjector6 = 51; + + pinTrigger = 23; + pinTrigger2 = 36; + pinStepperDir = 34; + pinStepperStep = 35; + pinCoil1 = 31; + pinCoil2 = 32; + pinTachOut = 28; + pinFan = 27; + pinCoil4 = 29; + pinCoil3 = 30; + pinO2 = A22; + #elif defined(STM32F4) + //Black F407VE http://wiki.stm32duino.com/index.php?title=STM32F407 + //PC8~PC12 SDio + //PA13~PA15 & PB4 SWD(debug) pins + //PB0 EEPROM CS pin + //PD5 & PD6 Serial2 + pinInjector1 = PE7; //Output pin injector 1 is on + pinInjector2 = PE8; //Output pin injector 2 is on + pinInjector3 = PE9; //Output pin injector 3 is on + pinInjector4 = PE10; //Output pin injector 4 is on + pinInjector5 = PE11; //Output pin injector 5 is on + pinInjector6 = PE12; //Output pin injector 6 is on + pinCoil1 = PB5; //Pin for coil 1 + pinCoil2 = PB6; //Pin for coil 2 + pinCoil3 = PB7; //Pin for coil 3 + pinCoil4 = PB8; //Pin for coil 4 + pinCoil5 = PB9; //Pin for coil 5 + pinTPS = A0; //TPS input pin + pinMAP = A1; //MAP sensor pin + pinIAT = A2; //IAT sensor pin + pinCLT = A3; //CLT sensor pin + pinO2 = A4; //O2 Sensor pin + pinBat = A5; //Battery reference voltage pin + pinBaro = A10; + pinIdle1 = PB8; //Single wire idle control + pinIdle2 = PB9; //2 wire idle control + pinBoost = PE0; //Boost control + pinVVT_1 = PE1; //Default VVT output + pinStepperDir = PD8; //Direction pin for DRV8825 driver + pinStepperStep = PB15; //Step pin for DRV8825 driver + pinStepperEnable = PD9; //Enable pin for DRV8825 + pinDisplayReset = PE1; // OLED reset pin + pinFan = PE2; //Pin for the fan output + pinFuelPump = PA6; //Fuel pump output + pinTachOut = PA7; //Tacho output pin + //external interrupt enabled pins + //external interrupts could be enalbed in any pin, except same port numbers (PA4,PE4) + pinFlex = PE2; // Flex sensor (Must be external interrupt enabled) + pinTrigger = PE3; //The CAS pin + pinTrigger2 = PE4; //The Cam Sensor pin + #elif defined(CORE_STM32) + //blue pill http://wiki.stm32duino.com/index.php?title=Blue_Pill + //Maple mini http://wiki.stm32duino.com/index.php?title=Maple_Mini + //pins PA12, PA11 are used for USB or CAN couldn't be used for GPIO + pinInjector1 = PB7; //Output pin injector 1 is on + pinInjector2 = PB6; //Output pin injector 2 is on + pinInjector3 = PB5; //Output pin injector 3 is on + pinInjector4 = PB4; //Output pin injector 4 is on + pinCoil1 = PB3; //Pin for coil 1 + pinCoil2 = PA15; //Pin for coil 2 + pinCoil3 = PA14; //Pin for coil 3 + pinCoil4 = PA9; //Pin for coil 4 + pinCoil5 = PA8; //Pin for coil 5 + pinTPS = A0; //TPS input pin + pinMAP = A1; //MAP sensor pin + pinIAT = A2; //IAT sensor pin + pinCLT = A3; //CLS sensor pin + pinO2 = A4; //O2 Sensor pin + pinBat = A5; //Battery reference voltage pin + pinBaro = pinMAP; + pinIdle1 = PB2; //Single wire idle control + pinIdle2 = PA2; //2 wire idle control + pinBoost = PA1; //Boost control + pinVVT_1 = PA0; //Default VVT output + pinStepperDir = PC15; //Direction pin for DRV8825 driver + pinStepperStep = PC14; //Step pin for DRV8825 driver + pinStepperEnable = PC13; //Enable pin for DRV8825 + pinDisplayReset = PB2; // OLED reset pin + pinFan = PB1; //Pin for the fan output + pinFuelPump = PB11; //Fuel pump output + pinTachOut = PB10; //Tacho output pin + //external interrupt enabled pins + pinFlex = PB8; // Flex sensor (Must be external interrupt enabled) + pinTrigger = PA10; //The CAS pin + pinTrigger2 = PA13; //The Cam Sensor pin + #endif + break; + + case 9: + //Pin mappings as per the MX5 PNP shield + pinInjector1 = 11; //Output pin injector 1 is on + pinInjector2 = 10; //Output pin injector 2 is on + pinInjector3 = 9; //Output pin injector 3 is on + pinInjector4 = 8; //Output pin injector 4 is on + pinInjector5 = 14; //Output pin injector 5 is on + pinCoil1 = 39; //Pin for coil 1 + pinCoil2 = 41; //Pin for coil 2 + pinCoil3 = 32; //Pin for coil 3 + pinCoil4 = 33; //Pin for coil 4 + pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now + pinTrigger = 19; //The CAS pin + pinTrigger2 = 18; //The Cam Sensor pin + pinTPS = A2;//TPS input pin + pinMAP = A5; //MAP sensor pin + pinIAT = A0; //IAT sensor pin + pinCLT = A1; //CLS sensor pin + pinO2 = A3; //O2 Sensor pin + pinBat = A4; //Battery reference voltage pin + pinDisplayReset = 48; // OLED reset pin + pinTachOut = 49; //Tacho output pin (Goes to ULN2803) + pinIdle1 = 2; //Single wire idle control + pinBoost = 4; + pinIdle2 = 4; //2 wire idle control (Note this is shared with boost!!!) + pinFuelPump = 37; //Fuel pump output + pinStepperDir = 16; //Direction pin for DRV8825 driver + pinStepperStep = 17; //Step pin for DRV8825 driver + pinFan = 35; //Pin for the fan output + pinLaunch = 12; //Can be overwritten below + pinFlex = 3; // Flex sensor (Must be external interrupt enabled) + pinResetControl = 44; //Reset control output + + #if defined(CORE_TEENSY) + pinTrigger = 23; + pinTrigger2 = 36; + pinStepperDir = 34; + pinStepperStep = 35; + pinCoil1 = 33; //Done + pinCoil2 = 24; //Done + pinCoil3 = 51; //Won't work (No mapping for pin 32) + pinCoil4 = 52; //Won't work (No mapping for pin 33) + pinFuelPump = 26; //Requires PVT4 adapter or above + pinFan = 50; //Won't work (No mapping for pin 35) + pinTachOut = 28; //Done + #endif + break; + + case 10: + #ifndef SMALL_FLASH_MODE //No support for bluepill here anyway + //Pin mappings for user turtanas PCB + pinInjector1 = 4; //Output pin injector 1 is on + pinInjector2 = 5; //Output pin injector 2 is on + pinInjector3 = 6; //Output pin injector 3 is on + pinInjector4 = 7; //Output pin injector 4 is on + pinInjector5 = 8; //Placeholder only - NOT USED + pinInjector6 = 9; //Placeholder only - NOT USED + pinInjector7 = 10; //Placeholder only - NOT USED + pinInjector8 = 11; //Placeholder only - NOT USED + pinCoil1 = 24; //Pin for coil 1 + pinCoil2 = 28; //Pin for coil 2 + pinCoil3 = 36; //Pin for coil 3 + pinCoil4 = 40; //Pin for coil 4 + pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now + pinTrigger = 18; //The CAS pin + pinTrigger2 = 19; //The Cam Sensor pin + pinTPS = A2;//TPS input pin + pinMAP = A3; //MAP sensor pin + pinMAP2 = A8; //MAP2 sensor pin + pinIAT = A0; //IAT sensor pin + pinCLT = A1; //CLS sensor pin + pinO2 = A4; //O2 Sensor pin + pinBat = A7; //Battery reference voltage pin + pinDisplayReset = 48; // OLED reset pin + pinSpareTemp1 = A6; + pinSpareTemp2 = A5; + pinTachOut = 41; //Tacho output pin transistori puuttuu 2n2222 tähän ja 1k 12v + pinFuelPump = 42; //Fuel pump output 2n2222 + pinFan = 47; //Pin for the fan output + pinTachOut = 49; //Tacho output pin + pinFlex = 2; // Flex sensor (Must be external interrupt enabled) + pinResetControl = 26; //Reset control output + + #endif + break; + + case 20: + #ifndef SMALL_FLASH_MODE //No support for bluepill here anyway + //Pin mappings as per the Plazomat In/Out shields Rev 0.1 + pinInjector1 = 8; //Output pin injector 1 is on + pinInjector2 = 9; //Output pin injector 2 is on + pinInjector3 = 10; //Output pin injector 3 is on + pinInjector4 = 11; //Output pin injector 4 is on + pinInjector5 = 12; //Output pin injector 5 is on + pinCoil1 = 28; //Pin for coil 1 + pinCoil2 = 24; //Pin for coil 2 + pinCoil3 = 40; //Pin for coil 3 + pinCoil4 = 36; //Pin for coil 4 + pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now + pinSpareOut1 = 4; //Spare LSD Output 1(PWM) + pinSpareOut2 = 5; //Spare LSD Output 2(PWM) + pinSpareOut3 = 6; //Spare LSD Output 3(PWM) + pinSpareOut4 = 7; //Spare LSD Output 4(PWM) + pinSpareOut5 = 50; //Spare LSD Output 5(digital) + pinSpareOut6 = 52; //Spare LSD Output 6(digital) + pinTrigger = 20; //The CAS pin + pinTrigger2 = 21; //The Cam Sensor pin + pinSpareTemp2 = A15; //spare Analog input 2 + pinSpareTemp1 = A14; //spare Analog input 1 + pinO2 = A8; //O2 Sensor pin + pinBat = A4; //Battery reference voltage pin + pinMAP = A3; //MAP sensor pin + pinTPS = A2;//TPS input pin + pinCLT = A1; //CLS sensor pin + pinIAT = A0; //IAT sensor pin + pinFan = 47; //Pin for the fan output + pinFuelPump = 4; //Fuel pump output + pinTachOut = 49; //Tacho output pin + pinResetControl = 26; //Reset control output + #endif + break; + + case 30: + #ifndef SMALL_FLASH_MODE //No support for bluepill here anyway + //Pin mappings as per the dazv6 shield + pinInjector1 = 8; //Output pin injector 1 is on + pinInjector2 = 9; //Output pin injector 2 is on + pinInjector3 = 10; //Output pin injector 3 is on + pinInjector4 = 11; //Output pin injector 4 is on + pinInjector5 = 12; //Output pin injector 5 is on + pinCoil1 = 40; //Pin for coil 1 + pinCoil2 = 38; //Pin for coil 2 + pinCoil3 = 50; //Pin for coil 3 + pinCoil4 = 52; //Pin for coil 4 + pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now + pinTrigger = 19; //The CAS pin + pinTrigger2 = 18; //The Cam Sensor pin + pinTrigger3 = 17; // cam sensor 2 pin + pinTPS = A2;//TPS input pin + pinMAP = A3; //MAP sensor pin + pinIAT = A0; //IAT sensor pin + pinCLT = A1; //CLS sensor pin + pinO2 = A8; //O2 Sensor pin + pinO2_2 = A9; //O2 sensor pin (second sensor) + pinBat = A4; //Battery reference voltage pin + pinDisplayReset = 48; // OLED reset pin + pinTachOut = 49; //Tacho output pin + pinIdle1 = 5; //Single wire idle control + pinFuelPump = 45; //Fuel pump output + pinStepperDir = 20; //Direction pin for DRV8825 driver + pinStepperStep = 21; //Step pin for DRV8825 driver + pinSpareHOut1 = 4; // high current output spare1 + pinSpareHOut2 = 6; // high current output spare2 + pinBoost = 7; + pinSpareLOut1 = 43; //low current output spare1 + pinSpareLOut2 = 47; + pinSpareLOut3 = 49; + pinSpareLOut4 = 51; + pinSpareLOut5 = 53; + pinFan = 47; //Pin for the fan output + #endif + break; + + case 40: + //Pin mappings as per the NO2C shield + pinInjector1 = 8; //Output pin injector 1 is on + pinInjector2 = 9; //Output pin injector 2 is on + pinInjector3 = 11; //Output pin injector 3 is on - NOT USED + pinInjector4 = 12; //Output pin injector 4 is on - NOT USED + pinInjector5 = 13; //Placeholder only - NOT USED + pinCoil1 = 23; //Pin for coil 1 + pinCoil2 = 22; //Pin for coil 2 + pinCoil3 = 2; //Pin for coil 3 - ONLY WITH DB2 + pinCoil4 = 3; //Pin for coil 4 - ONLY WITH DB2 + pinCoil5 = 46; //Placeholder only - NOT USED + pinTrigger = 19; //The CAS pin + pinTrigger2 = 18; //The Cam Sensor pin + pinTPS = A3; //TPS input pin + pinMAP = A0; //MAP sensor pin + pinIAT = A5; //IAT sensor pin + pinCLT = A4; //CLT sensor pin + pinO2 = A2; //O2 sensor pin + pinBat = A1; //Battery reference voltage pin + pinBaro = A6; //Baro sensor pin - ONLY WITH DB + pinSpareTemp1 = A7; //spare Analog input 1 - ONLY WITH DB + pinDisplayReset = 48; // OLED reset pin - NOT USED + pinTachOut = 38; //Tacho output pin + pinIdle1 = 5; //Single wire idle control + pinIdle2 = 47; //2 wire idle control - NOT USED + pinBoost = 7; //Boost control + pinVVT_1 = 6; //Default VVT output + pinFuelPump = 4; //Fuel pump output + pinStepperDir = 25; //Direction pin for DRV8825 driver + pinStepperStep = 24; //Step pin for DRV8825 driver + pinStepperEnable = 27; //Enable pin for DRV8825 driver + pinLaunch = 10; //Can be overwritten below + pinFlex = 20; // Flex sensor (Must be external interrupt enabled) - ONLY WITH DB + pinFan = 30; //Pin for the fan output - ONLY WITH DB + pinSpareLOut1 = 32; //low current output spare1 - ONLY WITH DB + pinSpareLOut2 = 34; //low current output spare2 - ONLY WITH DB + pinSpareLOut3 = 36; //low current output spare3 - ONLY WITH DB + pinResetControl = 26; //Reset control output + break; + + case 41: + #ifndef SMALL_FLASH_MODE //No support for bluepill here anyway + //Pin mappings as per the UA4C shield + pinInjector1 = 8; //Output pin injector 1 is on + pinInjector2 = 7; //Output pin injector 2 is on + pinInjector3 = 6; //Output pin injector 3 is on + pinInjector4 = 5; //Output pin injector 4 is on + pinInjector5 = 45; //Output pin injector 5 is on PLACEHOLDER value for now + pinCoil1 = 35; //Pin for coil 1 + pinCoil2 = 36; //Pin for coil 2 + pinCoil3 = 33; //Pin for coil 3 + pinCoil4 = 34; //Pin for coil 4 + pinCoil5 = 44; //Pin for coil 5 PLACEHOLDER value for now + pinTrigger = 19; //The CAS pin + pinTrigger2 = 18; //The Cam Sensor pin + pinFlex = 20; // Flex sensor + pinTPS = A3; //TPS input pin + pinMAP = A0; //MAP sensor pin + pinBaro = A7; //Baro sensor pin + pinIAT = A5; //IAT sensor pin + pinCLT = A4; //CLS sensor pin + pinO2 = A1; //O2 Sensor pin + pinO2_2 = A9; //O2 sensor pin (second sensor) + pinBat = A2; //Battery reference voltage pin + pinSpareTemp1 = A8; //spare Analog input 1 + pinLaunch = 37; //Can be overwritten below + pinDisplayReset = 48; // OLED reset pin PLACEHOLDER value for now + pinTachOut = 22; //Tacho output pin + pinIdle1 = 9; //Single wire idle control + pinIdle2 = 10; //2 wire idle control + pinFuelPump = 23; //Fuel pump output + pinVVT_1 = 11; //Default VVT output + pinStepperDir = 32; //Direction pin for DRV8825 driver + pinStepperStep = 31; //Step pin for DRV8825 driver + pinStepperEnable = 30; //Enable pin for DRV8825 driver + pinBoost = 12; //Boost control + pinSpareLOut1 = 26; //low current output spare1 + pinSpareLOut2 = 27; //low current output spare2 + pinSpareLOut3 = 28; //low current output spare3 + pinSpareLOut4 = 29; //low current output spare4 + pinFan = 24; //Pin for the fan output + pinResetControl = 46; //Reset control output PLACEHOLDER value for now + #endif + break; + + #if defined(CORE_TEENSY) + case 50: + //Pin mappings as per the teensy rev A shield + pinInjector1 = 2; //Output pin injector 1 is on + pinInjector2 = 10; //Output pin injector 2 is on + pinInjector3 = 6; //Output pin injector 3 is on + pinInjector4 = 9; //Output pin injector 4 is on + //Placeholder only - NOT USED: + //pinInjector5 = 13; + pinCoil1 = 29; //Pin for coil 1 + pinCoil2 = 30; //Pin for coil 2 + pinCoil3 = 31; //Pin for coil 3 - ONLY WITH DB2 + pinCoil4 = 32; //Pin for coil 4 - ONLY WITH DB2 + //Placeholder only - NOT USED: + //pinCoil5 = 46; + pinTrigger = 23; //The CAS pin + pinTrigger2 = 36; //The Cam Sensor pin + pinTPS = 16; //TPS input pin + pinMAP = 17; //MAP sensor pin + pinIAT = 14; //IAT sensor pin + pinCLT = 15; //CLT sensor pin + pinO2 = A22; //O2 sensor pin + pinO2_2 = A21; //O2 sensor pin (second sensor) + pinBat = 18; //Battery reference voltage pin + pinTachOut = 20; //Tacho output pin + pinIdle1 = 5; //Single wire idle control + pinBoost = 11; //Boost control + pinFuelPump = 38; //Fuel pump output + pinStepperDir = 34; //Direction pin for DRV8825 driver + pinStepperStep = 35; //Step pin for DRV8825 driver + pinStepperEnable = 33; //Enable pin for DRV8825 driver + pinLaunch = 26; //Can be overwritten below + pinFan = 37; //Pin for the fan output - ONLY WITH DB + pinSpareHOut1 = 8; // high current output spare1 + pinSpareHOut2 = 7; // high current output spare2 + pinSpareLOut1 = 21; //low current output spare1 + break; + + case 51: + //Pin mappings as per the teensy revB board shield + pinInjector1 = 2; //Output pin injector 1 is on + pinInjector2 = 10; //Output pin injector 2 is on + pinInjector3 = 6; //Output pin injector 3 is on - NOT USED + pinInjector4 = 9; //Output pin injector 4 is on - NOT USED + pinCoil1 = 29; //Pin for coil 1 + pinCoil2 = 30; //Pin for coil 2 + pinCoil3 = 31; //Pin for coil 3 - ONLY WITH DB2 + pinCoil4 = 32; //Pin for coil 4 - ONLY WITH DB2 + pinTrigger = 23; //The CAS pin + pinTrigger2 = 36; //The Cam Sensor pin + pinTPS = 16; //TPS input pin + pinMAP = 17; //MAP sensor pin + pinIAT = 14; //IAT sensor pin + pinCLT = 15; //CLT sensor pin + pinO2 = A22; //O2 sensor pin + pinO2_2 = A21; //O2 sensor pin (second sensor) + pinBat = 18; //Battery reference voltage pin + pinTachOut = 20; //Tacho output pin + pinIdle1 = 5; //Single wire idle control + pinBoost = 11; //Boost control + pinFuelPump = 38; //Fuel pump output + pinStepperDir = 34; //Direction pin for DRV8825 driver + pinStepperStep = 35; //Step pin for DRV8825 driver + pinStepperEnable = 33; //Enable pin for DRV8825 driver + pinLaunch = 26; //Can be overwritten below + pinFan = 37; //Pin for the fan output - ONLY WITH DB + pinSpareHOut1 = 8; // high current output spare1 + pinSpareHOut2 = 7; // high current output spare2 + pinSpareLOut1 = 21; //low current output spare1 + break; + #endif + + default: + #ifndef SMALL_FLASH_MODE //No support for bluepill here anyway + //Pin mappings as per the v0.2 shield + pinInjector1 = 8; //Output pin injector 1 is on + pinInjector2 = 9; //Output pin injector 2 is on + pinInjector3 = 10; //Output pin injector 3 is on + pinInjector4 = 11; //Output pin injector 4 is on + pinInjector5 = 12; //Output pin injector 5 is on + pinCoil1 = 28; //Pin for coil 1 + pinCoil2 = 24; //Pin for coil 2 + pinCoil3 = 40; //Pin for coil 3 + pinCoil4 = 36; //Pin for coil 4 + pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now + pinTrigger = 20; //The CAS pin + pinTrigger2 = 21; //The Cam Sensor pin + pinTPS = A2; //TPS input pin + pinMAP = A3; //MAP sensor pin + pinIAT = A0; //IAT sensor pin + pinCLT = A1; //CLS sensor pin + pinO2 = A8; //O2 Sensor pin + pinBat = A4; //Battery reference voltage pin + pinStepperDir = 16; //Direction pin for DRV8825 driver + pinStepperStep = 17; //Step pin for DRV8825 driver + pinDisplayReset = 48; // OLED reset pin + pinFan = 47; //Pin for the fan output + pinFuelPump = 4; //Fuel pump output + pinTachOut = 49; //Tacho output pin + pinFlex = 3; // Flex sensor (Must be external interrupt enabled) + pinBoost = 5; + pinIdle1 = 6; + pinResetControl = 43; //Reset control output + #endif + break; + } + + //Setup any devices that are using selectable pins + + if ( (configPage6.launchPin != 0) && (configPage6.launchPin < BOARD_NR_GPIO_PINS) ) { pinLaunch = pinTranslate(configPage6.launchPin); } + if ( (configPage4.ignBypassPin != 0) && (configPage4.ignBypassPin < BOARD_NR_GPIO_PINS) ) { pinIgnBypass = pinTranslate(configPage4.ignBypassPin); } + if ( (configPage2.tachoPin != 0) && (configPage2.tachoPin < BOARD_NR_GPIO_PINS) ) { pinTachOut = pinTranslate(configPage2.tachoPin); } + if ( (configPage4.fuelPumpPin != 0) && (configPage4.fuelPumpPin < BOARD_NR_GPIO_PINS) ) { pinFuelPump = pinTranslate(configPage4.fuelPumpPin); } + if ( (configPage6.fanPin != 0) && (configPage6.fanPin < BOARD_NR_GPIO_PINS) ) { pinFan = pinTranslate(configPage6.fanPin); } + if ( (configPage6.boostPin != 0) && (configPage6.boostPin < BOARD_NR_GPIO_PINS) ) { pinBoost = pinTranslate(configPage6.boostPin); } + if ( (configPage6.vvtPin != 0) && (configPage6.vvtPin < BOARD_NR_GPIO_PINS) ) { pinVVT_1 = pinTranslate(configPage6.vvtPin); } + if ( (configPage6.useExtBaro != 0) && (configPage6.baroPin < BOARD_NR_GPIO_PINS) ) { pinBaro = configPage6.baroPin + A0; } + if ( (configPage6.useEMAP != 0) && (configPage10.EMAPPin < BOARD_NR_GPIO_PINS) ) { pinEMAP = configPage10.EMAPPin + A0; } + + //Currently there's no default pin for Idle Up + pinIdleUp = pinTranslate(configPage2.idleUpPin); + + /* Reset control is a special case. If reset control is enabled, it needs its initial state set BEFORE its pinMode. + If that doesn't happen and reset control is in "Serial Command" mode, the Arduino will end up in a reset loop + because the control pin will go low as soon as the pinMode is set to OUTPUT. */ + if ( (configPage4.resetControl != 0) && (configPage4.resetControlPin < BOARD_NR_GPIO_PINS) ) + { + resetControl = configPage4.resetControl; + pinResetControl = pinTranslate(configPage4.resetControlPin); + setResetControlPinState(); + pinMode(pinResetControl, OUTPUT); + } + + //Finally, set the relevant pin modes for outputs + pinMode(pinCoil1, OUTPUT); + pinMode(pinCoil2, OUTPUT); + pinMode(pinCoil3, OUTPUT); + pinMode(pinCoil4, OUTPUT); + pinMode(pinCoil5, OUTPUT); + pinMode(pinInjector1, OUTPUT); + pinMode(pinInjector2, OUTPUT); + pinMode(pinInjector3, OUTPUT); + pinMode(pinInjector4, OUTPUT); + pinMode(pinInjector5, OUTPUT); + pinMode(pinTachOut, OUTPUT); + pinMode(pinIdle1, OUTPUT); + pinMode(pinIdle2, OUTPUT); + pinMode(pinFuelPump, OUTPUT); + pinMode(pinIgnBypass, OUTPUT); + pinMode(pinFan, OUTPUT); + pinMode(pinStepperDir, OUTPUT); + pinMode(pinStepperStep, OUTPUT); + pinMode(pinStepperEnable, OUTPUT); + pinMode(pinBoost, OUTPUT); + pinMode(pinVVT_1, OUTPUT); + + inj1_pin_port = portOutputRegister(digitalPinToPort(pinInjector1)); + inj1_pin_mask = digitalPinToBitMask(pinInjector1); + inj2_pin_port = portOutputRegister(digitalPinToPort(pinInjector2)); + inj2_pin_mask = digitalPinToBitMask(pinInjector2); + inj3_pin_port = portOutputRegister(digitalPinToPort(pinInjector3)); + inj3_pin_mask = digitalPinToBitMask(pinInjector3); + inj4_pin_port = portOutputRegister(digitalPinToPort(pinInjector4)); + inj4_pin_mask = digitalPinToBitMask(pinInjector4); + inj5_pin_port = portOutputRegister(digitalPinToPort(pinInjector5)); + inj5_pin_mask = digitalPinToBitMask(pinInjector5); + inj6_pin_port = portOutputRegister(digitalPinToPort(pinInjector6)); + inj6_pin_mask = digitalPinToBitMask(pinInjector6); + inj7_pin_port = portOutputRegister(digitalPinToPort(pinInjector7)); + inj7_pin_mask = digitalPinToBitMask(pinInjector7); + inj8_pin_port = portOutputRegister(digitalPinToPort(pinInjector8)); + inj8_pin_mask = digitalPinToBitMask(pinInjector8); + + ign1_pin_port = portOutputRegister(digitalPinToPort(pinCoil1)); + ign1_pin_mask = digitalPinToBitMask(pinCoil1); + ign2_pin_port = portOutputRegister(digitalPinToPort(pinCoil2)); + ign2_pin_mask = digitalPinToBitMask(pinCoil2); + ign3_pin_port = portOutputRegister(digitalPinToPort(pinCoil3)); + ign3_pin_mask = digitalPinToBitMask(pinCoil3); + ign4_pin_port = portOutputRegister(digitalPinToPort(pinCoil4)); + ign4_pin_mask = digitalPinToBitMask(pinCoil4); + ign5_pin_port = portOutputRegister(digitalPinToPort(pinCoil5)); + ign5_pin_mask = digitalPinToBitMask(pinCoil5); + ign6_pin_port = portOutputRegister(digitalPinToPort(pinCoil6)); + ign6_pin_mask = digitalPinToBitMask(pinCoil6); + ign7_pin_port = portOutputRegister(digitalPinToPort(pinCoil7)); + ign7_pin_mask = digitalPinToBitMask(pinCoil7); + ign8_pin_port = portOutputRegister(digitalPinToPort(pinCoil8)); + ign8_pin_mask = digitalPinToBitMask(pinCoil8); + + tach_pin_port = portOutputRegister(digitalPinToPort(pinTachOut)); + tach_pin_mask = digitalPinToBitMask(pinTachOut); + pump_pin_port = portOutputRegister(digitalPinToPort(pinFuelPump)); + pump_pin_mask = digitalPinToBitMask(pinFuelPump); + + //And for inputs + #if defined(CORE_STM32) + #ifndef ARDUINO_ARCH_STM32 //libmaple core aka STM32DUINO + pinMode(pinMAP, INPUT_ANALOG); + pinMode(pinO2, INPUT_ANALOG); + pinMode(pinO2_2, INPUT_ANALOG); + pinMode(pinTPS, INPUT_ANALOG); + pinMode(pinIAT, INPUT_ANALOG); + pinMode(pinCLT, INPUT_ANALOG); + pinMode(pinBat, INPUT_ANALOG); + pinMode(pinBaro, INPUT_ANALOG); + #else + pinMode(pinMAP, INPUT); + pinMode(pinO2, INPUT); + pinMode(pinO2_2, INPUT); + pinMode(pinTPS, INPUT); + pinMode(pinIAT, INPUT); + pinMode(pinCLT, INPUT); + pinMode(pinBat, INPUT); + pinMode(pinBaro, INPUT); + #endif + #endif + pinMode(pinTrigger, INPUT); + pinMode(pinTrigger2, INPUT); + pinMode(pinTrigger3, INPUT); + + //Each of the below are only set when their relevant function is enabled. This can help prevent pin conflicts that users aren't aware of with unused functions + if(configPage2.flexEnabled > 0) + { + pinMode(pinFlex, INPUT); //Standard GM / Continental flex sensor requires pullup, but this should be onboard. The internal pullup will not work (Requires ~3.3k)! + } + if(configPage6.launchEnabled > 0) + { + if (configPage6.lnchPullRes == true) { pinMode(pinLaunch, INPUT_PULLUP); } + else { pinMode(pinLaunch, INPUT); } //If Launch Pull Resistor is not set make input float. + } + if(configPage2.idleUpEnabled > 0) + { + if (configPage2.idleUpPolarity == 0) { pinMode(pinIdleUp, INPUT_PULLUP); } //Normal setting + else { pinMode(pinIdleUp, INPUT); } //inverted setting + } + + + //These must come after the above pinMode statements + triggerPri_pin_port = portInputRegister(digitalPinToPort(pinTrigger)); + triggerPri_pin_mask = digitalPinToBitMask(pinTrigger); + triggerSec_pin_port = portInputRegister(digitalPinToPort(pinTrigger2)); + triggerSec_pin_mask = digitalPinToBitMask(pinTrigger2); + + #if defined(CORE_STM32) + #else + //Set default values + digitalWrite(pinMAP, HIGH); + //digitalWrite(pinO2, LOW); + digitalWrite(pinTPS, LOW); + #endif +} #endif \ No newline at end of file diff --git a/speeduino/init.ino b/speeduino/init.ino index 120a8da3..c4e12342 100644 --- a/speeduino/init.ino +++ b/speeduino/init.ino @@ -754,753 +754,7 @@ void initialiseAll() digitalWrite(LED_BUILTIN, HIGH); } -void setPinMapping(byte boardID) -{ - switch (boardID) - { - case 0: - #ifndef SMALL_FLASH_MODE //No support for bluepill here anyway - //Pin mappings as per the v0.1 shield - pinInjector1 = 8; //Output pin injector 1 is on - pinInjector2 = 9; //Output pin injector 2 is on - pinInjector3 = 11; //Output pin injector 3 is on - pinInjector4 = 10; //Output pin injector 4 is on - pinInjector5 = 12; //Output pin injector 5 is on - pinCoil1 = 6; //Pin for coil 1 - pinCoil2 = 7; //Pin for coil 2 - pinCoil3 = 12; //Pin for coil 3 - pinCoil4 = 13; //Pin for coil 4 - pinCoil5 = 14; //Pin for coil 5 - pinTrigger = 2; //The CAS pin - pinTrigger2 = 3; //The CAS pin - pinTPS = A0; //TPS input pin - pinMAP = A1; //MAP sensor pin - pinIAT = A2; //IAT sensor pin - pinCLT = A3; //CLS sensor pin - pinO2 = A4; //O2 Sensor pin - pinIdle1 = 46; //Single wire idle control - pinIdle2 = 47; //2 wire idle control - pinStepperDir = 16; //Direction pin for DRV8825 driver - pinStepperStep = 17; //Step pin for DRV8825 driver - pinFan = 47; //Pin for the fan output - pinFuelPump = 4; //Fuel pump output - pinTachOut = 49; //Tacho output pin - pinFlex = 19; // Flex sensor (Must be external interrupt enabled) - pinResetControl = 43; //Reset control output - #endif - break; - case 1: - #ifndef SMALL_FLASH_MODE //No support for bluepill here anyway - //Pin mappings as per the v0.2 shield - pinInjector1 = 8; //Output pin injector 1 is on - pinInjector2 = 9; //Output pin injector 2 is on - pinInjector3 = 10; //Output pin injector 3 is on - pinInjector4 = 11; //Output pin injector 4 is on - pinInjector5 = 12; //Output pin injector 5 is on - pinCoil1 = 28; //Pin for coil 1 - pinCoil2 = 24; //Pin for coil 2 - pinCoil3 = 40; //Pin for coil 3 - pinCoil4 = 36; //Pin for coil 4 - pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now - pinTrigger = 20; //The CAS pin - pinTrigger2 = 21; //The Cam Sensor pin - pinTPS = A2; //TPS input pin - pinMAP = A3; //MAP sensor pin - pinIAT = A0; //IAT sensor pin - pinCLT = A1; //CLS sensor pin - pinO2 = A8; //O2 Sensor pin - pinBat = A4; //Battery reference voltage pin - pinDisplayReset = 48; // OLED reset pin - pinTachOut = 49; //Tacho output pin - pinIdle1 = 30; //Single wire idle control - pinIdle2 = 31; //2 wire idle control - pinStepperDir = 16; //Direction pin for DRV8825 driver - pinStepperStep = 17; //Step pin for DRV8825 driver - pinFan = 47; //Pin for the fan output - pinFuelPump = 4; //Fuel pump output - pinFlex = 2; // Flex sensor (Must be external interrupt enabled) - pinResetControl = 43; //Reset control output - break; - #endif - case 2: - #ifndef SMALL_FLASH_MODE //No support for bluepill here anyway - //Pin mappings as per the v0.3 shield - pinInjector1 = 8; //Output pin injector 1 is on - pinInjector2 = 9; //Output pin injector 2 is on - pinInjector3 = 10; //Output pin injector 3 is on - pinInjector4 = 11; //Output pin injector 4 is on - pinInjector5 = 12; //Output pin injector 5 is on - pinCoil1 = 28; //Pin for coil 1 - pinCoil2 = 24; //Pin for coil 2 - pinCoil3 = 40; //Pin for coil 3 - pinCoil4 = 36; //Pin for coil 4 - pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now - pinTrigger = 19; //The CAS pin - pinTrigger2 = 18; //The Cam Sensor pin - pinTPS = A2;//TPS input pin - pinMAP = A3; //MAP sensor pin - pinIAT = A0; //IAT sensor pin - pinCLT = A1; //CLS sensor pin - pinO2 = A8; //O2 Sensor pin - pinBat = A4; //Battery reference voltage pin - pinDisplayReset = 48; // OLED reset pin - pinTachOut = 49; //Tacho output pin - pinIdle1 = 5; //Single wire idle control - pinIdle2 = 53; //2 wire idle control - pinBoost = 7; //Boost control - pinVVT_1 = 6; //Default VVT output - pinFuelPump = 4; //Fuel pump output - pinStepperDir = 16; //Direction pin for DRV8825 driver - pinStepperStep = 17; //Step pin for DRV8825 driver - pinStepperEnable = 26; //Enable pin for DRV8825 - pinFan = A13; //Pin for the fan output - pinLaunch = 51; //Can be overwritten below - pinFlex = 2; // Flex sensor (Must be external interrupt enabled) - pinResetControl = 50; //Reset control output - #if defined(CORE_TEENSY) - pinTrigger = 23; - pinStepperDir = 33; - pinStepperStep = 34; - pinCoil1 = 31; - pinTachOut = 28; - pinFan = 27; - pinCoil4 = 21; - pinCoil3 = 30; - pinO2 = A22; - #endif - #endif - break; - - case 3: - //Pin mappings as per the v0.4 shield - pinInjector1 = 8; //Output pin injector 1 is on - pinInjector2 = 9; //Output pin injector 2 is on - pinInjector3 = 10; //Output pin injector 3 is on - pinInjector4 = 11; //Output pin injector 4 is on - pinInjector5 = 12; //Output pin injector 5 is on - pinInjector6 = 50; //CAUTION: Uses the same as Coil 4 below. - pinCoil1 = 40; //Pin for coil 1 - pinCoil2 = 38; //Pin for coil 2 - pinCoil3 = 52; //Pin for coil 3 - pinCoil4 = 50; //Pin for coil 4 - pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now - pinTrigger = 19; //The CAS pin - pinTrigger2 = 18; //The Cam Sensor pin - pinTPS = A2;//TPS input pin - pinMAP = A3; //MAP sensor pin - pinIAT = A0; //IAT sensor pin - pinCLT = A1; //CLS sensor pin - pinO2 = A8; //O2 Sensor pin - pinBat = A4; //Battery reference voltage pin - pinDisplayReset = 48; // OLED reset pin - pinTachOut = 49; //Tacho output pin (Goes to ULN2803) - pinIdle1 = 5; //Single wire idle control - pinIdle2 = 6; //2 wire idle control - pinBoost = 7; //Boost control - pinVVT_1 = 4; //Default VVT output - pinFuelPump = 45; //Fuel pump output (Goes to ULN2803) - pinStepperDir = 16; //Direction pin for DRV8825 driver - pinStepperStep = 17; //Step pin for DRV8825 driver - pinStepperEnable = 24; //Enable pin for DRV8825 - pinFan = 47; //Pin for the fan output (Goes to ULN2803) - pinLaunch = 51; //Can be overwritten below - pinFlex = 2; // Flex sensor (Must be external interrupt enabled) - pinResetControl = 43; //Reset control output - - #if defined(CORE_TEENSY) - pinInjector6 = 51; - - pinTrigger = 23; - pinTrigger2 = 36; - pinStepperDir = 34; - pinStepperStep = 35; - pinCoil1 = 31; - pinCoil2 = 32; - pinTachOut = 28; - pinFan = 27; - pinCoil4 = 29; - pinCoil3 = 30; - pinO2 = A22; - #elif defined(STM32F4) - //Black F407VE http://wiki.stm32duino.com/index.php?title=STM32F407 - //PC8~PC12 SDio - //PA13~PA15 & PB4 SWD(debug) pins - //PB0 EEPROM CS pin - //PD5 & PD6 Serial2 - pinInjector1 = PE7; //Output pin injector 1 is on - pinInjector2 = PE8; //Output pin injector 2 is on - pinInjector3 = PE9; //Output pin injector 3 is on - pinInjector4 = PE10; //Output pin injector 4 is on - pinInjector5 = PE11; //Output pin injector 5 is on - pinInjector6 = PE12; //Output pin injector 6 is on - pinCoil1 = PB5; //Pin for coil 1 - pinCoil2 = PB6; //Pin for coil 2 - pinCoil3 = PB7; //Pin for coil 3 - pinCoil4 = PB8; //Pin for coil 4 - pinCoil5 = PB9; //Pin for coil 5 - pinTPS = A0; //TPS input pin - pinMAP = A1; //MAP sensor pin - pinIAT = A2; //IAT sensor pin - pinCLT = A3; //CLT sensor pin - pinO2 = A4; //O2 Sensor pin - pinBat = A5; //Battery reference voltage pin - pinBaro = A10; - pinIdle1 = PB8; //Single wire idle control - pinIdle2 = PB9; //2 wire idle control - pinBoost = PE0; //Boost control - pinVVT_1 = PE1; //Default VVT output - pinStepperDir = PD8; //Direction pin for DRV8825 driver - pinStepperStep = PB15; //Step pin for DRV8825 driver - pinStepperEnable = PD9; //Enable pin for DRV8825 - pinDisplayReset = PE1; // OLED reset pin - pinFan = PE2; //Pin for the fan output - pinFuelPump = PA6; //Fuel pump output - pinTachOut = PA7; //Tacho output pin - //external interrupt enabled pins - //external interrupts could be enalbed in any pin, except same port numbers (PA4,PE4) - pinFlex = PE2; // Flex sensor (Must be external interrupt enabled) - pinTrigger = PE3; //The CAS pin - pinTrigger2 = PE4; //The Cam Sensor pin - #elif defined(CORE_STM32) - //blue pill http://wiki.stm32duino.com/index.php?title=Blue_Pill - //Maple mini http://wiki.stm32duino.com/index.php?title=Maple_Mini - //pins PA12, PA11 are used for USB or CAN couldn't be used for GPIO - pinInjector1 = PB7; //Output pin injector 1 is on - pinInjector2 = PB6; //Output pin injector 2 is on - pinInjector3 = PB5; //Output pin injector 3 is on - pinInjector4 = PB4; //Output pin injector 4 is on - pinCoil1 = PB3; //Pin for coil 1 - pinCoil2 = PA15; //Pin for coil 2 - pinCoil3 = PA14; //Pin for coil 3 - pinCoil4 = PA9; //Pin for coil 4 - pinCoil5 = PA8; //Pin for coil 5 - pinTPS = A0; //TPS input pin - pinMAP = A1; //MAP sensor pin - pinIAT = A2; //IAT sensor pin - pinCLT = A3; //CLS sensor pin - pinO2 = A4; //O2 Sensor pin - pinBat = A5; //Battery reference voltage pin - pinBaro = pinMAP; - pinIdle1 = PB2; //Single wire idle control - pinIdle2 = PA2; //2 wire idle control - pinBoost = PA1; //Boost control - pinVVT_1 = PA0; //Default VVT output - pinStepperDir = PC15; //Direction pin for DRV8825 driver - pinStepperStep = PC14; //Step pin for DRV8825 driver - pinStepperEnable = PC13; //Enable pin for DRV8825 - pinDisplayReset = PB2; // OLED reset pin - pinFan = PB1; //Pin for the fan output - pinFuelPump = PB11; //Fuel pump output - pinTachOut = PB10; //Tacho output pin - //external interrupt enabled pins - pinFlex = PB8; // Flex sensor (Must be external interrupt enabled) - pinTrigger = PA10; //The CAS pin - pinTrigger2 = PA13; //The Cam Sensor pin - #endif - break; - - case 9: - //Pin mappings as per the MX5 PNP shield - pinInjector1 = 11; //Output pin injector 1 is on - pinInjector2 = 10; //Output pin injector 2 is on - pinInjector3 = 9; //Output pin injector 3 is on - pinInjector4 = 8; //Output pin injector 4 is on - pinInjector5 = 14; //Output pin injector 5 is on - pinCoil1 = 39; //Pin for coil 1 - pinCoil2 = 41; //Pin for coil 2 - pinCoil3 = 32; //Pin for coil 3 - pinCoil4 = 33; //Pin for coil 4 - pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now - pinTrigger = 19; //The CAS pin - pinTrigger2 = 18; //The Cam Sensor pin - pinTPS = A2;//TPS input pin - pinMAP = A5; //MAP sensor pin - pinIAT = A0; //IAT sensor pin - pinCLT = A1; //CLS sensor pin - pinO2 = A3; //O2 Sensor pin - pinBat = A4; //Battery reference voltage pin - pinDisplayReset = 48; // OLED reset pin - pinTachOut = 49; //Tacho output pin (Goes to ULN2803) - pinIdle1 = 2; //Single wire idle control - pinBoost = 4; - pinIdle2 = 4; //2 wire idle control (Note this is shared with boost!!!) - pinFuelPump = 37; //Fuel pump output - pinStepperDir = 16; //Direction pin for DRV8825 driver - pinStepperStep = 17; //Step pin for DRV8825 driver - pinFan = 35; //Pin for the fan output - pinLaunch = 12; //Can be overwritten below - pinFlex = 3; // Flex sensor (Must be external interrupt enabled) - pinResetControl = 44; //Reset control output - - #if defined(CORE_TEENSY) - pinTrigger = 23; - pinTrigger2 = 36; - pinStepperDir = 34; - pinStepperStep = 35; - pinCoil1 = 33; //Done - pinCoil2 = 24; //Done - pinCoil3 = 51; //Won't work (No mapping for pin 32) - pinCoil4 = 52; //Won't work (No mapping for pin 33) - pinFuelPump = 26; //Requires PVT4 adapter or above - pinFan = 50; //Won't work (No mapping for pin 35) - pinTachOut = 28; //Done - #endif - break; - - case 10: - #ifndef SMALL_FLASH_MODE //No support for bluepill here anyway - //Pin mappings for user turtanas PCB - pinInjector1 = 4; //Output pin injector 1 is on - pinInjector2 = 5; //Output pin injector 2 is on - pinInjector3 = 6; //Output pin injector 3 is on - pinInjector4 = 7; //Output pin injector 4 is on - pinInjector5 = 8; //Placeholder only - NOT USED - pinInjector6 = 9; //Placeholder only - NOT USED - pinInjector7 = 10; //Placeholder only - NOT USED - pinInjector8 = 11; //Placeholder only - NOT USED - pinCoil1 = 24; //Pin for coil 1 - pinCoil2 = 28; //Pin for coil 2 - pinCoil3 = 36; //Pin for coil 3 - pinCoil4 = 40; //Pin for coil 4 - pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now - pinTrigger = 18; //The CAS pin - pinTrigger2 = 19; //The Cam Sensor pin - pinTPS = A2;//TPS input pin - pinMAP = A3; //MAP sensor pin - pinMAP2 = A8; //MAP2 sensor pin - pinIAT = A0; //IAT sensor pin - pinCLT = A1; //CLS sensor pin - pinO2 = A4; //O2 Sensor pin - pinBat = A7; //Battery reference voltage pin - pinDisplayReset = 48; // OLED reset pin - pinSpareTemp1 = A6; - pinSpareTemp2 = A5; - pinTachOut = 41; //Tacho output pin transistori puuttuu 2n2222 tähän ja 1k 12v - pinFuelPump = 42; //Fuel pump output 2n2222 - pinFan = 47; //Pin for the fan output - pinTachOut = 49; //Tacho output pin - pinFlex = 2; // Flex sensor (Must be external interrupt enabled) - pinResetControl = 26; //Reset control output - - #endif - break; - - case 20: - #ifndef SMALL_FLASH_MODE //No support for bluepill here anyway - //Pin mappings as per the Plazomat In/Out shields Rev 0.1 - pinInjector1 = 8; //Output pin injector 1 is on - pinInjector2 = 9; //Output pin injector 2 is on - pinInjector3 = 10; //Output pin injector 3 is on - pinInjector4 = 11; //Output pin injector 4 is on - pinInjector5 = 12; //Output pin injector 5 is on - pinCoil1 = 28; //Pin for coil 1 - pinCoil2 = 24; //Pin for coil 2 - pinCoil3 = 40; //Pin for coil 3 - pinCoil4 = 36; //Pin for coil 4 - pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now - pinSpareOut1 = 4; //Spare LSD Output 1(PWM) - pinSpareOut2 = 5; //Spare LSD Output 2(PWM) - pinSpareOut3 = 6; //Spare LSD Output 3(PWM) - pinSpareOut4 = 7; //Spare LSD Output 4(PWM) - pinSpareOut5 = 50; //Spare LSD Output 5(digital) - pinSpareOut6 = 52; //Spare LSD Output 6(digital) - pinTrigger = 20; //The CAS pin - pinTrigger2 = 21; //The Cam Sensor pin - pinSpareTemp2 = A15; //spare Analog input 2 - pinSpareTemp1 = A14; //spare Analog input 1 - pinO2 = A8; //O2 Sensor pin - pinBat = A4; //Battery reference voltage pin - pinMAP = A3; //MAP sensor pin - pinTPS = A2;//TPS input pin - pinCLT = A1; //CLS sensor pin - pinIAT = A0; //IAT sensor pin - pinFan = 47; //Pin for the fan output - pinFuelPump = 4; //Fuel pump output - pinTachOut = 49; //Tacho output pin - pinResetControl = 26; //Reset control output - #endif - break; - - case 30: - #ifndef SMALL_FLASH_MODE //No support for bluepill here anyway - //Pin mappings as per the dazv6 shield - pinInjector1 = 8; //Output pin injector 1 is on - pinInjector2 = 9; //Output pin injector 2 is on - pinInjector3 = 10; //Output pin injector 3 is on - pinInjector4 = 11; //Output pin injector 4 is on - pinInjector5 = 12; //Output pin injector 5 is on - pinCoil1 = 40; //Pin for coil 1 - pinCoil2 = 38; //Pin for coil 2 - pinCoil3 = 50; //Pin for coil 3 - pinCoil4 = 52; //Pin for coil 4 - pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now - pinTrigger = 19; //The CAS pin - pinTrigger2 = 18; //The Cam Sensor pin - pinTrigger3 = 17; // cam sensor 2 pin - pinTPS = A2;//TPS input pin - pinMAP = A3; //MAP sensor pin - pinIAT = A0; //IAT sensor pin - pinCLT = A1; //CLS sensor pin - pinO2 = A8; //O2 Sensor pin - pinO2_2 = A9; //O2 sensor pin (second sensor) - pinBat = A4; //Battery reference voltage pin - pinDisplayReset = 48; // OLED reset pin - pinTachOut = 49; //Tacho output pin - pinIdle1 = 5; //Single wire idle control - pinFuelPump = 45; //Fuel pump output - pinStepperDir = 20; //Direction pin for DRV8825 driver - pinStepperStep = 21; //Step pin for DRV8825 driver - pinSpareHOut1 = 4; // high current output spare1 - pinSpareHOut2 = 6; // high current output spare2 - pinBoost = 7; - pinSpareLOut1 = 43; //low current output spare1 - pinSpareLOut2 = 47; - pinSpareLOut3 = 49; - pinSpareLOut4 = 51; - pinSpareLOut5 = 53; - pinFan = 47; //Pin for the fan output - #endif - break; - - case 40: - //Pin mappings as per the NO2C shield - pinInjector1 = 8; //Output pin injector 1 is on - pinInjector2 = 9; //Output pin injector 2 is on - pinInjector3 = 11; //Output pin injector 3 is on - NOT USED - pinInjector4 = 12; //Output pin injector 4 is on - NOT USED - pinInjector5 = 13; //Placeholder only - NOT USED - pinCoil1 = 23; //Pin for coil 1 - pinCoil2 = 22; //Pin for coil 2 - pinCoil3 = 2; //Pin for coil 3 - ONLY WITH DB2 - pinCoil4 = 3; //Pin for coil 4 - ONLY WITH DB2 - pinCoil5 = 46; //Placeholder only - NOT USED - pinTrigger = 19; //The CAS pin - pinTrigger2 = 18; //The Cam Sensor pin - pinTPS = A3; //TPS input pin - pinMAP = A0; //MAP sensor pin - pinIAT = A5; //IAT sensor pin - pinCLT = A4; //CLT sensor pin - pinO2 = A2; //O2 sensor pin - pinBat = A1; //Battery reference voltage pin - pinBaro = A6; //Baro sensor pin - ONLY WITH DB - pinSpareTemp1 = A7; //spare Analog input 1 - ONLY WITH DB - pinDisplayReset = 48; // OLED reset pin - NOT USED - pinTachOut = 38; //Tacho output pin - pinIdle1 = 5; //Single wire idle control - pinIdle2 = 47; //2 wire idle control - NOT USED - pinBoost = 7; //Boost control - pinVVT_1 = 6; //Default VVT output - pinFuelPump = 4; //Fuel pump output - pinStepperDir = 25; //Direction pin for DRV8825 driver - pinStepperStep = 24; //Step pin for DRV8825 driver - pinStepperEnable = 27; //Enable pin for DRV8825 driver - pinLaunch = 10; //Can be overwritten below - pinFlex = 20; // Flex sensor (Must be external interrupt enabled) - ONLY WITH DB - pinFan = 30; //Pin for the fan output - ONLY WITH DB - pinSpareLOut1 = 32; //low current output spare1 - ONLY WITH DB - pinSpareLOut2 = 34; //low current output spare2 - ONLY WITH DB - pinSpareLOut3 = 36; //low current output spare3 - ONLY WITH DB - pinResetControl = 26; //Reset control output - break; - - case 41: - #ifndef SMALL_FLASH_MODE //No support for bluepill here anyway - //Pin mappings as per the UA4C shield - pinInjector1 = 8; //Output pin injector 1 is on - pinInjector2 = 7; //Output pin injector 2 is on - pinInjector3 = 6; //Output pin injector 3 is on - pinInjector4 = 5; //Output pin injector 4 is on - pinInjector5 = 45; //Output pin injector 5 is on PLACEHOLDER value for now - pinCoil1 = 35; //Pin for coil 1 - pinCoil2 = 36; //Pin for coil 2 - pinCoil3 = 33; //Pin for coil 3 - pinCoil4 = 34; //Pin for coil 4 - pinCoil5 = 44; //Pin for coil 5 PLACEHOLDER value for now - pinTrigger = 19; //The CAS pin - pinTrigger2 = 18; //The Cam Sensor pin - pinFlex = 20; // Flex sensor - pinTPS = A3; //TPS input pin - pinMAP = A0; //MAP sensor pin - pinBaro = A7; //Baro sensor pin - pinIAT = A5; //IAT sensor pin - pinCLT = A4; //CLS sensor pin - pinO2 = A1; //O2 Sensor pin - pinO2_2 = A9; //O2 sensor pin (second sensor) - pinBat = A2; //Battery reference voltage pin - pinSpareTemp1 = A8; //spare Analog input 1 - pinLaunch = 37; //Can be overwritten below - pinDisplayReset = 48; // OLED reset pin PLACEHOLDER value for now - pinTachOut = 22; //Tacho output pin - pinIdle1 = 9; //Single wire idle control - pinIdle2 = 10; //2 wire idle control - pinFuelPump = 23; //Fuel pump output - pinVVT_1 = 11; //Default VVT output - pinStepperDir = 32; //Direction pin for DRV8825 driver - pinStepperStep = 31; //Step pin for DRV8825 driver - pinStepperEnable = 30; //Enable pin for DRV8825 driver - pinBoost = 12; //Boost control - pinSpareLOut1 = 26; //low current output spare1 - pinSpareLOut2 = 27; //low current output spare2 - pinSpareLOut3 = 28; //low current output spare3 - pinSpareLOut4 = 29; //low current output spare4 - pinFan = 24; //Pin for the fan output - pinResetControl = 46; //Reset control output PLACEHOLDER value for now - #endif - break; - - #if defined(CORE_TEENSY) - case 50: - //Pin mappings as per the teensy rev A shield - pinInjector1 = 2; //Output pin injector 1 is on - pinInjector2 = 10; //Output pin injector 2 is on - pinInjector3 = 6; //Output pin injector 3 is on - pinInjector4 = 9; //Output pin injector 4 is on - //Placeholder only - NOT USED: - //pinInjector5 = 13; - pinCoil1 = 29; //Pin for coil 1 - pinCoil2 = 30; //Pin for coil 2 - pinCoil3 = 31; //Pin for coil 3 - ONLY WITH DB2 - pinCoil4 = 32; //Pin for coil 4 - ONLY WITH DB2 - //Placeholder only - NOT USED: - //pinCoil5 = 46; - pinTrigger = 23; //The CAS pin - pinTrigger2 = 36; //The Cam Sensor pin - pinTPS = 16; //TPS input pin - pinMAP = 17; //MAP sensor pin - pinIAT = 14; //IAT sensor pin - pinCLT = 15; //CLT sensor pin - pinO2 = A22; //O2 sensor pin - pinO2_2 = A21; //O2 sensor pin (second sensor) - pinBat = 18; //Battery reference voltage pin - pinTachOut = 20; //Tacho output pin - pinIdle1 = 5; //Single wire idle control - pinBoost = 11; //Boost control - pinFuelPump = 38; //Fuel pump output - pinStepperDir = 34; //Direction pin for DRV8825 driver - pinStepperStep = 35; //Step pin for DRV8825 driver - pinStepperEnable = 33; //Enable pin for DRV8825 driver - pinLaunch = 26; //Can be overwritten below - pinFan = 37; //Pin for the fan output - ONLY WITH DB - pinSpareHOut1 = 8; // high current output spare1 - pinSpareHOut2 = 7; // high current output spare2 - pinSpareLOut1 = 21; //low current output spare1 - break; - - case 51: - //Pin mappings as per the teensy revB board shield - pinInjector1 = 2; //Output pin injector 1 is on - pinInjector2 = 10; //Output pin injector 2 is on - pinInjector3 = 6; //Output pin injector 3 is on - NOT USED - pinInjector4 = 9; //Output pin injector 4 is on - NOT USED - pinCoil1 = 29; //Pin for coil 1 - pinCoil2 = 30; //Pin for coil 2 - pinCoil3 = 31; //Pin for coil 3 - ONLY WITH DB2 - pinCoil4 = 32; //Pin for coil 4 - ONLY WITH DB2 - pinTrigger = 23; //The CAS pin - pinTrigger2 = 36; //The Cam Sensor pin - pinTPS = 16; //TPS input pin - pinMAP = 17; //MAP sensor pin - pinIAT = 14; //IAT sensor pin - pinCLT = 15; //CLT sensor pin - pinO2 = A22; //O2 sensor pin - pinO2_2 = A21; //O2 sensor pin (second sensor) - pinBat = 18; //Battery reference voltage pin - pinTachOut = 20; //Tacho output pin - pinIdle1 = 5; //Single wire idle control - pinBoost = 11; //Boost control - pinFuelPump = 38; //Fuel pump output - pinStepperDir = 34; //Direction pin for DRV8825 driver - pinStepperStep = 35; //Step pin for DRV8825 driver - pinStepperEnable = 33; //Enable pin for DRV8825 driver - pinLaunch = 26; //Can be overwritten below - pinFan = 37; //Pin for the fan output - ONLY WITH DB - pinSpareHOut1 = 8; // high current output spare1 - pinSpareHOut2 = 7; // high current output spare2 - pinSpareLOut1 = 21; //low current output spare1 - break; - #endif - - default: - #ifndef SMALL_FLASH_MODE //No support for bluepill here anyway - //Pin mappings as per the v0.2 shield - pinInjector1 = 8; //Output pin injector 1 is on - pinInjector2 = 9; //Output pin injector 2 is on - pinInjector3 = 10; //Output pin injector 3 is on - pinInjector4 = 11; //Output pin injector 4 is on - pinInjector5 = 12; //Output pin injector 5 is on - pinCoil1 = 28; //Pin for coil 1 - pinCoil2 = 24; //Pin for coil 2 - pinCoil3 = 40; //Pin for coil 3 - pinCoil4 = 36; //Pin for coil 4 - pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now - pinTrigger = 20; //The CAS pin - pinTrigger2 = 21; //The Cam Sensor pin - pinTPS = A2; //TPS input pin - pinMAP = A3; //MAP sensor pin - pinIAT = A0; //IAT sensor pin - pinCLT = A1; //CLS sensor pin - pinO2 = A8; //O2 Sensor pin - pinBat = A4; //Battery reference voltage pin - pinStepperDir = 16; //Direction pin for DRV8825 driver - pinStepperStep = 17; //Step pin for DRV8825 driver - pinDisplayReset = 48; // OLED reset pin - pinFan = 47; //Pin for the fan output - pinFuelPump = 4; //Fuel pump output - pinTachOut = 49; //Tacho output pin - pinFlex = 3; // Flex sensor (Must be external interrupt enabled) - pinBoost = 5; - pinIdle1 = 6; - pinResetControl = 43; //Reset control output - #endif - break; - } - - //Setup any devices that are using selectable pins - - if ( (configPage6.launchPin != 0) && (configPage6.launchPin < BOARD_NR_GPIO_PINS) ) { pinLaunch = pinTranslate(configPage6.launchPin); } - if ( (configPage4.ignBypassPin != 0) && (configPage4.ignBypassPin < BOARD_NR_GPIO_PINS) ) { pinIgnBypass = pinTranslate(configPage4.ignBypassPin); } - if ( (configPage2.tachoPin != 0) && (configPage2.tachoPin < BOARD_NR_GPIO_PINS) ) { pinTachOut = pinTranslate(configPage2.tachoPin); } - if ( (configPage4.fuelPumpPin != 0) && (configPage4.fuelPumpPin < BOARD_NR_GPIO_PINS) ) { pinFuelPump = pinTranslate(configPage4.fuelPumpPin); } - if ( (configPage6.fanPin != 0) && (configPage6.fanPin < BOARD_NR_GPIO_PINS) ) { pinFan = pinTranslate(configPage6.fanPin); } - if ( (configPage6.boostPin != 0) && (configPage6.boostPin < BOARD_NR_GPIO_PINS) ) { pinBoost = pinTranslate(configPage6.boostPin); } - if ( (configPage6.vvtPin != 0) && (configPage6.vvtPin < BOARD_NR_GPIO_PINS) ) { pinVVT_1 = pinTranslate(configPage6.vvtPin); } - if ( (configPage6.useExtBaro != 0) && (configPage6.baroPin < BOARD_NR_GPIO_PINS) ) { pinBaro = configPage6.baroPin + A0; } - if ( (configPage6.useEMAP != 0) && (configPage10.EMAPPin < BOARD_NR_GPIO_PINS) ) { pinEMAP = configPage10.EMAPPin + A0; } - - //Currently there's no default pin for Idle Up - pinIdleUp = pinTranslate(configPage2.idleUpPin); - - /* Reset control is a special case. If reset control is enabled, it needs its initial state set BEFORE its pinMode. - If that doesn't happen and reset control is in "Serial Command" mode, the Arduino will end up in a reset loop - because the control pin will go low as soon as the pinMode is set to OUTPUT. */ - if ( (configPage4.resetControl != 0) && (configPage4.resetControlPin < BOARD_NR_GPIO_PINS) ) - { - resetControl = configPage4.resetControl; - pinResetControl = pinTranslate(configPage4.resetControlPin); - setResetControlPinState(); - pinMode(pinResetControl, OUTPUT); - } - - //Finally, set the relevant pin modes for outputs - pinMode(pinCoil1, OUTPUT); - pinMode(pinCoil2, OUTPUT); - pinMode(pinCoil3, OUTPUT); - pinMode(pinCoil4, OUTPUT); - pinMode(pinCoil5, OUTPUT); - pinMode(pinInjector1, OUTPUT); - pinMode(pinInjector2, OUTPUT); - pinMode(pinInjector3, OUTPUT); - pinMode(pinInjector4, OUTPUT); - pinMode(pinInjector5, OUTPUT); - pinMode(pinTachOut, OUTPUT); - pinMode(pinIdle1, OUTPUT); - pinMode(pinIdle2, OUTPUT); - pinMode(pinFuelPump, OUTPUT); - pinMode(pinIgnBypass, OUTPUT); - pinMode(pinFan, OUTPUT); - pinMode(pinStepperDir, OUTPUT); - pinMode(pinStepperStep, OUTPUT); - pinMode(pinStepperEnable, OUTPUT); - pinMode(pinBoost, OUTPUT); - pinMode(pinVVT_1, OUTPUT); - - inj1_pin_port = portOutputRegister(digitalPinToPort(pinInjector1)); - inj1_pin_mask = digitalPinToBitMask(pinInjector1); - inj2_pin_port = portOutputRegister(digitalPinToPort(pinInjector2)); - inj2_pin_mask = digitalPinToBitMask(pinInjector2); - inj3_pin_port = portOutputRegister(digitalPinToPort(pinInjector3)); - inj3_pin_mask = digitalPinToBitMask(pinInjector3); - inj4_pin_port = portOutputRegister(digitalPinToPort(pinInjector4)); - inj4_pin_mask = digitalPinToBitMask(pinInjector4); - inj5_pin_port = portOutputRegister(digitalPinToPort(pinInjector5)); - inj5_pin_mask = digitalPinToBitMask(pinInjector5); - inj6_pin_port = portOutputRegister(digitalPinToPort(pinInjector6)); - inj6_pin_mask = digitalPinToBitMask(pinInjector6); - inj7_pin_port = portOutputRegister(digitalPinToPort(pinInjector7)); - inj7_pin_mask = digitalPinToBitMask(pinInjector7); - inj8_pin_port = portOutputRegister(digitalPinToPort(pinInjector8)); - inj8_pin_mask = digitalPinToBitMask(pinInjector8); - - ign1_pin_port = portOutputRegister(digitalPinToPort(pinCoil1)); - ign1_pin_mask = digitalPinToBitMask(pinCoil1); - ign2_pin_port = portOutputRegister(digitalPinToPort(pinCoil2)); - ign2_pin_mask = digitalPinToBitMask(pinCoil2); - ign3_pin_port = portOutputRegister(digitalPinToPort(pinCoil3)); - ign3_pin_mask = digitalPinToBitMask(pinCoil3); - ign4_pin_port = portOutputRegister(digitalPinToPort(pinCoil4)); - ign4_pin_mask = digitalPinToBitMask(pinCoil4); - ign5_pin_port = portOutputRegister(digitalPinToPort(pinCoil5)); - ign5_pin_mask = digitalPinToBitMask(pinCoil5); - ign6_pin_port = portOutputRegister(digitalPinToPort(pinCoil6)); - ign6_pin_mask = digitalPinToBitMask(pinCoil6); - ign7_pin_port = portOutputRegister(digitalPinToPort(pinCoil7)); - ign7_pin_mask = digitalPinToBitMask(pinCoil7); - ign8_pin_port = portOutputRegister(digitalPinToPort(pinCoil8)); - ign8_pin_mask = digitalPinToBitMask(pinCoil8); - - tach_pin_port = portOutputRegister(digitalPinToPort(pinTachOut)); - tach_pin_mask = digitalPinToBitMask(pinTachOut); - pump_pin_port = portOutputRegister(digitalPinToPort(pinFuelPump)); - pump_pin_mask = digitalPinToBitMask(pinFuelPump); - - //And for inputs - #if defined(CORE_STM32) - #ifndef ARDUINO_ARCH_STM32 //libmaple core aka STM32DUINO - pinMode(pinMAP, INPUT_ANALOG); - pinMode(pinO2, INPUT_ANALOG); - pinMode(pinO2_2, INPUT_ANALOG); - pinMode(pinTPS, INPUT_ANALOG); - pinMode(pinIAT, INPUT_ANALOG); - pinMode(pinCLT, INPUT_ANALOG); - pinMode(pinBat, INPUT_ANALOG); - pinMode(pinBaro, INPUT_ANALOG); - #else - pinMode(pinMAP, INPUT); - pinMode(pinO2, INPUT); - pinMode(pinO2_2, INPUT); - pinMode(pinTPS, INPUT); - pinMode(pinIAT, INPUT); - pinMode(pinCLT, INPUT); - pinMode(pinBat, INPUT); - pinMode(pinBaro, INPUT); - #endif - #endif - pinMode(pinTrigger, INPUT); - pinMode(pinTrigger2, INPUT); - pinMode(pinTrigger3, INPUT); - - //Each of the below are only set when their relevant function is enabled. This can help prevent pin conflicts that users aren't aware of with unused functions - if(configPage2.flexEnabled > 0) - { - pinMode(pinFlex, INPUT); //Standard GM / Continental flex sensor requires pullup, but this should be onboard. The internal pullup will not work (Requires ~3.3k)! - } - if(configPage6.launchEnabled > 0) - { - if (configPage6.lnchPullRes == true) { pinMode(pinLaunch, INPUT_PULLUP); } - else { pinMode(pinLaunch, INPUT); } //If Launch Pull Resistor is not set make input float. - } - if(configPage2.idleUpEnabled > 0) - { - if (configPage2.idleUpPolarity == 0) { pinMode(pinIdleUp, INPUT_PULLUP); } //Normal setting - else { pinMode(pinIdleUp, INPUT); } //inverted setting - } - - - //These must come after the above pinMode statements - triggerPri_pin_port = portInputRegister(digitalPinToPort(pinTrigger)); - triggerPri_pin_mask = digitalPinToBitMask(pinTrigger); - triggerSec_pin_port = portInputRegister(digitalPinToPort(pinTrigger2)); - triggerSec_pin_mask = digitalPinToBitMask(pinTrigger2); - - #if defined(CORE_STM32) - #else - //Set default values - digitalWrite(pinMAP, HIGH); - //digitalWrite(pinO2, LOW); - digitalWrite(pinTPS, LOW); - #endif -} void initialiseTriggers() { From 7863cc1eefb64dd549b4f027b04f6f5517cd3d02 Mon Sep 17 00:00:00 2001 From: hoogendijkta Date: Wed, 20 Feb 2019 17:21:16 +0100 Subject: [PATCH 04/51] Working analog read of TPS/MAP/CLT --- speeduino/board_stm32.ino | 98 ++++++++++++++------------------------- speeduino/maths.h | 2 +- 2 files changed, 36 insertions(+), 64 deletions(-) diff --git a/speeduino/board_stm32.ino b/speeduino/board_stm32.ino index 0a832850..ca9d716e 100644 --- a/speeduino/board_stm32.ino +++ b/speeduino/board_stm32.ino @@ -118,13 +118,13 @@ void initBoard() #endif #endif - TimerPulseInit(&HardwareTimers_2, 0xFFFF, 500, EmptyIRQCallback); + TimerPulseInit(&HardwareTimers_2, 0xFFFF, 0, EmptyIRQCallback); attachIntHandleOC(&HardwareTimers_2, fuelSchedule1Interrupt, 1, 0); attachIntHandleOC(&HardwareTimers_2, fuelSchedule2Interrupt, 2, 0); attachIntHandleOC(&HardwareTimers_2, fuelSchedule3Interrupt, 3, 0); attachIntHandleOC(&HardwareTimers_2, fuelSchedule4Interrupt, 4, 0); - TimerPulseInit(&HardwareTimers_3, 0xFFFF, 500, EmptyIRQCallback); + TimerPulseInit(&HardwareTimers_3, 0xFFFF, 0, EmptyIRQCallback); attachIntHandleOC(&HardwareTimers_3, ignitionSchedule1Interrupt, 1, 0); attachIntHandleOC(&HardwareTimers_3, ignitionSchedule2Interrupt, 2, 0); attachIntHandleOC(&HardwareTimers_3, ignitionSchedule3Interrupt, 3, 0); @@ -286,39 +286,8 @@ void setPinMapping(byte boardID) case 3: //Pin mappings as per the v0.4 shield - pinInjector1 = 8; //Output pin injector 1 is on - pinInjector2 = 9; //Output pin injector 2 is on - pinInjector3 = 10; //Output pin injector 3 is on - pinInjector4 = 11; //Output pin injector 4 is on - pinInjector5 = 12; //Output pin injector 5 is on - pinInjector6 = 50; //CAUTION: Uses the same as Coil 4 below. - pinCoil1 = 40; //Pin for coil 1 - pinCoil2 = 38; //Pin for coil 2 - pinCoil3 = 52; //Pin for coil 3 - pinCoil4 = 50; //Pin for coil 4 - pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now - pinTrigger = 19; //The CAS pin - pinTrigger2 = 18; //The Cam Sensor pin - pinTPS = A2;//TPS input pin - pinMAP = A3; //MAP sensor pin - pinIAT = A0; //IAT sensor pin - pinCLT = A1; //CLS sensor pin - pinO2 = A8; //O2 Sensor pin - pinBat = A4; //Battery reference voltage pin - pinDisplayReset = 48; // OLED reset pin - pinTachOut = 49; //Tacho output pin (Goes to ULN2803) - pinIdle1 = 5; //Single wire idle control - pinIdle2 = 6; //2 wire idle control - pinBoost = 7; //Boost control - pinVVT_1 = 4; //Default VVT output - pinFuelPump = 45; //Fuel pump output (Goes to ULN2803) - pinStepperDir = 16; //Direction pin for DRV8825 driver - pinStepperStep = 17; //Step pin for DRV8825 driver - pinStepperEnable = 24; //Enable pin for DRV8825 - pinFan = 47; //Pin for the fan output (Goes to ULN2803) - pinLaunch = 51; //Can be overwritten below - pinFlex = 2; // Flex sensor (Must be external interrupt enabled) - pinResetControl = 43; //Reset control output + + //Black F407VE http://wiki.stm32duino.com/index.php?title=STM32F407 //PC8~PC12 SDio @@ -336,13 +305,13 @@ void setPinMapping(byte boardID) pinCoil3 = PB7; //Pin for coil 3 pinCoil4 = PB8; //Pin for coil 4 pinCoil5 = PB9; //Pin for coil 5 - pinTPS = A0; //TPS input pin - pinMAP = A1; //MAP sensor pin - pinIAT = A2; //IAT sensor pin - pinCLT = A3; //CLT sensor pin - pinO2 = A4; //O2 Sensor pin - pinBat = A5; //Battery reference voltage pin - pinBaro = A10; + pinTPS = PC0;//TPS input pin + pinMAP = PC1; //MAP sensor pin + pinIAT = PC2; //IAT sensor pin + pinCLT = PC3; //CLS sensor pin + pinO2 = PC4; //O2 Sensor pin + pinBat = PC6; //Battery reference voltage pin + pinBaro = PC7; pinIdle1 = PB8; //Single wire idle control pinIdle2 = PB9; //2 wire idle control pinBoost = PE0; //Boost control @@ -354,6 +323,9 @@ void setPinMapping(byte boardID) pinFan = PE2; //Pin for the fan output pinFuelPump = PA6; //Fuel pump output pinTachOut = PA7; //Tacho output pin + pinLaunch = 51; //Can be overwritten below + pinResetControl = 43; //Reset control output + //external interrupt enabled pins //external interrupts could be enalbed in any pin, except same port numbers (PA4,PE4) pinFlex = PE2; // Flex sensor (Must be external interrupt enabled) @@ -759,27 +731,27 @@ void setPinMapping(byte boardID) pump_pin_mask = digitalPinToBitMask(pinFuelPump); //And for inputs - #if defined(CORE_STM32) - #ifndef ARDUINO_ARCH_STM32 //libmaple core aka STM32DUINO - pinMode(pinMAP, INPUT_ANALOG); - pinMode(pinO2, INPUT_ANALOG); - pinMode(pinO2_2, INPUT_ANALOG); - pinMode(pinTPS, INPUT_ANALOG); - pinMode(pinIAT, INPUT_ANALOG); - pinMode(pinCLT, INPUT_ANALOG); - pinMode(pinBat, INPUT_ANALOG); - pinMode(pinBaro, INPUT_ANALOG); - #else - pinMode(pinMAP, INPUT); - pinMode(pinO2, INPUT); - pinMode(pinO2_2, INPUT); - pinMode(pinTPS, INPUT); - pinMode(pinIAT, INPUT); - pinMode(pinCLT, INPUT); - pinMode(pinBat, INPUT); - pinMode(pinBaro, INPUT); - #endif - #endif +// #if defined(CORE_STM32) +// #ifndef ARDUINO_ARCH_STM32 //libmaple core aka STM32DUINO +// pinMode(pinMAP, INPUT_ANALOG); +// pinMode(pinO2, INPUT_ANALOG); +// pinMode(pinO2_2, INPUT_ANALOG); +// pinMode(pinTPS, INPUT_ANALOG); +// pinMode(pinIAT, INPUT_ANALOG); +// pinMode(pinCLT, INPUT_ANALOG); +// pinMode(pinBat, INPUT_ANALOG); +// pinMode(pinBaro, INPUT_ANALOG); +// #else +// pinMode(pinMAP, INPUT); +// pinMode(pinO2, INPUT); +// pinMode(pinO2_2, INPUT); +// pinMode(pinTPS, INPUT); +// pinMode(pinIAT, INPUT); +// pinMode(pinCLT, INPUT); +// pinMode(pinBat, INPUT); +// pinMode(pinBaro, INPUT); +// #endif +// #endif pinMode(pinTrigger, INPUT); pinMode(pinTrigger2, INPUT); pinMode(pinTrigger3, INPUT); diff --git a/speeduino/maths.h b/speeduino/maths.h index 88c5d8bb..c46173d1 100644 --- a/speeduino/maths.h +++ b/speeduino/maths.h @@ -11,7 +11,7 @@ unsigned long divu100(unsigned long); //This is a dedicated function that specifically handles the case of mapping 0-1023 values into a 0 to X range //This is a common case because it means converting from a standard 10-bit analog input to a byte or 10-bit analog into 0-511 (Eg the temperature readings) -#if defined(_VARIANT_ARDUINO_STM32_) //libmaple +#if defined(_VARIANT_ARDUINO_STM32_) && !defined(ARDUINO_BLACK_F407VE) //libmaple //ST stm32duino core returns 0 - 1023 for analog read #define fastMap1023toX(x, out_max) ( ((unsigned long)x * out_max) >> 12) //This is a new version that allows for out_min #define fastMap10Bit(x, out_min, out_max) ( ( ((unsigned long)x * (out_max-out_min)) >> 12 ) + out_min) From 1ee21e755572d414b54c8a9409663e71a2a20833 Mon Sep 17 00:00:00 2001 From: hoogendijkta Date: Wed, 20 Feb 2019 17:29:35 +0100 Subject: [PATCH 05/51] Cleanedup sram backup as EEPROM --- .../src/BackupSram/BackupSramAsEEPROM.cpp | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/speeduino/src/BackupSram/BackupSramAsEEPROM.cpp b/speeduino/src/BackupSram/BackupSramAsEEPROM.cpp index 865b5f7c..022476d3 100644 --- a/speeduino/src/BackupSram/BackupSramAsEEPROM.cpp +++ b/speeduino/src/BackupSram/BackupSramAsEEPROM.cpp @@ -1,7 +1,22 @@ #if defined(ARDUINO_BLACK_F407VE) #include "BackupSramAsEEPROM.h" - BackupSramAsEEPROM::BackupSramAsEEPROM(){} + BackupSramAsEEPROM::BackupSramAsEEPROM(){ + //Enable the power interface clock + RCC->APB1ENR |= RCC_APB1ENR_PWREN; + + //Enable the backup SRAM clock by setting BKPSRAMEN bit i + RCC->AHB1ENR |= RCC_AHB1ENR_BKPSRAMEN; + + /** enable the backup regulator (used to maintain the backup SRAM content in + * standby and Vbat modes). NOTE : this bit is not reset when the device + * wakes up from standby, system reset or power reset. You can check that + * the backup regulator is ready on PWR->CSR.brr, see rm p144 */ + + //enable backup power regulator this makes sram backup posible. bit is not reset by software! + PWR->CSR |= PWR_CSR_BRE; + + } int8_t BackupSramAsEEPROM::write_byte( uint8_t *data, uint16_t bytes, uint16_t offset ) { uint8_t* base_addr = (uint8_t *) BKPSRAM_BASE; uint16_t i; @@ -10,23 +25,10 @@ return -1; } - //Enable the power interface clock - RCC->APB1ENR |= RCC_APB1ENR_PWREN; - - //Enable the backup SRAM clock by setting BKPSRAMEN bit i - RCC->AHB1ENR |= RCC_AHB1ENR_BKPSRAMEN; - /* disable backup domain write protection */ //Set the Disable Backup Domain write protection (DBP) bit in PWR power control register PWR->CR |= PWR_CR_DBP; - - /** enable the backup regulator (used to maintain the backup SRAM content in - * standby and Vbat modes). NOTE : this bit is not reset when the device - * wakes up from standby, system reset or power reset. You can check that - * the backup regulator is ready on PWR->CSR.brr, see rm p144 */ - //enable backup power regulator this makes sram backup posible. bit is not reset by software! - PWR->CSR |= PWR_CSR_BRE; - + for( i = 0; i < bytes; i++ ) { *(base_addr + offset + i) = *(data + i); } @@ -43,8 +45,6 @@ /* ERROR : the last byte is outside the backup SRAM region */ return -1; } - //Enable the backup SRAM clock by setting BKPSRAMEN bit i - RCC->AHB1ENR |= RCC_AHB1ENR_BKPSRAMEN; for( i = 0; i < bytes; i++ ) { *(data + i) = *(base_addr + offset + i); From 93b8d5cc8aa306f5c64194d72cef90ae5f58d96e Mon Sep 17 00:00:00 2001 From: hoogendijkta Date: Wed, 20 Feb 2019 22:46:10 +0100 Subject: [PATCH 06/51] New pins assigned to BLACK_STM32F407VE. --- speeduino/board_stm32.ino | 129 ++++++++---------- speeduino/globals.h | 1 - speeduino/maths.h | 2 +- speeduino/sensors.ino | 4 +- speeduino/src/BackupSram/BackupSramAsEEPROM.h | 8 +- 5 files changed, 64 insertions(+), 80 deletions(-) diff --git a/speeduino/board_stm32.ino b/speeduino/board_stm32.ino index ca9d716e..0ee2c88c 100644 --- a/speeduino/board_stm32.ino +++ b/speeduino/board_stm32.ino @@ -13,7 +13,7 @@ stimer_t HardwareTimers_4; stimer_t HardwareTimers_5; stimer_t HardwareTimers_8; - + #define LED_BUILTIN PA7 //These should really be in the stm32GENERIC libs, but for somereason they only have timers 1-4 // #include // #include "src/HardwareTimers/HardwareTimer.h" @@ -26,6 +26,9 @@ extern void oneMSIntervalIRQ(stimer_t *Timer){oneMSInterval();} extern void EmptyIRQCallback(stimer_t *Timer, uint32_t channel){} + + + void initBoard() { /* @@ -40,6 +43,7 @@ void initBoard() HardwareTimers_5.timer = TIM5; HardwareTimers_8.timer = TIM8; + /* *********************************************************************************************************** * General @@ -56,6 +60,8 @@ void initBoard() } //This must happen at the end of the idle init + TimerPulseInit(&HardwareTimers_1, 0xFFFF, 0, EmptyIRQCallback); + if(idle_pwm_max_count > 0) { attachIntHandleOC(&HardwareTimers_1, idleInterrupt, 4, 0);} //on first flash the configPage4.iacAlgorithm is invalid //Timer1.setMode(4, TIMER_OUTPUT_COMPARE); //timer_set_mode(TIMER1, 4, TIMER_OUTPUT_COMPARE; //if(idle_pwm_max_count > 0) { Timer1.attachInterrupt(4, idleInterrupt);} //on first flash the configPage4.iacAlgorithm is invalid @@ -90,6 +96,8 @@ void initBoard() // Timer1.setMode(3, TIMER_OUTPUT_COMPARE); // if(boost_pwm_max_count > 0) { Timer1.attachInterrupt(2, boostInterrupt);} // if(vvt_pwm_max_count > 0) { Timer1.attachInterrupt(3, vvtInterrupt);} + if(idle_pwm_max_count > 0) { attachIntHandleOC(&HardwareTimers_2, boostInterrupt, 4, 0);} + if(idle_pwm_max_count > 0) { attachIntHandleOC(&HardwareTimers_3, vvtInterrupt, 4, 0);} // Timer1.resume(); /* @@ -291,84 +299,59 @@ void setPinMapping(byte boardID) //Black F407VE http://wiki.stm32duino.com/index.php?title=STM32F407 //PC8~PC12 SDio - //PA13~PA15 & PB4 SWD(debug) pins + + //PA9..PA10 Serial1 + //PA11..PA12 USB + //PA13..PA15 & PB4 SWD(debug) pins //PB0 EEPROM CS pin + //PB1 LCD + //PB2 BOOT1 + //PB3..PB5 SPI interface + //PB6..PB8 NRF interface + + //PD5 & PD6 Serial2 - pinInjector1 = PE7; //Output pin injector 1 is on - pinInjector2 = PE8; //Output pin injector 2 is on - pinInjector3 = PE9; //Output pin injector 3 is on - pinInjector4 = PE10; //Output pin injector 4 is on - pinInjector5 = PE11; //Output pin injector 5 is on - pinInjector6 = PE12; //Output pin injector 6 is on - pinCoil1 = PB5; //Pin for coil 1 - pinCoil2 = PB6; //Pin for coil 2 - pinCoil3 = PB7; //Pin for coil 3 - pinCoil4 = PB8; //Pin for coil 4 - pinCoil5 = PB9; //Pin for coil 5 - pinTPS = PC0;//TPS input pin - pinMAP = PC1; //MAP sensor pin - pinIAT = PC2; //IAT sensor pin - pinCLT = PC3; //CLS sensor pin - pinO2 = PC4; //O2 Sensor pin - pinBat = PC6; //Battery reference voltage pin - pinBaro = PC7; - pinIdle1 = PB8; //Single wire idle control - pinIdle2 = PB9; //2 wire idle control - pinBoost = PE0; //Boost control - pinVVT_1 = PE1; //Default VVT output - pinStepperDir = PD8; //Direction pin for DRV8825 driver - pinStepperStep = PB15; //Step pin for DRV8825 driver - pinStepperEnable = PD9; //Enable pin for DRV8825 - pinDisplayReset = PE1; // OLED reset pin - pinFan = PE2; //Pin for the fan output + + + + pinInjector1 = PA1; //Output pin injector 1 is on + pinInjector2 = PA2; //Output pin injector 2 is on + pinInjector3 = PA3; //Output pin injector 3 is on + pinInjector4 = PA4; //Output pin injector 4 is on + pinInjector5 = PA5; //Output pin injector 5 is on + pinInjector6 = PD4; //Output pin injector 6 is on + pinCoil1 = PD7; //Pin for coil 1 + pinCoil2 = PC0; //Pin for coil 2 + pinCoil3 = PC1; //Pin for coil 3 + pinCoil4 = PC2; //Pin for coil 4 + pinCoil5 = PC3; //Pin for coil 5 + pinTPS = PA8;//TPS input pin + pinMAP = PB9; //MAP sensor pin + pinIAT = PB10; //IAT sensor pin + pinCLT = PB11; //CLS sensor pin + pinO2 = PC13; //O2 Sensor pin + pinBat = PD11; //Battery reference voltage pin + pinBaro = PD12; + pinIdle1 = PC4; //Single wire idle control + pinIdle2 = PC6; //2 wire idle control + pinBoost = PC7; //Boost control + pinVVT_1 = PD3; //Default VVT output + pinStepperDir = PE0; //Direction pin for DRV8825 driver + pinStepperStep = PE1; //Step pin for DRV8825 driver + pinStepperEnable = PE2; //Enable pin for DRV8825 + pinDisplayReset = PE5; // OLED reset pin + pinFan = PE6; //Pin for the fan output + pinFuelPump = PA6; //Fuel pump output - pinTachOut = PA7; //Tacho output pin - pinLaunch = 51; //Can be overwritten below - pinResetControl = 43; //Reset control output + pinTachOut = PD15; //Tacho output pin + // pinLaunch = 51; //Can be overwritten below + // pinResetControl = 43; //Reset control output //external interrupt enabled pins //external interrupts could be enalbed in any pin, except same port numbers (PA4,PE4) - pinFlex = PE2; // Flex sensor (Must be external interrupt enabled) - pinTrigger = PE3; //The CAS pin - pinTrigger2 = PE4; //The Cam Sensor pin - - -// #if defined(CORE_STM32) -// //blue pill http://wiki.stm32duino.com/index.php?title=Blue_Pill -// //Maple mini http://wiki.stm32duino.com/index.php?title=Maple_Mini -// //pins PA12, PA11 are used for USB or CAN couldn't be used for GPIO -// pinInjector1 = PB7; //Output pin injector 1 is on -// pinInjector2 = PB6; //Output pin injector 2 is on -// pinInjector3 = PB5; //Output pin injector 3 is on -// pinInjector4 = PB4; //Output pin injector 4 is on -// pinCoil1 = PB3; //Pin for coil 1 -// pinCoil2 = PA15; //Pin for coil 2 -// pinCoil3 = PA14; //Pin for coil 3 -// pinCoil4 = PA9; //Pin for coil 4 -// pinCoil5 = PA8; //Pin for coil 5 -// pinTPS = A0; //TPS input pin -// pinMAP = A1; //MAP sensor pin -// pinIAT = A2; //IAT sensor pin -// pinCLT = A3; //CLS sensor pin -// pinO2 = A4; //O2 Sensor pin -// pinBat = A5; //Battery reference voltage pin -// pinBaro = pinMAP; -// pinIdle1 = PB2; //Single wire idle control -// pinIdle2 = PA2; //2 wire idle control -// pinBoost = PA1; //Boost control -// pinVVT_1 = PA0; //Default VVT output -// pinStepperDir = PC15; //Direction pin for DRV8825 driver -// pinStepperStep = PC14; //Step pin for DRV8825 driver -// pinStepperEnable = PC13; //Enable pin for DRV8825 -// pinDisplayReset = PB2; // OLED reset pin -// pinFan = PB1; //Pin for the fan output -// pinFuelPump = PB11; //Fuel pump output -// pinTachOut = PB10; //Tacho output pin -// //external interrupt enabled pins -// pinFlex = PB8; // Flex sensor (Must be external interrupt enabled) -// pinTrigger = PA10; //The CAS pin -// pinTrigger2 = PA13; //The Cam Sensor pin -// #endif + pinFlex = PA4; // Flex sensor (Must be external interrupt enabled) + pinTrigger = PD13; //The CAS pin + pinTrigger2 = PD14; //The Cam Sensor pin break; case 9: diff --git a/speeduino/globals.h b/speeduino/globals.h index dd0ea6f4..d2d9d2c7 100644 --- a/speeduino/globals.h +++ b/speeduino/globals.h @@ -34,7 +34,6 @@ #elif defined(ARDUINO_BLACK_F407VE) || defined(STM32F4) #define BOARD_DIGITAL_GPIO_PINS 80 #define BOARD_NR_GPIO_PINS 80 - #define LED_BUILTIN PA7 //These boards always make 8/8 channels available #undef INJ_CHANNELS diff --git a/speeduino/maths.h b/speeduino/maths.h index c46173d1..7682bc0a 100644 --- a/speeduino/maths.h +++ b/speeduino/maths.h @@ -11,7 +11,7 @@ unsigned long divu100(unsigned long); //This is a dedicated function that specifically handles the case of mapping 0-1023 values into a 0 to X range //This is a common case because it means converting from a standard 10-bit analog input to a byte or 10-bit analog into 0-511 (Eg the temperature readings) -#if defined(_VARIANT_ARDUINO_STM32_) && !defined(ARDUINO_BLACK_F407VE) //libmaple //ST stm32duino core returns 0 - 1023 for analog read +#if defined(_VARIANT_ARDUINO_STM32_) //libmaple //ST stm32duino core returns 0 - 1023 for analog read first use analogReadResolution(12); to make it 12 bit #define fastMap1023toX(x, out_max) ( ((unsigned long)x * out_max) >> 12) //This is a new version that allows for out_min #define fastMap10Bit(x, out_min, out_max) ( ( ((unsigned long)x * (out_max-out_min)) >> 12 ) + out_min) diff --git a/speeduino/sensors.ino b/speeduino/sensors.ino index 1a74f22f..7e7ebc60 100644 --- a/speeduino/sensors.ino +++ b/speeduino/sensors.ino @@ -47,8 +47,8 @@ void initialiseADC() BIT_CLEAR(ADCSRA,ADPS1); BIT_CLEAR(ADCSRA,ADPS0); #endif -#elif defined(ARDUINO_ARCH_STM32) //STM32GENERIC lib - analogReadResolution(10); //use 10bits for analog +#elif defined(ARDUINO_ARCH_STM32) //STM32GENERIC core and ST STM32duino core, change analog read to 12 bit + analogReadResolution(12); //use 10bits for analog #endif MAPcurRev = 0; MAPcount = 0; diff --git a/speeduino/src/BackupSram/BackupSramAsEEPROM.h b/speeduino/src/BackupSram/BackupSramAsEEPROM.h index 14c0fcde..e376a2c9 100644 --- a/speeduino/src/BackupSram/BackupSramAsEEPROM.h +++ b/speeduino/src/BackupSram/BackupSramAsEEPROM.h @@ -2,12 +2,14 @@ //The backup battery is available on the ebay stm32F407VET6 black boards. -//UGLY HACK TO PREVENT EEPROM LIBRARY BEING IMPORTED FIRST!! -#ifndef EEPROM_h -#define EEPROM_h #if defined(ARDUINO_BLACK_F407VE) +//UGLY HACK TO PREVENT EEPROM LIBRARY BEING IMPORTED FIRST!! +//Use with black_F407VE board +#ifndef EEPROM_h +#define EEPROM_h + #include #include "stm32f407xx.h" From a55114e96c37b7b0dd3c170da064611163ebe548 Mon Sep 17 00:00:00 2001 From: hoogendijkta Date: Wed, 20 Feb 2019 23:14:25 +0100 Subject: [PATCH 07/51] More pin swaping --- speeduino/board_stm32.ino | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/speeduino/board_stm32.ino b/speeduino/board_stm32.ino index 0ee2c88c..e117b2ab 100644 --- a/speeduino/board_stm32.ino +++ b/speeduino/board_stm32.ino @@ -311,9 +311,6 @@ void setPinMapping(byte boardID) //PD5 & PD6 Serial2 - - - pinInjector1 = PA1; //Output pin injector 1 is on pinInjector2 = PA2; //Output pin injector 2 is on pinInjector3 = PA3; //Output pin injector 3 is on @@ -321,19 +318,19 @@ void setPinMapping(byte boardID) pinInjector5 = PA5; //Output pin injector 5 is on pinInjector6 = PD4; //Output pin injector 6 is on pinCoil1 = PD7; //Pin for coil 1 - pinCoil2 = PC0; //Pin for coil 2 - pinCoil3 = PC1; //Pin for coil 3 - pinCoil4 = PC2; //Pin for coil 4 - pinCoil5 = PC3; //Pin for coil 5 - pinTPS = PA8;//TPS input pin - pinMAP = PB9; //MAP sensor pin - pinIAT = PB10; //IAT sensor pin - pinCLT = PB11; //CLS sensor pin - pinO2 = PC13; //O2 Sensor pin - pinBat = PD11; //Battery reference voltage pin - pinBaro = PD12; - pinIdle1 = PC4; //Single wire idle control - pinIdle2 = PC6; //2 wire idle control + pinCoil2 = PB9; //Pin for coil 2 + pinCoil3 = PA8; //Pin for coil 3 + pinCoil4 = PB10; //Pin for coil 4 + pinCoil5 = PB11; //Pin for coil 5 + pinMAP = PC0; //MAP sensor pin + pinTPS = PC1;//TPS input pin + pinIAT = PC2; //IAT sensor pin + pinCLT = PC3; //CLS sensor pin + pinO2 = PC5; //O2 Sensor pin + pinBat = PB1; //Battery reference voltage pin + pinBaro = PC4; + pinIdle1 = PB12; //Single wire idle control + pinIdle2 = PB11; //2 wire idle control pinBoost = PC7; //Boost control pinVVT_1 = PD3; //Default VVT output pinStepperDir = PE0; //Direction pin for DRV8825 driver @@ -349,7 +346,7 @@ void setPinMapping(byte boardID) //external interrupt enabled pins //external interrupts could be enalbed in any pin, except same port numbers (PA4,PE4) - pinFlex = PA4; // Flex sensor (Must be external interrupt enabled) + pinFlex = PD4; // Flex sensor (Must be external interrupt enabled) pinTrigger = PD13; //The CAS pin pinTrigger2 = PD14; //The Cam Sensor pin break; From 9fb23c2d31fcc92e46d7d25bccf78f1f3f66e171 Mon Sep 17 00:00:00 2001 From: hoogendijkta Date: Thu, 21 Feb 2019 22:44:06 +0100 Subject: [PATCH 08/51] Seems like a working version of speeduino on the STM32F407 --- speeduino/board_stm32.h | 161 +++++++++----------------------------- speeduino/board_stm32.ino | 29 +++---- speeduino/globals.h | 4 +- 3 files changed, 56 insertions(+), 138 deletions(-) diff --git a/speeduino/board_stm32.h b/speeduino/board_stm32.h index 608c60a0..4392f177 100644 --- a/speeduino/board_stm32.h +++ b/speeduino/board_stm32.h @@ -32,30 +32,30 @@ *********************************************************************************************************** * Schedules */ - #define MAX_TIMER_PERIOD 131070 //The longest period of time (in uS) that the timer can permit (IN this case it is 65535 * 2, as each timer tick is 2uS) - #define MAX_TIMER_PERIOD_SLOW 131070 //The longest period of time (in uS) that the timer can permit (IN this case it is 65535 * 2, as each timer tick is 2uS) - #define uS_TO_TIMER_COMPARE(uS) (uS >> 1) //Converts a given number of uS into the required number of timer ticks until that time has passed. - #define uS_TO_TIMER_COMPARE_SLOW(uS) (uS >> 1) //Converts a given number of uS into the required number of timer ticks until that time has passed. - #if defined(ARDUINO_ARCH_STM32) // STM32GENERIC core - #define FUEL1_COUNTER (TIM2)->CNT - #define FUEL2_COUNTER (TIM2)->CNT - #define FUEL3_COUNTER (TIM2)->CNT - #define FUEL4_COUNTER (TIM2)->CNT + #define MAX_TIMER_PERIOD 65535 //The longest period of time (in uS) that the timer can permit (IN this case it is 65535 * 2, as each timer tick is 2uS) + #define MAX_TIMER_PERIOD_SLOW 65535 //The longest period of time (in uS) that the timer can permit (IN this case it is 65535 * 2, as each timer tick is 2uS) + #define uS_TO_TIMER_COMPARE(uS) (uS ) //Converts a given number of uS into the required number of timer ticks until that time has passed. + #define uS_TO_TIMER_COMPARE_SLOW(uS) (uS ) //Converts a given number of uS into the required number of timer ticks until that time has passed. - #define FUEL1_COMPARE (TIM2)->CCR1 - #define FUEL2_COMPARE (TIM2)->CCR2 - #define FUEL3_COMPARE (TIM2)->CCR3 - #define FUEL4_COMPARE (TIM2)->CCR4 + #define FUEL1_COUNTER (TIM3)->CNT + #define FUEL2_COUNTER (TIM3)->CNT + #define FUEL3_COUNTER (TIM3)->CNT + #define FUEL4_COUNTER (TIM3)->CNT - #define IGN1_COUNTER (TIM3)->CNT - #define IGN2_COUNTER (TIM3)->CNT - #define IGN3_COUNTER (TIM3)->CNT - #define IGN4_COUNTER (TIM3)->CNT + #define FUEL1_COMPARE (TIM3)->CCR1 + #define FUEL2_COMPARE (TIM3)->CCR2 + #define FUEL3_COMPARE (TIM3)->CCR3 + #define FUEL4_COMPARE (TIM3)->CCR4 - #define IGN1_COMPARE (TIM3)->CCR1 - #define IGN2_COMPARE (TIM3)->CCR2 - #define IGN3_COMPARE (TIM3)->CCR3 - #define IGN4_COMPARE (TIM3)->CCR4 + #define IGN1_COUNTER (TIM2)->CNT + #define IGN2_COUNTER (TIM2)->CNT + #define IGN3_COUNTER (TIM2)->CNT + #define IGN4_COUNTER (TIM2)->CNT + + #define IGN1_COMPARE (TIM2)->CCR1 + #define IGN2_COMPARE (TIM2)->CCR2 + #define IGN3_COMPARE (TIM2)->CCR3 + #define IGN4_COMPARE (TIM2)->CCR4 #ifndef SMALL_FLASH_MODE #define FUEL5_COUNTER (TIM5)->CNT @@ -77,27 +77,27 @@ #define IGN6_COMPARE (TIM4)->CCR2 #define IGN7_COMPARE (TIM4)->CCR3 #define IGN8_COMPARE (TIM4)->CCR4 - #endif + #endif //https://github.com/rogerclarkmelbourne/Arduino_STM32/blob/754bc2969921f1ef262bd69e7faca80b19db7524/STM32F1/system/libmaple/include/libmaple/timer.h#L444 - #define FUEL1_TIMER_ENABLE() (TIM2)->CCER |= TIM_CCER_CC1E - #define FUEL2_TIMER_ENABLE() (TIM2)->CCER |= TIM_CCER_CC2E - #define FUEL3_TIMER_ENABLE() (TIM2)->CCER |= TIM_CCER_CC3E - #define FUEL4_TIMER_ENABLE() (TIM2)->CCER |= TIM_CCER_CC4E + #define FUEL1_TIMER_ENABLE() (TIM3)->CCER |= TIM_CCER_CC1E + #define FUEL2_TIMER_ENABLE() (TIM3)->CCER |= TIM_CCER_CC2E + #define FUEL3_TIMER_ENABLE() (TIM3)->CCER |= TIM_CCER_CC3E + #define FUEL4_TIMER_ENABLE() (TIM3)->CCER |= TIM_CCER_CC4E - #define FUEL1_TIMER_DISABLE() (TIM2)->CCER &= ~TIM_CCER_CC1E - #define FUEL2_TIMER_DISABLE() (TIM2)->CCER &= ~TIM_CCER_CC2E - #define FUEL3_TIMER_DISABLE() (TIM2)->CCER &= ~TIM_CCER_CC3E - #define FUEL4_TIMER_DISABLE() (TIM2)->CCER &= ~TIM_CCER_CC4E + #define FUEL1_TIMER_DISABLE() (TIM3)->CCER &= ~TIM_CCER_CC1E + #define FUEL2_TIMER_DISABLE() (TIM3)->CCER &= ~TIM_CCER_CC2E + #define FUEL3_TIMER_DISABLE() (TIM3)->CCER &= ~TIM_CCER_CC3E + #define FUEL4_TIMER_DISABLE() (TIM3)->CCER &= ~TIM_CCER_CC4E - #define IGN1_TIMER_ENABLE() (TIM3)->CCER |= TIM_CCER_CC1E - #define IGN2_TIMER_ENABLE() (TIM3)->CCER |= TIM_CCER_CC2E - #define IGN3_TIMER_ENABLE() (TIM3)->CCER |= TIM_CCER_CC3E - #define IGN4_TIMER_ENABLE() (TIM3)->CCER |= TIM_CCER_CC4E + #define IGN1_TIMER_ENABLE() (TIM2)->CCER |= TIM_CCER_CC1E + #define IGN2_TIMER_ENABLE() (TIM2)->CCER |= TIM_CCER_CC2E + #define IGN3_TIMER_ENABLE() (TIM2)->CCER |= TIM_CCER_CC3E + #define IGN4_TIMER_ENABLE() (TIM2)->CCER |= TIM_CCER_CC4E - #define IGN1_TIMER_DISABLE() (TIM3)->CCER &= ~TIM_CCER_CC1E - #define IGN2_TIMER_DISABLE() (TIM3)->CCER &= ~TIM_CCER_CC2E - #define IGN3_TIMER_DISABLE() (TIM3)->CCER &= ~TIM_CCER_CC3E - #define IGN4_TIMER_DISABLE() (TIM3)->CCER &= ~TIM_CCER_CC4E + #define IGN1_TIMER_DISABLE() (TIM2)->CCER &= ~TIM_CCER_CC1E + #define IGN2_TIMER_DISABLE() (TIM2)->CCER &= ~TIM_CCER_CC2E + #define IGN3_TIMER_DISABLE() (TIM2)->CCER &= ~TIM_CCER_CC3E + #define IGN4_TIMER_DISABLE() (TIM2)->CCER &= ~TIM_CCER_CC4E #ifndef SMALL_FLASH_MODE #define FUEL5_TIMER_ENABLE() (TIM5)->CCER |= TIM_CCER_CC1E @@ -120,91 +120,8 @@ #define IGN7_TIMER_DISABLE() (TIM4)->CCER &= ~TIM_CCER_CC3E #define IGN8_TIMER_DISABLE() (TIM4)->CCER &= ~TIM_CCER_CC4E #endif - #else //libmaple core aka STM32DUINO - #define FUEL1_COUNTER (TIMER2->regs).gen->CNT - #define FUEL2_COUNTER (TIMER2->regs).gen->CNT - #define FUEL3_COUNTER (TIMER2->regs).gen->CNT - #define FUEL4_COUNTER (TIMER2->regs).gen->CNT + - #define FUEL1_COMPARE (TIMER2->regs).gen->CCR1 - #define FUEL2_COMPARE (TIMER2->regs).gen->CCR2 - #define FUEL3_COMPARE (TIMER2->regs).gen->CCR3 - #define FUEL4_COMPARE (TIMER2->regs).gen->CCR4 - - #define IGN1_COUNTER (TIMER3->regs).gen->CNT - #define IGN2_COUNTER (TIMER3->regs).gen->CNT - #define IGN3_COUNTER (TIMER3->regs).gen->CNT - #define IGN4_COUNTER (TIMER3->regs).gen->CNT - - #define IGN1_COMPARE (TIMER3->regs).gen->CCR1 - #define IGN2_COMPARE (TIMER3->regs).gen->CCR2 - #define IGN3_COMPARE (TIMER3->regs).gen->CCR3 - #define IGN4_COMPARE (TIMER3->regs).gen->CCR4 - - #ifndef SMALL_FLASH_MODE - #define FUEL5_COUNTER (TIMER5->regs).gen->CNT - #define FUEL6_COUNTER (TIMER5->regs).gen->CNT - #define FUEL7_COUNTER (TIMER5->regs).gen->CNT - #define FUEL8_COUNTER (TIMER5->regs).gen->CNT - - #define FUEL5_COMPARE (TIMER5->regs).gen->CCR1 - #define FUEL6_COMPARE (TIMER5->regs).gen->CCR2 - #define FUEL7_COMPARE (TIMER5->regs).gen->CCR3 - #define FUEL8_COMPARE (TIMER5->regs).gen->CCR4 - - #define IGN5_COUNTER (TIMER4->regs).gen->CNT - #define IGN6_COUNTER (TIMER4->regs).gen->CNT - #define IGN7_COUNTER (TIMER4->regs).gen->CNT - #define IGN8_COUNTER (TIMER4->regs).gen->CNT - - #define IGN5_COMPARE (TIMER4->regs).gen->CCR1 - #define IGN6_COMPARE (TIMER4->regs).gen->CCR2 - #define IGN7_COMPARE (TIMER4->regs).gen->CCR3 - #define IGN8_COMPARE (TIMER4->regs).gen->CCR4 - #endif - //https://github.com/rogerclarkmelbourne/Arduino_STM32/blob/754bc2969921f1ef262bd69e7faca80b19db7524/STM32F1/system/libmaple/include/libmaple/timer.h#L444 - #define FUEL1_TIMER_ENABLE() (TIMER2->regs).gen->CCER |= TIMER_CCER_CC1E - #define FUEL2_TIMER_ENABLE() (TIMER2->regs).gen->CCER |= TIMER_CCER_CC2E - #define FUEL3_TIMER_ENABLE() (TIMER2->regs).gen->CCER |= TIMER_CCER_CC3E - #define FUEL4_TIMER_ENABLE() (TIMER2->regs).gen->CCER |= TIMER_CCER_CC4E - - #define FUEL1_TIMER_DISABLE() (TIMER2->regs).gen->CCER &= ~TIMER_CCER_CC1E - #define FUEL2_TIMER_DISABLE() (TIMER2->regs).gen->CCER &= ~TIMER_CCER_CC2E - #define FUEL3_TIMER_DISABLE() (TIMER2->regs).gen->CCER &= ~TIMER_CCER_CC3E - #define FUEL4_TIMER_DISABLE() (TIMER2->regs).gen->CCER &= ~TIMER_CCER_CC4E - - #define IGN1_TIMER_DISABLE() (TIMER3->regs).gen->CCER &= ~TIMER_CCER_CC1E - #define IGN2_TIMER_DISABLE() (TIMER3->regs).gen->CCER &= ~TIMER_CCER_CC2E - #define IGN3_TIMER_DISABLE() (TIMER3->regs).gen->CCER &= ~TIMER_CCER_CC3E - #define IGN4_TIMER_DISABLE() (TIMER3->regs).gen->CCER &= ~TIMER_CCER_CC4E - - #define IGN1_TIMER_ENABLE() (TIMER3->regs).gen->CCER |= TIMER_CCER_CC1E - #define IGN2_TIMER_ENABLE() (TIMER3->regs).gen->CCER |= TIMER_CCER_CC2E - #define IGN3_TIMER_ENABLE() (TIMER3->regs).gen->CCER |= TIMER_CCER_CC3E - #define IGN4_TIMER_ENABLE() (TIMER3->regs).gen->CCER |= TIMER_CCER_CC4E - - #ifndef SMALL_FLASH_MODE - #define FUEL5_TIMER_ENABLE() (TIMER5->regs).gen->CCER |= TIMER_CCER_CC1E - #define FUEL6_TIMER_ENABLE() (TIMER5->regs).gen->CCER |= TIMER_CCER_CC2E - #define FUEL7_TIMER_ENABLE() (TIMER5->regs).gen->CCER |= TIMER_CCER_CC3E - #define FUEL8_TIMER_ENABLE() (TIMER5->regs).gen->CCER |= TIMER_CCER_CC4E - - #define IGN5_TIMER_ENABLE() (TIMER4->regs).gen->CCER |= TIMER_CCER_CC1E - #define IGN6_TIMER_ENABLE() (TIMER4->regs).gen->CCER |= TIMER_CCER_CC2E - #define IGN7_TIMER_ENABLE() (TIMER4->regs).gen->CCER |= TIMER_CCER_CC3E - #define IGN8_TIMER_ENABLE() (TIMER4->regs).gen->CCER |= TIMER_CCER_CC4E - - #define FUEL5_TIMER_DISABLE() (TIMER5->regs).gen->CCER &= ~TIMER_CCER_CC1E - #define FUEL6_TIMER_DISABLE() (TIMER5->regs).gen->CCER &= ~TIMER_CCER_CC2E - #define FUEL7_TIMER_DISABLE() (TIMER5->regs).gen->CCER &= ~TIMER_CCER_CC3E - #define FUEL8_TIMER_DISABLE() (TIMER5->regs).gen->CCER &= ~TIMER_CCER_CC4E - - #define IGN5_TIMER_DISABLE() (TIMER4->regs).gen->CCER &= ~TIMER_CCER_CC1E - #define IGN6_TIMER_DISABLE() (TIMER4->regs).gen->CCER &= ~TIMER_CCER_CC2E - #define IGN7_TIMER_DISABLE() (TIMER4->regs).gen->CCER &= ~TIMER_CCER_CC3E - #define IGN8_TIMER_DISABLE() (TIMER4->regs).gen->CCER &= ~TIMER_CCER_CC4E - #endif -#endif /* *********************************************************************************************************** diff --git a/speeduino/board_stm32.ino b/speeduino/board_stm32.ino index e117b2ab..3f3720ad 100644 --- a/speeduino/board_stm32.ino +++ b/speeduino/board_stm32.ino @@ -22,9 +22,10 @@ #else #include "HardwareTimer.h" #endif - +int EmptyIRQCallbackCnt; extern void oneMSIntervalIRQ(stimer_t *Timer){oneMSInterval();} -extern void EmptyIRQCallback(stimer_t *Timer, uint32_t channel){} + +extern void EmptyIRQCallback(stimer_t *Timer, uint32_t channel){EmptyIRQCallbackCnt++;} @@ -96,8 +97,8 @@ void initBoard() // Timer1.setMode(3, TIMER_OUTPUT_COMPARE); // if(boost_pwm_max_count > 0) { Timer1.attachInterrupt(2, boostInterrupt);} // if(vvt_pwm_max_count > 0) { Timer1.attachInterrupt(3, vvtInterrupt);} - if(idle_pwm_max_count > 0) { attachIntHandleOC(&HardwareTimers_2, boostInterrupt, 4, 0);} - if(idle_pwm_max_count > 0) { attachIntHandleOC(&HardwareTimers_3, vvtInterrupt, 4, 0);} + if(idle_pwm_max_count > 0) { attachIntHandleOC(&HardwareTimers_1, boostInterrupt, 2, 0);} + if(vvt_pwm_max_count > 0) { attachIntHandleOC(&HardwareTimers_1, vvtInterrupt, 3, 0);} // Timer1.resume(); /* @@ -126,17 +127,17 @@ void initBoard() #endif #endif - TimerPulseInit(&HardwareTimers_2, 0xFFFF, 0, EmptyIRQCallback); - attachIntHandleOC(&HardwareTimers_2, fuelSchedule1Interrupt, 1, 0); - attachIntHandleOC(&HardwareTimers_2, fuelSchedule2Interrupt, 2, 0); - attachIntHandleOC(&HardwareTimers_2, fuelSchedule3Interrupt, 3, 0); - attachIntHandleOC(&HardwareTimers_2, fuelSchedule4Interrupt, 4, 0); - TimerPulseInit(&HardwareTimers_3, 0xFFFF, 0, EmptyIRQCallback); - attachIntHandleOC(&HardwareTimers_3, ignitionSchedule1Interrupt, 1, 0); - attachIntHandleOC(&HardwareTimers_3, ignitionSchedule2Interrupt, 2, 0); - attachIntHandleOC(&HardwareTimers_3, ignitionSchedule3Interrupt, 3, 0); - attachIntHandleOC(&HardwareTimers_3, ignitionSchedule4Interrupt, 4, 0); + attachIntHandleOC(&HardwareTimers_3, fuelSchedule1Interrupt, 1, 0); + attachIntHandleOC(&HardwareTimers_3, fuelSchedule2Interrupt, 2, 0); + attachIntHandleOC(&HardwareTimers_3, fuelSchedule3Interrupt, 3, 0); + attachIntHandleOC(&HardwareTimers_3, fuelSchedule4Interrupt, 4, 0); + + TimerPulseInit(&HardwareTimers_2, 0xFFFF, 0, EmptyIRQCallback); + attachIntHandleOC(&HardwareTimers_2, ignitionSchedule1Interrupt, 1, 0); + attachIntHandleOC(&HardwareTimers_2, ignitionSchedule2Interrupt, 2, 0); + attachIntHandleOC(&HardwareTimers_2, ignitionSchedule3Interrupt, 3, 0); + attachIntHandleOC(&HardwareTimers_2, ignitionSchedule4Interrupt, 4, 0); // Timer1.setMode(1, TIMER_OUTPUT_COMPARE); diff --git a/speeduino/globals.h b/speeduino/globals.h index d2d9d2c7..f25f4bbf 100644 --- a/speeduino/globals.h +++ b/speeduino/globals.h @@ -38,8 +38,8 @@ //These boards always make 8/8 channels available #undef INJ_CHANNELS #undef IGN_CHANNELS - #define INJ_CHANNELS 8 - #define IGN_CHANNELS 8 + #define INJ_CHANNELS 4 + #define IGN_CHANNELS 4 #endif //Specific mode for Bluepill due to its small flash size. This disables a number of strings from being compiled into the flash From 3f074551c7164105cba385634cdc23f9e2b23acc Mon Sep 17 00:00:00 2001 From: hoogendijkta Date: Thu, 21 Feb 2019 22:46:14 +0100 Subject: [PATCH 09/51] screenshot for the results --- Screenshot_TS_stm32F407.png | Bin 0 -> 373434 bytes Screenshot_logicanalyser_stm32F407.png | Bin 0 -> 37428 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 Screenshot_TS_stm32F407.png create mode 100644 Screenshot_logicanalyser_stm32F407.png diff --git a/Screenshot_TS_stm32F407.png b/Screenshot_TS_stm32F407.png new file mode 100644 index 0000000000000000000000000000000000000000..6100e84cef9c0073a829558c67dc03b4c9676383 GIT binary patch literal 373434 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∨G^t9+`X=y1bANI6pGIF_h#O5E4%sS5QI0To# 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 literal 0 HcmV?d00001 From cc6d3e4147a0371651acf718d4dace12755696d8 Mon Sep 17 00:00:00 2001 From: hoogendijkta Date: Fri, 22 Feb 2019 16:39:07 +0100 Subject: [PATCH 10/51] cleaning up the files and making a board file for the stm32F407VE --- speeduino/board_stm32.h | 3 +- speeduino/board_stm32.ino | 891 +++++++++++++++++-------------- speeduino/board_stm32F407VE.h | 153 ++++++ speeduino/board_stm32F407VE.ino | 898 ++++++++++++++++++++++++++++++++ speeduino/globals.h | 5 +- 5 files changed, 1565 insertions(+), 385 deletions(-) create mode 100644 speeduino/board_stm32F407VE.h create mode 100644 speeduino/board_stm32F407VE.ino diff --git a/speeduino/board_stm32.h b/speeduino/board_stm32.h index 4392f177..63ccb09c 100644 --- a/speeduino/board_stm32.h +++ b/speeduino/board_stm32.h @@ -1,6 +1,7 @@ #ifndef STM32_H #define STM32_H -#if defined(CORE_STM32) +#if defined(CORE_STM32) && !defined(ARDUINO_BLACK_F407VE) + #if defined(STM32F4) //These should really be in the stm32GENERIC libs, but for somereason they only have timers 1-4 // #include diff --git a/speeduino/board_stm32.ino b/speeduino/board_stm32.ino index 3f3720ad..6c8a5ffb 100644 --- a/speeduino/board_stm32.ino +++ b/speeduino/board_stm32.ino @@ -1,4 +1,4 @@ -#if defined(CORE_STM32) +#if defined(CORE_STM32) && !defined(ARDUINO_BLACK_F407VE) #include "board_stm32.h" #include "globals.h" #include "auxiliaries.h" @@ -22,10 +22,9 @@ #else #include "HardwareTimer.h" #endif -int EmptyIRQCallbackCnt; extern void oneMSIntervalIRQ(stimer_t *Timer){oneMSInterval();} -extern void EmptyIRQCallback(stimer_t *Timer, uint32_t channel){EmptyIRQCallbackCnt++;} +extern void EmptyIRQCallback(stimer_t *Timer, uint32_t channel){} @@ -62,6 +61,7 @@ void initBoard() //This must happen at the end of the idle init TimerPulseInit(&HardwareTimers_1, 0xFFFF, 0, EmptyIRQCallback); + setTimerPrescalerRegister(&HardwareTimers_1, (uint32_t)(getTimerClkFreq(HardwareTimers_1.timer) / (500000)) - 1); if(idle_pwm_max_count > 0) { attachIntHandleOC(&HardwareTimers_1, idleInterrupt, 4, 0);} //on first flash the configPage4.iacAlgorithm is invalid //Timer1.setMode(4, TIMER_OUTPUT_COMPARE); //timer_set_mode(TIMER1, 4, TIMER_OUTPUT_COMPARE; @@ -100,54 +100,29 @@ void initBoard() if(idle_pwm_max_count > 0) { attachIntHandleOC(&HardwareTimers_1, boostInterrupt, 2, 0);} if(vvt_pwm_max_count > 0) { attachIntHandleOC(&HardwareTimers_1, vvtInterrupt, 3, 0);} // Timer1.resume(); - - /* - *********************************************************************************************************** - * Schedules - */ - #if defined(ARDUINO_ARCH_STM32) // STM32GENERIC core - //see https://github.com/rogerclarkmelbourne/Arduino_STM32/blob/754bc2969921f1ef262bd69e7faca80b19db7524/STM32F1/system/libmaple/include/libmaple/timer.h#L444 -// Timer1.setPrescaleFactor((HAL_RCC_GetHCLKFreq() * 2U)-1); //2us resolution -// Timer2.setPrescaleFactor((HAL_RCC_GetHCLKFreq() * 2U)-1); //2us resolution -// Timer3.setPrescaleFactor((HAL_RCC_GetHCLKFreq() * 2U)-1); //2us resolution - #else //libmaple core aka STM32DUINO - //see https://github.com/rogerclarkmelbourne/Arduino_STM32/blob/754bc2969921f1ef262bd69e7faca80b19db7524/STM32F1/system/libmaple/include/libmaple/timer.h#L444 - #if defined (STM32F1) || defined(__STM32F1__) - //(CYCLES_PER_MICROSECOND == 72, APB2 at 72MHz, APB1 at 36MHz). - //Timer2 to 4 is on APB1, Timer1 on APB2. http://www.st.com/resource/en/datasheet/stm32f103cb.pdf sheet 12 - Timer1.setPrescaleFactor((72 * 2U)-1); //2us resolution - Timer2.setPrescaleFactor((36 * 2U)-1); //2us resolution - Timer3.setPrescaleFactor((36 * 2U)-1); //2us resolution - #elif defined(STM32F4) - //(CYCLES_PER_MICROSECOND == 168, APB2 at 84MHz, APB1 at 42MHz). - //Timer2 to 14 is on APB1, Timers 1, 8, 9 and 10 on APB2. http://www.st.com/resource/en/datasheet/stm32f407vg.pdf sheet 120 - Timer1.setPrescaleFactor((84 * 2U)-1); //2us resolution - Timer2.setPrescaleFactor((42 * 2U)-1); //2us resolution - Timer3.setPrescaleFactor((42 * 2U)-1); //2us resolution - #endif - #endif - + TimerPulseInit(&HardwareTimers_3, 0xFFFF, 0, EmptyIRQCallback); + setTimerPrescalerRegister(&HardwareTimers_3, (uint32_t)(getTimerClkFreq(HardwareTimers_3.timer) / (1000000)) - 1); attachIntHandleOC(&HardwareTimers_3, fuelSchedule1Interrupt, 1, 0); attachIntHandleOC(&HardwareTimers_3, fuelSchedule2Interrupt, 2, 0); attachIntHandleOC(&HardwareTimers_3, fuelSchedule3Interrupt, 3, 0); attachIntHandleOC(&HardwareTimers_3, fuelSchedule4Interrupt, 4, 0); TimerPulseInit(&HardwareTimers_2, 0xFFFF, 0, EmptyIRQCallback); + setTimerPrescalerRegister(&HardwareTimers_2, (uint32_t)(getTimerClkFreq(HardwareTimers_2.timer) / (1000000)) - 1); attachIntHandleOC(&HardwareTimers_2, ignitionSchedule1Interrupt, 1, 0); attachIntHandleOC(&HardwareTimers_2, ignitionSchedule2Interrupt, 2, 0); attachIntHandleOC(&HardwareTimers_2, ignitionSchedule3Interrupt, 3, 0); attachIntHandleOC(&HardwareTimers_2, ignitionSchedule4Interrupt, 4, 0); -// Timer1.setMode(1, TIMER_OUTPUT_COMPARE); - //Attach interupt functions //Injection TimerPulseInit(&HardwareTimers_5, 0xFFFF, 0, EmptyIRQCallback); + setTimerPrescalerRegister(&HardwareTimers_5, (uint32_t)(getTimerClkFreq(HardwareTimers_5.timer) / (1000000)) - 1); #if (INJ_CHANNELS >= 5) attachIntHandleOC(&HardwareTimers_5, fuelSchedule5Interrupt, 1, 0); -//Timer5.attachInterrupt(1, fuelSchedule5Interrupt); + //Timer5.attachInterrupt(1, fuelSchedule5Interrupt); #endif #if (INJ_CHANNELS >= 6) attachIntHandleOC(&HardwareTimers_5, fuelSchedule6Interrupt, 2, 0); @@ -163,6 +138,7 @@ void initBoard() #endif TimerPulseInit(&HardwareTimers_4, 0xFFFF, 0, EmptyIRQCallback); + setTimerPrescalerRegister(&HardwareTimers_4, (uint32_t)(getTimerClkFreq(HardwareTimers_4.timer) / (1000000)) - 1); #if (IGN_CHANNELS >= 5) attachIntHandleOC(&HardwareTimers_4, ignitionSchedule5Interrupt, 1, 0); //Timer4.attachInterrupt(1, ignitionSchedule5Interrupt); @@ -187,117 +163,16 @@ uint16_t freeRam() char top = 't'; return &top - reinterpret_cast(sbrk(0)); } + +//pinmapping the STM32F407 for different boards, at this moment no board is desgined. +//All boards are set to the default just to be sure. void setPinMapping(byte boardID) { switch (boardID) { case 0: - #ifndef SMALL_FLASH_MODE //No support for bluepill here anyway - //Pin mappings as per the v0.1 shield - pinInjector1 = 8; //Output pin injector 1 is on - pinInjector2 = 9; //Output pin injector 2 is on - pinInjector3 = 11; //Output pin injector 3 is on - pinInjector4 = 10; //Output pin injector 4 is on - pinInjector5 = 12; //Output pin injector 5 is on - pinCoil1 = 6; //Pin for coil 1 - pinCoil2 = 7; //Pin for coil 2 - pinCoil3 = 12; //Pin for coil 3 - pinCoil4 = 13; //Pin for coil 4 - pinCoil5 = 14; //Pin for coil 5 - pinTrigger = 2; //The CAS pin - pinTrigger2 = 3; //The CAS pin - pinTPS = A0; //TPS input pin - pinMAP = A1; //MAP sensor pin - pinIAT = A2; //IAT sensor pin - pinCLT = A3; //CLS sensor pin - pinO2 = A4; //O2 Sensor pin - pinIdle1 = 46; //Single wire idle control - pinIdle2 = 47; //2 wire idle control - pinStepperDir = 16; //Direction pin for DRV8825 driver - pinStepperStep = 17; //Step pin for DRV8825 driver - pinFan = 47; //Pin for the fan output - pinFuelPump = 4; //Fuel pump output - pinTachOut = 49; //Tacho output pin - pinFlex = 19; // Flex sensor (Must be external interrupt enabled) - pinResetControl = 43; //Reset control output - #endif - break; - case 1: - #ifndef SMALL_FLASH_MODE //No support for bluepill here anyway - //Pin mappings as per the v0.2 shield - pinInjector1 = 8; //Output pin injector 1 is on - pinInjector2 = 9; //Output pin injector 2 is on - pinInjector3 = 10; //Output pin injector 3 is on - pinInjector4 = 11; //Output pin injector 4 is on - pinInjector5 = 12; //Output pin injector 5 is on - pinCoil1 = 28; //Pin for coil 1 - pinCoil2 = 24; //Pin for coil 2 - pinCoil3 = 40; //Pin for coil 3 - pinCoil4 = 36; //Pin for coil 4 - pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now - pinTrigger = 20; //The CAS pin - pinTrigger2 = 21; //The Cam Sensor pin - pinTPS = A2; //TPS input pin - pinMAP = A3; //MAP sensor pin - pinIAT = A0; //IAT sensor pin - pinCLT = A1; //CLS sensor pin - pinO2 = A8; //O2 Sensor pin - pinBat = A4; //Battery reference voltage pin - pinDisplayReset = 48; // OLED reset pin - pinTachOut = 49; //Tacho output pin - pinIdle1 = 30; //Single wire idle control - pinIdle2 = 31; //2 wire idle control - pinStepperDir = 16; //Direction pin for DRV8825 driver - pinStepperStep = 17; //Step pin for DRV8825 driver - pinFan = 47; //Pin for the fan output - pinFuelPump = 4; //Fuel pump output - pinFlex = 2; // Flex sensor (Must be external interrupt enabled) - pinResetControl = 43; //Reset control output - break; - #endif - case 2: - #ifndef SMALL_FLASH_MODE //No support for bluepill here anyway - //Pin mappings as per the v0.3 shield - pinInjector1 = 8; //Output pin injector 1 is on - pinInjector2 = 9; //Output pin injector 2 is on - pinInjector3 = 10; //Output pin injector 3 is on - pinInjector4 = 11; //Output pin injector 4 is on - pinInjector5 = 12; //Output pin injector 5 is on - pinCoil1 = 28; //Pin for coil 1 - pinCoil2 = 24; //Pin for coil 2 - pinCoil3 = 40; //Pin for coil 3 - pinCoil4 = 36; //Pin for coil 4 - pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now - pinTrigger = 19; //The CAS pin - pinTrigger2 = 18; //The Cam Sensor pin - pinTPS = A2;//TPS input pin - pinMAP = A3; //MAP sensor pin - pinIAT = A0; //IAT sensor pin - pinCLT = A1; //CLS sensor pin - pinO2 = A8; //O2 Sensor pin - pinBat = A4; //Battery reference voltage pin - pinDisplayReset = 48; // OLED reset pin - pinTachOut = 49; //Tacho output pin - pinIdle1 = 5; //Single wire idle control - pinIdle2 = 53; //2 wire idle control - pinBoost = 7; //Boost control - pinVVT_1 = 6; //Default VVT output - pinFuelPump = 4; //Fuel pump output - pinStepperDir = 16; //Direction pin for DRV8825 driver - pinStepperStep = 17; //Step pin for DRV8825 driver - pinStepperEnable = 26; //Enable pin for DRV8825 - pinFan = A13; //Pin for the fan output - pinLaunch = 51; //Can be overwritten below - pinFlex = 2; // Flex sensor (Must be external interrupt enabled) - pinResetControl = 50; //Reset control output - #endif - break; - - case 3: //Pin mappings as per the v0.4 shield - - //Black F407VE http://wiki.stm32duino.com/index.php?title=STM32F407 //PC8~PC12 SDio @@ -310,6 +185,172 @@ void setPinMapping(byte boardID) //PB3..PB5 SPI interface //PB6..PB8 NRF interface + //PD5 & PD6 Serial2 + pinInjector1 = PA1; //Output pin injector 1 is on + pinInjector2 = PA2; //Output pin injector 2 is on + pinInjector3 = PA3; //Output pin injector 3 is on + pinInjector4 = PA4; //Output pin injector 4 is on + pinInjector5 = PA5; //Output pin injector 5 is on + pinInjector6 = PD4; //Output pin injector 6 is on + pinCoil1 = PD7; //Pin for coil 1 + pinCoil2 = PB9; //Pin for coil 2 + pinCoil3 = PA8; //Pin for coil 3 + pinCoil4 = PB10; //Pin for coil 4 + pinCoil5 = PB11; //Pin for coil 5 + pinMAP = PC0; //MAP sensor pin + pinTPS = PC1;//TPS input pin + pinIAT = PC2; //IAT sensor pin + pinCLT = PC3; //CLS sensor pin + pinO2 = PC5; //O2 Sensor pin + pinBat = PB1; //Battery reference voltage pin + pinBaro = PC4; + pinIdle1 = PB12; //Single wire idle control + pinIdle2 = PB11; //2 wire idle control + pinBoost = PC7; //Boost control + pinVVT_1 = PD3; //Default VVT output + pinStepperDir = PE0; //Direction pin for DRV8825 driver + pinStepperStep = PE1; //Step pin for DRV8825 driver + pinStepperEnable = PE2; //Enable pin for DRV8825 + pinDisplayReset = PE5; // OLED reset pin + pinFan = PE6; //Pin for the fan output + + pinFuelPump = PA6; //Fuel pump output + pinTachOut = PD15; //Tacho output pin + // pinLaunch = 51; //Can be overwritten below + // pinResetControl = 43; //Reset control output + + //external interrupt enabled pins + //external interrupts could be enalbed in any pin, except same port numbers (PA4,PE4) + pinFlex = PD4; // Flex sensor (Must be external interrupt enabled) + pinTrigger = PD13; //The CAS pin + pinTrigger2 = PD14; //The Cam Sensor pin + break; + case 1: + //Pin mappings as per the v0.4 shield + + //Black F407VE http://wiki.stm32duino.com/index.php?title=STM32F407 + //PC8~PC12 SDio + + //PA9..PA10 Serial1 + //PA11..PA12 USB + //PA13..PA15 & PB4 SWD(debug) pins + //PB0 EEPROM CS pin + //PB1 LCD + //PB2 BOOT1 + //PB3..PB5 SPI interface + //PB6..PB8 NRF interface + + //PD5 & PD6 Serial2 + pinInjector1 = PA1; //Output pin injector 1 is on + pinInjector2 = PA2; //Output pin injector 2 is on + pinInjector3 = PA3; //Output pin injector 3 is on + pinInjector4 = PA4; //Output pin injector 4 is on + pinInjector5 = PA5; //Output pin injector 5 is on + pinInjector6 = PD4; //Output pin injector 6 is on + pinCoil1 = PD7; //Pin for coil 1 + pinCoil2 = PB9; //Pin for coil 2 + pinCoil3 = PA8; //Pin for coil 3 + pinCoil4 = PB10; //Pin for coil 4 + pinCoil5 = PB11; //Pin for coil 5 + pinMAP = PC0; //MAP sensor pin + pinTPS = PC1;//TPS input pin + pinIAT = PC2; //IAT sensor pin + pinCLT = PC3; //CLS sensor pin + pinO2 = PC5; //O2 Sensor pin + pinBat = PB1; //Battery reference voltage pin + pinBaro = PC4; + pinIdle1 = PB12; //Single wire idle control + pinIdle2 = PB11; //2 wire idle control + pinBoost = PC7; //Boost control + pinVVT_1 = PD3; //Default VVT output + pinStepperDir = PE0; //Direction pin for DRV8825 driver + pinStepperStep = PE1; //Step pin for DRV8825 driver + pinStepperEnable = PE2; //Enable pin for DRV8825 + pinDisplayReset = PE5; // OLED reset pin + pinFan = PE6; //Pin for the fan output + + pinFuelPump = PA6; //Fuel pump output + pinTachOut = PD15; //Tacho output pin + // pinLaunch = 51; //Can be overwritten below + // pinResetControl = 43; //Reset control output + + //external interrupt enabled pins + //external interrupts could be enalbed in any pin, except same port numbers (PA4,PE4) + pinFlex = PD4; // Flex sensor (Must be external interrupt enabled) + pinTrigger = PD13; //The CAS pin + pinTrigger2 = PD14; //The Cam Sensor pin + break; + + case 2: + //Pin mappings as per the v0.4 shield + + //Black F407VE http://wiki.stm32duino.com/index.php?title=STM32F407 + //PC8~PC12 SDio + + //PA9..PA10 Serial1 + //PA11..PA12 USB + //PA13..PA15 & PB4 SWD(debug) pins + //PB0 EEPROM CS pin + //PB1 LCD + //PB2 BOOT1 + //PB3..PB5 SPI interface + //PB6..PB8 NRF interface + + //PD5 & PD6 Serial2 + pinInjector1 = PA1; //Output pin injector 1 is on + pinInjector2 = PA2; //Output pin injector 2 is on + pinInjector3 = PA3; //Output pin injector 3 is on + pinInjector4 = PA4; //Output pin injector 4 is on + pinInjector5 = PA5; //Output pin injector 5 is on + pinInjector6 = PD4; //Output pin injector 6 is on + pinCoil1 = PD7; //Pin for coil 1 + pinCoil2 = PB9; //Pin for coil 2 + pinCoil3 = PA8; //Pin for coil 3 + pinCoil4 = PB10; //Pin for coil 4 + pinCoil5 = PB11; //Pin for coil 5 + pinMAP = PC0; //MAP sensor pin + pinTPS = PC1;//TPS input pin + pinIAT = PC2; //IAT sensor pin + pinCLT = PC3; //CLS sensor pin + pinO2 = PC5; //O2 Sensor pin + pinBat = PB1; //Battery reference voltage pin + pinBaro = PC4; + pinIdle1 = PB12; //Single wire idle control + pinIdle2 = PB11; //2 wire idle control + pinBoost = PC7; //Boost control + pinVVT_1 = PD3; //Default VVT output + pinStepperDir = PE0; //Direction pin for DRV8825 driver + pinStepperStep = PE1; //Step pin for DRV8825 driver + pinStepperEnable = PE2; //Enable pin for DRV8825 + pinDisplayReset = PE5; // OLED reset pin + pinFan = PE6; //Pin for the fan output + + pinFuelPump = PA6; //Fuel pump output + pinTachOut = PD15; //Tacho output pin + // pinLaunch = 51; //Can be overwritten below + // pinResetControl = 43; //Reset control output + + //external interrupt enabled pins + //external interrupts could be enalbed in any pin, except same port numbers (PA4,PE4) + pinFlex = PD4; // Flex sensor (Must be external interrupt enabled) + pinTrigger = PD13; //The CAS pin + pinTrigger2 = PD14; //The Cam Sensor pin + break; + + case 3: + //Pin mappings as per the v0.4 shield + + //Black F407VE http://wiki.stm32duino.com/index.php?title=STM32F407 + //PC8~PC12 SDio + + //PA9..PA10 Serial1 + //PA11..PA12 USB + //PA13..PA15 & PB4 SWD(debug) pins + //PB0 EEPROM CS pin + //PB1 LCD + //PB2 BOOT1 + //PB3..PB5 SPI interface + //PB6..PB8 NRF interface //PD5 & PD6 Serial2 pinInjector1 = PA1; //Output pin injector 1 is on @@ -388,238 +429,338 @@ void setPinMapping(byte boardID) break; case 10: - #ifndef SMALL_FLASH_MODE //No support for bluepill here anyway - //Pin mappings for user turtanas PCB - pinInjector1 = 4; //Output pin injector 1 is on - pinInjector2 = 5; //Output pin injector 2 is on - pinInjector3 = 6; //Output pin injector 3 is on - pinInjector4 = 7; //Output pin injector 4 is on - pinInjector5 = 8; //Placeholder only - NOT USED - pinInjector6 = 9; //Placeholder only - NOT USED - pinInjector7 = 10; //Placeholder only - NOT USED - pinInjector8 = 11; //Placeholder only - NOT USED - pinCoil1 = 24; //Pin for coil 1 - pinCoil2 = 28; //Pin for coil 2 - pinCoil3 = 36; //Pin for coil 3 - pinCoil4 = 40; //Pin for coil 4 - pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now - pinTrigger = 18; //The CAS pin - pinTrigger2 = 19; //The Cam Sensor pin - pinTPS = A2;//TPS input pin - pinMAP = A3; //MAP sensor pin - pinMAP2 = A8; //MAP2 sensor pin - pinIAT = A0; //IAT sensor pin - pinCLT = A1; //CLS sensor pin - pinO2 = A4; //O2 Sensor pin - pinBat = A7; //Battery reference voltage pin - pinDisplayReset = 48; // OLED reset pin - pinSpareTemp1 = A6; - pinSpareTemp2 = A5; - pinTachOut = 41; //Tacho output pin transistori puuttuu 2n2222 tähän ja 1k 12v - pinFuelPump = 42; //Fuel pump output 2n2222 - pinFan = 47; //Pin for the fan output - pinTachOut = 49; //Tacho output pin - pinFlex = 2; // Flex sensor (Must be external interrupt enabled) - pinResetControl = 26; //Reset control output + //Pin mappings as per the v0.4 shield - #endif + //Black F407VE http://wiki.stm32duino.com/index.php?title=STM32F407 + //PC8~PC12 SDio + + //PA9..PA10 Serial1 + //PA11..PA12 USB + //PA13..PA15 & PB4 SWD(debug) pins + //PB0 EEPROM CS pin + //PB1 LCD + //PB2 BOOT1 + //PB3..PB5 SPI interface + //PB6..PB8 NRF interface + + //PD5 & PD6 Serial2 + pinInjector1 = PA1; //Output pin injector 1 is on + pinInjector2 = PA2; //Output pin injector 2 is on + pinInjector3 = PA3; //Output pin injector 3 is on + pinInjector4 = PA4; //Output pin injector 4 is on + pinInjector5 = PA5; //Output pin injector 5 is on + pinInjector6 = PD4; //Output pin injector 6 is on + pinCoil1 = PD7; //Pin for coil 1 + pinCoil2 = PB9; //Pin for coil 2 + pinCoil3 = PA8; //Pin for coil 3 + pinCoil4 = PB10; //Pin for coil 4 + pinCoil5 = PB11; //Pin for coil 5 + pinMAP = PC0; //MAP sensor pin + pinTPS = PC1;//TPS input pin + pinIAT = PC2; //IAT sensor pin + pinCLT = PC3; //CLS sensor pin + pinO2 = PC5; //O2 Sensor pin + pinBat = PB1; //Battery reference voltage pin + pinBaro = PC4; + pinIdle1 = PB12; //Single wire idle control + pinIdle2 = PB11; //2 wire idle control + pinBoost = PC7; //Boost control + pinVVT_1 = PD3; //Default VVT output + pinStepperDir = PE0; //Direction pin for DRV8825 driver + pinStepperStep = PE1; //Step pin for DRV8825 driver + pinStepperEnable = PE2; //Enable pin for DRV8825 + pinDisplayReset = PE5; // OLED reset pin + pinFan = PE6; //Pin for the fan output + + pinFuelPump = PA6; //Fuel pump output + pinTachOut = PD15; //Tacho output pin + // pinLaunch = 51; //Can be overwritten below + // pinResetControl = 43; //Reset control output + + //external interrupt enabled pins + //external interrupts could be enalbed in any pin, except same port numbers (PA4,PE4) + pinFlex = PD4; // Flex sensor (Must be external interrupt enabled) + pinTrigger = PD13; //The CAS pin + pinTrigger2 = PD14; //The Cam Sensor pin break; case 20: -// #ifndef SMALL_FLASH_MODE //No support for bluepill here anyway -// //Pin mappings as per the Plazomat In/Out shields Rev 0.1 -// pinInjector1 = 8; //Output pin injector 1 is on -// pinInjector2 = 9; //Output pin injector 2 is on -// pinInjector3 = 10; //Output pin injector 3 is on -// pinInjector4 = 11; //Output pin injector 4 is on -// pinInjector5 = 12; //Output pin injector 5 is on -// pinCoil1 = 28; //Pin for coil 1 -// pinCoil2 = 24; //Pin for coil 2 -// pinCoil3 = 40; //Pin for coil 3 -// pinCoil4 = 36; //Pin for coil 4 -// pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now -// pinSpareOut1 = 4; //Spare LSD Output 1(PWM) -// pinSpareOut2 = 5; //Spare LSD Output 2(PWM) -// pinSpareOut3 = 6; //Spare LSD Output 3(PWM) -// pinSpareOut4 = 7; //Spare LSD Output 4(PWM) -// pinSpareOut5 = 50; //Spare LSD Output 5(digital) -// pinSpareOut6 = 52; //Spare LSD Output 6(digital) -// pinTrigger = 20; //The CAS pin -// pinTrigger2 = 21; //The Cam Sensor pin -// pinSpareTemp2 = A15; //spare Analog input 2 -// pinSpareTemp1 = A14; //spare Analog input 1 -// pinO2 = A8; //O2 Sensor pin -// pinBat = A4; //Battery reference voltage pin -// pinMAP = A3; //MAP sensor pin -// pinTPS = A2;//TPS input pin -// pinCLT = A1; //CLS sensor pin -// pinIAT = A0; //IAT sensor pin -// pinFan = 47; //Pin for the fan output -// pinFuelPump = 4; //Fuel pump output -// pinTachOut = 49; //Tacho output pin -// pinResetControl = 26; //Reset control output -// #endif + //Pin mappings as per the v0.4 shield + + //Black F407VE http://wiki.stm32duino.com/index.php?title=STM32F407 + //PC8~PC12 SDio + + //PA9..PA10 Serial1 + //PA11..PA12 USB + //PA13..PA15 & PB4 SWD(debug) pins + //PB0 EEPROM CS pin + //PB1 LCD + //PB2 BOOT1 + //PB3..PB5 SPI interface + //PB6..PB8 NRF interface + + //PD5 & PD6 Serial2 + pinInjector1 = PA1; //Output pin injector 1 is on + pinInjector2 = PA2; //Output pin injector 2 is on + pinInjector3 = PA3; //Output pin injector 3 is on + pinInjector4 = PA4; //Output pin injector 4 is on + pinInjector5 = PA5; //Output pin injector 5 is on + pinInjector6 = PD4; //Output pin injector 6 is on + pinCoil1 = PD7; //Pin for coil 1 + pinCoil2 = PB9; //Pin for coil 2 + pinCoil3 = PA8; //Pin for coil 3 + pinCoil4 = PB10; //Pin for coil 4 + pinCoil5 = PB11; //Pin for coil 5 + pinMAP = PC0; //MAP sensor pin + pinTPS = PC1;//TPS input pin + pinIAT = PC2; //IAT sensor pin + pinCLT = PC3; //CLS sensor pin + pinO2 = PC5; //O2 Sensor pin + pinBat = PB1; //Battery reference voltage pin + pinBaro = PC4; + pinIdle1 = PB12; //Single wire idle control + pinIdle2 = PB11; //2 wire idle control + pinBoost = PC7; //Boost control + pinVVT_1 = PD3; //Default VVT output + pinStepperDir = PE0; //Direction pin for DRV8825 driver + pinStepperStep = PE1; //Step pin for DRV8825 driver + pinStepperEnable = PE2; //Enable pin for DRV8825 + pinDisplayReset = PE5; // OLED reset pin + pinFan = PE6; //Pin for the fan output + + pinFuelPump = PA6; //Fuel pump output + pinTachOut = PD15; //Tacho output pin + // pinLaunch = 51; //Can be overwritten below + // pinResetControl = 43; //Reset control output + + //external interrupt enabled pins + //external interrupts could be enalbed in any pin, except same port numbers (PA4,PE4) + pinFlex = PD4; // Flex sensor (Must be external interrupt enabled) + pinTrigger = PD13; //The CAS pin + pinTrigger2 = PD14; //The Cam Sensor pin break; case 30: - #ifndef SMALL_FLASH_MODE //No support for bluepill here anyway - //Pin mappings as per the dazv6 shield - pinInjector1 = 8; //Output pin injector 1 is on - pinInjector2 = 9; //Output pin injector 2 is on - pinInjector3 = 10; //Output pin injector 3 is on - pinInjector4 = 11; //Output pin injector 4 is on - pinInjector5 = 12; //Output pin injector 5 is on - pinCoil1 = 40; //Pin for coil 1 - pinCoil2 = 38; //Pin for coil 2 - pinCoil3 = 50; //Pin for coil 3 - pinCoil4 = 52; //Pin for coil 4 - pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now - pinTrigger = 19; //The CAS pin - pinTrigger2 = 18; //The Cam Sensor pin - pinTrigger3 = 17; // cam sensor 2 pin - pinTPS = A2;//TPS input pin - pinMAP = A3; //MAP sensor pin - pinIAT = A0; //IAT sensor pin - pinCLT = A1; //CLS sensor pin - pinO2 = A8; //O2 Sensor pin - pinO2_2 = A9; //O2 sensor pin (second sensor) - pinBat = A4; //Battery reference voltage pin - pinDisplayReset = 48; // OLED reset pin - pinTachOut = 49; //Tacho output pin - pinIdle1 = 5; //Single wire idle control - pinFuelPump = 45; //Fuel pump output - pinStepperDir = 20; //Direction pin for DRV8825 driver - pinStepperStep = 21; //Step pin for DRV8825 driver - pinSpareHOut1 = 4; // high current output spare1 - pinSpareHOut2 = 6; // high current output spare2 - pinBoost = 7; - pinSpareLOut1 = 43; //low current output spare1 - pinSpareLOut2 = 47; - pinSpareLOut3 = 49; - pinSpareLOut4 = 51; - pinSpareLOut5 = 53; - pinFan = 47; //Pin for the fan output - #endif + //Pin mappings as per the v0.4 shield + + //Black F407VE http://wiki.stm32duino.com/index.php?title=STM32F407 + //PC8~PC12 SDio + + //PA9..PA10 Serial1 + //PA11..PA12 USB + //PA13..PA15 & PB4 SWD(debug) pins + //PB0 EEPROM CS pin + //PB1 LCD + //PB2 BOOT1 + //PB3..PB5 SPI interface + //PB6..PB8 NRF interface + + //PD5 & PD6 Serial2 + pinInjector1 = PA1; //Output pin injector 1 is on + pinInjector2 = PA2; //Output pin injector 2 is on + pinInjector3 = PA3; //Output pin injector 3 is on + pinInjector4 = PA4; //Output pin injector 4 is on + pinInjector5 = PA5; //Output pin injector 5 is on + pinInjector6 = PD4; //Output pin injector 6 is on + pinCoil1 = PD7; //Pin for coil 1 + pinCoil2 = PB9; //Pin for coil 2 + pinCoil3 = PA8; //Pin for coil 3 + pinCoil4 = PB10; //Pin for coil 4 + pinCoil5 = PB11; //Pin for coil 5 + pinMAP = PC0; //MAP sensor pin + pinTPS = PC1;//TPS input pin + pinIAT = PC2; //IAT sensor pin + pinCLT = PC3; //CLS sensor pin + pinO2 = PC5; //O2 Sensor pin + pinBat = PB1; //Battery reference voltage pin + pinBaro = PC4; + pinIdle1 = PB12; //Single wire idle control + pinIdle2 = PB11; //2 wire idle control + pinBoost = PC7; //Boost control + pinVVT_1 = PD3; //Default VVT output + pinStepperDir = PE0; //Direction pin for DRV8825 driver + pinStepperStep = PE1; //Step pin for DRV8825 driver + pinStepperEnable = PE2; //Enable pin for DRV8825 + pinDisplayReset = PE5; // OLED reset pin + pinFan = PE6; //Pin for the fan output + + pinFuelPump = PA6; //Fuel pump output + pinTachOut = PD15; //Tacho output pin + // pinLaunch = 51; //Can be overwritten below + // pinResetControl = 43; //Reset control output + + //external interrupt enabled pins + //external interrupts could be enalbed in any pin, except same port numbers (PA4,PE4) + pinFlex = PD4; // Flex sensor (Must be external interrupt enabled) + pinTrigger = PD13; //The CAS pin + pinTrigger2 = PD14; //The Cam Sensor pin break; case 40: - //Pin mappings as per the NO2C shield - pinInjector1 = 8; //Output pin injector 1 is on - pinInjector2 = 9; //Output pin injector 2 is on - pinInjector3 = 11; //Output pin injector 3 is on - NOT USED - pinInjector4 = 12; //Output pin injector 4 is on - NOT USED - pinInjector5 = 13; //Placeholder only - NOT USED - pinCoil1 = 23; //Pin for coil 1 - pinCoil2 = 22; //Pin for coil 2 - pinCoil3 = 2; //Pin for coil 3 - ONLY WITH DB2 - pinCoil4 = 3; //Pin for coil 4 - ONLY WITH DB2 - pinCoil5 = 46; //Placeholder only - NOT USED - pinTrigger = 19; //The CAS pin - pinTrigger2 = 18; //The Cam Sensor pin - pinTPS = A3; //TPS input pin - pinMAP = A0; //MAP sensor pin - pinIAT = A5; //IAT sensor pin - pinCLT = A4; //CLT sensor pin - pinO2 = A2; //O2 sensor pin - pinBat = A1; //Battery reference voltage pin - pinBaro = A6; //Baro sensor pin - ONLY WITH DB - pinSpareTemp1 = A7; //spare Analog input 1 - ONLY WITH DB - pinDisplayReset = 48; // OLED reset pin - NOT USED - pinTachOut = 38; //Tacho output pin - pinIdle1 = 5; //Single wire idle control - pinIdle2 = 47; //2 wire idle control - NOT USED - pinBoost = 7; //Boost control - pinVVT_1 = 6; //Default VVT output - pinFuelPump = 4; //Fuel pump output - pinStepperDir = 25; //Direction pin for DRV8825 driver - pinStepperStep = 24; //Step pin for DRV8825 driver - pinStepperEnable = 27; //Enable pin for DRV8825 driver - pinLaunch = 10; //Can be overwritten below - pinFlex = 20; // Flex sensor (Must be external interrupt enabled) - ONLY WITH DB - pinFan = 30; //Pin for the fan output - ONLY WITH DB - pinSpareLOut1 = 32; //low current output spare1 - ONLY WITH DB - pinSpareLOut2 = 34; //low current output spare2 - ONLY WITH DB - pinSpareLOut3 = 36; //low current output spare3 - ONLY WITH DB - pinResetControl = 26; //Reset control output - break; + //Pin mappings as per the v0.4 shield + + //Black F407VE http://wiki.stm32duino.com/index.php?title=STM32F407 + //PC8~PC12 SDio + + //PA9..PA10 Serial1 + //PA11..PA12 USB + //PA13..PA15 & PB4 SWD(debug) pins + //PB0 EEPROM CS pin + //PB1 LCD + //PB2 BOOT1 + //PB3..PB5 SPI interface + //PB6..PB8 NRF interface + + //PD5 & PD6 Serial2 + pinInjector1 = PA1; //Output pin injector 1 is on + pinInjector2 = PA2; //Output pin injector 2 is on + pinInjector3 = PA3; //Output pin injector 3 is on + pinInjector4 = PA4; //Output pin injector 4 is on + pinInjector5 = PA5; //Output pin injector 5 is on + pinInjector6 = PD4; //Output pin injector 6 is on + pinCoil1 = PD7; //Pin for coil 1 + pinCoil2 = PB9; //Pin for coil 2 + pinCoil3 = PA8; //Pin for coil 3 + pinCoil4 = PB10; //Pin for coil 4 + pinCoil5 = PB11; //Pin for coil 5 + pinMAP = PC0; //MAP sensor pin + pinTPS = PC1;//TPS input pin + pinIAT = PC2; //IAT sensor pin + pinCLT = PC3; //CLS sensor pin + pinO2 = PC5; //O2 Sensor pin + pinBat = PB1; //Battery reference voltage pin + pinBaro = PC4; + pinIdle1 = PB12; //Single wire idle control + pinIdle2 = PB11; //2 wire idle control + pinBoost = PC7; //Boost control + pinVVT_1 = PD3; //Default VVT output + pinStepperDir = PE0; //Direction pin for DRV8825 driver + pinStepperStep = PE1; //Step pin for DRV8825 driver + pinStepperEnable = PE2; //Enable pin for DRV8825 + pinDisplayReset = PE5; // OLED reset pin + pinFan = PE6; //Pin for the fan output + + pinFuelPump = PA6; //Fuel pump output + pinTachOut = PD15; //Tacho output pin + // pinLaunch = 51; //Can be overwritten below + // pinResetControl = 43; //Reset control output + + //external interrupt enabled pins + //external interrupts could be enalbed in any pin, except same port numbers (PA4,PE4) + pinFlex = PD4; // Flex sensor (Must be external interrupt enabled) + pinTrigger = PD13; //The CAS pin + pinTrigger2 = PD14; //The Cam Sensor pin case 41: - #ifndef SMALL_FLASH_MODE //No support for bluepill here anyway - //Pin mappings as per the UA4C shield - pinInjector1 = 8; //Output pin injector 1 is on - pinInjector2 = 7; //Output pin injector 2 is on - pinInjector3 = 6; //Output pin injector 3 is on - pinInjector4 = 5; //Output pin injector 4 is on - pinInjector5 = 45; //Output pin injector 5 is on PLACEHOLDER value for now - pinCoil1 = 35; //Pin for coil 1 - pinCoil2 = 36; //Pin for coil 2 - pinCoil3 = 33; //Pin for coil 3 - pinCoil4 = 34; //Pin for coil 4 - pinCoil5 = 44; //Pin for coil 5 PLACEHOLDER value for now - pinTrigger = 19; //The CAS pin - pinTrigger2 = 18; //The Cam Sensor pin - pinFlex = 20; // Flex sensor - pinTPS = A3; //TPS input pin - pinMAP = A0; //MAP sensor pin - pinBaro = A7; //Baro sensor pin - pinIAT = A5; //IAT sensor pin - pinCLT = A4; //CLS sensor pin - pinO2 = A1; //O2 Sensor pin - pinO2_2 = A9; //O2 sensor pin (second sensor) - pinBat = A2; //Battery reference voltage pin - pinSpareTemp1 = A8; //spare Analog input 1 - pinLaunch = 37; //Can be overwritten below - pinDisplayReset = 48; // OLED reset pin PLACEHOLDER value for now - pinTachOut = 22; //Tacho output pin - pinIdle1 = 9; //Single wire idle control - pinIdle2 = 10; //2 wire idle control - pinFuelPump = 23; //Fuel pump output - pinVVT_1 = 11; //Default VVT output - pinStepperDir = 32; //Direction pin for DRV8825 driver - pinStepperStep = 31; //Step pin for DRV8825 driver - pinStepperEnable = 30; //Enable pin for DRV8825 driver - pinBoost = 12; //Boost control - pinSpareLOut1 = 26; //low current output spare1 - pinSpareLOut2 = 27; //low current output spare2 - pinSpareLOut3 = 28; //low current output spare3 - pinSpareLOut4 = 29; //low current output spare4 - pinFan = 24; //Pin for the fan output - pinResetControl = 46; //Reset control output PLACEHOLDER value for now - #endif + //Pin mappings as per the v0.4 shield + + //Black F407VE http://wiki.stm32duino.com/index.php?title=STM32F407 + //PC8~PC12 SDio + + //PA9..PA10 Serial1 + //PA11..PA12 USB + //PA13..PA15 & PB4 SWD(debug) pins + //PB0 EEPROM CS pin + //PB1 LCD + //PB2 BOOT1 + //PB3..PB5 SPI interface + //PB6..PB8 NRF interface + + //PD5 & PD6 Serial2 + pinInjector1 = PA1; //Output pin injector 1 is on + pinInjector2 = PA2; //Output pin injector 2 is on + pinInjector3 = PA3; //Output pin injector 3 is on + pinInjector4 = PA4; //Output pin injector 4 is on + pinInjector5 = PA5; //Output pin injector 5 is on + pinInjector6 = PD4; //Output pin injector 6 is on + pinCoil1 = PD7; //Pin for coil 1 + pinCoil2 = PB9; //Pin for coil 2 + pinCoil3 = PA8; //Pin for coil 3 + pinCoil4 = PB10; //Pin for coil 4 + pinCoil5 = PB11; //Pin for coil 5 + pinMAP = PC0; //MAP sensor pin + pinTPS = PC1;//TPS input pin + pinIAT = PC2; //IAT sensor pin + pinCLT = PC3; //CLS sensor pin + pinO2 = PC5; //O2 Sensor pin + pinBat = PB1; //Battery reference voltage pin + pinBaro = PC4; + pinIdle1 = PB12; //Single wire idle control + pinIdle2 = PB11; //2 wire idle control + pinBoost = PC7; //Boost control + pinVVT_1 = PD3; //Default VVT output + pinStepperDir = PE0; //Direction pin for DRV8825 driver + pinStepperStep = PE1; //Step pin for DRV8825 driver + pinStepperEnable = PE2; //Enable pin for DRV8825 + pinDisplayReset = PE5; // OLED reset pin + pinFan = PE6; //Pin for the fan output + + pinFuelPump = PA6; //Fuel pump output + pinTachOut = PD15; //Tacho output pin + // pinLaunch = 51; //Can be overwritten below + // pinResetControl = 43; //Reset control output + + //external interrupt enabled pins + //external interrupts could be enalbed in any pin, except same port numbers (PA4,PE4) + pinFlex = PD4; // Flex sensor (Must be external interrupt enabled) + pinTrigger = PD13; //The CAS pin + pinTrigger2 = PD14; //The Cam Sensor pin break; default: - #ifndef SMALL_FLASH_MODE //No support for bluepill here anyway - //Pin mappings as per the v0.2 shield - pinInjector1 = 8; //Output pin injector 1 is on - pinInjector2 = 9; //Output pin injector 2 is on - pinInjector3 = 10; //Output pin injector 3 is on - pinInjector4 = 11; //Output pin injector 4 is on - pinInjector5 = 12; //Output pin injector 5 is on - pinCoil1 = 28; //Pin for coil 1 - pinCoil2 = 24; //Pin for coil 2 - pinCoil3 = 40; //Pin for coil 3 - pinCoil4 = 36; //Pin for coil 4 - pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now - pinTrigger = 20; //The CAS pin - pinTrigger2 = 21; //The Cam Sensor pin - pinTPS = A2; //TPS input pin - pinMAP = A3; //MAP sensor pin - pinIAT = A0; //IAT sensor pin - pinCLT = A1; //CLS sensor pin - pinO2 = A8; //O2 Sensor pin - pinBat = A4; //Battery reference voltage pin - pinStepperDir = 16; //Direction pin for DRV8825 driver - pinStepperStep = 17; //Step pin for DRV8825 driver - pinDisplayReset = 48; // OLED reset pin - pinFan = 47; //Pin for the fan output - pinFuelPump = 4; //Fuel pump output - pinTachOut = 49; //Tacho output pin - pinFlex = 3; // Flex sensor (Must be external interrupt enabled) - pinBoost = 5; - pinIdle1 = 6; - pinResetControl = 43; //Reset control output - #endif + //Pin mappings as per the v0.4 shield + + //Black F407VE http://wiki.stm32duino.com/index.php?title=STM32F407 + //PC8~PC12 SDio + + //PA9..PA10 Serial1 + //PA11..PA12 USB + //PA13..PA15 & PB4 SWD(debug) pins + //PB0 EEPROM CS pin + //PB1 LCD + //PB2 BOOT1 + //PB3..PB5 SPI interface + //PB6..PB8 NRF interface + + //PD5 & PD6 Serial2 + pinInjector1 = PA1; //Output pin injector 1 is on + pinInjector2 = PA2; //Output pin injector 2 is on + pinInjector3 = PA3; //Output pin injector 3 is on + pinInjector4 = PA4; //Output pin injector 4 is on + pinInjector5 = PA5; //Output pin injector 5 is on + pinInjector6 = PD4; //Output pin injector 6 is on + pinCoil1 = PD7; //Pin for coil 1 + pinCoil2 = PB9; //Pin for coil 2 + pinCoil3 = PA8; //Pin for coil 3 + pinCoil4 = PB10; //Pin for coil 4 + pinCoil5 = PB11; //Pin for coil 5 + pinMAP = PC0; //MAP sensor pin + pinTPS = PC1;//TPS input pin + pinIAT = PC2; //IAT sensor pin + pinCLT = PC3; //CLS sensor pin + pinO2 = PC5; //O2 Sensor pin + pinBat = PB1; //Battery reference voltage pin + pinBaro = PC4; + pinIdle1 = PB12; //Single wire idle control + pinIdle2 = PB11; //2 wire idle control + pinBoost = PC7; //Boost control + pinVVT_1 = PD3; //Default VVT output + pinStepperDir = PE0; //Direction pin for DRV8825 driver + pinStepperStep = PE1; //Step pin for DRV8825 driver + pinStepperEnable = PE2; //Enable pin for DRV8825 + pinDisplayReset = PE5; // OLED reset pin + pinFan = PE6; //Pin for the fan output + + pinFuelPump = PA6; //Fuel pump output + pinTachOut = PD15; //Tacho output pin + // pinLaunch = 51; //Can be overwritten below + // pinResetControl = 43; //Reset control output + + //external interrupt enabled pins + //external interrupts could be enalbed in any pin, except same port numbers (PA4,PE4) + pinFlex = PD4; // Flex sensor (Must be external interrupt enabled) + pinTrigger = PD13; //The CAS pin + pinTrigger2 = PD14; //The Cam Sensor pin break; } @@ -712,27 +853,15 @@ void setPinMapping(byte boardID) pump_pin_mask = digitalPinToBitMask(pinFuelPump); //And for inputs -// #if defined(CORE_STM32) -// #ifndef ARDUINO_ARCH_STM32 //libmaple core aka STM32DUINO -// pinMode(pinMAP, INPUT_ANALOG); -// pinMode(pinO2, INPUT_ANALOG); -// pinMode(pinO2_2, INPUT_ANALOG); -// pinMode(pinTPS, INPUT_ANALOG); -// pinMode(pinIAT, INPUT_ANALOG); -// pinMode(pinCLT, INPUT_ANALOG); -// pinMode(pinBat, INPUT_ANALOG); -// pinMode(pinBaro, INPUT_ANALOG); -// #else -// pinMode(pinMAP, INPUT); -// pinMode(pinO2, INPUT); -// pinMode(pinO2_2, INPUT); -// pinMode(pinTPS, INPUT); -// pinMode(pinIAT, INPUT); -// pinMode(pinCLT, INPUT); -// pinMode(pinBat, INPUT); -// pinMode(pinBaro, INPUT); -// #endif -// #endif + pinMode(pinMAP, INPUT); + pinMode(pinO2, INPUT); + pinMode(pinO2_2, INPUT); + pinMode(pinTPS, INPUT); + pinMode(pinIAT, INPUT); + pinMode(pinCLT, INPUT); + pinMode(pinBat, INPUT); + pinMode(pinBaro, INPUT); + pinMode(pinTrigger, INPUT); pinMode(pinTrigger2, INPUT); pinMode(pinTrigger3, INPUT); @@ -760,12 +889,10 @@ void setPinMapping(byte boardID) triggerSec_pin_port = portInputRegister(digitalPinToPort(pinTrigger2)); triggerSec_pin_mask = digitalPinToBitMask(pinTrigger2); - #if defined(CORE_STM32) - #else - //Set default values - digitalWrite(pinMAP, HIGH); - //digitalWrite(pinO2, LOW); - digitalWrite(pinTPS, LOW); - #endif + //Set default values + digitalWrite(pinMAP, HIGH); + //digitalWrite(pinO2, LOW); + digitalWrite(pinTPS, LOW); + } #endif diff --git a/speeduino/board_stm32F407VE.h b/speeduino/board_stm32F407VE.h new file mode 100644 index 00000000..e0f4f10f --- /dev/null +++ b/speeduino/board_stm32F407VE.h @@ -0,0 +1,153 @@ +#ifndef STM32F407VE_H +#define STM32F407VE_H +#if defined(ARDUINO_BLACK_F407VE) + +/* +*********************************************************************************************************** +* General +*/ + #define PORT_TYPE uint8_t + #define micros_safe() micros() //timer5 method is not used on anything but AVR, the micros_safe() macro is simply an alias for the normal micros() + + #define USE_SERIAL3 + void initBoard(); + uint16_t freeRam(); +// extern void oneMSIntervalIRQ(stimer_t *Timer); + + extern void EmptyIRQCallback(stimer_t *Timer, uint32_t channel); + #if defined(USE_STM32GENERIC) + #define Serial Serial1 + #endif + + /* +*********************************************************************************************************** +* Schedules +*/ + #define MAX_TIMER_PERIOD 65535 //The longest period of time (in uS) that the timer can permit (IN this case it is 65535 * 2, as each timer tick is 2uS) + #define MAX_TIMER_PERIOD_SLOW 65535 //The longest period of time (in uS) that the timer can permit (IN this case it is 65535 * 2, as each timer tick is 2uS) + #define uS_TO_TIMER_COMPARE(uS) (uS ) //Converts a given number of uS into the required number of timer ticks until that time has passed. + #define uS_TO_TIMER_COMPARE_SLOW(uS) (uS ) //Converts a given number of uS into the required number of timer ticks until that time has passed. + + #define FUEL1_COUNTER (TIM3)->CNT + #define FUEL2_COUNTER (TIM3)->CNT + #define FUEL3_COUNTER (TIM3)->CNT + #define FUEL4_COUNTER (TIM3)->CNT + + #define FUEL1_COMPARE (TIM3)->CCR1 + #define FUEL2_COMPARE (TIM3)->CCR2 + #define FUEL3_COMPARE (TIM3)->CCR3 + #define FUEL4_COMPARE (TIM3)->CCR4 + + #define IGN1_COUNTER (TIM2)->CNT + #define IGN2_COUNTER (TIM2)->CNT + #define IGN3_COUNTER (TIM2)->CNT + #define IGN4_COUNTER (TIM2)->CNT + + #define IGN1_COMPARE (TIM2)->CCR1 + #define IGN2_COMPARE (TIM2)->CCR2 + #define IGN3_COMPARE (TIM2)->CCR3 + #define IGN4_COMPARE (TIM2)->CCR4 + + #define FUEL5_COUNTER (TIM5)->CNT + #define FUEL6_COUNTER (TIM5)->CNT + #define FUEL7_COUNTER (TIM5)->CNT + #define FUEL8_COUNTER (TIM5)->CNT + + #define FUEL5_COMPARE (TIM5)->CCR1 + #define FUEL6_COMPARE (TIM5)->CCR2 + #define FUEL7_COMPARE (TIM5)->CCR3 + #define FUEL8_COMPARE (TIM5)->CCR4 + + #define IGN5_COUNTER (TIM4)->CNT + #define IGN6_COUNTER (TIM4)->CNT + #define IGN7_COUNTER (TIM4)->CNT + #define IGN8_COUNTER (TIM4)->CNT + + #define IGN5_COMPARE (TIM4)->CCR1 + #define IGN6_COMPARE (TIM4)->CCR2 + #define IGN7_COMPARE (TIM4)->CCR3 + #define IGN8_COMPARE (TIM4)->CCR4 + + //https://github.com/rogerclarkmelbourne/Arduino_STM32/blob/754bc2969921f1ef262bd69e7faca80b19db7524/STM32F1/system/libmaple/include/libmaple/timer.h#L444 + #define FUEL1_TIMER_ENABLE() (TIM3)->CCER |= TIM_CCER_CC1E + #define FUEL2_TIMER_ENABLE() (TIM3)->CCER |= TIM_CCER_CC2E + #define FUEL3_TIMER_ENABLE() (TIM3)->CCER |= TIM_CCER_CC3E + #define FUEL4_TIMER_ENABLE() (TIM3)->CCER |= TIM_CCER_CC4E + + #define FUEL1_TIMER_DISABLE() (TIM3)->CCER &= ~TIM_CCER_CC1E + #define FUEL2_TIMER_DISABLE() (TIM3)->CCER &= ~TIM_CCER_CC2E + #define FUEL3_TIMER_DISABLE() (TIM3)->CCER &= ~TIM_CCER_CC3E + #define FUEL4_TIMER_DISABLE() (TIM3)->CCER &= ~TIM_CCER_CC4E + + #define IGN1_TIMER_ENABLE() (TIM2)->CCER |= TIM_CCER_CC1E + #define IGN2_TIMER_ENABLE() (TIM2)->CCER |= TIM_CCER_CC2E + #define IGN3_TIMER_ENABLE() (TIM2)->CCER |= TIM_CCER_CC3E + #define IGN4_TIMER_ENABLE() (TIM2)->CCER |= TIM_CCER_CC4E + + #define IGN1_TIMER_DISABLE() (TIM2)->CCER &= ~TIM_CCER_CC1E + #define IGN2_TIMER_DISABLE() (TIM2)->CCER &= ~TIM_CCER_CC2E + #define IGN3_TIMER_DISABLE() (TIM2)->CCER &= ~TIM_CCER_CC3E + #define IGN4_TIMER_DISABLE() (TIM2)->CCER &= ~TIM_CCER_CC4E + + + #define FUEL5_TIMER_ENABLE() (TIM5)->CCER |= TIM_CCER_CC1E + #define FUEL6_TIMER_ENABLE() (TIM5)->CCER |= TIM_CCER_CC2E + #define FUEL7_TIMER_ENABLE() (TIM5)->CCER |= TIM_CCER_CC3E + #define FUEL8_TIMER_ENABLE() (TIM5)->CCER |= TIM_CCER_CC4E + + #define FUEL5_TIMER_DISABLE() (TIM5)->CCER &= ~TIM_CCER_CC1E + #define FUEL6_TIMER_DISABLE() (TIM5)->CCER &= ~TIM_CCER_CC2E + #define FUEL7_TIMER_DISABLE() (TIM5)->CCER &= ~TIM_CCER_CC3E + #define FUEL8_TIMER_DISABLE() (TIM5)->CCER &= ~TIM_CCER_CC4E + + #define IGN5_TIMER_ENABLE() (TIM4)->CCER |= TIM_CCER_CC1E + #define IGN6_TIMER_ENABLE() (TIM4)->CCER |= TIM_CCER_CC2E + #define IGN7_TIMER_ENABLE() (TIM4)->CCER |= TIM_CCER_CC3E + #define IGN8_TIMER_ENABLE() (TIM4)->CCER |= TIM_CCER_CC4E + + #define IGN5_TIMER_DISABLE() (TIM4)->CCER &= ~TIM_CCER_CC1E + #define IGN6_TIMER_DISABLE() (TIM4)->CCER &= ~TIM_CCER_CC2E + #define IGN7_TIMER_DISABLE() (TIM4)->CCER &= ~TIM_CCER_CC3E + #define IGN8_TIMER_DISABLE() (TIM4)->CCER &= ~TIM_CCER_CC4E + + + + +/* +*********************************************************************************************************** +* Auxilliaries +*/ + #define ENABLE_BOOST_TIMER() (TIM1)->CCER |= TIM_CCER_CC2E + #define DISABLE_BOOST_TIMER() (TIM1)->CCER &= ~TIM_CCER_CC2E + + #define ENABLE_VVT_TIMER() (TIM1)->CCER |= TIM_CCER_CC3E + #define DISABLE_VVT_TIMER() (TIM1)->CCER &= ~TIM_CCER_CC3E + + #define BOOST_TIMER_COMPARE (TIM1)->CCR2 + #define BOOST_TIMER_COUNTER (TIM1)->CNT + #define VVT_TIMER_COMPARE (TIM1)->CCR3 + #define VVT_TIMER_COUNTER (TIM1)->CNT + +/* +*********************************************************************************************************** +* Idle +*/ + #define IDLE_COUNTER (TIM1)->CNT + #define IDLE_COMPARE (TIM1)->CCR4 + + #define IDLE_TIMER_ENABLE() (TIM1)->CCER |= TIM_CCER_CC4E + #define IDLE_TIMER_DISABLE() (TIM1)->CCER &= ~TIM_CCER_CC4E + +/* +*********************************************************************************************************** +* Timers +*/ + + +/* +*********************************************************************************************************** +* CAN / Second serial +*/ + +#endif //CORE_STM32 +#endif //STM32_H diff --git a/speeduino/board_stm32F407VE.ino b/speeduino/board_stm32F407VE.ino new file mode 100644 index 00000000..97038ad4 --- /dev/null +++ b/speeduino/board_stm32F407VE.ino @@ -0,0 +1,898 @@ +#if defined(ARDUINO_BLACK_F407VE) +#include "board_stm32F407VE.h" +#include "globals.h" +#include "auxiliaries.h" +#include "idle.h" +#include "scheduler.h" +#if defined(STM32F4) + #define NR_OFF_TIMERS 9 + //stimer_t HardwareTimers[NR_OFF_TIMERS + 1]; + stimer_t HardwareTimers_1; + stimer_t HardwareTimers_2; + stimer_t HardwareTimers_3; + stimer_t HardwareTimers_4; + stimer_t HardwareTimers_5; + stimer_t HardwareTimers_8; + #define LED_BUILTIN PA7 + //These should really be in the stm32GENERIC libs, but for somereason they only have timers 1-4 +// #include +// #include "src/HardwareTimers/HardwareTimer.h" +// HardwareTimer Timer5(TIM5, chip_tim5, sizeof(chip_tim5) / sizeof(chip_tim5[0])); +// HardwareTimer Timer8(TIM8, chip_tim8, sizeof(chip_tim8) / sizeof(chip_tim8[0])); +#else + #include "HardwareTimer.h" +#endif +extern void oneMSIntervalIRQ(stimer_t *Timer){oneMSInterval();} + +extern void EmptyIRQCallback(stimer_t *Timer, uint32_t channel){} + + + + +void initBoard() +{ + /* + * Initialize timers + */ + + HardwareTimers_1.timer = TIM1; + HardwareTimers_2.timer = TIM2; + HardwareTimers_3.timer = TIM3; + HardwareTimers_4.timer = TIM4; + + HardwareTimers_5.timer = TIM5; + HardwareTimers_8.timer = TIM8; + + + /* + *********************************************************************************************************** + * General + */ + #define FLASH_LENGTH 8192 + + /* + *********************************************************************************************************** + * Idle + */ + if( (configPage6.iacAlgorithm == IAC_ALGORITHM_PWM_OL) || (configPage6.iacAlgorithm == IAC_ALGORITHM_PWM_CL) ) + { + idle_pwm_max_count = 1000000L / (configPage6.idleFreq * 2); //Converts the frequency in Hz to the number of ticks (at 2uS) it takes to complete 1 cycle. Note that the frequency is divided by 2 coming from TS to allow for up to 5KHz + } + + //This must happen at the end of the idle init + TimerPulseInit(&HardwareTimers_1, 0xFFFF, 0, EmptyIRQCallback); + setTimerPrescalerRegister(&HardwareTimers_1, (uint32_t)(getTimerClkFreq(HardwareTimers_1.timer) / (500000)) - 1); + if(idle_pwm_max_count > 0) { attachIntHandleOC(&HardwareTimers_1, idleInterrupt, 4, 0);} //on first flash the configPage4.iacAlgorithm is invalid + //Timer1.setMode(4, TIMER_OUTPUT_COMPARE); + //timer_set_mode(TIMER1, 4, TIMER_OUTPUT_COMPARE; + //if(idle_pwm_max_count > 0) { Timer1.attachInterrupt(4, idleInterrupt);} //on first flash the configPage4.iacAlgorithm is invalid + //Timer1.resume(); + + + /* + *********************************************************************************************************** + * Timers + */ + #if defined(ARDUINO_BLACK_F407VE) || defined(STM32F4) || defined(_STM32F4_) + TimerHandleInit(&HardwareTimers_8, 1000, 168); + attachIntHandle(&HardwareTimers_8, oneMSIntervalIRQ); + #else + Timer4.setPeriod(1000); // Set up period + Timer4.setMode(1, TIMER_OUTPUT_COMPARE); + Timer4.attachInterrupt(1, oneMSInterval); + Timer4.resume(); //Start Timer + #endif + pinMode(LED_BUILTIN, OUTPUT); //Visual WDT + + /* + *********************************************************************************************************** + * Auxilliaries + */ + //2uS resolution Min 8Hz, Max 5KHz + boost_pwm_max_count = 1000000L / (2 * configPage6.boostFreq * 2); //Converts the frequency in Hz to the number of ticks (at 2uS) it takes to complete 1 cycle. The x2 is there because the frequency is stored at half value (in a byte) to allow freqneucies up to 511Hz + vvt_pwm_max_count = 1000000L / (2 * configPage6.vvtFreq * 2); //Converts the frequency in Hz to the number of ticks (at 2uS) it takes to complete 1 cycle + + //Need to be initialised last due to instant interrupt +// Timer1.setMode(2, TIMER_OUTPUT_COMPARE); +// Timer1.setMode(3, TIMER_OUTPUT_COMPARE); +// if(boost_pwm_max_count > 0) { Timer1.attachInterrupt(2, boostInterrupt);} +// if(vvt_pwm_max_count > 0) { Timer1.attachInterrupt(3, vvtInterrupt);} + if(idle_pwm_max_count > 0) { attachIntHandleOC(&HardwareTimers_1, boostInterrupt, 2, 0);} + if(vvt_pwm_max_count > 0) { attachIntHandleOC(&HardwareTimers_1, vvtInterrupt, 3, 0);} +// Timer1.resume(); + + TimerPulseInit(&HardwareTimers_3, 0xFFFF, 0, EmptyIRQCallback); + setTimerPrescalerRegister(&HardwareTimers_3, (uint32_t)(getTimerClkFreq(HardwareTimers_3.timer) / (1000000)) - 1); + attachIntHandleOC(&HardwareTimers_3, fuelSchedule1Interrupt, 1, 0); + attachIntHandleOC(&HardwareTimers_3, fuelSchedule2Interrupt, 2, 0); + attachIntHandleOC(&HardwareTimers_3, fuelSchedule3Interrupt, 3, 0); + attachIntHandleOC(&HardwareTimers_3, fuelSchedule4Interrupt, 4, 0); + + TimerPulseInit(&HardwareTimers_2, 0xFFFF, 0, EmptyIRQCallback); + setTimerPrescalerRegister(&HardwareTimers_2, (uint32_t)(getTimerClkFreq(HardwareTimers_2.timer) / (1000000)) - 1); + attachIntHandleOC(&HardwareTimers_2, ignitionSchedule1Interrupt, 1, 0); + attachIntHandleOC(&HardwareTimers_2, ignitionSchedule2Interrupt, 2, 0); + attachIntHandleOC(&HardwareTimers_2, ignitionSchedule3Interrupt, 3, 0); + attachIntHandleOC(&HardwareTimers_2, ignitionSchedule4Interrupt, 4, 0); + + //Attach interupt functions + //Injection + + TimerPulseInit(&HardwareTimers_5, 0xFFFF, 0, EmptyIRQCallback); + setTimerPrescalerRegister(&HardwareTimers_5, (uint32_t)(getTimerClkFreq(HardwareTimers_5.timer) / (1000000)) - 1); + #if (INJ_CHANNELS >= 5) + attachIntHandleOC(&HardwareTimers_5, fuelSchedule5Interrupt, 1, 0); + //Timer5.attachInterrupt(1, fuelSchedule5Interrupt); + #endif + #if (INJ_CHANNELS >= 6) + attachIntHandleOC(&HardwareTimers_5, fuelSchedule6Interrupt, 2, 0); + //Timer5.attachInterrupt(2, fuelSchedule6Interrupt); + #endif + #if (INJ_CHANNELS >= 7) + attachIntHandleOC(&HardwareTimers_5, fuelSchedule7Interrupt, 3, 0); + //Timer5.attachInterrupt(3, fuelSchedule7Interrupt); + #endif + #if (INJ_CHANNELS >= 8) + attachIntHandleOC(&HardwareTimers_5, fuelSchedule8Interrupt, 4, 0); + //Timer5.attachInterrupt(4, fuelSchedule8Interrupt); + #endif + + TimerPulseInit(&HardwareTimers_4, 0xFFFF, 0, EmptyIRQCallback); + setTimerPrescalerRegister(&HardwareTimers_4, (uint32_t)(getTimerClkFreq(HardwareTimers_4.timer) / (1000000)) - 1); + #if (IGN_CHANNELS >= 5) + attachIntHandleOC(&HardwareTimers_4, ignitionSchedule5Interrupt, 1, 0); + //Timer4.attachInterrupt(1, ignitionSchedule5Interrupt); + #endif + #if (IGN_CHANNELS >= 6) + attachIntHandleOC(&HardwareTimers_4, ignitionSchedule6Interrupt, 2, 0); + //Timer4.attachInterrupt(2, ignitionSchedule6Interrupt); + #endif + #if (IGN_CHANNELS >= 7) + attachIntHandleOC(&HardwareTimers_4, ignitionSchedule7Interrupt, 3, 0); + //Timer4.attachInterrupt(3, ignitionSchedule7Interrupt); + #endif + #if (IGN_CHANNELS >= 8) + attachIntHandleOC(&HardwareTimers_4, ignitionSchedule8Interrupt, 4, 0); + //Timer4.attachInterrupt(4, ignitionSchedule8Interrupt); + #endif + +} + +uint16_t freeRam() +{ + char top = 't'; + return &top - reinterpret_cast(sbrk(0)); +} + +//pinmapping the STM32F407 for different boards, at this moment no board is desgined. +//All boards are set to the default just to be sure. +void setPinMapping(byte boardID) +{ + switch (boardID) + { + case 0: + //Pin mappings as per the v0.4 shield + + //Black F407VE http://wiki.stm32duino.com/index.php?title=STM32F407 + //PC8~PC12 SDio + + //PA9..PA10 Serial1 + //PA11..PA12 USB + //PA13..PA15 & PB4 SWD(debug) pins + //PB0 EEPROM CS pin + //PB1 LCD + //PB2 BOOT1 + //PB3..PB5 SPI interface + //PB6..PB8 NRF interface + + //PD5 & PD6 Serial2 + pinInjector1 = PA1; //Output pin injector 1 is on + pinInjector2 = PA2; //Output pin injector 2 is on + pinInjector3 = PA3; //Output pin injector 3 is on + pinInjector4 = PA4; //Output pin injector 4 is on + pinInjector5 = PA5; //Output pin injector 5 is on + pinInjector6 = PD4; //Output pin injector 6 is on + pinCoil1 = PD7; //Pin for coil 1 + pinCoil2 = PB9; //Pin for coil 2 + pinCoil3 = PA8; //Pin for coil 3 + pinCoil4 = PB10; //Pin for coil 4 + pinCoil5 = PB11; //Pin for coil 5 + pinMAP = PC0; //MAP sensor pin + pinTPS = PC1;//TPS input pin + pinIAT = PC2; //IAT sensor pin + pinCLT = PC3; //CLS sensor pin + pinO2 = PC5; //O2 Sensor pin + pinBat = PB1; //Battery reference voltage pin + pinBaro = PC4; + pinIdle1 = PB12; //Single wire idle control + pinIdle2 = PB11; //2 wire idle control + pinBoost = PC7; //Boost control + pinVVT_1 = PD3; //Default VVT output + pinStepperDir = PE0; //Direction pin for DRV8825 driver + pinStepperStep = PE1; //Step pin for DRV8825 driver + pinStepperEnable = PE2; //Enable pin for DRV8825 + pinDisplayReset = PE5; // OLED reset pin + pinFan = PE6; //Pin for the fan output + + pinFuelPump = PA6; //Fuel pump output + pinTachOut = PD15; //Tacho output pin + // pinLaunch = 51; //Can be overwritten below + // pinResetControl = 43; //Reset control output + + //external interrupt enabled pins + //external interrupts could be enalbed in any pin, except same port numbers (PA4,PE4) + pinFlex = PD4; // Flex sensor (Must be external interrupt enabled) + pinTrigger = PD13; //The CAS pin + pinTrigger2 = PD14; //The Cam Sensor pin + break; + case 1: + //Pin mappings as per the v0.4 shield + + //Black F407VE http://wiki.stm32duino.com/index.php?title=STM32F407 + //PC8~PC12 SDio + + //PA9..PA10 Serial1 + //PA11..PA12 USB + //PA13..PA15 & PB4 SWD(debug) pins + //PB0 EEPROM CS pin + //PB1 LCD + //PB2 BOOT1 + //PB3..PB5 SPI interface + //PB6..PB8 NRF interface + + //PD5 & PD6 Serial2 + pinInjector1 = PA1; //Output pin injector 1 is on + pinInjector2 = PA2; //Output pin injector 2 is on + pinInjector3 = PA3; //Output pin injector 3 is on + pinInjector4 = PA4; //Output pin injector 4 is on + pinInjector5 = PA5; //Output pin injector 5 is on + pinInjector6 = PD4; //Output pin injector 6 is on + pinCoil1 = PD7; //Pin for coil 1 + pinCoil2 = PB9; //Pin for coil 2 + pinCoil3 = PA8; //Pin for coil 3 + pinCoil4 = PB10; //Pin for coil 4 + pinCoil5 = PB11; //Pin for coil 5 + pinMAP = PC0; //MAP sensor pin + pinTPS = PC1;//TPS input pin + pinIAT = PC2; //IAT sensor pin + pinCLT = PC3; //CLS sensor pin + pinO2 = PC5; //O2 Sensor pin + pinBat = PB1; //Battery reference voltage pin + pinBaro = PC4; + pinIdle1 = PB12; //Single wire idle control + pinIdle2 = PB11; //2 wire idle control + pinBoost = PC7; //Boost control + pinVVT_1 = PD3; //Default VVT output + pinStepperDir = PE0; //Direction pin for DRV8825 driver + pinStepperStep = PE1; //Step pin for DRV8825 driver + pinStepperEnable = PE2; //Enable pin for DRV8825 + pinDisplayReset = PE5; // OLED reset pin + pinFan = PE6; //Pin for the fan output + + pinFuelPump = PA6; //Fuel pump output + pinTachOut = PD15; //Tacho output pin + // pinLaunch = 51; //Can be overwritten below + // pinResetControl = 43; //Reset control output + + //external interrupt enabled pins + //external interrupts could be enalbed in any pin, except same port numbers (PA4,PE4) + pinFlex = PD4; // Flex sensor (Must be external interrupt enabled) + pinTrigger = PD13; //The CAS pin + pinTrigger2 = PD14; //The Cam Sensor pin + break; + + case 2: + //Pin mappings as per the v0.4 shield + + //Black F407VE http://wiki.stm32duino.com/index.php?title=STM32F407 + //PC8~PC12 SDio + + //PA9..PA10 Serial1 + //PA11..PA12 USB + //PA13..PA15 & PB4 SWD(debug) pins + //PB0 EEPROM CS pin + //PB1 LCD + //PB2 BOOT1 + //PB3..PB5 SPI interface + //PB6..PB8 NRF interface + + //PD5 & PD6 Serial2 + pinInjector1 = PA1; //Output pin injector 1 is on + pinInjector2 = PA2; //Output pin injector 2 is on + pinInjector3 = PA3; //Output pin injector 3 is on + pinInjector4 = PA4; //Output pin injector 4 is on + pinInjector5 = PA5; //Output pin injector 5 is on + pinInjector6 = PD4; //Output pin injector 6 is on + pinCoil1 = PD7; //Pin for coil 1 + pinCoil2 = PB9; //Pin for coil 2 + pinCoil3 = PA8; //Pin for coil 3 + pinCoil4 = PB10; //Pin for coil 4 + pinCoil5 = PB11; //Pin for coil 5 + pinMAP = PC0; //MAP sensor pin + pinTPS = PC1;//TPS input pin + pinIAT = PC2; //IAT sensor pin + pinCLT = PC3; //CLS sensor pin + pinO2 = PC5; //O2 Sensor pin + pinBat = PB1; //Battery reference voltage pin + pinBaro = PC4; + pinIdle1 = PB12; //Single wire idle control + pinIdle2 = PB11; //2 wire idle control + pinBoost = PC7; //Boost control + pinVVT_1 = PD3; //Default VVT output + pinStepperDir = PE0; //Direction pin for DRV8825 driver + pinStepperStep = PE1; //Step pin for DRV8825 driver + pinStepperEnable = PE2; //Enable pin for DRV8825 + pinDisplayReset = PE5; // OLED reset pin + pinFan = PE6; //Pin for the fan output + + pinFuelPump = PA6; //Fuel pump output + pinTachOut = PD15; //Tacho output pin + // pinLaunch = 51; //Can be overwritten below + // pinResetControl = 43; //Reset control output + + //external interrupt enabled pins + //external interrupts could be enalbed in any pin, except same port numbers (PA4,PE4) + pinFlex = PD4; // Flex sensor (Must be external interrupt enabled) + pinTrigger = PD13; //The CAS pin + pinTrigger2 = PD14; //The Cam Sensor pin + break; + + case 3: + //Pin mappings as per the v0.4 shield + + //Black F407VE http://wiki.stm32duino.com/index.php?title=STM32F407 + //PC8~PC12 SDio + + //PA9..PA10 Serial1 + //PA11..PA12 USB + //PA13..PA15 & PB4 SWD(debug) pins + //PB0 EEPROM CS pin + //PB1 LCD + //PB2 BOOT1 + //PB3..PB5 SPI interface + //PB6..PB8 NRF interface + + //PD5 & PD6 Serial2 + pinInjector1 = PA1; //Output pin injector 1 is on + pinInjector2 = PA2; //Output pin injector 2 is on + pinInjector3 = PA3; //Output pin injector 3 is on + pinInjector4 = PA4; //Output pin injector 4 is on + pinInjector5 = PA5; //Output pin injector 5 is on + pinInjector6 = PD4; //Output pin injector 6 is on + pinCoil1 = PD7; //Pin for coil 1 + pinCoil2 = PB9; //Pin for coil 2 + pinCoil3 = PA8; //Pin for coil 3 + pinCoil4 = PB10; //Pin for coil 4 + pinCoil5 = PB11; //Pin for coil 5 + pinMAP = PC0; //MAP sensor pin + pinTPS = PC1;//TPS input pin + pinIAT = PC2; //IAT sensor pin + pinCLT = PC3; //CLS sensor pin + pinO2 = PC5; //O2 Sensor pin + pinBat = PB1; //Battery reference voltage pin + pinBaro = PC4; + pinIdle1 = PB12; //Single wire idle control + pinIdle2 = PB11; //2 wire idle control + pinBoost = PC7; //Boost control + pinVVT_1 = PD3; //Default VVT output + pinStepperDir = PE0; //Direction pin for DRV8825 driver + pinStepperStep = PE1; //Step pin for DRV8825 driver + pinStepperEnable = PE2; //Enable pin for DRV8825 + pinDisplayReset = PE5; // OLED reset pin + pinFan = PE6; //Pin for the fan output + + pinFuelPump = PA6; //Fuel pump output + pinTachOut = PD15; //Tacho output pin + // pinLaunch = 51; //Can be overwritten below + // pinResetControl = 43; //Reset control output + + //external interrupt enabled pins + //external interrupts could be enalbed in any pin, except same port numbers (PA4,PE4) + pinFlex = PD4; // Flex sensor (Must be external interrupt enabled) + pinTrigger = PD13; //The CAS pin + pinTrigger2 = PD14; //The Cam Sensor pin + break; + + case 9: + //Pin mappings as per the MX5 PNP shield + pinInjector1 = 11; //Output pin injector 1 is on + pinInjector2 = 10; //Output pin injector 2 is on + pinInjector3 = 9; //Output pin injector 3 is on + pinInjector4 = 8; //Output pin injector 4 is on + pinInjector5 = 14; //Output pin injector 5 is on + pinCoil1 = 39; //Pin for coil 1 + pinCoil2 = 41; //Pin for coil 2 + pinCoil3 = 32; //Pin for coil 3 + pinCoil4 = 33; //Pin for coil 4 + pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now + pinTrigger = 19; //The CAS pin + pinTrigger2 = 18; //The Cam Sensor pin + pinTPS = A2;//TPS input pin + pinMAP = A5; //MAP sensor pin + pinIAT = A0; //IAT sensor pin + pinCLT = A1; //CLS sensor pin + pinO2 = A3; //O2 Sensor pin + pinBat = A4; //Battery reference voltage pin + pinDisplayReset = 48; // OLED reset pin + pinTachOut = 49; //Tacho output pin (Goes to ULN2803) + pinIdle1 = 2; //Single wire idle control + pinBoost = 4; + pinIdle2 = 4; //2 wire idle control (Note this is shared with boost!!!) + pinFuelPump = 37; //Fuel pump output + pinStepperDir = 16; //Direction pin for DRV8825 driver + pinStepperStep = 17; //Step pin for DRV8825 driver + pinFan = 35; //Pin for the fan output + pinLaunch = 12; //Can be overwritten below + pinFlex = 3; // Flex sensor (Must be external interrupt enabled) + pinResetControl = 44; //Reset control output + + break; + + case 10: + //Pin mappings as per the v0.4 shield + + //Black F407VE http://wiki.stm32duino.com/index.php?title=STM32F407 + //PC8~PC12 SDio + + //PA9..PA10 Serial1 + //PA11..PA12 USB + //PA13..PA15 & PB4 SWD(debug) pins + //PB0 EEPROM CS pin + //PB1 LCD + //PB2 BOOT1 + //PB3..PB5 SPI interface + //PB6..PB8 NRF interface + + //PD5 & PD6 Serial2 + pinInjector1 = PA1; //Output pin injector 1 is on + pinInjector2 = PA2; //Output pin injector 2 is on + pinInjector3 = PA3; //Output pin injector 3 is on + pinInjector4 = PA4; //Output pin injector 4 is on + pinInjector5 = PA5; //Output pin injector 5 is on + pinInjector6 = PD4; //Output pin injector 6 is on + pinCoil1 = PD7; //Pin for coil 1 + pinCoil2 = PB9; //Pin for coil 2 + pinCoil3 = PA8; //Pin for coil 3 + pinCoil4 = PB10; //Pin for coil 4 + pinCoil5 = PB11; //Pin for coil 5 + pinMAP = PC0; //MAP sensor pin + pinTPS = PC1;//TPS input pin + pinIAT = PC2; //IAT sensor pin + pinCLT = PC3; //CLS sensor pin + pinO2 = PC5; //O2 Sensor pin + pinBat = PB1; //Battery reference voltage pin + pinBaro = PC4; + pinIdle1 = PB12; //Single wire idle control + pinIdle2 = PB11; //2 wire idle control + pinBoost = PC7; //Boost control + pinVVT_1 = PD3; //Default VVT output + pinStepperDir = PE0; //Direction pin for DRV8825 driver + pinStepperStep = PE1; //Step pin for DRV8825 driver + pinStepperEnable = PE2; //Enable pin for DRV8825 + pinDisplayReset = PE5; // OLED reset pin + pinFan = PE6; //Pin for the fan output + + pinFuelPump = PA6; //Fuel pump output + pinTachOut = PD15; //Tacho output pin + // pinLaunch = 51; //Can be overwritten below + // pinResetControl = 43; //Reset control output + + //external interrupt enabled pins + //external interrupts could be enalbed in any pin, except same port numbers (PA4,PE4) + pinFlex = PD4; // Flex sensor (Must be external interrupt enabled) + pinTrigger = PD13; //The CAS pin + pinTrigger2 = PD14; //The Cam Sensor pin + break; + + case 20: + //Pin mappings as per the v0.4 shield + + //Black F407VE http://wiki.stm32duino.com/index.php?title=STM32F407 + //PC8~PC12 SDio + + //PA9..PA10 Serial1 + //PA11..PA12 USB + //PA13..PA15 & PB4 SWD(debug) pins + //PB0 EEPROM CS pin + //PB1 LCD + //PB2 BOOT1 + //PB3..PB5 SPI interface + //PB6..PB8 NRF interface + + //PD5 & PD6 Serial2 + pinInjector1 = PA1; //Output pin injector 1 is on + pinInjector2 = PA2; //Output pin injector 2 is on + pinInjector3 = PA3; //Output pin injector 3 is on + pinInjector4 = PA4; //Output pin injector 4 is on + pinInjector5 = PA5; //Output pin injector 5 is on + pinInjector6 = PD4; //Output pin injector 6 is on + pinCoil1 = PD7; //Pin for coil 1 + pinCoil2 = PB9; //Pin for coil 2 + pinCoil3 = PA8; //Pin for coil 3 + pinCoil4 = PB10; //Pin for coil 4 + pinCoil5 = PB11; //Pin for coil 5 + pinMAP = PC0; //MAP sensor pin + pinTPS = PC1;//TPS input pin + pinIAT = PC2; //IAT sensor pin + pinCLT = PC3; //CLS sensor pin + pinO2 = PC5; //O2 Sensor pin + pinBat = PB1; //Battery reference voltage pin + pinBaro = PC4; + pinIdle1 = PB12; //Single wire idle control + pinIdle2 = PB11; //2 wire idle control + pinBoost = PC7; //Boost control + pinVVT_1 = PD3; //Default VVT output + pinStepperDir = PE0; //Direction pin for DRV8825 driver + pinStepperStep = PE1; //Step pin for DRV8825 driver + pinStepperEnable = PE2; //Enable pin for DRV8825 + pinDisplayReset = PE5; // OLED reset pin + pinFan = PE6; //Pin for the fan output + + pinFuelPump = PA6; //Fuel pump output + pinTachOut = PD15; //Tacho output pin + // pinLaunch = 51; //Can be overwritten below + // pinResetControl = 43; //Reset control output + + //external interrupt enabled pins + //external interrupts could be enalbed in any pin, except same port numbers (PA4,PE4) + pinFlex = PD4; // Flex sensor (Must be external interrupt enabled) + pinTrigger = PD13; //The CAS pin + pinTrigger2 = PD14; //The Cam Sensor pin + break; + + case 30: + //Pin mappings as per the v0.4 shield + + //Black F407VE http://wiki.stm32duino.com/index.php?title=STM32F407 + //PC8~PC12 SDio + + //PA9..PA10 Serial1 + //PA11..PA12 USB + //PA13..PA15 & PB4 SWD(debug) pins + //PB0 EEPROM CS pin + //PB1 LCD + //PB2 BOOT1 + //PB3..PB5 SPI interface + //PB6..PB8 NRF interface + + //PD5 & PD6 Serial2 + pinInjector1 = PA1; //Output pin injector 1 is on + pinInjector2 = PA2; //Output pin injector 2 is on + pinInjector3 = PA3; //Output pin injector 3 is on + pinInjector4 = PA4; //Output pin injector 4 is on + pinInjector5 = PA5; //Output pin injector 5 is on + pinInjector6 = PD4; //Output pin injector 6 is on + pinCoil1 = PD7; //Pin for coil 1 + pinCoil2 = PB9; //Pin for coil 2 + pinCoil3 = PA8; //Pin for coil 3 + pinCoil4 = PB10; //Pin for coil 4 + pinCoil5 = PB11; //Pin for coil 5 + pinMAP = PC0; //MAP sensor pin + pinTPS = PC1;//TPS input pin + pinIAT = PC2; //IAT sensor pin + pinCLT = PC3; //CLS sensor pin + pinO2 = PC5; //O2 Sensor pin + pinBat = PB1; //Battery reference voltage pin + pinBaro = PC4; + pinIdle1 = PB12; //Single wire idle control + pinIdle2 = PB11; //2 wire idle control + pinBoost = PC7; //Boost control + pinVVT_1 = PD3; //Default VVT output + pinStepperDir = PE0; //Direction pin for DRV8825 driver + pinStepperStep = PE1; //Step pin for DRV8825 driver + pinStepperEnable = PE2; //Enable pin for DRV8825 + pinDisplayReset = PE5; // OLED reset pin + pinFan = PE6; //Pin for the fan output + + pinFuelPump = PA6; //Fuel pump output + pinTachOut = PD15; //Tacho output pin + // pinLaunch = 51; //Can be overwritten below + // pinResetControl = 43; //Reset control output + + //external interrupt enabled pins + //external interrupts could be enalbed in any pin, except same port numbers (PA4,PE4) + pinFlex = PD4; // Flex sensor (Must be external interrupt enabled) + pinTrigger = PD13; //The CAS pin + pinTrigger2 = PD14; //The Cam Sensor pin + break; + + case 40: + //Pin mappings as per the v0.4 shield + + //Black F407VE http://wiki.stm32duino.com/index.php?title=STM32F407 + //PC8~PC12 SDio + + //PA9..PA10 Serial1 + //PA11..PA12 USB + //PA13..PA15 & PB4 SWD(debug) pins + //PB0 EEPROM CS pin + //PB1 LCD + //PB2 BOOT1 + //PB3..PB5 SPI interface + //PB6..PB8 NRF interface + + //PD5 & PD6 Serial2 + pinInjector1 = PA1; //Output pin injector 1 is on + pinInjector2 = PA2; //Output pin injector 2 is on + pinInjector3 = PA3; //Output pin injector 3 is on + pinInjector4 = PA4; //Output pin injector 4 is on + pinInjector5 = PA5; //Output pin injector 5 is on + pinInjector6 = PD4; //Output pin injector 6 is on + pinCoil1 = PD7; //Pin for coil 1 + pinCoil2 = PB9; //Pin for coil 2 + pinCoil3 = PA8; //Pin for coil 3 + pinCoil4 = PB10; //Pin for coil 4 + pinCoil5 = PB11; //Pin for coil 5 + pinMAP = PC0; //MAP sensor pin + pinTPS = PC1;//TPS input pin + pinIAT = PC2; //IAT sensor pin + pinCLT = PC3; //CLS sensor pin + pinO2 = PC5; //O2 Sensor pin + pinBat = PB1; //Battery reference voltage pin + pinBaro = PC4; + pinIdle1 = PB12; //Single wire idle control + pinIdle2 = PB11; //2 wire idle control + pinBoost = PC7; //Boost control + pinVVT_1 = PD3; //Default VVT output + pinStepperDir = PE0; //Direction pin for DRV8825 driver + pinStepperStep = PE1; //Step pin for DRV8825 driver + pinStepperEnable = PE2; //Enable pin for DRV8825 + pinDisplayReset = PE5; // OLED reset pin + pinFan = PE6; //Pin for the fan output + + pinFuelPump = PA6; //Fuel pump output + pinTachOut = PD15; //Tacho output pin + // pinLaunch = 51; //Can be overwritten below + // pinResetControl = 43; //Reset control output + + //external interrupt enabled pins + //external interrupts could be enalbed in any pin, except same port numbers (PA4,PE4) + pinFlex = PD4; // Flex sensor (Must be external interrupt enabled) + pinTrigger = PD13; //The CAS pin + pinTrigger2 = PD14; //The Cam Sensor pin + + case 41: + //Pin mappings as per the v0.4 shield + + //Black F407VE http://wiki.stm32duino.com/index.php?title=STM32F407 + //PC8~PC12 SDio + + //PA9..PA10 Serial1 + //PA11..PA12 USB + //PA13..PA15 & PB4 SWD(debug) pins + //PB0 EEPROM CS pin + //PB1 LCD + //PB2 BOOT1 + //PB3..PB5 SPI interface + //PB6..PB8 NRF interface + + //PD5 & PD6 Serial2 + pinInjector1 = PA1; //Output pin injector 1 is on + pinInjector2 = PA2; //Output pin injector 2 is on + pinInjector3 = PA3; //Output pin injector 3 is on + pinInjector4 = PA4; //Output pin injector 4 is on + pinInjector5 = PA5; //Output pin injector 5 is on + pinInjector6 = PD4; //Output pin injector 6 is on + pinCoil1 = PD7; //Pin for coil 1 + pinCoil2 = PB9; //Pin for coil 2 + pinCoil3 = PA8; //Pin for coil 3 + pinCoil4 = PB10; //Pin for coil 4 + pinCoil5 = PB11; //Pin for coil 5 + pinMAP = PC0; //MAP sensor pin + pinTPS = PC1;//TPS input pin + pinIAT = PC2; //IAT sensor pin + pinCLT = PC3; //CLS sensor pin + pinO2 = PC5; //O2 Sensor pin + pinBat = PB1; //Battery reference voltage pin + pinBaro = PC4; + pinIdle1 = PB12; //Single wire idle control + pinIdle2 = PB11; //2 wire idle control + pinBoost = PC7; //Boost control + pinVVT_1 = PD3; //Default VVT output + pinStepperDir = PE0; //Direction pin for DRV8825 driver + pinStepperStep = PE1; //Step pin for DRV8825 driver + pinStepperEnable = PE2; //Enable pin for DRV8825 + pinDisplayReset = PE5; // OLED reset pin + pinFan = PE6; //Pin for the fan output + + pinFuelPump = PA6; //Fuel pump output + pinTachOut = PD15; //Tacho output pin + // pinLaunch = 51; //Can be overwritten below + // pinResetControl = 43; //Reset control output + + //external interrupt enabled pins + //external interrupts could be enalbed in any pin, except same port numbers (PA4,PE4) + pinFlex = PD4; // Flex sensor (Must be external interrupt enabled) + pinTrigger = PD13; //The CAS pin + pinTrigger2 = PD14; //The Cam Sensor pin + break; + + default: + //Pin mappings as per the v0.4 shield + + //Black F407VE http://wiki.stm32duino.com/index.php?title=STM32F407 + //PC8~PC12 SDio + + //PA9..PA10 Serial1 + //PA11..PA12 USB + //PA13..PA15 & PB4 SWD(debug) pins + //PB0 EEPROM CS pin + //PB1 LCD + //PB2 BOOT1 + //PB3..PB5 SPI interface + //PB6..PB8 NRF interface + + //PD5 & PD6 Serial2 + pinInjector1 = PA1; //Output pin injector 1 is on + pinInjector2 = PA2; //Output pin injector 2 is on + pinInjector3 = PA3; //Output pin injector 3 is on + pinInjector4 = PA4; //Output pin injector 4 is on + pinInjector5 = PA5; //Output pin injector 5 is on + pinInjector6 = PD4; //Output pin injector 6 is on + pinCoil1 = PD7; //Pin for coil 1 + pinCoil2 = PB9; //Pin for coil 2 + pinCoil3 = PA8; //Pin for coil 3 + pinCoil4 = PB10; //Pin for coil 4 + pinCoil5 = PB11; //Pin for coil 5 + pinMAP = PC0; //MAP sensor pin + pinTPS = PC1;//TPS input pin + pinIAT = PC2; //IAT sensor pin + pinCLT = PC3; //CLS sensor pin + pinO2 = PC5; //O2 Sensor pin + pinBat = PB1; //Battery reference voltage pin + pinBaro = PC4; + pinIdle1 = PB12; //Single wire idle control + pinIdle2 = PB11; //2 wire idle control + pinBoost = PC7; //Boost control + pinVVT_1 = PD3; //Default VVT output + pinStepperDir = PE0; //Direction pin for DRV8825 driver + pinStepperStep = PE1; //Step pin for DRV8825 driver + pinStepperEnable = PE2; //Enable pin for DRV8825 + pinDisplayReset = PE5; // OLED reset pin + pinFan = PE6; //Pin for the fan output + + pinFuelPump = PA6; //Fuel pump output + pinTachOut = PD15; //Tacho output pin + // pinLaunch = 51; //Can be overwritten below + // pinResetControl = 43; //Reset control output + + //external interrupt enabled pins + //external interrupts could be enalbed in any pin, except same port numbers (PA4,PE4) + pinFlex = PD4; // Flex sensor (Must be external interrupt enabled) + pinTrigger = PD13; //The CAS pin + pinTrigger2 = PD14; //The Cam Sensor pin + break; + } + + //Setup any devices that are using selectable pins + + if ( (configPage6.launchPin != 0) && (configPage6.launchPin < BOARD_NR_GPIO_PINS) ) { pinLaunch = pinTranslate(configPage6.launchPin); } + if ( (configPage4.ignBypassPin != 0) && (configPage4.ignBypassPin < BOARD_NR_GPIO_PINS) ) { pinIgnBypass = pinTranslate(configPage4.ignBypassPin); } + if ( (configPage2.tachoPin != 0) && (configPage2.tachoPin < BOARD_NR_GPIO_PINS) ) { pinTachOut = pinTranslate(configPage2.tachoPin); } + if ( (configPage4.fuelPumpPin != 0) && (configPage4.fuelPumpPin < BOARD_NR_GPIO_PINS) ) { pinFuelPump = pinTranslate(configPage4.fuelPumpPin); } + if ( (configPage6.fanPin != 0) && (configPage6.fanPin < BOARD_NR_GPIO_PINS) ) { pinFan = pinTranslate(configPage6.fanPin); } + if ( (configPage6.boostPin != 0) && (configPage6.boostPin < BOARD_NR_GPIO_PINS) ) { pinBoost = pinTranslate(configPage6.boostPin); } + if ( (configPage6.vvtPin != 0) && (configPage6.vvtPin < BOARD_NR_GPIO_PINS) ) { pinVVT_1 = pinTranslate(configPage6.vvtPin); } + if ( (configPage6.useExtBaro != 0) && (configPage6.baroPin < BOARD_NR_GPIO_PINS) ) { pinBaro = configPage6.baroPin + A0; } + if ( (configPage6.useEMAP != 0) && (configPage10.EMAPPin < BOARD_NR_GPIO_PINS) ) { pinEMAP = configPage10.EMAPPin + A0; } + + //Currently there's no default pin for Idle Up + pinIdleUp = pinTranslate(configPage2.idleUpPin); + + /* Reset control is a special case. If reset control is enabled, it needs its initial state set BEFORE its pinMode. + If that doesn't happen and reset control is in "Serial Command" mode, the Arduino will end up in a reset loop + because the control pin will go low as soon as the pinMode is set to OUTPUT. */ + if ( (configPage4.resetControl != 0) && (configPage4.resetControlPin < BOARD_NR_GPIO_PINS) ) + { + resetControl = configPage4.resetControl; + pinResetControl = pinTranslate(configPage4.resetControlPin); + setResetControlPinState(); + pinMode(pinResetControl, OUTPUT); + } + + //Finally, set the relevant pin modes for outputs + pinMode(pinCoil1, OUTPUT); + pinMode(pinCoil2, OUTPUT); + pinMode(pinCoil3, OUTPUT); + pinMode(pinCoil4, OUTPUT); + pinMode(pinCoil5, OUTPUT); + pinMode(pinInjector1, OUTPUT); + pinMode(pinInjector2, OUTPUT); + pinMode(pinInjector3, OUTPUT); + pinMode(pinInjector4, OUTPUT); + pinMode(pinInjector5, OUTPUT); + pinMode(pinTachOut, OUTPUT); + pinMode(pinIdle1, OUTPUT); + pinMode(pinIdle2, OUTPUT); + pinMode(pinFuelPump, OUTPUT); + pinMode(pinIgnBypass, OUTPUT); + pinMode(pinFan, OUTPUT); + pinMode(pinStepperDir, OUTPUT); + pinMode(pinStepperStep, OUTPUT); + pinMode(pinStepperEnable, OUTPUT); + pinMode(pinBoost, OUTPUT); + pinMode(pinVVT_1, OUTPUT); + + inj1_pin_port = portOutputRegister(digitalPinToPort(pinInjector1)); + inj1_pin_mask = digitalPinToBitMask(pinInjector1); + inj2_pin_port = portOutputRegister(digitalPinToPort(pinInjector2)); + inj2_pin_mask = digitalPinToBitMask(pinInjector2); + inj3_pin_port = portOutputRegister(digitalPinToPort(pinInjector3)); + inj3_pin_mask = digitalPinToBitMask(pinInjector3); + inj4_pin_port = portOutputRegister(digitalPinToPort(pinInjector4)); + inj4_pin_mask = digitalPinToBitMask(pinInjector4); + inj5_pin_port = portOutputRegister(digitalPinToPort(pinInjector5)); + inj5_pin_mask = digitalPinToBitMask(pinInjector5); + inj6_pin_port = portOutputRegister(digitalPinToPort(pinInjector6)); + inj6_pin_mask = digitalPinToBitMask(pinInjector6); + inj7_pin_port = portOutputRegister(digitalPinToPort(pinInjector7)); + inj7_pin_mask = digitalPinToBitMask(pinInjector7); + inj8_pin_port = portOutputRegister(digitalPinToPort(pinInjector8)); + inj8_pin_mask = digitalPinToBitMask(pinInjector8); + + ign1_pin_port = portOutputRegister(digitalPinToPort(pinCoil1)); + ign1_pin_mask = digitalPinToBitMask(pinCoil1); + ign2_pin_port = portOutputRegister(digitalPinToPort(pinCoil2)); + ign2_pin_mask = digitalPinToBitMask(pinCoil2); + ign3_pin_port = portOutputRegister(digitalPinToPort(pinCoil3)); + ign3_pin_mask = digitalPinToBitMask(pinCoil3); + ign4_pin_port = portOutputRegister(digitalPinToPort(pinCoil4)); + ign4_pin_mask = digitalPinToBitMask(pinCoil4); + ign5_pin_port = portOutputRegister(digitalPinToPort(pinCoil5)); + ign5_pin_mask = digitalPinToBitMask(pinCoil5); + ign6_pin_port = portOutputRegister(digitalPinToPort(pinCoil6)); + ign6_pin_mask = digitalPinToBitMask(pinCoil6); + ign7_pin_port = portOutputRegister(digitalPinToPort(pinCoil7)); + ign7_pin_mask = digitalPinToBitMask(pinCoil7); + ign8_pin_port = portOutputRegister(digitalPinToPort(pinCoil8)); + ign8_pin_mask = digitalPinToBitMask(pinCoil8); + + tach_pin_port = portOutputRegister(digitalPinToPort(pinTachOut)); + tach_pin_mask = digitalPinToBitMask(pinTachOut); + pump_pin_port = portOutputRegister(digitalPinToPort(pinFuelPump)); + pump_pin_mask = digitalPinToBitMask(pinFuelPump); + + //And for inputs + pinMode(pinMAP, INPUT); + pinMode(pinO2, INPUT); + pinMode(pinO2_2, INPUT); + pinMode(pinTPS, INPUT); + pinMode(pinIAT, INPUT); + pinMode(pinCLT, INPUT); + pinMode(pinBat, INPUT); + pinMode(pinBaro, INPUT); + + pinMode(pinTrigger, INPUT); + pinMode(pinTrigger2, INPUT); + pinMode(pinTrigger3, INPUT); + + //Each of the below are only set when their relevant function is enabled. This can help prevent pin conflicts that users aren't aware of with unused functions + if(configPage2.flexEnabled > 0) + { + pinMode(pinFlex, INPUT); //Standard GM / Continental flex sensor requires pullup, but this should be onboard. The internal pullup will not work (Requires ~3.3k)! + } + if(configPage6.launchEnabled > 0) + { + if (configPage6.lnchPullRes == true) { pinMode(pinLaunch, INPUT_PULLUP); } + else { pinMode(pinLaunch, INPUT); } //If Launch Pull Resistor is not set make input float. + } + if(configPage2.idleUpEnabled > 0) + { + if (configPage2.idleUpPolarity == 0) { pinMode(pinIdleUp, INPUT_PULLUP); } //Normal setting + else { pinMode(pinIdleUp, INPUT); } //inverted setting + } + + + //These must come after the above pinMode statements + triggerPri_pin_port = portInputRegister(digitalPinToPort(pinTrigger)); + triggerPri_pin_mask = digitalPinToBitMask(pinTrigger); + triggerSec_pin_port = portInputRegister(digitalPinToPort(pinTrigger2)); + triggerSec_pin_mask = digitalPinToBitMask(pinTrigger2); + + //Set default values + digitalWrite(pinMAP, HIGH); + //digitalWrite(pinO2, LOW); + digitalWrite(pinTPS, LOW); + +} +#endif diff --git a/speeduino/globals.h b/speeduino/globals.h index f25f4bbf..3bef76d8 100644 --- a/speeduino/globals.h +++ b/speeduino/globals.h @@ -32,14 +32,15 @@ #define LED_BUILTIN PB1 //Maple Mini #endif #elif defined(ARDUINO_BLACK_F407VE) || defined(STM32F4) + #define BOARD_H "board_stm32F407VE.h" #define BOARD_DIGITAL_GPIO_PINS 80 #define BOARD_NR_GPIO_PINS 80 //These boards always make 8/8 channels available #undef INJ_CHANNELS #undef IGN_CHANNELS - #define INJ_CHANNELS 4 - #define IGN_CHANNELS 4 + #define INJ_CHANNELS 8 + #define IGN_CHANNELS 8 #endif //Specific mode for Bluepill due to its small flash size. This disables a number of strings from being compiled into the flash From a54fec295997a8b92e6f6771ccea222aba3d8d40 Mon Sep 17 00:00:00 2001 From: Josh Stewart Date: Sat, 23 Feb 2019 14:41:06 +1100 Subject: [PATCH 11/51] March dev signatures --- reference/speeduino.ini | 2 +- speeduino/comms.ino | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/reference/speeduino.ini b/reference/speeduino.ini index a158777b..7dbefc6b 100644 --- a/reference/speeduino.ini +++ b/reference/speeduino.ini @@ -6,7 +6,7 @@ MTversion = 2.25 queryCommand = "Q" - signature = "speeduino 201902" + signature = "speeduino 201903-dev" versionInfo = "S" ;This info is what is displayed to user [TunerStudio] diff --git a/speeduino/comms.ino b/speeduino/comms.ino index 3a16e80e..eab3a49d 100644 --- a/speeduino/comms.ino +++ b/speeduino/comms.ino @@ -195,7 +195,7 @@ void command() break; case 'Q': // send code version - Serial.print(F("speeduino 201902")); + Serial.print(F("speeduino 201903-dev")); break; case 'r': //New format for the optimised OutputChannels @@ -225,7 +225,7 @@ void command() break; case 'S': // send code version - Serial.print(F("Speeduino 2019.02")); + Serial.print(F("Speeduino 2019.03-dev")); currentStatus.secl = 0; //This is required in TS3 due to its stricter timings break; From e397ab4d75c857d41168d8a2b9c97a5bb0483bb8 Mon Sep 17 00:00:00 2001 From: Josh Stewart Date: Sat, 23 Feb 2019 15:11:29 +1100 Subject: [PATCH 12/51] Fix for potential bad unsigned int division on dual / missing tooth new ign mode --- speeduino/decoders.ino | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/speeduino/decoders.ino b/speeduino/decoders.ino index 60af9c14..c17007c0 100644 --- a/speeduino/decoders.ino +++ b/speeduino/decoders.ino @@ -434,22 +434,22 @@ void triggerSetEndTeeth_missingTooth() byte toothAdder = 0; if( (configPage4.sparkMode == IGN_MODE_SEQUENTIAL) && (configPage4.TrigSpeed == CRANK_SPEED) ) { toothAdder = configPage4.triggerTeeth; } - ignition1EndTooth = ( (ignition1EndAngle - configPage4.triggerAngle) / triggerToothAngle ) - 1; + ignition1EndTooth = ( (ignition1EndAngle - configPage4.triggerAngle) / (int16_t)(triggerToothAngle) ) - 1; if(ignition1EndTooth > (configPage4.triggerTeeth + toothAdder)) { ignition1EndTooth -= (configPage4.triggerTeeth + toothAdder); } if(ignition1EndTooth <= 0) { ignition1EndTooth += (configPage4.triggerTeeth + toothAdder); } if(ignition1EndTooth > (triggerActualTeeth + toothAdder)) { ignition1EndTooth = (triggerActualTeeth + toothAdder); } - ignition2EndTooth = ( (ignition2EndAngle - configPage4.triggerAngle) / triggerToothAngle ) - 1; + ignition2EndTooth = ( (ignition2EndAngle - configPage4.triggerAngle) / (int16_t)(triggerToothAngle) ) - 1; if(ignition2EndTooth > (configPage4.triggerTeeth + toothAdder)) { ignition2EndTooth -= (configPage4.triggerTeeth + toothAdder); } if(ignition2EndTooth <= 0) { ignition2EndTooth += (configPage4.triggerTeeth + toothAdder); } if(ignition2EndTooth > (triggerActualTeeth + toothAdder)) { ignition2EndTooth = (triggerActualTeeth + toothAdder); } - ignition3EndTooth = ( (ignition3EndAngle - configPage4.triggerAngle) / triggerToothAngle ) - 1; + ignition3EndTooth = ( (ignition3EndAngle - configPage4.triggerAngle) / (int16_t)(triggerToothAngle) ) - 1; if(ignition3EndTooth > (configPage4.triggerTeeth + toothAdder)) { ignition3EndTooth -= (configPage4.triggerTeeth + toothAdder); } if(ignition3EndTooth <= 0) { ignition3EndTooth += (configPage4.triggerTeeth + toothAdder); } if(ignition3EndTooth > (triggerActualTeeth + toothAdder)) { ignition3EndTooth = (triggerActualTeeth + toothAdder); } - ignition4EndTooth = ( (ignition4EndAngle - configPage4.triggerAngle) / triggerToothAngle ) - 1; + ignition4EndTooth = ( (ignition4EndAngle - configPage4.triggerAngle) / (int16_t)(triggerToothAngle) ) - 1; if(ignition4EndTooth > (configPage4.triggerTeeth + toothAdder)) { ignition4EndTooth -= (configPage4.triggerTeeth + toothAdder); } if(ignition4EndTooth <= 0) { ignition4EndTooth += (configPage4.triggerTeeth + toothAdder); } if(ignition4EndTooth > (triggerActualTeeth + toothAdder)) { ignition4EndTooth = (triggerActualTeeth + toothAdder); } @@ -592,22 +592,22 @@ void triggerSetEndTeeth_DualWheel() byte toothAdder = 0; if( (configPage4.sparkMode == IGN_MODE_SEQUENTIAL) && (configPage4.TrigSpeed == CRANK_SPEED) ) { toothAdder = configPage4.triggerTeeth; } - ignition1EndTooth = ( (ignition1EndAngle - configPage4.triggerAngle) / triggerToothAngle ) - 1; + ignition1EndTooth = ( (ignition1EndAngle - configPage4.triggerAngle) / (int16_t)(triggerToothAngle) ) - 1; if(ignition1EndTooth > (configPage4.triggerTeeth + toothAdder)) { ignition1EndTooth -= (configPage4.triggerTeeth + toothAdder); } if(ignition1EndTooth <= 0) { ignition1EndTooth += configPage4.triggerTeeth; } if(ignition1EndTooth > (triggerActualTeeth + toothAdder)) { ignition1EndTooth = (triggerActualTeeth + toothAdder); } - ignition2EndTooth = ( (ignition2EndAngle - configPage4.triggerAngle) / triggerToothAngle ) - 1; + ignition2EndTooth = ( (ignition2EndAngle - configPage4.triggerAngle) / (int16_t)(triggerToothAngle) ) - 1; if(ignition2EndTooth > (configPage4.triggerTeeth + toothAdder)) { ignition2EndTooth -= (configPage4.triggerTeeth + toothAdder); } if(ignition2EndTooth <= 0) { ignition2EndTooth += configPage4.triggerTeeth; } if(ignition1EndTooth > (triggerActualTeeth + toothAdder)) { ignition3EndTooth = (triggerActualTeeth + toothAdder); } - ignition3EndTooth = ( (ignition3EndAngle - configPage4.triggerAngle) / triggerToothAngle ) - 1; + ignition3EndTooth = ( (ignition3EndAngle - configPage4.triggerAngle) / (int16_t)(triggerToothAngle) ) - 1; if(ignition3EndTooth > (configPage4.triggerTeeth + toothAdder)) { ignition3EndTooth -= (configPage4.triggerTeeth + toothAdder); } if(ignition3EndTooth <= 0) { ignition3EndTooth += configPage4.triggerTeeth; } if(ignition3EndTooth > (triggerActualTeeth + toothAdder)) { ignition3EndTooth = (triggerActualTeeth + toothAdder); } - ignition4EndTooth = ( (ignition4EndAngle - configPage4.triggerAngle) / triggerToothAngle ) - 1; + ignition4EndTooth = ( (ignition4EndAngle - configPage4.triggerAngle) / (int16_t)(triggerToothAngle) ) - 1; if(ignition4EndTooth > (configPage4.triggerTeeth + toothAdder)) { ignition4EndTooth -= (configPage4.triggerTeeth + toothAdder); } if(ignition4EndTooth <= 0) { ignition4EndTooth += configPage4.triggerTeeth; } if(ignition4EndTooth > (triggerActualTeeth + toothAdder)) { ignition4EndTooth = (triggerActualTeeth + toothAdder); } From 8577ef0a153d54cf3e2ae608613db5c50f531e9a Mon Sep 17 00:00:00 2001 From: hoogendijkta Date: Sat, 23 Feb 2019 15:35:06 +0100 Subject: [PATCH 13/51] working on stm32F407, sequential setting not completly correct yet --- speeduino/board_stm32.h | 220 ++++++++++++++++++++++++-------- speeduino/board_stm32.ino | 176 ++++++++++++------------- speeduino/board_stm32F407VE.h | 167 ++++++++++++------------ speeduino/board_stm32F407VE.ino | 10 +- speeduino/board_teensy35.ino | 1 + speeduino/cancomms.h | 5 +- 6 files changed, 344 insertions(+), 235 deletions(-) diff --git a/speeduino/board_stm32.h b/speeduino/board_stm32.h index 63ccb09c..8e062025 100644 --- a/speeduino/board_stm32.h +++ b/speeduino/board_stm32.h @@ -2,61 +2,88 @@ #define STM32_H #if defined(CORE_STM32) && !defined(ARDUINO_BLACK_F407VE) -#if defined(STM32F4) - //These should really be in the stm32GENERIC libs, but for somereason they only have timers 1-4 -// #include -// #include "src/HardwareTimers/HardwareTimer.h" -// HardwareTimer Timer5(TIM5, chip_tim5, sizeof(chip_tim5) / sizeof(chip_tim5[0])); -// HardwareTimer Timer8(TIM8, chip_tim8, sizeof(chip_tim8) / sizeof(chip_tim8[0])); -#else - #include "HardwareTimer.h" -#endif - /* *********************************************************************************************************** * General */ #define PORT_TYPE uint8_t #define micros_safe() micros() //timer5 method is not used on anything but AVR, the micros_safe() macro is simply an alias for the normal micros() - #define USE_SERIAL3 void initBoard(); uint16_t freeRam(); -// extern void oneMSIntervalIRQ(stimer_t *Timer); - - extern void EmptyIRQCallback(stimer_t *Timer, uint32_t channel); + #if defined(USE_STM32GENERIC) #define Serial Serial1 #endif - /* + //Much of the below is not correct, but included to allow compilation + //STM32F1/variants/.../board.cpp + #if defined (STM32F4) + #define A0 PA0 + #define A1 PA1 + #define A2 PA2 + #define A3 PA3 + #define A4 PA4 + #define A5 PA5 + #define A6 PA6 + #define A7 PA7 + #define A8 PB0 + #define A9 PB1 + #define A10 PC0 + #define A11 PC1 + #define A12 PC2 + #define A13 PC3 + #define A14 PC4 + #define A15 PC5 + #else + #define A0 PB0 + #define A1 PA7 + #define A2 PA6 + #define A3 PA5 + #define A4 PA4 + #define A5 PA3 + #define A6 PA2 + #define A7 PA1 + #define A8 PA0 + //STM32F1 have only 9 12bit adc + #define A9 PB0 + #define A10 PA7 + #define A11 PA6 + #define A12 PA5 + #define A13 PA4 + #define A14 PA3 + #define A15 PA2 + #endif + + +/* *********************************************************************************************************** * Schedules */ - #define MAX_TIMER_PERIOD 65535 //The longest period of time (in uS) that the timer can permit (IN this case it is 65535 * 2, as each timer tick is 2uS) - #define MAX_TIMER_PERIOD_SLOW 65535 //The longest period of time (in uS) that the timer can permit (IN this case it is 65535 * 2, as each timer tick is 2uS) - #define uS_TO_TIMER_COMPARE(uS) (uS ) //Converts a given number of uS into the required number of timer ticks until that time has passed. - #define uS_TO_TIMER_COMPARE_SLOW(uS) (uS ) //Converts a given number of uS into the required number of timer ticks until that time has passed. + #define MAX_TIMER_PERIOD 131070 //The longest period of time (in uS) that the timer can permit (IN this case it is 65535 * 2, as each timer tick is 2uS) + #define MAX_TIMER_PERIOD_SLOW 131070 //The longest period of time (in uS) that the timer can permit (IN this case it is 65535 * 2, as each timer tick is 2uS) + #define uS_TO_TIMER_COMPARE(uS) (uS >> 1) //Converts a given number of uS into the required number of timer ticks until that time has passed. + #define uS_TO_TIMER_COMPARE_SLOW(uS) (uS >> 1) //Converts a given number of uS into the required number of timer ticks until that time has passed. + #if defined(ARDUINO_ARCH_STM32) // STM32GENERIC core + #define FUEL1_COUNTER (TIM2)->CNT + #define FUEL2_COUNTER (TIM2)->CNT + #define FUEL3_COUNTER (TIM2)->CNT + #define FUEL4_COUNTER (TIM2)->CNT - #define FUEL1_COUNTER (TIM3)->CNT - #define FUEL2_COUNTER (TIM3)->CNT - #define FUEL3_COUNTER (TIM3)->CNT - #define FUEL4_COUNTER (TIM3)->CNT + #define FUEL1_COMPARE (TIM2)->CCR1 + #define FUEL2_COMPARE (TIM2)->CCR2 + #define FUEL3_COMPARE (TIM2)->CCR3 + #define FUEL4_COMPARE (TIM2)->CCR4 - #define FUEL1_COMPARE (TIM3)->CCR1 - #define FUEL2_COMPARE (TIM3)->CCR2 - #define FUEL3_COMPARE (TIM3)->CCR3 - #define FUEL4_COMPARE (TIM3)->CCR4 + #define IGN1_COUNTER (TIM3)->CNT + #define IGN2_COUNTER (TIM3)->CNT + #define IGN3_COUNTER (TIM3)->CNT + #define IGN4_COUNTER (TIM3)->CNT - #define IGN1_COUNTER (TIM2)->CNT - #define IGN2_COUNTER (TIM2)->CNT - #define IGN3_COUNTER (TIM2)->CNT - #define IGN4_COUNTER (TIM2)->CNT - - #define IGN1_COMPARE (TIM2)->CCR1 - #define IGN2_COMPARE (TIM2)->CCR2 - #define IGN3_COMPARE (TIM2)->CCR3 - #define IGN4_COMPARE (TIM2)->CCR4 + #define IGN1_COMPARE (TIM3)->CCR1 + #define IGN2_COMPARE (TIM3)->CCR2 + #define IGN3_COMPARE (TIM3)->CCR3 + #define IGN4_COMPARE (TIM3)->CCR4 #ifndef SMALL_FLASH_MODE #define FUEL5_COUNTER (TIM5)->CNT @@ -78,27 +105,27 @@ #define IGN6_COMPARE (TIM4)->CCR2 #define IGN7_COMPARE (TIM4)->CCR3 #define IGN8_COMPARE (TIM4)->CCR4 - #endif + #endif //https://github.com/rogerclarkmelbourne/Arduino_STM32/blob/754bc2969921f1ef262bd69e7faca80b19db7524/STM32F1/system/libmaple/include/libmaple/timer.h#L444 - #define FUEL1_TIMER_ENABLE() (TIM3)->CCER |= TIM_CCER_CC1E - #define FUEL2_TIMER_ENABLE() (TIM3)->CCER |= TIM_CCER_CC2E - #define FUEL3_TIMER_ENABLE() (TIM3)->CCER |= TIM_CCER_CC3E - #define FUEL4_TIMER_ENABLE() (TIM3)->CCER |= TIM_CCER_CC4E + #define FUEL1_TIMER_ENABLE() (TIM2)->CCER |= TIM_CCER_CC1E + #define FUEL2_TIMER_ENABLE() (TIM2)->CCER |= TIM_CCER_CC2E + #define FUEL3_TIMER_ENABLE() (TIM2)->CCER |= TIM_CCER_CC3E + #define FUEL4_TIMER_ENABLE() (TIM2)->CCER |= TIM_CCER_CC4E - #define FUEL1_TIMER_DISABLE() (TIM3)->CCER &= ~TIM_CCER_CC1E - #define FUEL2_TIMER_DISABLE() (TIM3)->CCER &= ~TIM_CCER_CC2E - #define FUEL3_TIMER_DISABLE() (TIM3)->CCER &= ~TIM_CCER_CC3E - #define FUEL4_TIMER_DISABLE() (TIM3)->CCER &= ~TIM_CCER_CC4E + #define FUEL1_TIMER_DISABLE() (TIM2)->CCER &= ~TIM_CCER_CC1E + #define FUEL2_TIMER_DISABLE() (TIM2)->CCER &= ~TIM_CCER_CC2E + #define FUEL3_TIMER_DISABLE() (TIM2)->CCER &= ~TIM_CCER_CC3E + #define FUEL4_TIMER_DISABLE() (TIM2)->CCER &= ~TIM_CCER_CC4E - #define IGN1_TIMER_ENABLE() (TIM2)->CCER |= TIM_CCER_CC1E - #define IGN2_TIMER_ENABLE() (TIM2)->CCER |= TIM_CCER_CC2E - #define IGN3_TIMER_ENABLE() (TIM2)->CCER |= TIM_CCER_CC3E - #define IGN4_TIMER_ENABLE() (TIM2)->CCER |= TIM_CCER_CC4E + #define IGN1_TIMER_ENABLE() (TIM3)->CCER |= TIM_CCER_CC1E + #define IGN2_TIMER_ENABLE() (TIM3)->CCER |= TIM_CCER_CC2E + #define IGN3_TIMER_ENABLE() (TIM3)->CCER |= TIM_CCER_CC3E + #define IGN4_TIMER_ENABLE() (TIM3)->CCER |= TIM_CCER_CC4E - #define IGN1_TIMER_DISABLE() (TIM2)->CCER &= ~TIM_CCER_CC1E - #define IGN2_TIMER_DISABLE() (TIM2)->CCER &= ~TIM_CCER_CC2E - #define IGN3_TIMER_DISABLE() (TIM2)->CCER &= ~TIM_CCER_CC3E - #define IGN4_TIMER_DISABLE() (TIM2)->CCER &= ~TIM_CCER_CC4E + #define IGN1_TIMER_DISABLE() (TIM3)->CCER &= ~TIM_CCER_CC1E + #define IGN2_TIMER_DISABLE() (TIM3)->CCER &= ~TIM_CCER_CC2E + #define IGN3_TIMER_DISABLE() (TIM3)->CCER &= ~TIM_CCER_CC3E + #define IGN4_TIMER_DISABLE() (TIM3)->CCER &= ~TIM_CCER_CC4E #ifndef SMALL_FLASH_MODE #define FUEL5_TIMER_ENABLE() (TIM5)->CCER |= TIM_CCER_CC1E @@ -121,8 +148,91 @@ #define IGN7_TIMER_DISABLE() (TIM4)->CCER &= ~TIM_CCER_CC3E #define IGN8_TIMER_DISABLE() (TIM4)->CCER &= ~TIM_CCER_CC4E #endif - + #else //libmaple core aka STM32DUINO + #define FUEL1_COUNTER (TIMER2->regs).gen->CNT + #define FUEL2_COUNTER (TIMER2->regs).gen->CNT + #define FUEL3_COUNTER (TIMER2->regs).gen->CNT + #define FUEL4_COUNTER (TIMER2->regs).gen->CNT + #define FUEL1_COMPARE (TIMER2->regs).gen->CCR1 + #define FUEL2_COMPARE (TIMER2->regs).gen->CCR2 + #define FUEL3_COMPARE (TIMER2->regs).gen->CCR3 + #define FUEL4_COMPARE (TIMER2->regs).gen->CCR4 + + #define IGN1_COUNTER (TIMER3->regs).gen->CNT + #define IGN2_COUNTER (TIMER3->regs).gen->CNT + #define IGN3_COUNTER (TIMER3->regs).gen->CNT + #define IGN4_COUNTER (TIMER3->regs).gen->CNT + + #define IGN1_COMPARE (TIMER3->regs).gen->CCR1 + #define IGN2_COMPARE (TIMER3->regs).gen->CCR2 + #define IGN3_COMPARE (TIMER3->regs).gen->CCR3 + #define IGN4_COMPARE (TIMER3->regs).gen->CCR4 + + #ifndef SMALL_FLASH_MODE + #define FUEL5_COUNTER (TIMER5->regs).gen->CNT + #define FUEL6_COUNTER (TIMER5->regs).gen->CNT + #define FUEL7_COUNTER (TIMER5->regs).gen->CNT + #define FUEL8_COUNTER (TIMER5->regs).gen->CNT + + #define FUEL5_COMPARE (TIMER5->regs).gen->CCR1 + #define FUEL6_COMPARE (TIMER5->regs).gen->CCR2 + #define FUEL7_COMPARE (TIMER5->regs).gen->CCR3 + #define FUEL8_COMPARE (TIMER5->regs).gen->CCR4 + + #define IGN5_COUNTER (TIMER4->regs).gen->CNT + #define IGN6_COUNTER (TIMER4->regs).gen->CNT + #define IGN7_COUNTER (TIMER4->regs).gen->CNT + #define IGN8_COUNTER (TIMER4->regs).gen->CNT + + #define IGN5_COMPARE (TIMER4->regs).gen->CCR1 + #define IGN6_COMPARE (TIMER4->regs).gen->CCR2 + #define IGN7_COMPARE (TIMER4->regs).gen->CCR3 + #define IGN8_COMPARE (TIMER4->regs).gen->CCR4 + #endif + //https://github.com/rogerclarkmelbourne/Arduino_STM32/blob/754bc2969921f1ef262bd69e7faca80b19db7524/STM32F1/system/libmaple/include/libmaple/timer.h#L444 + #define FUEL1_TIMER_ENABLE() (TIMER2->regs).gen->CCER |= TIMER_CCER_CC1E + #define FUEL2_TIMER_ENABLE() (TIMER2->regs).gen->CCER |= TIMER_CCER_CC2E + #define FUEL3_TIMER_ENABLE() (TIMER2->regs).gen->CCER |= TIMER_CCER_CC3E + #define FUEL4_TIMER_ENABLE() (TIMER2->regs).gen->CCER |= TIMER_CCER_CC4E + + #define FUEL1_TIMER_DISABLE() (TIMER2->regs).gen->CCER &= ~TIMER_CCER_CC1E + #define FUEL2_TIMER_DISABLE() (TIMER2->regs).gen->CCER &= ~TIMER_CCER_CC2E + #define FUEL3_TIMER_DISABLE() (TIMER2->regs).gen->CCER &= ~TIMER_CCER_CC3E + #define FUEL4_TIMER_DISABLE() (TIMER2->regs).gen->CCER &= ~TIMER_CCER_CC4E + + #define IGN1_TIMER_DISABLE() (TIMER3->regs).gen->CCER &= ~TIMER_CCER_CC1E + #define IGN2_TIMER_DISABLE() (TIMER3->regs).gen->CCER &= ~TIMER_CCER_CC2E + #define IGN3_TIMER_DISABLE() (TIMER3->regs).gen->CCER &= ~TIMER_CCER_CC3E + #define IGN4_TIMER_DISABLE() (TIMER3->regs).gen->CCER &= ~TIMER_CCER_CC4E + + #define IGN1_TIMER_ENABLE() (TIMER3->regs).gen->CCER |= TIMER_CCER_CC1E + #define IGN2_TIMER_ENABLE() (TIMER3->regs).gen->CCER |= TIMER_CCER_CC2E + #define IGN3_TIMER_ENABLE() (TIMER3->regs).gen->CCER |= TIMER_CCER_CC3E + #define IGN4_TIMER_ENABLE() (TIMER3->regs).gen->CCER |= TIMER_CCER_CC4E + + #ifndef SMALL_FLASH_MODE + #define FUEL5_TIMER_ENABLE() (TIMER5->regs).gen->CCER |= TIMER_CCER_CC1E + #define FUEL6_TIMER_ENABLE() (TIMER5->regs).gen->CCER |= TIMER_CCER_CC2E + #define FUEL7_TIMER_ENABLE() (TIMER5->regs).gen->CCER |= TIMER_CCER_CC3E + #define FUEL8_TIMER_ENABLE() (TIMER5->regs).gen->CCER |= TIMER_CCER_CC4E + + #define IGN5_TIMER_ENABLE() (TIMER4->regs).gen->CCER |= TIMER_CCER_CC1E + #define IGN6_TIMER_ENABLE() (TIMER4->regs).gen->CCER |= TIMER_CCER_CC2E + #define IGN7_TIMER_ENABLE() (TIMER4->regs).gen->CCER |= TIMER_CCER_CC3E + #define IGN8_TIMER_ENABLE() (TIMER4->regs).gen->CCER |= TIMER_CCER_CC4E + + #define FUEL5_TIMER_DISABLE() (TIMER5->regs).gen->CCER &= ~TIMER_CCER_CC1E + #define FUEL6_TIMER_DISABLE() (TIMER5->regs).gen->CCER &= ~TIMER_CCER_CC2E + #define FUEL7_TIMER_DISABLE() (TIMER5->regs).gen->CCER &= ~TIMER_CCER_CC3E + #define FUEL8_TIMER_DISABLE() (TIMER5->regs).gen->CCER &= ~TIMER_CCER_CC4E + + #define IGN5_TIMER_DISABLE() (TIMER4->regs).gen->CCER &= ~TIMER_CCER_CC1E + #define IGN6_TIMER_DISABLE() (TIMER4->regs).gen->CCER &= ~TIMER_CCER_CC2E + #define IGN7_TIMER_DISABLE() (TIMER4->regs).gen->CCER &= ~TIMER_CCER_CC3E + #define IGN8_TIMER_DISABLE() (TIMER4->regs).gen->CCER &= ~TIMER_CCER_CC4E + #endif +#endif /* *********************************************************************************************************** @@ -182,4 +292,4 @@ */ #endif //CORE_STM32 -#endif //STM32_H +#endif //STM32_H \ No newline at end of file diff --git a/speeduino/board_stm32.ino b/speeduino/board_stm32.ino index 6c8a5ffb..0de8d8df 100644 --- a/speeduino/board_stm32.ino +++ b/speeduino/board_stm32.ino @@ -4,51 +4,22 @@ #include "auxiliaries.h" #include "idle.h" #include "scheduler.h" +#include "HardwareTimer.h" #if defined(STM32F4) - #define NR_OFF_TIMERS 9 - //stimer_t HardwareTimers[NR_OFF_TIMERS + 1]; - stimer_t HardwareTimers_1; - stimer_t HardwareTimers_2; - stimer_t HardwareTimers_3; - stimer_t HardwareTimers_4; - stimer_t HardwareTimers_5; - stimer_t HardwareTimers_8; - #define LED_BUILTIN PA7 //These should really be in the stm32GENERIC libs, but for somereason they only have timers 1-4 -// #include -// #include "src/HardwareTimers/HardwareTimer.h" -// HardwareTimer Timer5(TIM5, chip_tim5, sizeof(chip_tim5) / sizeof(chip_tim5[0])); -// HardwareTimer Timer8(TIM8, chip_tim8, sizeof(chip_tim8) / sizeof(chip_tim8[0])); -#else - #include "HardwareTimer.h" + #include + HardwareTimer Timer5(TIM5, chip_tim5, sizeof(chip_tim5) / sizeof(chip_tim5[0])); + HardwareTimer Timer8(TIM8, chip_tim8, sizeof(chip_tim8) / sizeof(chip_tim8[0])); #endif -extern void oneMSIntervalIRQ(stimer_t *Timer){oneMSInterval();} - -extern void EmptyIRQCallback(stimer_t *Timer, uint32_t channel){} - - - void initBoard() { - /* - * Initialize timers - */ - - HardwareTimers_1.timer = TIM1; - HardwareTimers_2.timer = TIM2; - HardwareTimers_3.timer = TIM3; - HardwareTimers_4.timer = TIM4; - - HardwareTimers_5.timer = TIM5; - HardwareTimers_8.timer = TIM8; - - /* *********************************************************************************************************** * General */ - #define FLASH_LENGTH 8192 + #define FLASH_LENGTH 8192 + /* *********************************************************************************************************** @@ -60,13 +31,10 @@ void initBoard() } //This must happen at the end of the idle init - TimerPulseInit(&HardwareTimers_1, 0xFFFF, 0, EmptyIRQCallback); - setTimerPrescalerRegister(&HardwareTimers_1, (uint32_t)(getTimerClkFreq(HardwareTimers_1.timer) / (500000)) - 1); - if(idle_pwm_max_count > 0) { attachIntHandleOC(&HardwareTimers_1, idleInterrupt, 4, 0);} //on first flash the configPage4.iacAlgorithm is invalid - //Timer1.setMode(4, TIMER_OUTPUT_COMPARE); + Timer1.setMode(4, TIMER_OUTPUT_COMPARE); //timer_set_mode(TIMER1, 4, TIMER_OUTPUT_COMPARE; - //if(idle_pwm_max_count > 0) { Timer1.attachInterrupt(4, idleInterrupt);} //on first flash the configPage4.iacAlgorithm is invalid - //Timer1.resume(); + if(idle_pwm_max_count > 0) { Timer1.attachInterrupt(4, idleInterrupt);} //on first flash the configPage4.iacAlgorithm is invalid + Timer1.resume(); /* @@ -74,8 +42,10 @@ void initBoard() * Timers */ #if defined(ARDUINO_BLACK_F407VE) || defined(STM32F4) || defined(_STM32F4_) - TimerHandleInit(&HardwareTimers_8, 1000, 168); - attachIntHandle(&HardwareTimers_8, oneMSIntervalIRQ); + Timer8.setPeriod(1000); // Set up period + Timer8.setMode(1, TIMER_OUTPUT_COMPARE); + Timer8.attachInterrupt(1, oneMSInterval); + Timer8.resume(); //Start Timer #else Timer4.setPeriod(1000); // Set up period Timer4.setMode(1, TIMER_OUTPUT_COMPARE); @@ -93,69 +63,102 @@ void initBoard() vvt_pwm_max_count = 1000000L / (2 * configPage6.vvtFreq * 2); //Converts the frequency in Hz to the number of ticks (at 2uS) it takes to complete 1 cycle //Need to be initialised last due to instant interrupt -// Timer1.setMode(2, TIMER_OUTPUT_COMPARE); -// Timer1.setMode(3, TIMER_OUTPUT_COMPARE); -// if(boost_pwm_max_count > 0) { Timer1.attachInterrupt(2, boostInterrupt);} -// if(vvt_pwm_max_count > 0) { Timer1.attachInterrupt(3, vvtInterrupt);} - if(idle_pwm_max_count > 0) { attachIntHandleOC(&HardwareTimers_1, boostInterrupt, 2, 0);} - if(vvt_pwm_max_count > 0) { attachIntHandleOC(&HardwareTimers_1, vvtInterrupt, 3, 0);} -// Timer1.resume(); - - TimerPulseInit(&HardwareTimers_3, 0xFFFF, 0, EmptyIRQCallback); - setTimerPrescalerRegister(&HardwareTimers_3, (uint32_t)(getTimerClkFreq(HardwareTimers_3.timer) / (1000000)) - 1); - attachIntHandleOC(&HardwareTimers_3, fuelSchedule1Interrupt, 1, 0); - attachIntHandleOC(&HardwareTimers_3, fuelSchedule2Interrupt, 2, 0); - attachIntHandleOC(&HardwareTimers_3, fuelSchedule3Interrupt, 3, 0); - attachIntHandleOC(&HardwareTimers_3, fuelSchedule4Interrupt, 4, 0); + Timer1.setMode(2, TIMER_OUTPUT_COMPARE); + Timer1.setMode(3, TIMER_OUTPUT_COMPARE); + if(boost_pwm_max_count > 0) { Timer1.attachInterrupt(2, boostInterrupt);} + if(vvt_pwm_max_count > 0) { Timer1.attachInterrupt(3, vvtInterrupt);} + Timer1.resume(); + + /* + *********************************************************************************************************** + * Schedules + */ + #if defined(ARDUINO_ARCH_STM32) // STM32GENERIC core + //see https://github.com/rogerclarkmelbourne/Arduino_STM32/blob/754bc2969921f1ef262bd69e7faca80b19db7524/STM32F1/system/libmaple/include/libmaple/timer.h#L444 + Timer1.setPrescaleFactor((HAL_RCC_GetHCLKFreq() * 2U)-1); //2us resolution + Timer2.setPrescaleFactor((HAL_RCC_GetHCLKFreq() * 2U)-1); //2us resolution + Timer3.setPrescaleFactor((HAL_RCC_GetHCLKFreq() * 2U)-1); //2us resolution + #else //libmaple core aka STM32DUINO + //see https://github.com/rogerclarkmelbourne/Arduino_STM32/blob/754bc2969921f1ef262bd69e7faca80b19db7524/STM32F1/system/libmaple/include/libmaple/timer.h#L444 + #if defined (STM32F1) || defined(__STM32F1__) + //(CYCLES_PER_MICROSECOND == 72, APB2 at 72MHz, APB1 at 36MHz). + //Timer2 to 4 is on APB1, Timer1 on APB2. http://www.st.com/resource/en/datasheet/stm32f103cb.pdf sheet 12 + Timer1.setPrescaleFactor((72 * 2U)-1); //2us resolution + Timer2.setPrescaleFactor((36 * 2U)-1); //2us resolution + Timer3.setPrescaleFactor((36 * 2U)-1); //2us resolution + #elif defined(STM32F4) + //(CYCLES_PER_MICROSECOND == 168, APB2 at 84MHz, APB1 at 42MHz). + //Timer2 to 14 is on APB1, Timers 1, 8, 9 and 10 on APB2. http://www.st.com/resource/en/datasheet/stm32f407vg.pdf sheet 120 + Timer1.setPrescaleFactor((84 * 2U)-1); //2us resolution + Timer2.setPrescaleFactor((42 * 2U)-1); //2us resolution + Timer3.setPrescaleFactor((42 * 2U)-1); //2us resolution + #endif + #endif + Timer2.setMode(1, TIMER_OUTPUT_COMPARE); + Timer2.setMode(2, TIMER_OUTPUT_COMPARE); + Timer2.setMode(3, TIMER_OUTPUT_COMPARE); + Timer2.setMode(4, TIMER_OUTPUT_COMPARE); + + Timer3.setMode(1, TIMER_OUTPUT_COMPARE); + Timer3.setMode(2, TIMER_OUTPUT_COMPARE); + Timer3.setMode(3, TIMER_OUTPUT_COMPARE); + Timer3.setMode(4, TIMER_OUTPUT_COMPARE); + Timer1.setMode(1, TIMER_OUTPUT_COMPARE); - TimerPulseInit(&HardwareTimers_2, 0xFFFF, 0, EmptyIRQCallback); - setTimerPrescalerRegister(&HardwareTimers_2, (uint32_t)(getTimerClkFreq(HardwareTimers_2.timer) / (1000000)) - 1); - attachIntHandleOC(&HardwareTimers_2, ignitionSchedule1Interrupt, 1, 0); - attachIntHandleOC(&HardwareTimers_2, ignitionSchedule2Interrupt, 2, 0); - attachIntHandleOC(&HardwareTimers_2, ignitionSchedule3Interrupt, 3, 0); - attachIntHandleOC(&HardwareTimers_2, ignitionSchedule4Interrupt, 4, 0); - //Attach interupt functions //Injection - - TimerPulseInit(&HardwareTimers_5, 0xFFFF, 0, EmptyIRQCallback); - setTimerPrescalerRegister(&HardwareTimers_5, (uint32_t)(getTimerClkFreq(HardwareTimers_5.timer) / (1000000)) - 1); + Timer2.attachInterrupt(1, fuelSchedule1Interrupt); + Timer2.attachInterrupt(2, fuelSchedule2Interrupt); + Timer2.attachInterrupt(3, fuelSchedule3Interrupt); + Timer2.attachInterrupt(4, fuelSchedule4Interrupt); #if (INJ_CHANNELS >= 5) - attachIntHandleOC(&HardwareTimers_5, fuelSchedule5Interrupt, 1, 0); - //Timer5.attachInterrupt(1, fuelSchedule5Interrupt); + Timer5.attachInterrupt(1, fuelSchedule5Interrupt); #endif #if (INJ_CHANNELS >= 6) - attachIntHandleOC(&HardwareTimers_5, fuelSchedule6Interrupt, 2, 0); - //Timer5.attachInterrupt(2, fuelSchedule6Interrupt); + Timer5.attachInterrupt(2, fuelSchedule6Interrupt); #endif #if (INJ_CHANNELS >= 7) - attachIntHandleOC(&HardwareTimers_5, fuelSchedule7Interrupt, 3, 0); - //Timer5.attachInterrupt(3, fuelSchedule7Interrupt); + Timer5.attachInterrupt(3, fuelSchedule7Interrupt); #endif #if (INJ_CHANNELS >= 8) - attachIntHandleOC(&HardwareTimers_5, fuelSchedule8Interrupt, 4, 0); - //Timer5.attachInterrupt(4, fuelSchedule8Interrupt); + Timer5.attachInterrupt(4, fuelSchedule8Interrupt); #endif - TimerPulseInit(&HardwareTimers_4, 0xFFFF, 0, EmptyIRQCallback); - setTimerPrescalerRegister(&HardwareTimers_4, (uint32_t)(getTimerClkFreq(HardwareTimers_4.timer) / (1000000)) - 1); + //Ignition + #if (IGN_CHANNELS >= 1) + Timer3.attachInterrupt(1, ignitionSchedule1Interrupt); + #endif + #if (IGN_CHANNELS >= 2) + Timer3.attachInterrupt(2, ignitionSchedule2Interrupt); + #endif + #if (IGN_CHANNELS >= 3) + Timer3.attachInterrupt(3, ignitionSchedule3Interrupt); + #endif + #if (IGN_CHANNELS >= 4) + Timer3.attachInterrupt(4, ignitionSchedule4Interrupt); + #endif #if (IGN_CHANNELS >= 5) - attachIntHandleOC(&HardwareTimers_4, ignitionSchedule5Interrupt, 1, 0); - //Timer4.attachInterrupt(1, ignitionSchedule5Interrupt); + Timer4.attachInterrupt(1, ignitionSchedule5Interrupt); #endif #if (IGN_CHANNELS >= 6) - attachIntHandleOC(&HardwareTimers_4, ignitionSchedule6Interrupt, 2, 0); - //Timer4.attachInterrupt(2, ignitionSchedule6Interrupt); + Timer4.attachInterrupt(2, ignitionSchedule6Interrupt); #endif #if (IGN_CHANNELS >= 7) - attachIntHandleOC(&HardwareTimers_4, ignitionSchedule7Interrupt, 3, 0); - //Timer4.attachInterrupt(3, ignitionSchedule7Interrupt); + Timer4.attachInterrupt(3, ignitionSchedule7Interrupt); #endif #if (IGN_CHANNELS >= 8) - attachIntHandleOC(&HardwareTimers_4, ignitionSchedule8Interrupt, 4, 0); - //Timer4.attachInterrupt(4, ignitionSchedule8Interrupt); + Timer4.attachInterrupt(4, ignitionSchedule8Interrupt); #endif + Timer1.resume(); + Timer2.resume(); + Timer3.resume(); + #if (IGN_CHANNELS >= 5) + Timer4.resume(); + #endif + #if (INJ_CHANNELS >= 5) + Timer5.resume(); + #endif } uint16_t freeRam() @@ -163,7 +166,6 @@ uint16_t freeRam() char top = 't'; return &top - reinterpret_cast(sbrk(0)); } - //pinmapping the STM32F407 for different boards, at this moment no board is desgined. //All boards are set to the default just to be sure. void setPinMapping(byte boardID) @@ -895,4 +897,4 @@ void setPinMapping(byte boardID) digitalWrite(pinTPS, LOW); } -#endif +#endif \ No newline at end of file diff --git a/speeduino/board_stm32F407VE.h b/speeduino/board_stm32F407VE.h index e0f4f10f..a506a8f4 100644 --- a/speeduino/board_stm32F407VE.h +++ b/speeduino/board_stm32F407VE.h @@ -15,100 +15,96 @@ // extern void oneMSIntervalIRQ(stimer_t *Timer); extern void EmptyIRQCallback(stimer_t *Timer, uint32_t channel); - #if defined(USE_STM32GENERIC) - #define Serial Serial1 - #endif - /* *********************************************************************************************************** * Schedules */ - #define MAX_TIMER_PERIOD 65535 //The longest period of time (in uS) that the timer can permit (IN this case it is 65535 * 2, as each timer tick is 2uS) - #define MAX_TIMER_PERIOD_SLOW 65535 //The longest period of time (in uS) that the timer can permit (IN this case it is 65535 * 2, as each timer tick is 2uS) - #define uS_TO_TIMER_COMPARE(uS) (uS ) //Converts a given number of uS into the required number of timer ticks until that time has passed. - #define uS_TO_TIMER_COMPARE_SLOW(uS) (uS ) //Converts a given number of uS into the required number of timer ticks until that time has passed. +#define MAX_TIMER_PERIOD 65535*2 //The longest period of time (in uS) that the timer can permit (IN this case it is 65535 * 2, as each timer tick is 2uS) +#define MAX_TIMER_PERIOD_SLOW 65535*2//The longest period of time (in uS) that the timer can permit (IN this case it is 65535 * 2, as each timer tick is 2uS) +#define uS_TO_TIMER_COMPARE(uS) (uS ) //Converts a given number of uS into the required number of timer ticks until that time has passed. +#define uS_TO_TIMER_COMPARE_SLOW(uS) (uS ) //Converts a given number of uS into the required number of timer ticks until that time has passed. - #define FUEL1_COUNTER (TIM3)->CNT - #define FUEL2_COUNTER (TIM3)->CNT - #define FUEL3_COUNTER (TIM3)->CNT - #define FUEL4_COUNTER (TIM3)->CNT +#define FUEL1_COUNTER (TIM3)->CNT +#define FUEL2_COUNTER (TIM3)->CNT +#define FUEL3_COUNTER (TIM3)->CNT +#define FUEL4_COUNTER (TIM3)->CNT - #define FUEL1_COMPARE (TIM3)->CCR1 - #define FUEL2_COMPARE (TIM3)->CCR2 - #define FUEL3_COMPARE (TIM3)->CCR3 - #define FUEL4_COMPARE (TIM3)->CCR4 +#define FUEL1_COMPARE (TIM3)->CCR1 +#define FUEL2_COMPARE (TIM3)->CCR2 +#define FUEL3_COMPARE (TIM3)->CCR3 +#define FUEL4_COMPARE (TIM3)->CCR4 - #define IGN1_COUNTER (TIM2)->CNT - #define IGN2_COUNTER (TIM2)->CNT - #define IGN3_COUNTER (TIM2)->CNT - #define IGN4_COUNTER (TIM2)->CNT +#define IGN1_COUNTER (TIM2)->CNT +#define IGN2_COUNTER (TIM2)->CNT +#define IGN3_COUNTER (TIM2)->CNT +#define IGN4_COUNTER (TIM2)->CNT - #define IGN1_COMPARE (TIM2)->CCR1 - #define IGN2_COMPARE (TIM2)->CCR2 - #define IGN3_COMPARE (TIM2)->CCR3 - #define IGN4_COMPARE (TIM2)->CCR4 +#define IGN1_COMPARE (TIM2)->CCR1 +#define IGN2_COMPARE (TIM2)->CCR2 +#define IGN3_COMPARE (TIM2)->CCR3 +#define IGN4_COMPARE (TIM2)->CCR4 - #define FUEL5_COUNTER (TIM5)->CNT - #define FUEL6_COUNTER (TIM5)->CNT - #define FUEL7_COUNTER (TIM5)->CNT - #define FUEL8_COUNTER (TIM5)->CNT +#define FUEL5_COUNTER (TIM5)->CNT +#define FUEL6_COUNTER (TIM5)->CNT +#define FUEL7_COUNTER (TIM5)->CNT +#define FUEL8_COUNTER (TIM5)->CNT - #define FUEL5_COMPARE (TIM5)->CCR1 - #define FUEL6_COMPARE (TIM5)->CCR2 - #define FUEL7_COMPARE (TIM5)->CCR3 - #define FUEL8_COMPARE (TIM5)->CCR4 +#define FUEL5_COMPARE (TIM5)->CCR1 +#define FUEL6_COMPARE (TIM5)->CCR2 +#define FUEL7_COMPARE (TIM5)->CCR3 +#define FUEL8_COMPARE (TIM5)->CCR4 - #define IGN5_COUNTER (TIM4)->CNT - #define IGN6_COUNTER (TIM4)->CNT - #define IGN7_COUNTER (TIM4)->CNT - #define IGN8_COUNTER (TIM4)->CNT +#define IGN5_COUNTER (TIM4)->CNT +#define IGN6_COUNTER (TIM4)->CNT +#define IGN7_COUNTER (TIM4)->CNT +#define IGN8_COUNTER (TIM4)->CNT - #define IGN5_COMPARE (TIM4)->CCR1 - #define IGN6_COMPARE (TIM4)->CCR2 - #define IGN7_COMPARE (TIM4)->CCR3 - #define IGN8_COMPARE (TIM4)->CCR4 +#define IGN5_COMPARE (TIM4)->CCR1 +#define IGN6_COMPARE (TIM4)->CCR2 +#define IGN7_COMPARE (TIM4)->CCR3 +#define IGN8_COMPARE (TIM4)->CCR4 - //https://github.com/rogerclarkmelbourne/Arduino_STM32/blob/754bc2969921f1ef262bd69e7faca80b19db7524/STM32F1/system/libmaple/include/libmaple/timer.h#L444 - #define FUEL1_TIMER_ENABLE() (TIM3)->CCER |= TIM_CCER_CC1E - #define FUEL2_TIMER_ENABLE() (TIM3)->CCER |= TIM_CCER_CC2E - #define FUEL3_TIMER_ENABLE() (TIM3)->CCER |= TIM_CCER_CC3E - #define FUEL4_TIMER_ENABLE() (TIM3)->CCER |= TIM_CCER_CC4E + +#define FUEL1_TIMER_ENABLE() (TIM3)->CCER |= TIM_CCER_CC1E +#define FUEL2_TIMER_ENABLE() (TIM3)->CCER |= TIM_CCER_CC2E +#define FUEL3_TIMER_ENABLE() (TIM3)->CCER |= TIM_CCER_CC3E +#define FUEL4_TIMER_ENABLE() (TIM3)->CCER |= TIM_CCER_CC4E - #define FUEL1_TIMER_DISABLE() (TIM3)->CCER &= ~TIM_CCER_CC1E - #define FUEL2_TIMER_DISABLE() (TIM3)->CCER &= ~TIM_CCER_CC2E - #define FUEL3_TIMER_DISABLE() (TIM3)->CCER &= ~TIM_CCER_CC3E - #define FUEL4_TIMER_DISABLE() (TIM3)->CCER &= ~TIM_CCER_CC4E +#define FUEL1_TIMER_DISABLE() (TIM3)->CCER &= ~TIM_CCER_CC1E +#define FUEL2_TIMER_DISABLE() (TIM3)->CCER &= ~TIM_CCER_CC2E +#define FUEL3_TIMER_DISABLE() (TIM3)->CCER &= ~TIM_CCER_CC3E +#define FUEL4_TIMER_DISABLE() (TIM3)->CCER &= ~TIM_CCER_CC4E - #define IGN1_TIMER_ENABLE() (TIM2)->CCER |= TIM_CCER_CC1E - #define IGN2_TIMER_ENABLE() (TIM2)->CCER |= TIM_CCER_CC2E - #define IGN3_TIMER_ENABLE() (TIM2)->CCER |= TIM_CCER_CC3E - #define IGN4_TIMER_ENABLE() (TIM2)->CCER |= TIM_CCER_CC4E +#define IGN1_TIMER_ENABLE() (TIM2)->CCER |= TIM_CCER_CC1E +#define IGN2_TIMER_ENABLE() (TIM2)->CCER |= TIM_CCER_CC2E +#define IGN3_TIMER_ENABLE() (TIM2)->CCER |= TIM_CCER_CC3E +#define IGN4_TIMER_ENABLE() (TIM2)->CCER |= TIM_CCER_CC4E - #define IGN1_TIMER_DISABLE() (TIM2)->CCER &= ~TIM_CCER_CC1E - #define IGN2_TIMER_DISABLE() (TIM2)->CCER &= ~TIM_CCER_CC2E - #define IGN3_TIMER_DISABLE() (TIM2)->CCER &= ~TIM_CCER_CC3E - #define IGN4_TIMER_DISABLE() (TIM2)->CCER &= ~TIM_CCER_CC4E +#define IGN1_TIMER_DISABLE() (TIM2)->CCER &= ~TIM_CCER_CC1E +#define IGN2_TIMER_DISABLE() (TIM2)->CCER &= ~TIM_CCER_CC2E +#define IGN3_TIMER_DISABLE() (TIM2)->CCER &= ~TIM_CCER_CC3E +#define IGN4_TIMER_DISABLE() (TIM2)->CCER &= ~TIM_CCER_CC4E - #define FUEL5_TIMER_ENABLE() (TIM5)->CCER |= TIM_CCER_CC1E - #define FUEL6_TIMER_ENABLE() (TIM5)->CCER |= TIM_CCER_CC2E - #define FUEL7_TIMER_ENABLE() (TIM5)->CCER |= TIM_CCER_CC3E - #define FUEL8_TIMER_ENABLE() (TIM5)->CCER |= TIM_CCER_CC4E +#define FUEL5_TIMER_ENABLE() (TIM5)->CCER |= TIM_CCER_CC1E +#define FUEL6_TIMER_ENABLE() (TIM5)->CCER |= TIM_CCER_CC2E +#define FUEL7_TIMER_ENABLE() (TIM5)->CCER |= TIM_CCER_CC3E +#define FUEL8_TIMER_ENABLE() (TIM5)->CCER |= TIM_CCER_CC4E - #define FUEL5_TIMER_DISABLE() (TIM5)->CCER &= ~TIM_CCER_CC1E - #define FUEL6_TIMER_DISABLE() (TIM5)->CCER &= ~TIM_CCER_CC2E - #define FUEL7_TIMER_DISABLE() (TIM5)->CCER &= ~TIM_CCER_CC3E - #define FUEL8_TIMER_DISABLE() (TIM5)->CCER &= ~TIM_CCER_CC4E +#define FUEL5_TIMER_DISABLE() (TIM5)->CCER &= ~TIM_CCER_CC1E +#define FUEL6_TIMER_DISABLE() (TIM5)->CCER &= ~TIM_CCER_CC2E +#define FUEL7_TIMER_DISABLE() (TIM5)->CCER &= ~TIM_CCER_CC3E +#define FUEL8_TIMER_DISABLE() (TIM5)->CCER &= ~TIM_CCER_CC4E - #define IGN5_TIMER_ENABLE() (TIM4)->CCER |= TIM_CCER_CC1E - #define IGN6_TIMER_ENABLE() (TIM4)->CCER |= TIM_CCER_CC2E - #define IGN7_TIMER_ENABLE() (TIM4)->CCER |= TIM_CCER_CC3E - #define IGN8_TIMER_ENABLE() (TIM4)->CCER |= TIM_CCER_CC4E +#define IGN5_TIMER_ENABLE() (TIM4)->CCER |= TIM_CCER_CC1E +#define IGN6_TIMER_ENABLE() (TIM4)->CCER |= TIM_CCER_CC2E +#define IGN7_TIMER_ENABLE() (TIM4)->CCER |= TIM_CCER_CC3E +#define IGN8_TIMER_ENABLE() (TIM4)->CCER |= TIM_CCER_CC4E - #define IGN5_TIMER_DISABLE() (TIM4)->CCER &= ~TIM_CCER_CC1E - #define IGN6_TIMER_DISABLE() (TIM4)->CCER &= ~TIM_CCER_CC2E - #define IGN7_TIMER_DISABLE() (TIM4)->CCER &= ~TIM_CCER_CC3E - #define IGN8_TIMER_DISABLE() (TIM4)->CCER &= ~TIM_CCER_CC4E +#define IGN5_TIMER_DISABLE() (TIM4)->CCER &= ~TIM_CCER_CC1E +#define IGN6_TIMER_DISABLE() (TIM4)->CCER &= ~TIM_CCER_CC2E +#define IGN7_TIMER_DISABLE() (TIM4)->CCER &= ~TIM_CCER_CC3E +#define IGN8_TIMER_DISABLE() (TIM4)->CCER &= ~TIM_CCER_CC4E @@ -117,26 +113,26 @@ *********************************************************************************************************** * Auxilliaries */ - #define ENABLE_BOOST_TIMER() (TIM1)->CCER |= TIM_CCER_CC2E - #define DISABLE_BOOST_TIMER() (TIM1)->CCER &= ~TIM_CCER_CC2E +#define ENABLE_BOOST_TIMER() (TIM1)->CCER |= TIM_CCER_CC2E +#define DISABLE_BOOST_TIMER() (TIM1)->CCER &= ~TIM_CCER_CC2E - #define ENABLE_VVT_TIMER() (TIM1)->CCER |= TIM_CCER_CC3E - #define DISABLE_VVT_TIMER() (TIM1)->CCER &= ~TIM_CCER_CC3E +#define ENABLE_VVT_TIMER() (TIM1)->CCER |= TIM_CCER_CC3E +#define DISABLE_VVT_TIMER() (TIM1)->CCER &= ~TIM_CCER_CC3E - #define BOOST_TIMER_COMPARE (TIM1)->CCR2 - #define BOOST_TIMER_COUNTER (TIM1)->CNT - #define VVT_TIMER_COMPARE (TIM1)->CCR3 - #define VVT_TIMER_COUNTER (TIM1)->CNT +#define BOOST_TIMER_COMPARE (TIM1)->CCR2 +#define BOOST_TIMER_COUNTER (TIM1)->CNT +#define VVT_TIMER_COMPARE (TIM1)->CCR3 +#define VVT_TIMER_COUNTER (TIM1)->CNT /* *********************************************************************************************************** * Idle */ - #define IDLE_COUNTER (TIM1)->CNT - #define IDLE_COMPARE (TIM1)->CCR4 +#define IDLE_COUNTER (TIM1)->CNT +#define IDLE_COMPARE (TIM1)->CCR4 - #define IDLE_TIMER_ENABLE() (TIM1)->CCER |= TIM_CCER_CC4E - #define IDLE_TIMER_DISABLE() (TIM1)->CCER &= ~TIM_CCER_CC4E +#define IDLE_TIMER_ENABLE() (TIM1)->CCER |= TIM_CCER_CC4E +#define IDLE_TIMER_DISABLE() (TIM1)->CCER &= ~TIM_CCER_CC4E /* *********************************************************************************************************** @@ -148,6 +144,7 @@ *********************************************************************************************************** * CAN / Second serial */ +HardwareSerial CANSerial(PD6,PD5); #endif //CORE_STM32 #endif //STM32_H diff --git a/speeduino/board_stm32F407VE.ino b/speeduino/board_stm32F407VE.ino index 97038ad4..9b1c7e85 100644 --- a/speeduino/board_stm32F407VE.ino +++ b/speeduino/board_stm32F407VE.ino @@ -61,7 +61,7 @@ void initBoard() //This must happen at the end of the idle init TimerPulseInit(&HardwareTimers_1, 0xFFFF, 0, EmptyIRQCallback); - setTimerPrescalerRegister(&HardwareTimers_1, (uint32_t)(getTimerClkFreq(HardwareTimers_1.timer) / (500000)) - 1); + //setTimerPrescalerRegister(&HardwareTimers_1, (uint32_t)(getTimerClkFreq(HardwareTimers_1.timer) / (500000)) - 1); if(idle_pwm_max_count > 0) { attachIntHandleOC(&HardwareTimers_1, idleInterrupt, 4, 0);} //on first flash the configPage4.iacAlgorithm is invalid //Timer1.setMode(4, TIMER_OUTPUT_COMPARE); //timer_set_mode(TIMER1, 4, TIMER_OUTPUT_COMPARE; @@ -102,14 +102,14 @@ void initBoard() // Timer1.resume(); TimerPulseInit(&HardwareTimers_3, 0xFFFF, 0, EmptyIRQCallback); - setTimerPrescalerRegister(&HardwareTimers_3, (uint32_t)(getTimerClkFreq(HardwareTimers_3.timer) / (1000000)) - 1); + setTimerPrescalerRegister(&HardwareTimers_3, (uint32_t)(getTimerClkFreq(HardwareTimers_3.timer) / (500000)) - 1); attachIntHandleOC(&HardwareTimers_3, fuelSchedule1Interrupt, 1, 0); attachIntHandleOC(&HardwareTimers_3, fuelSchedule2Interrupt, 2, 0); attachIntHandleOC(&HardwareTimers_3, fuelSchedule3Interrupt, 3, 0); attachIntHandleOC(&HardwareTimers_3, fuelSchedule4Interrupt, 4, 0); TimerPulseInit(&HardwareTimers_2, 0xFFFF, 0, EmptyIRQCallback); - setTimerPrescalerRegister(&HardwareTimers_2, (uint32_t)(getTimerClkFreq(HardwareTimers_2.timer) / (1000000)) - 1); + setTimerPrescalerRegister(&HardwareTimers_2, (uint32_t)(getTimerClkFreq(HardwareTimers_2.timer) / (500000)) - 1); attachIntHandleOC(&HardwareTimers_2, ignitionSchedule1Interrupt, 1, 0); attachIntHandleOC(&HardwareTimers_2, ignitionSchedule2Interrupt, 2, 0); attachIntHandleOC(&HardwareTimers_2, ignitionSchedule3Interrupt, 3, 0); @@ -119,7 +119,7 @@ void initBoard() //Injection TimerPulseInit(&HardwareTimers_5, 0xFFFF, 0, EmptyIRQCallback); - setTimerPrescalerRegister(&HardwareTimers_5, (uint32_t)(getTimerClkFreq(HardwareTimers_5.timer) / (1000000)) - 1); + //setTimerPrescalerRegister(&HardwareTimers_5, (uint32_t)(getTimerClkFreq(HardwareTimers_5.timer) / (1000000)) - 1); #if (INJ_CHANNELS >= 5) attachIntHandleOC(&HardwareTimers_5, fuelSchedule5Interrupt, 1, 0); //Timer5.attachInterrupt(1, fuelSchedule5Interrupt); @@ -138,7 +138,7 @@ void initBoard() #endif TimerPulseInit(&HardwareTimers_4, 0xFFFF, 0, EmptyIRQCallback); - setTimerPrescalerRegister(&HardwareTimers_4, (uint32_t)(getTimerClkFreq(HardwareTimers_4.timer) / (1000000)) - 1); + //setTimerPrescalerRegister(&HardwareTimers_4, (uint32_t)(getTimerClkFreq(HardwareTimers_4.timer) / (1000000)) - 1); #if (IGN_CHANNELS >= 5) attachIntHandleOC(&HardwareTimers_4, ignitionSchedule5Interrupt, 1, 0); //Timer4.attachInterrupt(1, ignitionSchedule5Interrupt); diff --git a/speeduino/board_teensy35.ino b/speeduino/board_teensy35.ino index fb3f45b2..d758ba9e 100644 --- a/speeduino/board_teensy35.ino +++ b/speeduino/board_teensy35.ino @@ -1006,4 +1006,5 @@ void setPinMapping(byte boardID) digitalWrite(pinTPS, LOW); #endif } + #endif \ No newline at end of file diff --git a/speeduino/cancomms.h b/speeduino/cancomms.h index 3c62cf02..e4cdf193 100644 --- a/speeduino/cancomms.h +++ b/speeduino/cancomms.h @@ -14,10 +14,9 @@ uint8_t Glow, Ghigh; #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) HardwareSerial &CANSerial = Serial3; -#elif defined(CORE_STM32) +#elif defined(CORE_STM32) && !defined(ARDUINO_BLACK_F407VE) #if defined(ARDUINO_ARCH_STM32) // STM32GENERIC core - HardwareSerial CANSerial(PD6,PD5); - //SerialUART &CANSerial = Serial2; + SerialUART &CANSerial = Serial2; #else //libmaple core aka STM32DUINO HardwareSerial &CANSerial = Serial2; #endif From 86fc1b645b919733052110d589ba519a75dadb7f Mon Sep 17 00:00:00 2001 From: hoogendijkta Date: Sat, 23 Feb 2019 15:39:38 +0100 Subject: [PATCH 14/51] changed comments to be correct with code --- speeduino/sensors.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/speeduino/sensors.ino b/speeduino/sensors.ino index 7e7ebc60..0013a220 100644 --- a/speeduino/sensors.ino +++ b/speeduino/sensors.ino @@ -48,7 +48,7 @@ void initialiseADC() BIT_CLEAR(ADCSRA,ADPS0); #endif #elif defined(ARDUINO_ARCH_STM32) //STM32GENERIC core and ST STM32duino core, change analog read to 12 bit - analogReadResolution(12); //use 10bits for analog + analogReadResolution(12); //use 12bits for analog reading on STM32 boards #endif MAPcurRev = 0; MAPcount = 0; From 1841009e0491d656c5cf089ff73a1a8d4c5b05ea Mon Sep 17 00:00:00 2001 From: hoogendijkta Date: Sun, 24 Feb 2019 12:18:14 +0100 Subject: [PATCH 15/51] added correct port mask and pin mask types for stm32 --- speeduino/auxiliaries.h | 12 +++++----- speeduino/board_stm32F407VE.h | 3 ++- speeduino/globals.h | 44 +++++++++++++++++------------------ speeduino/idle.h | 4 ++-- 4 files changed, 32 insertions(+), 31 deletions(-) diff --git a/speeduino/auxiliaries.h b/speeduino/auxiliaries.h index c3d582b8..1aae707d 100644 --- a/speeduino/auxiliaries.h +++ b/speeduino/auxiliaries.h @@ -25,17 +25,17 @@ void fanControl(); #define READ_N2O_ARM_PIN() ((*n2o_arming_pin_port & n2o_arming_pin_mask) ? true : false) volatile PORT_TYPE *boost_pin_port; -volatile byte boost_pin_mask; +volatile PINMAKS_TYPE boost_pin_mask; volatile PORT_TYPE *vvt_pin_port; -volatile byte vvt_pin_mask; +volatile PINMAKS_TYPE vvt_pin_mask; volatile PORT_TYPE *fan_pin_port; -volatile byte fan_pin_mask; +volatile PINMAKS_TYPE fan_pin_mask; volatile PORT_TYPE *n2o_stage1_pin_port; -volatile byte n2o_stage1_pin_mask; +volatile PINMAKS_TYPE n2o_stage1_pin_mask; volatile PORT_TYPE *n2o_stage2_pin_port; -volatile byte n2o_stage2_pin_mask; +volatile PINMAKS_TYPE n2o_stage2_pin_mask; volatile PORT_TYPE *n2o_arming_pin_port; -volatile byte n2o_arming_pin_mask; +volatile PINMAKS_TYPE n2o_arming_pin_mask; volatile bool boost_pwm_state; unsigned int boost_pwm_max_count; //Used for variable PWM frequency diff --git a/speeduino/board_stm32F407VE.h b/speeduino/board_stm32F407VE.h index a506a8f4..dcf3ecc6 100644 --- a/speeduino/board_stm32F407VE.h +++ b/speeduino/board_stm32F407VE.h @@ -6,7 +6,8 @@ *********************************************************************************************************** * General */ - #define PORT_TYPE uint8_t + #define PORT_TYPE uint32_t + #define PINMAKS_TYPE uint32_t #define micros_safe() micros() //timer5 method is not used on anything but AVR, the micros_safe() macro is simply an alias for the normal micros() #define USE_SERIAL3 diff --git a/speeduino/globals.h b/speeduino/globals.h index 3bef76d8..76df0926 100644 --- a/speeduino/globals.h +++ b/speeduino/globals.h @@ -51,8 +51,8 @@ extern "C" char* sbrk(int incr); //Used to freeRam #if defined(ARDUINO_ARCH_STM32) // STM32GENERIC core //inline unsigned char digitalPinToInterrupt(unsigned char Interrupt_pin) { return Interrupt_pin; } //This isn't included in the stm32duino libs (yet) - #define portOutputRegister(port) (volatile byte *)( &(port->ODR) ) - #define portInputRegister(port) (volatile byte *)( &(port->IDR) ) + // #define portOutputRegister(port) (volatile byte *)( &(port->ODR) ) + // #define portInputRegister(port) (volatile byte *)( &(port->IDR) ) #else //libmaple core aka STM32DUINO //These are defined in STM32F1/variants/generic_stm32f103c/variant.h but return a non byte* value #define portOutputRegister(port) (volatile byte *)( &(port->regs->ODR) ) @@ -252,48 +252,48 @@ struct table2D knockWindowDurationTable; //These are for the direct port manipulation of the injectors, coils and aux outputs volatile PORT_TYPE *inj1_pin_port; -volatile byte inj1_pin_mask; +volatile PINMAKS_TYPE inj1_pin_mask; volatile PORT_TYPE *inj2_pin_port; -volatile byte inj2_pin_mask; +volatile PINMAKS_TYPE inj2_pin_mask; volatile PORT_TYPE *inj3_pin_port; -volatile byte inj3_pin_mask; +volatile PINMAKS_TYPE inj3_pin_mask; volatile PORT_TYPE *inj4_pin_port; -volatile byte inj4_pin_mask; +volatile PINMAKS_TYPE inj4_pin_mask; volatile PORT_TYPE *inj5_pin_port; -volatile byte inj5_pin_mask; +volatile PINMAKS_TYPE inj5_pin_mask; volatile PORT_TYPE *inj6_pin_port; -volatile byte inj6_pin_mask; +volatile PINMAKS_TYPE inj6_pin_mask; volatile PORT_TYPE *inj7_pin_port; -volatile byte inj7_pin_mask; +volatile PINMAKS_TYPE inj7_pin_mask; volatile PORT_TYPE *inj8_pin_port; -volatile byte inj8_pin_mask; +volatile PINMAKS_TYPE inj8_pin_mask; volatile PORT_TYPE *ign1_pin_port; -volatile byte ign1_pin_mask; +volatile PINMAKS_TYPE ign1_pin_mask; volatile PORT_TYPE *ign2_pin_port; -volatile byte ign2_pin_mask; +volatile PINMAKS_TYPE ign2_pin_mask; volatile PORT_TYPE *ign3_pin_port; -volatile byte ign3_pin_mask; +volatile PINMAKS_TYPE ign3_pin_mask; volatile PORT_TYPE *ign4_pin_port; -volatile byte ign4_pin_mask; +volatile PINMAKS_TYPE ign4_pin_mask; volatile PORT_TYPE *ign5_pin_port; -volatile byte ign5_pin_mask; +volatile PINMAKS_TYPE ign5_pin_mask; volatile PORT_TYPE *ign6_pin_port; -volatile byte ign6_pin_mask; +volatile PINMAKS_TYPE ign6_pin_mask; volatile PORT_TYPE *ign7_pin_port; -volatile byte ign7_pin_mask; +volatile PINMAKS_TYPE ign7_pin_mask; volatile PORT_TYPE *ign8_pin_port; -volatile byte ign8_pin_mask; +volatile PINMAKS_TYPE ign8_pin_mask; volatile PORT_TYPE *tach_pin_port; -volatile byte tach_pin_mask; +volatile PINMAKS_TYPE tach_pin_mask; volatile PORT_TYPE *pump_pin_port; -volatile byte pump_pin_mask; +volatile PINMAKS_TYPE pump_pin_mask; volatile PORT_TYPE *triggerPri_pin_port; -volatile byte triggerPri_pin_mask; +volatile PINMAKS_TYPE triggerPri_pin_mask; volatile PORT_TYPE *triggerSec_pin_port; -volatile byte triggerSec_pin_mask; +volatile PINMAKS_TYPE triggerSec_pin_mask; //These need to be here as they are used in both speeduino.ino and scheduler.ino bool channel1InjEnabled = true; diff --git a/speeduino/idle.h b/speeduino/idle.h index 243d6b0c..b5b164e1 100644 --- a/speeduino/idle.h +++ b/speeduino/idle.h @@ -42,9 +42,9 @@ unsigned int iacStepTime; unsigned int completedHomeSteps; volatile PORT_TYPE *idle_pin_port; -volatile byte idle_pin_mask; +volatile PINMAKS_TYPE idle_pin_mask; volatile PORT_TYPE *idle2_pin_port; -volatile byte idle2_pin_mask; +volatile PINMAKS_TYPE idle2_pin_mask; volatile bool idle_pwm_state; unsigned int idle_pwm_max_count; //Used for variable PWM frequency From ecccfc2dc9ce242fab5f8f86dcd9262c404f17af Mon Sep 17 00:00:00 2001 From: hoogendijkta Date: Sun, 24 Feb 2019 12:21:01 +0100 Subject: [PATCH 16/51] added pinmask_type to all board files --- speeduino/board_avr2560.h | 1 + speeduino/board_stm32.h | 3 ++- speeduino/board_teensy35.h | 1 + speeduino/board_template.h | 1 + 4 files changed, 5 insertions(+), 1 deletion(-) diff --git a/speeduino/board_avr2560.h b/speeduino/board_avr2560.h index c54f916b..936341b3 100644 --- a/speeduino/board_avr2560.h +++ b/speeduino/board_avr2560.h @@ -10,6 +10,7 @@ * General */ #define PORT_TYPE uint8_t //Size of the port variables (Eg inj1_pin_port). + #define PINMAKS_TYPE uint8_t void initBoard(); uint16_t freeRam(); diff --git a/speeduino/board_stm32.h b/speeduino/board_stm32.h index 8e062025..4ac36a28 100644 --- a/speeduino/board_stm32.h +++ b/speeduino/board_stm32.h @@ -6,7 +6,8 @@ *********************************************************************************************************** * General */ - #define PORT_TYPE uint8_t + #define PORT_TYPE uint32_t + #define PINMAKS_TYPE uint32_t #define micros_safe() micros() //timer5 method is not used on anything but AVR, the micros_safe() macro is simply an alias for the normal micros() #define USE_SERIAL3 void initBoard(); diff --git a/speeduino/board_teensy35.h b/speeduino/board_teensy35.h index 280aa69e..f5e26a27 100644 --- a/speeduino/board_teensy35.h +++ b/speeduino/board_teensy35.h @@ -9,6 +9,7 @@ void initBoard(); uint16_t freeRam(); #define PORT_TYPE uint8_t //Size of the port variables + #define PINMAKS_TYPE uint8_t #define BOARD_DIGITAL_GPIO_PINS 34 #define BOARD_NR_GPIO_PINS 34 #define USE_SERIAL3 diff --git a/speeduino/board_template.h b/speeduino/board_template.h index 7c9374e6..dbe057be 100644 --- a/speeduino/board_template.h +++ b/speeduino/board_template.h @@ -7,6 +7,7 @@ * General */ #define PORT_TYPE uint32_t //Size of the port variables (Eg inj1_pin_port). Most systems use a byte, but SAMD21 and possibly others are a 32-bit unsigned int + #define PINMAKS_TYPE uint32_t #define BOARD_NR_GPIO_PINS 52 //Not sure this is correct #define BOARD_DIGITAL_GPIO_PINS 52 //Pretty sure this isn't right #define micros_safe() micros() //timer5 method is not used on anything but AVR, the micros_safe() macro is simply an alias for the normal micros() From 4fd527ee1169751bcc3fa054af40f64be59dbb85 Mon Sep 17 00:00:00 2001 From: hoogendijkta Date: Sun, 24 Feb 2019 18:28:25 +0100 Subject: [PATCH 17/51] selected 4us timing for timers. --- speeduino/board_stm32F407VE.ino | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/speeduino/board_stm32F407VE.ino b/speeduino/board_stm32F407VE.ino index 9b1c7e85..b0942550 100644 --- a/speeduino/board_stm32F407VE.ino +++ b/speeduino/board_stm32F407VE.ino @@ -102,14 +102,13 @@ void initBoard() // Timer1.resume(); TimerPulseInit(&HardwareTimers_3, 0xFFFF, 0, EmptyIRQCallback); - setTimerPrescalerRegister(&HardwareTimers_3, (uint32_t)(getTimerClkFreq(HardwareTimers_3.timer) / (500000)) - 1); attachIntHandleOC(&HardwareTimers_3, fuelSchedule1Interrupt, 1, 0); attachIntHandleOC(&HardwareTimers_3, fuelSchedule2Interrupt, 2, 0); attachIntHandleOC(&HardwareTimers_3, fuelSchedule3Interrupt, 3, 0); attachIntHandleOC(&HardwareTimers_3, fuelSchedule4Interrupt, 4, 0); + TimerPulseInit(&HardwareTimers_2, 0xFFFF, 0, EmptyIRQCallback); - setTimerPrescalerRegister(&HardwareTimers_2, (uint32_t)(getTimerClkFreq(HardwareTimers_2.timer) / (500000)) - 1); attachIntHandleOC(&HardwareTimers_2, ignitionSchedule1Interrupt, 1, 0); attachIntHandleOC(&HardwareTimers_2, ignitionSchedule2Interrupt, 2, 0); attachIntHandleOC(&HardwareTimers_2, ignitionSchedule3Interrupt, 3, 0); @@ -155,7 +154,11 @@ void initBoard() attachIntHandleOC(&HardwareTimers_4, ignitionSchedule8Interrupt, 4, 0); //Timer4.attachInterrupt(4, ignitionSchedule8Interrupt); #endif - + + setTimerPrescalerRegister(&HardwareTimers_2, (uint32_t)(getTimerClkFreq(HardwareTimers_2.timer) / (250000)) - 1); + setTimerPrescalerRegister(&HardwareTimers_3, (uint32_t)(getTimerClkFreq(HardwareTimers_3.timer) / (250000)) - 1); + setTimerPrescalerRegister(&HardwareTimers_4, (uint32_t)(getTimerClkFreq(HardwareTimers_4.timer) / (250000)) - 1); + setTimerPrescalerRegister(&HardwareTimers_5, (uint32_t)(getTimerClkFreq(HardwareTimers_5.timer) / (250000)) - 1); } uint16_t freeRam() From f3c031f06e9729f429d334483936f37b23518b31 Mon Sep 17 00:00:00 2001 From: hoogendijkta Date: Sun, 24 Feb 2019 18:28:44 +0100 Subject: [PATCH 18/51] selected 4us timing for timers. --- speeduino/board_stm32F407VE.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/speeduino/board_stm32F407VE.h b/speeduino/board_stm32F407VE.h index dcf3ecc6..11f40f92 100644 --- a/speeduino/board_stm32F407VE.h +++ b/speeduino/board_stm32F407VE.h @@ -20,10 +20,10 @@ *********************************************************************************************************** * Schedules */ -#define MAX_TIMER_PERIOD 65535*2 //The longest period of time (in uS) that the timer can permit (IN this case it is 65535 * 2, as each timer tick is 2uS) -#define MAX_TIMER_PERIOD_SLOW 65535*2//The longest period of time (in uS) that the timer can permit (IN this case it is 65535 * 2, as each timer tick is 2uS) -#define uS_TO_TIMER_COMPARE(uS) (uS ) //Converts a given number of uS into the required number of timer ticks until that time has passed. -#define uS_TO_TIMER_COMPARE_SLOW(uS) (uS ) //Converts a given number of uS into the required number of timer ticks until that time has passed. +#define MAX_TIMER_PERIOD 65535*4 //The longest period of time (in uS) that the timer can permit (IN this case it is 65535 * 2, as each timer tick is 2uS) +#define MAX_TIMER_PERIOD_SLOW 65535*4//The longest period of time (in uS) that the timer can permit (IN this case it is 65535 * 2, as each timer tick is 2uS) +#define uS_TO_TIMER_COMPARE(uS) (uS>>2) //Converts a given number of uS into the required number of timer ticks until that time has passed. +#define uS_TO_TIMER_COMPARE_SLOW(uS) (uS>>2) //Converts a given number of uS into the required number of timer ticks until that time has passed. #define FUEL1_COUNTER (TIM3)->CNT #define FUEL2_COUNTER (TIM3)->CNT From 33720f77f8f5f5cc452a36469c8cbe766226c7e3 Mon Sep 17 00:00:00 2001 From: Richard Metcalfe Date: Tue, 26 Feb 2019 22:52:37 +0000 Subject: [PATCH 19/51] Changes to idle stepper control to prevent idleControl() and disableIdle() from competing against each other. Also target the cranking stepper position when the engine stops and after initial homing when on open loop. Do not disable the stepper when engine stops on stepper closed loop. --- speeduino/idle.ino | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/speeduino/idle.ino b/speeduino/idle.ino index 23be3837..bb355e06 100644 --- a/speeduino/idle.ino +++ b/speeduino/idle.ino @@ -250,7 +250,8 @@ void idleControl() else if( (currentStatus.coolant + CALIBRATION_TEMPERATURE_OFFSET) < iacStepTable.axisX[IDLE_TABLE_SIZE-1]) { //Standard running - if ((mainLoopCount & 255) == 1) + //We must also have more than zero RPM for the running state + if (((mainLoopCount & 255) == 1) && (currentStatus.RPM > 0)) { //Only do a lookup of the required value around 4 times per second. Any more than this can create too much jitter and require a hyster value that is too high idleStepper.targetIdleStep = table2D_getValue(&iacStepTable, (currentStatus.coolant + CALIBRATION_TEMPERATURE_OFFSET)) * 3; //All temps are offset by 40 degrees. Step counts are divided by 3 in TS. Multiply back out here @@ -389,13 +390,17 @@ static inline void disableIdle() IDLE_TIMER_DISABLE(); digitalWrite(pinIdle1, LOW); } - else if ( (configPage6.iacAlgorithm == IAC_ALGORITHM_STEP_CL) || (configPage6.iacAlgorithm == IAC_ALGORITHM_STEP_OL) ) + else if ((configPage6.iacAlgorithm == IAC_ALGORITHM_STEP_OL) ) { //Only disable the stepper motor if homing is completed if( (checkForStepping() == false) && (isStepperHomed() == true) ) { - digitalWrite(pinStepperEnable, HIGH); //Disable the DRV8825 - idleStepper.targetIdleStep = idleStepper.curIdleStep; //Don't try to move anymore + /* for open loop stepper we should just move to the cranking position when + disabling idle, since the only time this function is called in this scenario + is if the engine stops. + */ + idleStepper.targetIdleStep = table2D_getValue(&iacCrankStepsTable, (currentStatus.coolant + CALIBRATION_TEMPERATURE_OFFSET)) * 3; //All temps are offset by 40 degrees. Step counts are divided by 3 in TS. Multiply back out here + if(currentStatus.idleUpActive == true) { idleStepper.targetIdleStep += configPage2.idleUpAdder; } //Add Idle Up amount if active? } } BIT_CLEAR(currentStatus.spark, BIT_SPARK_IDLE); //Turn the idle control flag off From 3b29179621430dd085a9f6c8465ccf0bc8edfd3c Mon Sep 17 00:00:00 2001 From: Richard Metcalfe Date: Tue, 26 Feb 2019 22:53:43 +0000 Subject: [PATCH 20/51] Changes to separate out stepper cooling step time from stepper step time. --- reference/speeduino.ini | 4 ++++ speeduino/globals.h | 2 +- speeduino/idle.h | 1 + speeduino/idle.ino | 29 +++++++++++++++++++++++++++-- 4 files changed, 33 insertions(+), 3 deletions(-) diff --git a/reference/speeduino.ini b/reference/speeduino.ini index a158777b..0c680ff9 100644 --- a/reference/speeduino.ini +++ b/reference/speeduino.ini @@ -857,6 +857,7 @@ page = 9 ;unused10_152 = scalar, U08, 152, "", 1, 0, 0, 255, 0 ;unused10_153 = scalar, U08, 153, "", 1, 0, 0, 255, 0 iacStepperInv = bits, U08, 153, [0:0], "No", "Yes" + iacCoolTime = bits , U08, 153, [1:3], "0", "1", "2", "3", "4", "5", "6","INVALID" unused10_154 = scalar, U08, 154, "", 1, 0, 0, 255, 0 unused10_155 = scalar, U08, 155, "", 1, 0, 0, 255, 0 @@ -1348,6 +1349,8 @@ menuDialog = main iacChannels = "The number of output channels used for PWM valves. Select 1 for 2-wire valves or 2 for 3-wire valves." iacStepTime = "Pause time between each step. Values that are too low can cause the motor to behave erratically or not at all" + iacCoolTime = "Cool time between each step. Set to zero if you don't want any cooling at all" + iacStepHome = "Homing steps to perform on startup. Must be greater than the fully open steps value" iacStepHyster = "The minimum number of steps to move in any one go." iacAlgorithm = "Selects method of idle control.\nNone = no idle control valve.\nOn/Off valve.\nPWM valve (2,3 wire).\nStepper Valve (4,6,8 wire)." @@ -1719,6 +1722,7 @@ menuDialog = main dialog = stepper_idle, "Stepper Idle" field = "Step time (ms)", iacStepTime, { iacAlgorithm == 4 || iacAlgorithm == 5 } + field = "Cool time (ms)", iacCoolTime, { iacAlgorithm == 4 || iacAlgorithm == 5 } field = "Home steps", iacStepHome, { iacAlgorithm == 4 || iacAlgorithm == 5 } field = "Minimum Steps", iacStepHyster, { iacAlgorithm == 4 || iacAlgorithm == 5 } field = "Stepper Inverted", iacStepperInv, { iacAlgorithm == 4 || iacAlgorithm == 5 } diff --git a/speeduino/globals.h b/speeduino/globals.h index 5efd9316..d267635d 100644 --- a/speeduino/globals.h +++ b/speeduino/globals.h @@ -746,8 +746,8 @@ struct config9 { uint8_t Auxinpinb[16]; // digital pin number when internal aux in use byte iacStepperInv : 1; //stepper direction of travel to allow reversing. 0=normal, 1=inverted. + byte iacCoolTime : 3; // how long to wait for the stepper to cool between steps - byte unused10_153; byte unused10_154; byte unused10_155; byte unused10_156; diff --git a/speeduino/idle.h b/speeduino/idle.h index 243d6b0c..07b1000c 100644 --- a/speeduino/idle.h +++ b/speeduino/idle.h @@ -39,6 +39,7 @@ struct StepperIdle idleStepper; bool idleOn; //Simply tracks whether idle was on last time around byte idleInitComplete = 99; //TRacks which idle method was initialised. 99 is a method that will never exist unsigned int iacStepTime; +unsigned int iacCoolTime; unsigned int completedHomeSteps; volatile PORT_TYPE *idle_pin_port; diff --git a/speeduino/idle.ino b/speeduino/idle.ino index bb355e06..87f0d365 100644 --- a/speeduino/idle.ino +++ b/speeduino/idle.ino @@ -104,6 +104,7 @@ void initialiseIdle() iacCrankStepsTable.values = configPage6.iacCrankSteps; iacCrankStepsTable.axisX = configPage6.iacCrankBins; iacStepTime = configPage6.iacStepTime * 1000; + iacCoolTime = configPage9.iacCoolTime * 1000; completedHomeSteps = 0; idleStepper.curIdleStep = 0; @@ -133,6 +134,7 @@ void initialiseIdle() iacCrankStepsTable.values = configPage6.iacCrankSteps; iacCrankStepsTable.axisX = configPage6.iacCrankBins; iacStepTime = configPage6.iacStepTime * 1000; + iacCoolTime = configPage9.iacCoolTime * 1000; completedHomeSteps = 0; idleCounter = 0; @@ -257,6 +259,7 @@ void idleControl() idleStepper.targetIdleStep = table2D_getValue(&iacStepTable, (currentStatus.coolant + CALIBRATION_TEMPERATURE_OFFSET)) * 3; //All temps are offset by 40 degrees. Step counts are divided by 3 in TS. Multiply back out here if(currentStatus.idleUpActive == true) { idleStepper.targetIdleStep += configPage2.idleUpAdder; } //Add Idle Up amount if active iacStepTime = configPage6.iacStepTime * 1000; + iacCoolTime = configPage9.iacCoolTime * 1000; } doStep(); } @@ -273,6 +276,7 @@ void idleControl() //This only needs to be run very infrequently, once every 32 calls to idleControl(). This is approx. once per second idlePID.SetTunings(configPage6.idleKP, configPage6.idleKI, configPage6.idleKD); iacStepTime = configPage6.iacStepTime * 1000; + iacCoolTime = configPage9.iacCoolTime * 1000; } idle_cl_target_rpm = table2D_getValue(&iacClosedLoopTable, currentStatus.coolant + CALIBRATION_TEMPERATURE_OFFSET) * 10; //All temps are offset by 40 degrees @@ -324,16 +328,37 @@ False: If the motor is ready for another step static inline byte checkForStepping() { bool isStepping = false; + unsigned int timeCheck; + if( (idleStepper.stepperStatus == STEPPING) || (idleStepper.stepperStatus == COOLING) ) { - if(micros_safe() > (idleStepper.stepStartTime + iacStepTime) ) + if (idleStepper.stepperStatus == STEPPING) { + timeCheck = iacStepTime; + } + else + { + timeCheck = iacCoolTime; + } + + if(micros_safe() > (idleStepper.stepStartTime + timeCheck) ) + { if(idleStepper.stepperStatus == STEPPING) { //Means we're currently in a step, but it needs to be turned off digitalWrite(pinStepperStep, LOW); //Turn off the step idleStepper.stepStartTime = micros_safe(); - idleStepper.stepperStatus = COOLING; //'Cooling' is the time the stepper needs to sit in LOW state before the next step can be made + + // if there is no cool time we can miss that step out completely. + if (iacCoolTime > 0) + { + idleStepper.stepperStatus = COOLING; //'Cooling' is the time the stepper needs to sit in LOW state before the next step can be made + } + else + { + idleStepper.stepperStatus = SOFF; + } + isStepping = true; } else From e8c31d5ce743b3502395b9c48d6324dd6ecf5c78 Mon Sep 17 00:00:00 2001 From: Josh Stewart Date: Fri, 1 Mar 2019 06:09:11 +1100 Subject: [PATCH 21/51] Initial testing of priming/homing based on voltage changes (re #205) --- speeduino/globals.h | 1 + speeduino/init.ino | 1 + speeduino/sensors.ino | 19 +++++++++++++++++++ speeduino/timers.ino | 3 ++- 4 files changed, 23 insertions(+), 1 deletion(-) diff --git a/speeduino/globals.h b/speeduino/globals.h index 105095ad..65c96384 100644 --- a/speeduino/globals.h +++ b/speeduino/globals.h @@ -313,6 +313,7 @@ int ignition5EndAngle = 0; //These are variables used across multiple files bool initialisationComplete = false; //Tracks whether the setup() function has run completely +byte fpPrimeTime = 0; //The time (in seconds, based on currentStatus.secl) that the fuel pump started priming volatile uint16_t mainLoopCount; unsigned long revolutionTime; //The time in uS that one revolution would take at current speed (The time tooth 1 was last seen, minus the time it was seen prior to that) volatile unsigned long timer5_overflow_count = 0; //Increments every time counter 5 overflows. Used for the fast version of micros() diff --git a/speeduino/init.ino b/speeduino/init.ino index 120a8da3..73ca81ef 100644 --- a/speeduino/init.ino +++ b/speeduino/init.ino @@ -225,6 +225,7 @@ void initialiseAll() triggerFilterTime = 0; //Trigger filter time is the shortest possible time (in uS) that there can be between crank teeth (ie at max RPM). Any pulses that occur faster than this time will be disgarded as noise. This is simply a default value, the actual values are set in the setup() functinos of each decoder dwellLimit_uS = (1000 * configPage4.dwellLimit); currentStatus.nChannels = (INJ_CHANNELS << 4) + IGN_CHANNELS; //First 4 bits store the number of injection channels, 2nd 4 store the number of ignition channels + fpPrimeTime = 0; noInterrupts(); initialiseTriggers(); diff --git a/speeduino/sensors.ino b/speeduino/sensors.ino index 1a74f22f..a6ec3c9a 100644 --- a/speeduino/sensors.ino +++ b/speeduino/sensors.ino @@ -9,6 +9,7 @@ A full copy of the license may be found in the projects root directory #include "maths.h" #include "storage.h" #include "comms.h" +#include "idle.h" void initialiseADC() { @@ -375,6 +376,24 @@ void readBat() tempReading = analogRead(pinBat); tempReading = fastMap1023toX(analogRead(pinBat), 245); //Get the current raw Battery value. Permissible values are from 0v to 24.5v (245) #endif + + //The following is a check for if the voltage has jumped up from under 5.5v to over 7v. + //If this occurs, it's very likely that the system has gone from being powered by USB to being powered from the 12v power source. + //Should that happen, we retrigger the fuel pump priming and idle homing (If using a stepper) + if( (currentStatus.battery10 < 55) && (tempReading > 70) && (currentStatus.RPM == 0) ) + { + //Reprime the fuel pump + fpPrimeTime = currentStatus.secl; + fpPrimed = false; + FUEL_PUMP_ON(); + + //Redo the stepper homing + if( (configPage6.iacAlgorithm == IAC_ALGORITHM_STEP_CL) || (configPage6.iacAlgorithm == IAC_ALGORITHM_STEP_OL) ) + { + initialiseIdle(); + } + } + currentStatus.battery10 = ADC_FILTER(tempReading, configPage4.ADCFILTER_BAT, currentStatus.battery10); } diff --git a/speeduino/timers.ino b/speeduino/timers.ino index 6d5f8a68..415f5235 100644 --- a/speeduino/timers.ino +++ b/speeduino/timers.ino @@ -143,7 +143,8 @@ void oneMSInterval() //Most ARM chips can simply call a function //Check whether fuel pump priming is complete if(fpPrimed == false) { - if(currentStatus.secl >= configPage2.fpPrime) + //fpPrimeTime is the time that the pump priming started. This is 0 on startup, but can be changed if the unit has been running on USB power and then had the ignition turned on (Which starts the priming again) + if( (currentStatus.secl - fpPrimeTime) >= configPage2.fpPrime) { fpPrimed = true; //Mark the priming as being completed if(currentStatus.RPM == 0) From 2fe2172d60609837044806ad5ec2f5e63570c1b2 Mon Sep 17 00:00:00 2001 From: Josh Stewart Date: Sat, 2 Mar 2019 13:57:56 +1100 Subject: [PATCH 22/51] Minor updates to the routing on VR v3 board (Now v3.1) as well as updating its BOM --- .../BOM/Bom-template-VR_ITEAD-v3.xls | Bin 30208 -> 30208 bytes ...oner_pcb.png => VR Conditioner v2_pcb.png} | Bin ..._schem.png => VR Conditioner v2_schem.png} | Bin .../VR Conditioner/VR Conditioner v3.1.fzz | Bin 0 -> 111306 bytes .../VR Conditioner v3.1_schem.png | Bin 0 -> 155799 bytes .../VR Conditioner/VR Conditioner v3.fzz | Bin 110620 -> 0 bytes ...ur.gm1 => VR Conditioner v3.1_contour.gm1} | 0 ...l => VR Conditioner v3.1_copperBottom.gbl} | 0 ....gtl => VR Conditioner v3.1_copperTop.gtl} | 31 +- ...rill.txt => VR Conditioner v3.1_drill.txt} | 6 +- ...gbs => VR Conditioner v3.1_maskBottom.gbs} | 0 ...op.gts => VR Conditioner v3.1_maskTop.gts} | 0 ...p => VR Conditioner v3.1_pasteMaskTop.gtp} | 0 .../gerbers/VR Conditioner v3.1_pnp.txt | 80 + .../VR Conditioner v3.1_silkBottom.gbo | 4170 ++ ...op.gto => VR Conditioner v3.1_silkTop.gto} | 1300 +- .../gerbers/VR Conditioner v3_pnp.txt | 77 - .../gerbers/VR Conditioner v3_silkBottom.gbo | 60014 ---------------- .../gerbers/VR Conditioner-v0.3.1.zip | Bin 0 -> 61151 bytes 19 files changed, 5567 insertions(+), 60111 deletions(-) rename reference/hardware/VR Conditioner/{VR Conditioner_pcb.png => VR Conditioner v2_pcb.png} (100%) rename reference/hardware/VR Conditioner/{VR Conditioner_schem.png => VR Conditioner v2_schem.png} (100%) create mode 100644 reference/hardware/VR Conditioner/VR Conditioner v3.1.fzz create mode 100644 reference/hardware/VR Conditioner/VR Conditioner v3.1_schem.png delete mode 100644 reference/hardware/VR Conditioner/VR Conditioner v3.fzz rename reference/hardware/VR Conditioner/gerbers/{VR Conditioner v3_contour.gm1 => VR Conditioner v3.1_contour.gm1} (100%) rename reference/hardware/VR Conditioner/gerbers/{VR Conditioner v3_copperBottom.gbl => VR Conditioner v3.1_copperBottom.gbl} (100%) rename reference/hardware/VR Conditioner/gerbers/{VR Conditioner v3_copperTop.gtl => VR Conditioner v3.1_copperTop.gtl} (99%) rename reference/hardware/VR Conditioner/gerbers/{VR Conditioner v3_drill.txt => VR Conditioner v3.1_drill.txt} (100%) rename reference/hardware/VR Conditioner/gerbers/{VR Conditioner v3_maskBottom.gbs => VR Conditioner v3.1_maskBottom.gbs} (100%) rename reference/hardware/VR Conditioner/gerbers/{VR Conditioner v3_maskTop.gts => VR Conditioner v3.1_maskTop.gts} (100%) rename reference/hardware/VR Conditioner/gerbers/{VR Conditioner v3_pasteMaskTop.gtp => VR Conditioner v3.1_pasteMaskTop.gtp} (100%) create mode 100644 reference/hardware/VR Conditioner/gerbers/VR Conditioner v3.1_pnp.txt create mode 100644 reference/hardware/VR Conditioner/gerbers/VR Conditioner v3.1_silkBottom.gbo rename reference/hardware/VR Conditioner/gerbers/{VR Conditioner v3_silkTop.gto => VR Conditioner v3.1_silkTop.gto} (92%) delete mode 100644 reference/hardware/VR Conditioner/gerbers/VR Conditioner v3_pnp.txt delete mode 100644 reference/hardware/VR Conditioner/gerbers/VR Conditioner v3_silkBottom.gbo create mode 100644 reference/hardware/VR Conditioner/gerbers/VR Conditioner-v0.3.1.zip diff --git a/reference/hardware/VR Conditioner/BOM/Bom-template-VR_ITEAD-v3.xls b/reference/hardware/VR Conditioner/BOM/Bom-template-VR_ITEAD-v3.xls index d4e32085bf2096d454fd7661ea8c5a7a91b6d9a9..c01d521c4077156e7b1beb191a602effbe0e18bc 100644 GIT binary patch delta 2272 zcmb_dd2o|O6yN>w~Qr3WeLhlT>ZNGNFw5z`ZTrD@Xx+Cpi;(gH2CrJ!<{AS%;B8j$5>g=L9Js2j5PBCY^9Z}(Y0E!yL2gMh~4~2aPNnD}$3l~P$ROErPDQtv*2CZfG%*Oc(=Fe&p z(%+a_RV$3q>*IvU^BdTET?%G5uclelCU|_CG z28T3F%^YJ+^@XKmVQpe=!;`w#W&SwGkwX5QEJ&N*15PFHX1qOjFm%-Eq-s z_WByS5|-7DfVTQl>JK;Thf^K~Hs~|~$WXxCG7QUWoIS5;dU9h`B~c?W591rO8ZFvc z)VY;)Rj&!Q%6ZjQ3kdUy60xXZt^_LPv;-&>h?hx8sr8inyi-DC3J6fOb507IRZGC4 z9t8RUew0AcfMD9p3Of;6;Xe5t6_N+a$J# ztoLl*#amZf?xh*SG?5jcHHBeHm`pQ#jK6W@G5J-Ih^SccfGJ5a2``RqY_u&N&(D?+ zZ5tPDGZ;|f@CMsb^@)08mMun~V93tVpd!6MD6pgnhHSx_VG)eO1;gmX$pS;cz~q$b z?3~eY21AS?R-c`0OD&AaO>nig=@ojKPE3WAG%%Q_R>B%%pnE+7sB{#y$)Ec#0WZ zf|=Dmj*#CmyJjkaP*^~o7S!9rho&IOT16~a(!!-TF8LjFK||Uwd+s5AzrQN^v}@>;34dIDuuk`L+b8?X@wq#* zQWYyiXZx93oew4+3rdMS{`rV|v0I~>KRQ+NW#NO+uIuGh#&3BX@SaHvMeb9F&?PYend#p6&Ws9rRo0YxW zp|KWIJv3Sqxlj(;CTiihHIh5afn`z%_~u2@E*O_LzG4TfT4V#}eod*m;qET8i2>G*^kkuuyBk!Hyk?vy6jCahVo{b?kKU3DBh#(yb z7{(7#j*VjwY~rH)%akUG#RW%X2^ylr%4YFckYFShS-DF}C{y?Fk!bcKQYn!OB!`ek z&SXyy$)#hd0ENg zc>FF3Z8D-^JJ`Px3k^4{ZzT^{MzTqa8yt>cxtqpaz5J8dD<^%5VPoeGTja~nQMw;4 zP7n4uOxE`PmXoz2t=Pg*8N5{!3_UXl6>Ws&oJKNnNG01h0#j<1{pX71mH+>W3n6n($ltwQ B6}Yg zresp_ntxE%hSi9eR9}yg5v7M_rARvEPN7XXqd4hA(F~)be4V?XEhE!k-EYo!?sv}b zoO|y1&OO(AlX!2E52Tzi2>`}LQG5zHk0e8qBPo!SNYum~Q8T~-{9s%d;u;9yXn{03 z)aOX=xRQC1NKltao2B_`<^n;1LEEJ!nG^+!oOBz%D3lPKGbq!d(#&-bdM9MDnte0e zq}-Iv0`M_34#qenX2?MIgJiMX4^oBl5F|BHC=%0AJ6FWBiAiXe)suFoRPZXkBAi4; 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 M4vewq<$ucm4+msv!~g&Q literal 0 HcmV?d00001 diff --git a/reference/hardware/VR Conditioner/VR Conditioner v3.1_schem.png b/reference/hardware/VR Conditioner/VR Conditioner v3.1_schem.png new file mode 100644 index 0000000000000000000000000000000000000000..26aa13eb288bf01a24d79bf986ffd61d927f124d GIT binary patch literal 155799 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�Ctk}{9pY%oM?)3V`{hd(kx$& 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

I&?D`31C><3w>K>cSA{kh?nM?iHp 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 +Aiqy{%yqk|!;#u! zsk9ezyeBlgxSR&xVJwY(W$LI`y*F}8Z9xFZWFw5%A;&p3>90v9C0=6^q?Bq!kwA|4 z!q!vV$@3_uz4_bhXN}4gSJQ%J)RP1D;4|M@R81j&h~eXw_#Fv{ySsV82k~FmRYX3) zW<Nuh_qYX=go&_~XY3d1_2gsJ9Dm6n>UamC)IVoRwiaL#kX zv_r0r!^q3j3#N1QW$O@B7@`pVoy+Tplca!Y$ zV9JYZ$(5w{S5^uVmo+J|jhZ;wD_K3{mbQA?17RA{*@N)~lzdR4AW|P`j77<1=2CL+ zKRdUKT$jzIqt)6rgrG>>{B5DIg)CmR<0ndtQ+8@hMUy3Db`>nVC&}Vml=Qs)){)zx z>_mP_)~68)(rgaTC#?{LX%34^emEOO0!;1ik3dJnynf=tMhOqzG@)`k7v4k9xUO{g zi~_2S*DiuK4E+AOj9hNsCEf<>Os>er@wrrpNM%y!w`peoRp?)le&e*RRs{$YNzTh# z`sxtW_jt*qhwT%fwZZ8lRn})iS7IrY#n@#-if`7SKaQ(T1LR*bR^D=PKghlZwFSj;2YRbu*FIUBCZ- z)9KC?yGNpt5h1h+FI}{1S(MK2mTlY{at|~^Cu&>Vsr{}g zU6WK*$!g?|xoJ10bTrV_j+#yYA9`_a>L;vVUGS7{$rmwT8>#AKYlM>BlgL6t%187W zY1OF~I9cj)V&s;|Id)^s1QPdX$g!_=k?v_+eW!S9OYN#f()3N)j_+?tX5SSfHv42wa&C?~wI-E4;U!44W}Xdzghszx9`Rkoprbm7_Ey zP0wqB9q(65MWL?55%3nLwaXy&K7!ta-kN`_wD=@4!HfJk7IMN5t$WmlLT=S1I>M-h z?|E@eqaSQ1J4bFCbw%`tj(Q{xSVd;lZx^ROJ5V$J?T&6>xvV^M{N{j5eD5Fm3ydJJ z{I&5?=-q~arl;%({S6nQ%HF74*e%!YF-4=65p!RcxBu|(7OwGtl$w)9RV(EXx@sB` zGfruiVczB9m%)SZJ+ZGSl_7Lgv0)BoW^l}8=oFg1Dim?195M3plMq98$%<-7E^J&r z8)g~OhW2xR8kah1{rd%9#@NpmW32I32%A&GH0ei@SWdak5qH-#vKS`s@QthK8*bBG#qQT3N{% zwc0xA(%drd*Pt__vI&%%95~Q6rKAPn_}nV?$QL#yL#{~J<_nmO^k}Ng8S-xOV`}yaMrz)KMwI7li zZEY$Sk9hz3b-RCWoqpL~`@mBc8J|^?(34Yj(Ec5M{Yql|YwR779jomxKz0t1N#=e+ zlXPBmkZ=lrBSbE$8$CK`WRP5n5gF3M&n*}AowTVyTov^bviMG9HW)6$UbYJ{IQr(y zDcC`yBi55n8){7@ievZBUmjmCFaPcIU{6`QS=Q+OusA7GcHfZdS4!mjYU2-**Z_Wb z(CrNULI%&I{urG>oyilfwwHf@`2DE2{Nx5q-IX{2h$~xkGx7%_sO>DVx<|(9`)76d6I= zuN{&Gnvx}R&)(mr#Y~>m9|pByGJX>V@HEH{C0^_`vsP*|`rP6dWwPtMAmFIzNuCDQ z)`kGIl{x;*Q;wM|vnrC2)5t5Lg4{%V@bL}@@}n@_bVj)Bv#GX;#Pc69)GXQor=VPF zxz7_JauXi88~<@ab756%5PB@Zv18M`txvnOUA4%bHZxD9IAr{W#vhMHU~Tq&pAWqBVE>GSie${M~82C_Z_M&maA?=1TE`+h`Z zUI=W)XYaprX4#tzw)om#iRW27J8(J*TD1t+jEVX;>ZE(=P5IVGLsujy|A$|@VNVAF zRQqNPysw76a?R`e&PKbHL$XS_OxFBr9u%;6!mF4R_(l}6`q3%doKgS zhE|w@JjjGW6N~#!N;`u#QHkDcCH06W?y$%b8{VOLTDv&Jt5;q!);mL23b>D_Bj%Eu z>c}z%=QfG~t<2SE%huY5*-riQFI#IFDDq;C9QDU?7%WEV%o4H{sKSmi7BpbKk$#2Cd0EoFm36e5WHk&Y)w-T983) ztmVTz%MJ>+Wb3H#=C~0}9x41EacjZ>$FVtX92Lw?rQ~MkXPyq_NpfRlL4{ZTmNn2H z4kv|Tx{a8G#|%$ncUpZhcP{op7Q6PuV6*sZf2J+g9q-Ylk7=6oik5-XfmOaJ|CTm( zbL`6D(UsNXZ-8IG(Qpsgg6)B2_sO46E|4=iJGh*m!6k;6*@|N*`H{-*(uXX*^BKh2 zZYEk0X7m7y9eU9JA*(`+Yx~boXP0w27UI329G&o3Q&>Tt6j-6>3u~K)N7nhVqDeA z9{uq!tgzZlqFnd?uJQCO7P@Z{W*NB*`;z_?-W3v;_0Ja^esWt0{v`Kx68v*DiY4na zZ7|i~)9Tu=po+SxEa?7|-4S%k(%n=^GyktKw|NaCiO*nZXJKT84w23_HXJBBA~1^u zl*Py;QRxZB753k`Ft9)?MXJzW|Mr3R7nMvn6|_h`6USG$+=(?N2wsURO2=J;_a7x# z-65{=)scFJPH)kY3H#33s9W)zQXBaU)MV>ykOTDt4nwgT0esJ zA~mkZJYKHuJNwU9Z0@I=nvQAYy3paG?7F5)q465$;mAkWMQPts#TxX`$R%B&m%0_2 z;lj-=`?TtycO!eF1j#cSyz7nY|FC@P=U)w@2QAdy83Ro_KI0w5n<|=$Dfu6UT~Rl! zo1{(IiN&1bQ$FZ!BKn*!dY`U(N#CU>3UdDQ3a3-ENxb-%sO&t2E%#qA!suUmK2oDvDB488a_A%BD=c08`t zH3a&ng-E)a9IBc8_LYz!;5+Pdri`rITt!tzUUrU*eOPuI@-@>rPSwp+lrYLX=GW01 zn`^oqU-3>URkRf%+LpZ7BOXG@%-Kf}ZSv*xHNO(aQ_fjxyP7tdSFnZZB};3>ko3J@ z*gg+40=}{Yb*+@95o!FN#|DvGJR;Y{{|?8rB}h#QaU!?A3}*8ixzHhhZ%BlCu!i0C zf#w2!AFd!~xD!3>S%6k|No_LmKnp5p?eOD1EN0C9RYa6^wXPjd?811i66O-mMGbsI ztA-+>EutZZ1NJrVPGx&kP6GTJ2&limlL+n(uCgvz9IUW4p{T>)UvUB*;x~ng@X*hX*vP+vajkNcE2aK+v>Jmn-b>T${(iZHLhdUn-ceFf5SrB159e!9D>48g zN$^S_{%$&r1JA0|~o&QKcEQuff}zWPNUr zSK>&uGfV9Z-7)QOhdHh%j3)SGU$uwH;nCA)A)ekN=S$+-5O0_fdMXC`;71nk`EqiK zfU-ea_D_zKjH;B(f5s(+WZ2=Ub;PDN&=35I%W88-r{#p!4ER2?uXM=ViKpspiC8vD zn1S|SM;CI1Q!+_^35!_}v-UzyxAGMRGiw{p+Ky`I2l2IlWsWA~Us!qZQTRX87u%6) zZV(YxQPh!!ru;LW9dRgT$2F!;SyLK}U`Dna6?3yZ4hHFxAgI6jq8phAd zY?jL}fI*uUmNH~#`eeHU(XbC@Zs-njrJmbnShjr({|SsRgN5Z;7S0=Y!{$5k$bUUq zBD~v|D}M^^BQNe#eks4gLOyvvy$x8_`+o4gOafXD<~qJe3E1VPCm+EH zjHG1Y;iRw`1=c$$?c<pR_0*~1%@-7hxePM_@Uvp=wzYJO%* zCbqQ91R&m-*sP%6;TVZJ>EoQatP5FMT{vpiW+ZJ*x%C=6P?Z5>fk zA5-2K!Nr*R!gX7XsbBuHeR|WG^ngW@*O#ZYDCYA7ehZC)ES|6_6761SyNM2hGa_bUd*PbltL+PQB8 z4-cT_^r1Sp-9IW0T69x@HtZ`gwFS#B5o4t0%~DFuQP5nEn2d_z`UqdzJ~y?hVuCyR zJt+cT``kkL{L>S<-rw#CuwQ{+Ck{-rxwbrkA?GUj&G5NP!g%-;zgrTA^$JK=m#>ww z{OX<>`Y1L~ATGi=wsh$sY^H9%NAz7qaRO?>ZGlf+^S%*QUD=BsHlxMjw;8+HG<|Ay zJoLIQ{ML+XoJRv-$2VgQQYDdp8Km#89a%`?|3K|BHK;(7(zXAr!I(13v*cc@{}~1e zqqZkoh?@N@J)QI}ebBG34WPlvE*WV>f!bone`g%-lZ6gN1%f^Y4QKuxti+#%01*Oy z!@BLS&!`6ty4%lQN!;*QT4>E{?FH%Zfc#%mvF5wWBI${z92`uh>Yfkh=(R;+xE>5N zJfj9uZ$?no8Oj72$}3z?EJr%k8AohTe1**c5S%GeeACSiIp^DYn53vMF9%lsoS;i_ z726hGO{boh%6Byur-`i~=Lp?HJoOPYiio`JA|=O=o#ZYMa>lgx(v>xw<9?gwsIQ#E z=;7uq0Y-DSFe`SbU3mOFNTF7zI*RWFRJGA=u+tV>Nx+^6!Xm zU0*Wa=mRKTF6_chg+Y{T^z82R5=QSgOIXE4<^P_8h6k}yaRHt$BPm#|0oD4~PhgoN zCxaLocF&Fr_m=nj@6g%zGwDV{jL&rWj9^YS$StGkT>xq;WZ^S%Q9*8f$V%qJ0fF|K ziJB}7vpzfVQht)F1QoZ3D&@dnUuhsL`aVL=;!}S5D^D_Ti)+7HxYd*-8oMx2e1Ed( z{$$)9N4a7u9|@?zDt0Zd!sbV~pxcl%2qw0}b;rPAhr8($U{ud~W#8H(hP1n4g<|I3D`! z_XlOvQV#*g=rfVyug6%6()C7@=LdH|azjC#EQ6BFN-dqlr*xL^~n zTk_akwwJ1qsFxf>K!jyd?xN^d7m$7%1+YF|`&A+KpQq@t0X@ho4_N)U%uvR4l02~V zso*JR+^co)b3t?7yaj278kKj9B7XpAs6K}@(L;9r zm1f8Wn|G%aWKM?2#SiS1eY&;Zcm7&vhwCA+#SlM7zi2@gACAmmBmANFTCq%B8lT3% za9Wn%v@2bFg?V9MSwefhQ}o=4w43GzDe(=;=ZbMyjhMMaRoIBl+!=X4zT&$#ztIz- z>yn0!6SHs=2jcbE>6ceO{8HO3JKPxB%<~G1BLg0JJXB*lBb`H2JlKCc`*KJWxf+!! zc~_zhbxlODRRl*q{f9>;q{m#vz-FI-U2qn=%LM*K`CR<)aM}%4v1Gu z6{=44jT2T51f#rv_gO@qwRMgA1+~}K79DnEgAXOD6j^I(z#VLHG9A0bHyqDp*OKp& ze49>uWTeF@pl<-+`vneJeL#>OcM2u<_8q8V!MjNGX9}Wnjalm0rjY$*MuP;YDW$+cF^$y-u2h3hfRORvtKM5wSo`t8Q^!+q^}dMkJRPye_WxlRm$<-AP@H6 zjyNKe+4XT(>o54-m|mrr7hbXwV!ed|2#@5vYO@duKO|aGF7<3GT}AXq?UKAyBM$cpD5*+mkArxlUiE_ zu^PiJI4Ui>MJ=|-29PNLzCXAOjZRT|4EW2JJO{zNLv$E4Uq*?Z=`?y?T`qoT4wC=7 z5f}D;KSeU2ucX%~%2=pRn~`3bO?UEj0xIc0g<4!#tZ8K7@1RH32`z$^Enu~{`dK;V z!?%i9Pizy-_KD5p%ht;)>j{^Ds0J3~_~RW;2W3$h`&om2&IhtjKw9w@{~)-tB}GT) z2NRzq4GcVS66)j+cnl&OGk3Oi27a=_7CNE)`oCvFiLR8P5B!=mWJ&5vvy@uw&ZV3H z9C`DnKJgu)T2zAgNpdPTKk)K7AeA)P7ew^`k8n}SYsOg5#Z66z5cwwjOf-y5Ur|B7 zrs2$JfuF)37r+@BY<*ETm~X`4%`tu-oW#==iYP{izKt2SPwOD9u1a)CP5X?{zi_VyPA@fPma}?I`3!tcE`N$jf`7o z5k^_{fu;etLhMlGs3`{3@UnZ~sIWv`KlgbH{fW8J3K=wyDdq|`Ax|dOFI1M%Uu2y{CY{js)#DP zq`-{$VP<{A%{PN`#m+h_k6!U*){=)mlEhraNW`(_4}fr~=P0J;)7xR`z$gF`!o8-I zzmu!Nb)_DhRFRXN&|`+2Ur9W-W)tB0o7XOks23dO8g5Da@f#{;Ugb-B*eAgtdhOaL1Z`jl)k# zj+H_J74FGcARTdEgI1Y_&b$4izXCSkn*NSjHr+*zWV~jhWPC4@nD@Y6@6-1mLX4;0 z!IT}DhA!q#lN!a4sym=LI!gG7cfOaaRvS4=x#mX_|+F>R?wVxU&lH>3IUL9P{&&La8*X@ z8z&&gn$imS55?;Hs&%UnjnFpxOf2&!cSq6_-eJ`p=WSR}_%C*6vlHKuT!MADcgGo4 zI~;67kRc!Wz7=nbu*RpbOAo6ja5shW$@j&n(M-C-$wE_=)H7txBW9-XNvYaE{V;uTxYCI>K$zD(cA7&NTh$V2;)ZchW7iH*mqH2H4D zDc4DMeTaEpf@a^2@_B@cdN zSA}FfcBP!Ec@9J*%63CF%3p6~wg7y<8xuuK*pMt+0|j7(ih`Fj6T~bY8?8xx*&Y^s zqCWoN|FLuxKu!LATqTqe7$Dt@?v@YIaHpmV6tWf~bs$(a49KhOt_oj|jlu!t7(+>CmJ>!R#psiut${p(r zF!(w=&)s=s5c1`K0gMzrZ%-q3<;RHE*){b{%LniFUB1t-?m)jp!_xm!@juam%hwE{ zp&XRpt2P$Stnb+o6uHiwGhuB?T3NNLWZ(63vWN$Ov%)|dE^iTg+BH?s}h0?aSR$CsU07wZtH zPrTncYWMt97MwccwjV4Sqc4bVkeVq;ZPlblj}%!}b%e)UjIAH1>P2R$gYO`}4CaI? zz=rY~YK>~g)FSdf=7Ta(CL`>`%BKEsibT#K@ikuEms&Q#7kJX)$B>SqP=eS1nsiC^ zVVc@!#`n`(Bk{h5Ni&;x(LLxtC3U^KLL|ubw0<4BS7xEqmX=Av&qf3o(N7r!Lv#i4 zp7)=LZcB`i#Ym#UKd}h05^1Rr#vX8<06RdXqHy1HF zRa|_|W?o9}UHHH^q3Z1;IgbS#o)!IiXv{PRG@0+UI^EruFIp&&JCP^NeXf(OCENKB z2YdT3UBxADD%lb7zOB3-sr^z3NrUgzmc9YHFmaAm@LcsL`U7(U)%WS_pZh( zQhkml0YT#ySwtfIy)?}>=B?;itiqPKmn>klF#Sr+8c-i@F7TGa+mg`XZOBg}-t%0} z0(A?&bvc_O9o1|BJcQo&S#WR_xLnjSYemz?a3p;quZI|#XOw;**i*#~Yrv_csq)Lq z{2}EL>G64O--eF%!{t6)!su8^=#}WiYxB~a56(Z5e-fnVxzBt7V&=vUt0&kZIz4b* zl*)`-7)&7y*3ZfhXY_tpAAE9-=YRc1IlU^L54;whLGsl`$p;-7xf@Z_-V4Xdc^quO=_q=Yo$-mJK5bJDef$?%Y2aOpXuE1QSm<=ym%~iWIHVmku ztH|@TrZK|TspQ=y#XqYZ|CSct^~eqH()~??M*&M{q;!ymm>}{s1;f%c7uY@{sdGwP zV;auJYX9O;yA`f7wK+XbU!sM?kjHCuB2YgGMm?rbU@F4k*);BxE3rIbB@=-Esu%8- z!Mh!OaQ}9_yj&KRFr~N>yCy3I2b|`P#Y;{;+Nyha?<4O$70%)%!?AoY*{yNj{EH4=+Y&26q53*_7xNwhp{sXPuLeIV#EFv*-JCjrc0=dvMlfz;OzV zRw*I&7tI(|S=j(GQB_Z1qO#!DY1x|}>mGfxDXw{2e5AHT54)JsZ9q`5TmGP`)4yfX z7>ZVWA+#+qNF(iqde8dAt8g#y0LpV0O^+#94Ronu3O!@h540NCTkc#Xk{V)2ipN*q z$CWLUSMl2kB{J6VUKYOw@cistf4JVG^#a8GLnD86XncQ%3(q0c{Hg|@wwC5k4bnST zPYBUuHZuJ(&FN*;Z(G@O-{||&tC$kDB_%K9xZ;vaEEM^3 zw3gB>c^Ccic8q}QM&q|{9CRCU?TIT;i3;I z6t|vtt?010iNOK~u!`L7jW&(9rEj)>{vB0<2}{;wNXp%rZ(_eA(6bX_6pbS-<7hYr zTr;H(w3Cg1tpf9a+kJNt{^&kW$yd-=7DY<(f%|z@0$y%XqCiY z1f>}6KkY;dko-X$1ynfS;xh&-wFqTiRvfB+WiFx{RM%p4I~|)D9F>+$)oV|(y(Kg* zPoVWIPGaNgAAQDww(-hY2d#jge-!?8OtS2r5!e-OzNZ!FnFuiY_#l$0`R?PmxxRUuxjf6<8jq!XK00qlvH2r(CatMeIbI@ zr@7G77)>M6iz#Zf6MqH0I^ANxhUG2+zPg`qWyGE ztg>*_&nDew(J4{vI_{x9{7UyhdlNR58KPt>c zLL=PL23E;oGT#h`KIn<^W^piVTBsG;Xe=rPU{)^+2x6r^IA3(tBkf`aTSgp$KU;() zI`8s4r+@bQM`ap67AQ&wuMzU(xpuA;VJ9Qi!xm4>B8|p1)J|#9q4c_fC?pBNt}goM zg1$`OeVBOUtUrnOIM*N~==tEnXc)le_PT+_sa9ynC;uE5h%gR$@BI;|>o``&%SjX|eE^8tJX`WnIWcsyC;3 zeX-y#gLSU-BJURwg~wox$d~r8{H7AKVRg8wwlvXVCj4(JP2M@xj(Ca z;j&63;MvPF!k3YUIA8ox+l5!Lbh*27=TGqjc`BOdq8@#6YVbV1uIBjuz0sDBuZ(Hl zUXay4eG->GavyW4^d2c`7g}bIq3ahS`96`+^g1{NeQ2ajBVIo&TX)q@HSP# zg~v>C?smKCT&5#G0g=y`N%?-f+6Zt2@n+R1E)hJRO2Y8>1g#C$Zpc$w?_6 z@VpikiuE=bU_EGYWYI=iC^i*4Ort-?2?c4V(_OlVogu*ZpkK`5GO>n=#+oK6+&C`& zfylHSZ4EiN1zv)bv*3Mk)v`Svy!vS?)Z3;$WDp<>YNQ1P&UKkYoNImY3j=NWJ<0R9 zZT|wU5lajFN5u%W?vX^v3cwyfppuvoT2-alQm@46WH%m;=Hx=o)^dLil<>HEi z&%Z27>G|&w?+B5LT*#|N+&}lVr~H)o3s13p4~QSt|HXl0@%a$k72X3k z^0tt<&6{a*6WQA%p`pLSk>k4V|DMNrkmV$FW}d7|Ew|VR05_DYEXmw% zP3R+5M*+i)qjytM=bKlsS-vYIt&kaNEl_Y*IP-@un%AV=D)nwzH0o$>hOP4IQyX4M z-GtVIMGpL>YMBrvfT+~#Kd;xns9yO_Jr=87ZxEYNoCwa5qD3IpoLrGM(UfxVHBB)d z^@zoryeY{^vwGe+5lZ;P4k0rj=7zc4DF^z7My>_dz<3CC*d+-k6!%YDJ`XDHT6!l9 zYjhoM7y3mnTpoj)+`tk5Zu4D*{-}d89CKS##vXg+eHk4gwfgyD^U=uwUNKh72l3z+5+C*IuiM;Bo45w9Q@2^w)$c*R>#VIpzENh z7sBsf)DR8B+hVDhcSpkOTnLmKjY+2LG*h%k-kwo4SfN%)?cxFix6kX0KM$H?s;5kD zWE~4_kEL6lnh>UIRC*D?g!9Z+R>nU6bRg4Ae<|m_Lud+1Y?LE3D?piaoY-I%dZM77 z1B@u-v|1i-)~il&ZfHz`kPGq7**i^TayfU5Tz_7)%w%xMaV{~luJ%}Z)x_66q!{P# zdPE)$g!lORv2>q_hsg{N5EBFO0AX>25*?~bEnoX-ZLzREh_u(QLLYN_5KU&1P;F~q z#iU@veizdgae zve;8_<5JXba;t41CY6U+_v&U%jmqSQ*iguqQ*G|FVUqcbiMY;5XnW|vufET5?4|=6 zhFKf62;=dr*(F3X?Z`+eGHYn$gsNQg&R@S2vERi;_1Wb0%pQ3jNZ#WP!O3cp`R1fw zgo+EqGIS2F{1#NTOxPVFi_?Zbq$9f17+*~hW%b;xxW##V9c_MJd}@iiLi8isiKkaE z6Z0^e1Z?Z_<6Zz~RvEt5t0v4oK^FWr)c*!FhOFw;|0OPho=l`?xjoaFk?Y~j(jFYS zbk*4kCZn5tDW7$jA`1bt+=}U$xDhAQ{gSqNLKD0FO9=l_WU*>Vhr!aZq0`5^ z%aAcrN~3RBKWmvIZy>7bCt=BhgWP?lgld)TZ+T+^VHhv=li+zoa6R>+Ydz8lgFMUB z6=$pIm5YV$y)}f<2~4k*Slx#TSAM!m$`CcsxC7%18LnTb1NlD-{CkdtoU+kH`pKLA z;j$EQ3j2&Zf7!1zk>hCfKa5xNo0N_U0|^pbUqfeqHK_qNPCy4AY9yh~$Bfeg)f~mhb?X3na-{ zr+%sLih`>`)JmO>y7>P`qTe=t81HIOF;TNlY=+p;j$2?|+0ieQNj`F_k{0^x z$sCH}^a+vt=gJlqJYc~Am&TD^cUzYkmAauWSq&-vATF>?l9@PYPo=kLzCM!|)gvL~ z>zus~HR}o8lB;7?bcxAumU;4-5KS86i992VeIay*kNi_ea~irH@Pv z&CQSKlRQl7ZeZyaubwFN_IY!gW54( z*TkXLufA?=e+TUnmyss#ZqY!~?oSWzdFe1l`5OwE|s}i%(>0Y8^cZX5G4sizfhbA$$I@=dc#_B+2BS!9I6IVQ6 zFw+etrgVLvx$zrzc;|AO0)5!T+y<5sXRp+fylqR&j*u&u@epU6B?%F_PYG!0ZJMG5 zaSSU;z$3jhRG-~>kM5#b=XAO7dRM?4WUg*nLZlw{{azO>z$>7pO;2Vjnks15xm}*o z5YHTd-NAa%!fLS~RY#4kB#TO`Dgj#u5QwidXsR6xe2F5GVe;E7L3HXeMYrZlvBTKX zDK{oGT)Q>7_uQI2y^uIux9lX`y#tww!|n`E_p=3&By%LBadQvv|=VphQVa2#LY;@{9{PN^B0e&N5#4Pd032H7qs(xMuKG z=uX1ed-)y*(Ra+I&Ph{5K=$^FcPNkBhQg{{h}J6=&ZK)dk|59`G3)*Gz3grMx8W}c zgjg2hY5oMbm`N9oWXf_R?g32DpmvG?Zl}Nwo6&wck9;G3u1Od5@K|Q=b=Mt_a^%D5 z3St;t6bUq%0!cMkOh0k6HRJkbUWG}j_qO07jheI})PMWvNdjU%Cx12Hbl9ykUVk{d zO`25Wp}dUrCt>fK48X}|AfoBo{9yJFuZPL}J-bJS7Lb$G;yJA)xoKyAMT!s5!^iBO z{yhoZ>Gf6?-0)wl8e5jaENSNrj#LAQVleL=gSL<8C_3!a^NGiR31<6DCyiG|7yWSy5II_1pm? z$}mqaGx2R7<+j7>jHM2%-I#<1c{WcbqeD#|+7XEdVZp+TFCCSOh$h^^F|69sDj7;) zCnP@*dWQs-^Q!(m)HK2*7G!IL=Pa>~)J0jLqU*d7peH3I2R7swOs5n#=l1D1x zc#{+PcY!T;@$n!X*_c41^s9IOEFE<6hIywb9-#`*9&aNOB0Ou?1-B(WN11<3dab-0 zslNvt3~ob(Og7qb^>t+QD$8m~d`8+FYykM;iVY=y^29N8?pe39alaR`0(J5!*3}mj zPMV4b%J1W!UjV|5NWC{(K=#~4V)3OK0qJpSQop@1CN?hx8f;~~#ru`+oju!sps>yr zcU6eK&ljGX4bNtUN`bpq8+u}~V#;?+_aLT8OV!S)2lTG6$seB|m<>RJ__hpRn_kw2 zflpV$_MM>SX-*-v zeRQ~Jes0Ole*M7nF**Z_{2Ky8Cn{G6j)E^b&7EHN6}7b6)O z3U60(1ze{v^(FL>?JEyO!EN!ZV>wQ>jTl&At(Sh-25SfQgckcbCn|*Bws1q#HC&e9 zd+}SR4f@5cwpPwaTClVP%uD`z?t*(%TX7%2mG#;UarJLtRM;aKU(Tb0g?ZNRqY`S% zoie?E+D$xMG1~uS0}yVcQrAs9uY#$@)%+*GW?P>+pJ- z&{k9z+W=CesuluIaUSEMu1W#IYvinXB|3t+QFv!Cyz;Bv;QKwf(UQIEV#k9JPe z0bA^s17*12)$e$&NG+AMIZ~J$4k1+Dnv`Nh5xDLQj_jc3J?Gg)s+n&e(st3V>J2w zf}jajniK@HLY`t)Zr~Z15N_E3p0Yv@>iW?8{BaRK2{J|@L57ODJD=2b=Opy|lh5tQ zqxfpIwe5^X+z(Z+`IZZmJk{JW6iKi`-f(#*_NT(Iq<_CZ!P)M8wrH&be$xkGJN?dr z8%NQ2|K!lo|DG=WlQnYOIr!N@sLeb0iL2}lX#G_Ad?TI^dm$>f5!~DVBh@6d;*CK7)zc)r$jl0=fDWUic1|4we?LJSr!G0RO_^$1_tuoW=D;MaB-XKuw zf&cV!mxu6|c!dSm<0B{r6}~(p5tGDBrn8t0 zYuAZ>Zz_v#iwlc=a>g6gF7LItLMt<{ZKc=a@B19~pptKi$@x*+6DM)3^+wSwVY% z&&{jEQOAl6Xeq8Qd7@URslF)Lc5sqd8v0F!lTRA9D9xUJ^~~KobVQA04tnP(;-z7H zy5D^bt)=f|6gIG>V$5{s4^}>0o}Ui-Cyq5+Y^YoW-Bsop$sp@qo10p{g5c`4z90Zm z+{&6!603`)PX_Qd)_ZWi|L8@y`=EjIMWiunhCp>O!qUC;ELOfp`fTW)UHHg5ziN}4 zCY%yHiSD0FWAz8z_`}HzCFkc4eL-uI`}4f8XE<<9?dCvhRyM}3R8JV-!&PQ*U{b3r zT$VE~VbDq>EnnNO2WqZWb zOrV|Wzh+lEdB@jxss?n>{?+#G;_2*RC-CM@kH7zFPU-3bjc6>oM?ODn@F0&bE&)2J zZlW$UWhjnvcX^#$eLgOO_eBJSa`*dp7v6nYHLZ0dAJDqSC8B!w`^qv7mb!}j(1;Bd zPiZq)1~Sdt860|oQd!#vk|F}R$y_&97@}*xE#JI`J+s#;lfrK`c?h|O?u#rHPqf+D zwn801;aqrJ@_3Mj?u;qH^9?Y|{H~_Bda3-_6+BCCHkQR{x^OS~?0W7Q%3ATPS$+Zx zZ!S@65Ynnzd32-!@T5Q0_PbRJoBoI{DvSave1|bj z)W@rNd0_`C4$Ty0-eX#_0KHJvVX$BA)(6mC8V{KR@C%)Y5+Dgw=_4mk!p(Vz0~n#wp}*xHE>{gnw? za%q4Vz5Pos7MppBC)l@xREU4tP>|nKj|S#K=%D&Nv-dYJ69oJFU6@*p>#gjMQqstL5iSxDQHk35C0A#Bnqz&knp#r&!m_81D%bNq(TWo+KP4l2@9akQ$-JLx zp@QGx#0|7XVnsx@jlJP_js$$$Yj zV5{O%vCGl@ClPrcPfKq01(%l>p<+d~o@RpECO7=EL$JCUQc+ zp$yYwsNwJP2kC4dc+$0U4E2RpB?*-~p8{xo{K)$JHIs!E9z>Kx)<$g5FM#&jFT_rnJRKl;IKLEr-wRmP~`FW?(= zhIWrXQU7Rtbfd?!d7Wbsk%8V9FH?mXla^Fv65(=%aE(F?SGK`HxyLFnzxQpWRkRbV zX&cqd$1{9((~&oGdld!s>63n;n_vgc1*vD&>M3O6TbHp#aHMv_!saK3SarH@ZZOKZ zhe{d9um(}(=q!GlHcha*HDhHWvd9iwG}1c`T1JG;RcAr@R5bjXQ$I7<+H?>%km{08 zHL(L}+URq6mG-aG;^QM&Zjr!^7z0Nb7Lw}-ww}WV`I-esYVFh95B*)d8(%7T?!q9# z^*L1{+x5_sM3XwSM|Y+z24W?FQH#jSm6|l0w3+jZsEV<>ac~K&vhd?f7H>SyHZ|HloF7z39x2-=;RDNPGEWZmNlthz9$}HwvOs+A!2_j5QT6 zm?6&ob_`pf{t*kUW)iYzK41TRWDu5sHND0VW}0rs2cVaJo^ij=SW3Fhh^9(*n1Qy4 zu`o|<<s)-=GxL&RA{U2u|8~x_@mS|Tkn^1HfIPB54bO{ZUE`#=yqiH_VuNDK8z}i{ zQ^gC)&C?NAFIT5^cD_n|06Pbjzcw0 zCdovJ`?%5?g2%zKIAGKyLvRc}1#+Q+kFc89wbS*RUYiF|-fbBSWxHFVFKcu#7!YHI zUz8!%z;ctxViT#I6&ni#4nE`cs@CI$h*}T+KstWiE!Wmi0G z_2^nt<)uv0bdtVHwv8;v!O)Gcact3lk9!>t6bEUJj@7w{i`VPHNt_C?zcu542QdTZ zBLh2v-YSczV((#v6~?(tDVKpN^RDtPQ{MeTH?6N7=7xu}PVJBDicd({!R9smgePP; z1J+nPVbgdZ-HEQ(z?sbSagipy(Rhox?rQp;`Q4=5I81VD8e1nAfx!VJoZx&CZ+2nJ zE5`WxVs>S%ZTkEnCaXp>1uF+D6fYtM+wEb| ze|k>Xq0)SPba2?uSW^m=!)cuS0LpJY7`)s@n_KqAjCN1P=F3`OP~JzCefPEJ^lh_u zJfZ0GxRHoU^4%5D=;`Qd}vU>B6ec zmXZ%}kmV;@iD|;*xN314(|df-p9aln-QahDzx7~l>4cAz%FtR>%6H;#ZcSeRlq3ai z@0;y{KVB^gbbnZ##Z>K-rhVUhV|P)}8(jVGgc&;gI^T3nGQAjIx=21Fyf+uXvc*$2 z3@(>tJS=!jeIaPHSlV=iAp>by+wrabPmvO;C7txNOuHZwzP?8qFPy?CwxzKckwX_>$aN926nW z<6NFDd6gV>`|X9I%9KFvkAm9_i;(Lqjz}VU?H@n$a>eaF4k(coA zS$XOUS8{LCt0Ge^Fh5ZlP~BbLR_-0}_mC^(S2}XAC3WN7;HeOsH#_hJ}X13rpgsNx(7#Exd(@WMcdm7 z)x&D=o4)SrQS`|WdsxfAx3h+I%YM|kQDuZ-CrPcYg1`nDF&on7ay1-W@R;B86HCLm zR(d}f*&g&b+=|><%PaLEljmc0o#3UlC4|i&l9$UfK=j;ol=>K_Mkh<34Iuu;h%$2{ zft@jyD~#1c+pno913)At8UAuj^zhr*OJTq_ET$9B{j9J*V{n0d9ZU0zwaE)5h?Xe_ z0bJM8kyO#l>4hsq4<}cOW#gEK$0Hmu5mw<4tp>!%M73bwu*Fre!!E`5sf^DB8zWM! zDG{E|gEsE@bJB!YnEjt`DG6Il@Bm~&Dbh5eYy1M;gzYV$GBc$imdSyURn>xxucWi? zwWKN2*wu2H^ZiF6ifD4#|0ZrFXru(yPw3zWN?`__GYp!xrg2$g!nP%m*aF%U!DPkH zOqyury#6pF5jFd`+1X9E6hSX6w_5Hjy^=$`QShS);6yLSNI(E1u>s$E^A)lk#6!2`*<6ZfU_CRIS=Q zs7`Yp!uge~A)&*6azxcnkYdEiIrWjwLzQqP5E2l=ds)Aj2F&S>hRR8tIokn`6@*y) z-q2_OL@1R#GbsxMP0%DkeGvi=SVJ-8sFGRbW~}D$sJBpyIO*^cWOGp=(?x~Mi&~6K zYtZtLI&j}WdtPlkR7$%Iv+_$S1fV0N1d7XhV=vNV)>PeO{p}$)d<1p5)^T?Cd!`6V zj*E_|Gf~kmbOIzbi0f>woGSeU4w|+V{jch~GzxirYurEHONq>9qv3 z3L0t8Nx3mdT9z_1=+idU-fs-?;@Y_ln+avd+^OU=;JT$uFAu$Uih0v^g zIk%G|s5tx88XJbN_~+EqL&h7loJ@Ibc0iWbT^A(U?W#D3ZB%Dd8~vxmsbF?}<1Xbw z$5)^6>LpvJNP9`WkETB+wjPdWJBO({|2cTol!n**Vl-qIxFHJ^48p6ts84Ant~e7A zdK~ozTtMOb4S#F#n=$w(qRZ4audBY@5`ZV32FowJos;V_at0$D_2os?rQe4_lB!l4)0FItBjVW)!TW5FhHS&GNaxv~b@MhC9M;VRt^U<+*1 zNDagE7Oj)B$1x1{^c%pQd$-RlUG#4qgyF0k80@)szv&r+iCdEUkl2+;)#Q8LATTUK z9pber#Dg@_+RT}OSwfVEE=fE?AGt00_`HXUKpMA&WL_XT7z;ryx#p<0_So6|hh|=9 zhK3P7>dt`K7Zf9W?6pE*hDC_A!0s9doBr~Uur=w^8~^!-ry!RoctWX5eC0+`Lg_%d z$EliEY%)pZ&Bf(R3FLfP=`%z;&y!4Jk)ti`e{z7pB9)PgQSQxT1DF{71l7N)aZJ(` zp*?E(^X$MyBhyvlZKxZOpF6UZ>z|+j)KB+kh-5^$e%R-Ho89yI@pN*t2CYdGi<&3U zC6cD?Cz*geJuW^spKeyvy3J8j4u`5wGxRSg1hJ=z-~R|xiAdHdI6HT#Yn* z?pZvO0XDII7#_zw-!MLtWSO`gu=2TzxvEOm9lh^Gik+W>L;jcVK&oLPq{4|go?cP? zCLyyg+55H}Jm}6>)t6j+vMgEDn~kn98^28+Ir1WAsFfQKvW|3o$7I(OI^MW~K~bV+ zlii_VVl+%9Iu4_I&3mqqqgO*d)}nKAy!iOd#5^IQ!8JLEKK6$ay%ytcR!eC={^0K{ z`CP5M`dzHAt{Cn)?Hcp8u}l5r5#A5Pjk)Mz74?TwoD}W(o2wG#g{{Ns+F`Zdk)n6V zraJ*z)u>k>e`h=Z5q%L+fWsVyQs2IGQ7c~-I|UlE+wlJHY`o==l?(bGj1B^38YhI& zmFUY;mk>bDl>;m$&dVp_e3=1IrIJPmpU@x7-#D!roP)YMOU$#J6{jui_csSJrk&tE zule0@eC2%2G3IaYfUJv`alCbNihQ8S6AupQpR=Gmtd}Ku8XGWi zlI8=fc+|&f8P29nZz_%IpY%|__QSUS8Z>QylMXC5$*50Ub`0N z)5MXr>WelQ(jOB8XlI8$eODs?L#J&|3lOolAMrgeoNy-OzoZVIL5e%#uL3@kn7;a3 z9_IT1T~_!A*fzxH5RqwGcl2*oAW% z8$}gBsftCHMDWzSNXF`_2;H!P-(AwAW6L~hQ$wFb<(S@!P4f$8!tGNqxJL(omaX?h z>(qO?U(3fQgI?hRhAZBMUh{4hE^HyfI3Kdg=|95RHa4)pS7XK&M*0D3F=>|Kdp;@A zsNF*(>hh=_#Y8j`n~_QyGwqgSFo2x335n)&18V4^Q)cZeKDz_cSnY)uf+hj zh}pRaj}e;gutQG-e=HClr}ktw;I=m^O$Y)AZK0hF8{ro=k`QSDjC&zNj|+q;pw5p1 zehz`5`vc>TvjYVO7-$XbnvkBUK0989;Wami<&QMUSpBe`!Op;H4%m$SySr+HcT$y< zvDAbArZw!DdZ>rz1G#xR*#>8wTjjLYgr-5bT&!SQolRJ9m?5bV9dY1Vb{MT!i!woycvIeV=#K{#!3}2RL@@E8wb2-Fw}tHvg7sHamAFAgZ7RfudGQ@ z6)0yDl>dPCcx{`ikBul@I8G8)MGQSUT~f>fbvrg|_5o6OJm5 zG@$P7F-#9hWB8w+-$F%~N&w>PsqOJMZgEpF`GK9BM467_wGL>$HRTSSc2Jn79@63K z&+`|q44a{6B#`-uci_y3JKwXwSL_X)0fP?IJC0US6>(qU5K)sM`ng}cG(nnm@BYT# z?h4D2NvIR+7Hyn-&xDBaC^0ObmjevX9UZT?bY>R91w>HU9Sf!R7Des45MWoc3VF$s zqzmFPxLb{JUi=i4o zW+M4qtm;tIZ%dtY2ZFN1WUM?9ml)vb@|0| zLNlH2OOm^VqWm?@gojQ|m0hUkdi4`6cT8aeX#;nDa!EExaZWjF$N$UkZn+F2l>v)7t>p>JW-c9UUqE+Ov%r}*x#AkYO(EO7KhXdAX*~w_8G>_NFZ&wY_;Gep$ zk03g~?9-6SPSwS=^iBKSdIFc1p@GZ|xL*1&8b&_gRC*A1OSR~a>ta%enl*}>c&37? zmJ*xD)wNDOJL%z8l{btVC=YG-uwl4POzPZkCk@x_kK84gtCGb+w#DDax8bAkTj0|{ zQW#`WIetR1qaS(nwgeAlPU+eKzpe-X$uSD<0!D5US-==$uAdq8y@rupA(Q$T8DZ)y z|Du`6glF!Nx0wB{Yv>c!^?)EMuUt0X8s*xR8#bMO?)#;chc#{aA&D#pvE0&Cc0(p# zh1an6wHXU)$~C+@g~^Om^|`9Jp3gzKPAc%8ZqMK z(h9B&vtpsWl|DbrQDubyz(pGpDBuH;UF|z7K?r*IKStSGi7uTD)CEU1w|a=wQp^My zA#xxg&dl(S3c*RP@2ltOBSn)L0xUa}IwI<}u8Iq9KvD}+BsWt$&O|e;7lU4QKTx$a>#v7P1nvLn1dl8~z^pte=>r&VRf zGtsI^jPD^-<)*Z9LoM%WIqjG_-I~yTpu>)n=Y~`5PGC4x?0TBw5E~KaRr=uSsW^b4 zG50^)TM%TVxPiX0NL?G8*WS8FHPd8ITQgoj>M;96KF%s&?O_>z9W*sScy8~ZZokbbH;((ui3B@AH z{P>8Nf*4oecu7fazD1<>GaEwCM9k;!F327z^fqop1yHG(i`XKWe{O3uqdk9cESnTR ziNlb1xJ`h34lWBPN@4rt{&V%i>BL;=ezAPJE8G-f zia?*HchrY=6$1rN`JE-{vEu}Z+nyj=N`ph>!qMu4wmr(HH$ryMO!G8l8tF_=a1GVu zSCWHYG!HL}uT#F7MgY5Zwga{>1qJw7I5jOHdrB5+oCR!~EzcWc=dA3=gR>W8na9@E;4 z`>2o6BMzz5Vw1XVLTkqQaXq=%+%N9Eqy^PVLVUhI$t2~T#Qw7jpwVffR%Y#px>B8s z0Ox4=e${8W!BAe*KlU5(%DV<@sFH+7u6#+zp9nFIdLNyYHD-Z zfId$x`*>##Tb($a&cSVxp{>Zwh=8|)a~oPM#@nWFC!c8tkf#f)8Lb@1iCkW5+Hrq>dnv229TM#AdAtU%At(dhx?RYGtoI=4chbDZr0#xaN}V zzxImYhFPI8eBTJ7GRtKmnSaZwQWYZT@q|H0k~d7oZsw~47IVZmHE4p!9zV?jfn4tk z3YbiZzIvtJ7hohhjT(td8oVd3W(l6lHnIkt@tXgdbMS+4H#o7;SB~N90GZ zejvu@MH}{aZD8k)osFSx@+vIa$DX&6AFB6L>an!T>X!MBo72|_YTLK#G6i^tVH|}+ z9pnJE5V@s#%^Jm+)%%u1Y4&F8E(?ln)QXv5b7=rTg!8q#rUK;R74)QFrP2gBC-x4l z*fxfQK(RO=W=6kdTf#j(iS@kS|>TOT5zcQ4Axd0n#9>LsVGca1Z^ z7!({LV&6lvA_d$Cw%Nr`q-+sK&}M^mhb)LJ*#k+BGXF(AForox2xYwZr7_WK58T&f za9dmcAtG*ylR}D9*1hk{w3_!GAl9PKdaqNtggCMqw?c8~SDr|B)%x1@X->iDAaDAHGRZ6HS>a*kCs?+}N~_U2^RQ3a4f)4s{^OAXe&vqM z>}+Bqyrq0EBeUQTgWX)AMExL4h!Tt$1jUB#s_AAj=-wr(_D4E=sQrhN=13M z{y2hla?XgGjcj6Phn*T6u1D87G_$0IVrBM{1GIAP~9pWdAYtbG{S-9tvt|Ng@V3N9) zWCQ+|(o7MJ^?HCL1!+DYiMm)Qz*RcmhpZ!K>xW3H9Sn3Lw@JT8uai(8gZH1U!m{!9 zJx+Wib%~5YsJ3eMKIGzGfd1(WFZUu~B=5W(Bo$Qv8F+ z+Sm*Zv6Rv5d+w_VZF7*7+(v~+Nlv&mG96~TSvBr=nxBo-ibCnO&9l+=`;ECK0?UxL~gZXf_mt2g_qbju$Gpgv}yrb@VL%8M6# z{jV8x4kR5WZSG%CtnhXsLV0QQS3-e@Jv(3D^Pxs|5#;(|j~L;&$dvIdBB#^9mW z0O5!z#>5|0@0GFa3%dA8G#7His@gB|N8X%D9+FbmO@8G&P&Rh|QL6ENu)w0?LDpH6_Kun&<}_M6XL4eUNv{`(DsO!jH=gKC5ySXs<08`jkI zwmnS8kG%}#yXWu^&JTLOA)GU7xms&DZ{p;<=Xsv{x$pa&x308AtSN&*i?~7z>LEPt zzsa$@hc{#TooQ9((hl_yTH~hcz2g6HppWxL{=kd3MDpoyy;6|aHotAZtKR9!sP$_+ zI6|0X(HAX#@@7P9M2bQL9Sgga^}`z?#l*RHJ6mJ*W|l1KWh>vD*(HzrV@56HXKoIE zON%VlKfsV)<{12yDX%9S@TQDJq2V+`&!FXae@llfSuc$d-lHnX*}4b@f${a*i>fXgi6 z6+vG#4uXyRFoh?oS?TZI+iP!CW^r^l<2(QUOW*9)JQWtkZ!&vjuv&+&R~gmF2}NLpd3FAlLhc>W_!{H)Sy_LqBvAxDHpUZnvSW1DHbr z7X(=2&dO!Y8L84g2#nmka6X%+y0enpRw{mg$LSZx8 z{kB5tFq7k7v}PJw2!`gL5&?hpXG~a@4MdBo`)J=ar;QhwC&foG2DvxI0W8(1jnhGhFa#GNjd=TJ6MNOtoauTAf zT5OqyUyj1p5U?TB5|biw@!I}y|6f(&C)RcY`pg*N;GZ3$7xt^%LgYvzv~3r>*>Yb< ziYZN!Lf}YU!ea2LNx&cOf!^ms-=$E}3zDeHR>&M~`OOPdQ+>btxMj_hW7!7JjN-cu zf9TGEkViW?%pr2{l=cr67CnItwzp0fhC+-+Zvm^(u1Xjy0+04*G(>K1a7Ema^GB{I zL6M$ssNCnL`rr^?49E{|^>pN01Drzo;d!B_kfwDWkc*d5>N2`HeGD5?t(2UJg6GhMFn%7=eJ%^nk!Y_oSvF968=t@D z)+6w`vAMfyp1uJxqx+>A;0=mQ3tekYQo9J&nVI9rnKEwMqV9tN`vw$)+eMT&VO+km`YR!4?dho6bk$JsCT3V3Pc zyms_l0IJi^4}21=uXdYnHjGo+!|mxT9G^XVMLGQ=;iZKF!EEw&H(V^#5`)X%IY>fp zfQ>&p`!J8z4JK8jfcBS{;O_^`R##$d*!vs2#MTT}o4d*9l7#2Vn_yNKnnyd7g~7(N z>vPXAtpfA1RCTw>z6q_&`BqMf^##)R^C#piVoGla=zo+!i>N6$2WKtpc=T4kJ5kNL&#?nBT~A#pxRTFQC{L;v;poGqV$ z?N{%&vktEH)kUxZ%P-oOMLvtnFuxaAyQ;`~b-Q@M%mWqmw$@ON7oub}1Vcj%n?bEf zaWP285i}tF0qi9__j?8Y+U?~ro{)NETpjDbmOLjV{o($RuKK#O4#TMX1DsBvC0HI(Y5cyr}OeiGfHf7Ve4Ru%OU z2Io&X9r8qgMlh<(lnxu#gZ|r6s69&fk7N8>p1d_67`x{zw_~&KIYm~z{4n<{r*+fm zM3s}h?dpl$QyBzLGycmHVHk$F$v|H4M01-t0)Hc}l`HR_es^wIVn`%BDTW3xN?HPw zEuzuCy-t}HD8n&UlReaH-=I^*D}!cLa)tT2%UNqYLLddE&Y)Il1qK)-dsqyY_-Vr^ zHbieV;1}JT2aN`UA<`VLBg|2lVlRTqYxPSpR#m8b_v26Ajb(VPfN^@DC(hP4F`090 z(7())VfvfD4$YADoi7FY%x@j?{o4YcG;1X8s_IDdpT&jD#p!D?y-c1TG_g~yGX7pJ z?BVQf#GU?fWboEqp%iaK`y!!FDMx1vD3lSHLYCr7rsY80wchzoX(R5`QH78s{IXal~+dd@XaA$=uN!g$8- zEs029vsh*@aQ}lvtPL7^W}Q`v`_p$2(L7A6KI_3XH}rBJk`fySwU8fkuLIWMv zXj&FK-BgJY(B3VfcHIp7#cwox{zXP{Mi-P`Z?f`Q^XSLgnk3|n%Ux42B=GnBV=HyL zuZ~AF7;GAansQmRIpp@gDSA40nsZ&<0U1bHy#F7C6|{X^f=15tgBKjj7&`w~wtGy66E(8{s1w77&<-DBj=D$96amhl#ua zK9<(M-XtoP&w=YFvk@=wcaYo;E0$OnmF7yGDB=Z=k^JtcT6m27s!tOKCfofN_ewx!r2G!7B0R6StU;{b;CPIkaSUulRB8L|8q(`5-PA04wOfTMgwZXL zC%@I&vCXjoYNDJ)_Bhx6m2J4uj1e~ZkNbpv=ebc|x@$?Y8{@FX92e_K^VCbG4^UyQ zh;XW|O>D5sx>H&KSmeZ1`nxhbwc`xu3rIGixMg3G(fxnw`Qt7$8-ccBtTvxhHLy4cSCrM!Ah-z2jl0N)$LWTQ zMFL-TQ*bkLA$l`-g5Jqx2_DWM1cPJC_rX}@w?rUz)I2hBl3;lYx?FaE3v|E&3I8~LBUPFrhapF@77@Htsxh<&^M zjq&22e&Gg<Kz=v0=sNyJ9n1IHn2}sgTii1_Ddt5}Lt0JaVDSQzF-LruWmNq(uPBYS zkPb$a*LZF)?e*SN`flLeAU?(KRFiF`Vd`)h^?j;4Y(V5LN>w{Gi+zs^ju-&2N)&U! zD~amYiBo6(eHGiJN*Y=#Jk7t%_1}oJu1!d!B<>;e93C;l)?Komk0uDgmR>aWDYqTo z&Ts`5`ejDe%;8L_}XS5jWm_;~k|QOC-}L z-A=?ZvYh76B5%?)yrj&`p?@{wJ3{&M_AuF7lH&lq4C5IScfaF#c237fH$%b&=b2hD z;c{SFx>94khpT(mL7fY)Jz?vAKCA36;iIOeM<@D1`>Nu-kza$oE1ULYjL-AH3Pw6$Sk(Qqz z>>N(_)McbpMlyy=MqJgbiQOa$=s};g2GXXD+anmX zkQxnk+2!k}`H61soXm|AftmXSpfuro3(qU&LS+8AV{6Cr$q|b*!PXgAw6i9UNfT|{EAXMZnXw- zx%$`($2H0fky0rO)KssjwGDunpQGTzjZf!Xce%_NOrdY*ZVU&Xt#F)flv`D?%^5erh@bdAjlfOsS8mFq_Dr-}ddQI)t9FvU zURh$s5n&L=h_JW6qoBy!eFxHK7G;GApQW0RjCs4P%YRPFXMD97A2=l@n~C#%4!9 zn-kMEjK;lL#kJ}6^m`H5y6wP#8mg{z#@B^*dY+U`@XD}QZP*BSm`+2{Vm1?wP{Tj) z9#vO9V`Qxr<8dBP(8Db!iK;djcUw_pJ3OTq4tVLIS(}&6>?8ztc7UL^`L>%Gt%Y{! zC%T<9$Cs*VfaafsXAuX7Sis7VT54Vvz*I98KCxU>0oQ`ML?O2eGs=tDDevY(2 ztP+eZw6DO3VSXWYLt11M7n8Tmvf*dXy?~Nn}()W;46W(NZ zozq(%dszY)Y5X3gTTQxBPHACX%i5>~*;uWlD>J%5w|3a>wK>Rc8+zMV*GbsRS?HtT zf79SJS;BZ7kTs9z`P~m=^cXXoUrgW$*-V%wA+2k0_eg4b7&=bU2*)iPL!^Q-eq?B3GOwr$a6O349j zo651NTE;lOr?0+rtL6`zWUz`FL$S@WWFysOYeBue0-1HMX7_xImJ|N{uX)X{KRY%R z9GN)A8nP#S@_djba_{vQI|rA|=Dk{mAAxJbd|lF8GZAJU!ca|Y!H?1zqs4I7rqoBT z#)s@l51_Rs)Et7saWmy^DNw#khAO`pwz0eU?6nj6MS~`*c_pv5FNN5n4`DShFcxCmwDi|16+>ZQnCnHdaj}pn_CHjT9u7pFXak`tz|e z7K^&SWZPuicr@kcboUh(OD6vp{EV+2%}Gu7x|EG=c2Z-sxd-Gzg}fHU?>R28qEsO| z^@6au4^HAFvP_VGxVTMM0RXxE9rUjF(Uq4|1mto|3qF_~2_++l-lY=7G6j#A?rs$)f0Z69b!@ zGCF@QzFE^*{9UG>FJ1C7u{_Ir-@veS@l_8PN*!@WT%XB(lOl}bCxp?9@WFlJTE=`l9rurE6e}# z&}{HLzyS3QUO5Fn$xPm)0UjxS^)TD~s#XWX$D24GiW9(|7g>sOdgi-yL;xhS)bs@P z^vGxrOPQ?lSQ%k5lxFW0)9AE{ps2I($<@?&7`HA>6modZq>vsumda)@-#IxN-mKYD zi8giXHlH%2qP6)mQlM5-dHi7`=*)gmCi^x)TQgtMkr(G7T&uwnTHa}y=-wRQgh;0o zDJXhbkW;ta=_92CX7z=zyEhZL`rmui2Zdo|A-3tcY0&#F-!HXg5cL6To~IeKJeb+g z2`V@K0UerlciYVS!;AOkfVdX)3D>0w4W71zU85=Gw;QUCS1cH7@B6EQhVlME&GZG{ zG}z9z$G4AQKyTmjw{=6ed8%Tc=XI3EfVlcYE^hksK=B9JZNC+mRtZMik2}?eUPl9O z-Tk>w+WLAI(=UFs`ox7ycV7tox8eDl(DAObkphy=Pp zoBbIV$dN$OT4eDU!QrnMZW)ewxCf31W|XDe1`C}@!(9OCKNzH=wf zkZLq7T=2Z9azjK?uW7?0+5!1&(8z8Fa+mMEo#Vp}NT;5}JGnVopv4UyD}SU%n$ARl zBPf|((Xxr$YF%q5kKefIvT;*u1Kn>+h+CnfpuZ_Ewftc)M*SUIHgQ5Bh>gJ5GRY=o z!3W#|O&0o|PZmHi+`dVb6`LBf0G_ZM(ziZS37KNc1|<}777)&}hh}@ps%QL!*tLn| zca+!uYh;WQKaq>X{c-^5)O$LM)T3ZV-Bf4VH0`Z9QJL^;f~3=AY7<({v11EHH(zX_ znj?Oa*~%zoilTJmE<jq~wO8oXtopRF06z znghMsJogqwf(_Xo0}Xu)?O!1mU9^C$gj0{T&~nyD)r`q^k>s(0qT2@*wc2U@peTpg-;H(`daMvxO(~x8r3i9qE{tOv z%a1!gey)%Khdyt@V6|5#p2b0ul)u7L`xC4mKZawP{9I-etdXfgn$&R>`J__ouS}2c zfL66CA;!2Upn)wGe6>4Z@`U-<=~(dw3b%k(3( zTS;Dzwd2a%hb=?&Pqf(HP!Cn6{c1+5KsYA|x5|iyxP)?46AJ!q%SyqFZ{?OXB4O*M zpZML*IF{MHobuC>;pZQ$v7d%_&F@{RiPW*)#Tqhtv)(np#|8C>iYZ8Vv^#C}(KESd z#CA<+zRs(=_qV(JhPbU+j6@5c4_L;H2`%#|P(|b zsYK-zO(h&DV=RAppqmo2m+%HF5oiIK1c1D#ICmJ!<0b*>X2p52bWZs;tO*0z=`bM+ zk@5l(2l7)cQrHv6_T@O-BssN**KCoK*m@33Ob9EuC~K5gU?<|I(HrT?eq&Rl*)1;b z#KqSA{)hP%Hn=3*)s>@IffTGS&Fns|M1T8KW_($xEAg+neo&xL1dm0*L6~TI=?1b+ z8@0x_^qmywNDAQ^?iP36%O~0|TDe>NoR+bM>wh*dZ)@bdcsiyzs{5xLXi18lXQenY z;k+2zFIN=*4JLfgKnH>OHGm(ya605owr=)>J@`6|La9$ZRWt_w0L{hS3BA1cd})Cm zymS4&nNg$EhhgbdCv8nCVH8de^X2P4X@|03ERxW=c?zlQwkEpj%$Lm=xznvvu-X6c zLpu4X)auNbRB0E)y?nsz6Y}s>#Rma2=J6nRZ|;l!54!d*sYlL$C=A)F9bO(pzTWGd z5X)Z>Er7jrYqMHteeGZ+#%ipXfdG1|5^QaMKw=ZFaz4RP)Jtf4Yna9VJm;2D3z$}r zU7qHdi@95~4yXbQ<|+toO3^FyN1wS3b|GJ-o21-rDSLU5jvY;zo-%Gnw&l$?(iMz{z)u+sC_crk-lYD)hX5J!)(DRa^RM zL*V9DfAQ^I!FGqT_wZ!V@2%T-m$TGsrH!MT_xHyjB-OcFhr_#HEq<|U$%1XE)lsD6 z31@MIF0BV{FX8j zj=$aTJcF_zZ5hsap|+BzXub<53R+U7WRsOu{e6c;w^l z*`k>S2S81#a$+d4ODM(zU1vO?ARVapf3|3AEP6r`Ee^6xq>{#6e7(bv7>M+Fei* zZJf&&j?W1x>D+M;bDqt zaDjvis2}x98jCHlmDowdqnJN}@H@u*;SKniFRhi?X1^MmM^fhleGu&|lJAIgZSVHc z&||AvWm**2PVcNI*()+Z0+g&UO{Zb=;4wWQ1DMEwth7^aRRDs~ePv>##I6QK_$jtS8lAb-+4187?v9$5He@7FHokAaqk;$jZ8cEFn7DNMzW%4yk$-1 z1n)ZqZCzs~>C4Yq1jf-$xRAYMQ^>0WGAvR}&-Gtkp5tnk9Q9?nAG7QYJyO`e>c z4jG~G$H?1f_N%X9Z)VqDzHfWytGa)WS-=IXH{;u$GA5rX^cZS`L*u4v?KI6D3VSh<6%v+WQdNpFXG9Pky?3DkyAo7bDr$1 z2O#a7O*!|Ba8xBjj6Lf$w{M!N!Cy3!^n(gp@jNWpy z$yfPjkmdJjm&NHJMRKJG^49a+X3g#mItL9U^Ca@ELh?9fq;3f^IcGw)^qoz{Bc26C zkkh!*C-oPpt_iQWfUejeo76sdR|_=IOFso?sTb!=gCs@rY6tx@!u5QVLOESMZ=2FE z=fFHm9BfLrFb7-yngS<5|3=z|L0a+kKX5bKt*-7 z-b8;K935B#sb*3ueHkE)-w^nhAxP??#rwhiIgo_JlZ@!H->6)>R=#a8M~7-Xr#)uy zGI9qPyQK{UryBdt3qx)D+&KTihvkG{A*?-ltO6p|k{FUkd1HMm0g)yX> zT-@U-ygV3^*}V=ZU3b-pvx(kNf55N+uXVmW=>2;Hz*b-71n1 zKTcN*YCq!pboF5Uukeyx#C4^4P7LZxU?I+p(`=%ZXOr-g_T9WK_yell->%4`*wOVx)S zSOcE0&|j}_yk(IxSDd08cYk7>PY{T*D}FOM@v7;r3*M~{t*He(y-$IB^O20n$2PZ( z-@w(nwJ#$QFBx;}3+U7&6f(&ZDKQl!w5HIl)(&HLyGd{7K?iXSnL<+cvQl-&UK2Mi8m7zmur)GEZb!NbhYeT{LJ>-PESqf z>Rvfz{UfPoW$=TFoONT(yN*4Oq_j=J79w`9kCFegx@gA2An<_XRy2i7np}MwhT}OD z=ekNWj6|mZYNFd=5hUqozM_FdlX|zSlwkWr9I&IcnT$WvF`pgullmK2ujF_Y%R=M~ z$*|}8`?xp#54k?8gSM?^i=F}NILNWx=;F1JAVLMj=Pa$E*@kid-r}}V#maD~qxsry z#`gy?oBc2ed0|z>dh?XYY+qyfno__F!0w>#>piPdN-YOOgiMY{^eS?F=>SNvkIh4? zk1i%wp|(EUI=e+rGd>(>0BORoP%9ZgTuNS-qnubJKIFhzB8&4)0s9#pn-64{DXWIE zUUZ+%_(1Rz&^^3z*Yg{VFESc`;EQZOG2eI7e)GyjhhAfVbd1*mn@sIA!J0*Stin>e zqc5zVmK2_tv=*zs@%$BJdLFPfH9+UOBpoFbSrhABtP0FuPPGL1fQueMz!PS|8~njSplS`4g<90)Bv3fpFAoE1idkPen4&8KN^Hc}47{12+Er^9Yk=%VLUJEM zkmotsyPN-nn!c~GKPg&trJ+J@slSy}R8u=Ucx1_%DI-QTB5P(FwzG~(>UKFb23DfC zthK_dQprn1*7W4Frl52xFTLu<`>QW#ZqD2G;zb!psQzEWwAifxOiCUKSuU*X+s_gf ze~!UHc9~#uorB~1A-MGRo?ZxS(6E9yjSCpV^64xJny)doC%3dOwyu@Fl{8|h1USRMJuK7<98}; z?%6^%JZ|&8-KA?)l}>;AgHHYXW}_n$lg4{%*$ZGYmNsi$L}3B1JOm= zyxh6aL{?e4MRhdyHvFuM|C)y;WxsTmmgB1dvf$U_!PFq<+{=zqIHnKq9}T%PjGH3A zdQ?F2^k)YB2v@|8sg(6nX%w^otGB*mEuyqwl_ZHCW?^q?5R zWJ&n_7Q=}Lq+6Xs6fVZ9aexend{hIHj8l8F$O$2r1G%Rwa;Lv zv#@dAH_82?tUAE7V``_C%EXZ-TmyW8a<#G`s6YD_RYuZWjehMtJBz`&+poe6PT$IM z1AGeH9eR)O z;$f*vKq5JmAJKf`;_0qw^`!1rFGYQa=^C+^wA!_E2qlBDg!^jF17d{ZoO{<$f_s

    ac6rYnG!8Nd(Ck=T;r?G8&CrnJfe)C)2Cd6HU7KsDJnL1~t>Zz;zw^6C z6dt4+$|o+m-ux_4EQ=vbH*5XyZ*pO0dT29)&Q2km{#l$UvlH$t<-D;_p z_IEaU)kf61>8X@BLhh)&tL+oK@slcZ`$a`+|Is;H6H~P~AbFHr9^@X(d?B4hI(Lq+ z8F7N{5C>ysw($USB7aV$bDk!US_9mm#YVOUm%*q^#d|)6-5BNKbEv6{sWAv(VBs_( z0giwN+?cUGi4$i(J7{4CLUv?TMgWvdh87DkBY2hy`mGs|ZLx+L!>15}bdo$}Z@MXT z)Ci4C?zELHV;(;!xzO<-5U;XFGH~3%hh_+gG#6`_Q**K1XM1wG{5$gt<-<0A!T{wq zGna~W0LAEUl0VVBXX=d~zn$4qxpxgv8IHVY3=yMR8_FUfF38G6I6annBaGjn8kr7H zyo{{X{M`-bKRl;G_VsGPj|Z|hA98XOc#-^`Z)f96OekFH)3`<-7_&?B{BYj z2=;+{=?n<(;+48QF}!?wu8Lk_lKrti*g1XFZfC*~sQshcXsuwYvO+N)$?t3mnQWcR zt!qE%Zoev#zQM{X^dIDDC<>^}O#H4)Ht>!?%O-d0!49V*bC=Qb? z*hxZ3rXS8_;w2x5`gq)Jy4=xm`f`_*`TO&WZ)JQ6z$qefQz-O7Ef{HXB|QPGjKl0 zX*h07k5Am7Cw2Jjb8MyY{4^MSc$Zu@To|E ziMu5M4uMIsq(OEn>PCN_nL8D`UZLs;^*rd$fR=X1WIQY)WPI#v=zE-|p>JM~0~1sr zDCtc_ROOY}`4+c9Fc8|@5eD<+G>?a6H<93s$FO!|BZqkH?#)yAg40RbdSGSQKVWJ5 zm`=GP08HgK2Y4ZfAfEQghzdu*Rp>s8_LH5leT$h; z`2SUApIyh9IvA$l4_G{9(8C+IS<^fn9=1JQ8K4ZH#A-tBj|(Rnbz&8liK(e5;@IbX zE{a3Ef;c|)t)v^NPETy;FODtz`W!Ggejz>#;P$4AN#}{tg^P*x3|F|M%fzVa#e`0V z>)EZ4elxj~8vAA-=NQ*@k14?!p53^$s?`WEZ+d`ZxHq;kOga8lzP}%P+6G|2h2^Ol zE;6SA+{Oi3?m``c`0fJm2dh@@2C3lhI?FeqNEv!2-Z-giL#gsy0Oq(;gM&Wa1PC01 z9hPYk<8Ra)rgfynccHAdL$w%hPA%Oa zEh8z2kl8tp$_tZhp6DY0zvR|A#ulvda6dPl$QSV`DBDen1^#AitiP@CDED?hOj-o} zGB>Xq09EHi@T1ckeB8oNjYf2p?t8QQDHe}!vA((H)Cv5d&K9oQhXAq2jYNndjr7e$ za5JqR8DV8F`xK$lRrEXWC2rxIi_-v20hOB0dj|*$(0eaUY0tUAa|^3Z%aj(K)hANE ze=4W&Q`gL&+uDCcvI640B?+a?G}wUBJt9YvSvqKHym>P zrg4Q0#=g_425km@x;?HE z_AF;sQZ}B6_L0K%f9F^m{P%XRBU|p~D%MHUcc)Z+D?TQOy_(36wML)1;3U^RoWA&` z??ftV48ckPlU zy*5VP%K7@#i0WkhVI|5w>d)1!UHW_gY5P_lvM`4Q35@b3BLAFwJP^bckFtbRM{6LM zk?S)M6yrVwe!d5922`&c-si3fhSmDqPq$|hp72kKJOKXEdP``&&1P}2#gFM}uEu7u zl!5TF^Q>j_W#>NxcCvsJ!E21OR0+W>ZzyG+k95dXJR-6Eg1EGe>#(Oha4auK>o^`} z35ld0X}kA#MZ!OJ1kRC<6w6B4qm(z7Omiw33^+NL#!`K?(`_NLZ7BI+ z8#m1K&;N)*B$kp&#@GK@`|4>|hAesHM@1gJq=@uSL^Ez#(>D_D_~cOg{B9g&=6YGP zgij&H4Vu-!h?beHm$Cce$8GmBQ6~!|0}0Lw@x}jLy;Bk;HDSD^gc2DKUn1@Gkj7iSa+{+~!p zo?CSfk^60Bnqw*sNE$J_cvoR&EfF?@UOz6@Ag)r9UriD?wkmS+qm-y%MXZqp?Z!_* zYC-NC-kgJS&5u$d_#H%9VN;sNO9pZ2)TrXjyt>gWnTmmn#uUA$?J1SAz5^WXVeG3n zwxok@dS?X0oAaF9xpw$7{9+rqKY{ahYLBKSA^no0n4Q3G+g2BNLnAQj$~AzG0hYVR zKb}>apeqZ{y}@dOmqFK5*tq6150TleLc45Zb^MD!M!l2aiSE*htz-$yMAUr1wg8_@ ze^?{nOTFR5Nu2O^aj)&2bYQfYM)6(kT?R^ebsT*hGCPB!8Aedh18Qodc$zL0qb#v< z=QN)S!sWxoG#YhlrpVc0Ch!z|i?g1*qtx%1%+c=I(os!v)}6s1;9Lx%=t{PvQ*K3G!z+-`8y5?+wdA(c8;MjCa0MPmu{D6pTM(h z(gV>^+JmR_W~A#?luk2v=c{`mhz^U(13@d_fK3sCXP)1=+gE|hjMZ@XF|jv*q{5A^ zod%JvP*UKS)4xsb74bmq#&Bn7-aDE3>0BxO+FFI57G;TuWOa17`Mh*gV%JB^+0mdr*11fPh=@!kA$?fLlt1zPf7h%$tf&4UvD zYMsQ8W)5G+og#wM;-p`<+kHK5hQB)lHjo0nL- z^z*a-eAb1zB>MHa+0<@_8Ox)-iA#o*FcLn@^IQHxZNjYg$ za}|5cA-r(*hKK+4@@pq{x>$Hv4}LO{Ee|yIa6rmQx9Bp@ri8`t4c7qGs;yJWm&KN* zk0vdrdQZ~Ji`l1^PSJY?@TMNMSmz8{vHBgT`oYgWws zlbY6)g01R|v=_c5?e>D|qzYouAVrqH{i6E36jKy$TGh_}ZKmN&I6wC^(Cq%{pN6`GM(SBE`^=j&&7IZENZ6}Av;+Lh zYQo0>(H8n6X`0>aiGs&r3D2Kd;A^tUszj=76RIMI$|-5BMru%pu5)EB54nosC1B%e zQTr?t`T@=T3r#@(1#IFvCR^#i?U@0N1*R&2ZSCT-ej}_lV!h`x;QgstzhsA-0QNZQ zEbSpdb4>p~;f1>FOxDDtW`9iW`Ys?VTWd{!nAx|xzDB-t3({T(*t=rIq!^PmyX|(i zHeI-O!+@(>ds9#4{eN>o5p=KBlZ!qT_b<#s@jDu2W!?n{a+#xR5=XLvE-Rsy>QGcJ z(bbtgF(mjj*U7rGJ>{h^EQ&w2VNwe3`u3gQ>d$z}@^(r+Dh7ImkJmdQ<+hc04+2tc zI^6Da`gdf+QYNVwy8s#kw>Y{h74o10p!)5wCR&U%p}65SgGItuA%!&FFuyyHjp{lRIn|wuwGY zonaBop3WzkJ7&vSJ7R1ypL^rntB1aQNa%X3+bcia^{PAPhm2T8u*CPjwtg)iGNYSCQf(1^lNIZ(3w`nJJ_(;0TcP&HuEmi z_u7LJ&5yHC8g7iHk|WdHv@B4J$l7O4TZ4Z>6jLbD@B4aE{W+vDl{i?wVXWfEA5 zC~&1WN}v{ZLq%&BO1O_DVhbinY zpDQx?B5azex|#&OEtSsrePm~hZKx5KTsJxGBk3IFR;hT~5hP5*-P^w`C2GW7)F0)4 zsq}Mju1S>3{#4}nmyogCEj-Tnk}8s3tBa&tg11PsWqki^Iov^F%7%2(wUT&tQymlt z7;(O-xRx+BO9;6FVfZ>a<_ERDSH*QCuaVz}eQRWRvPvm~@UTz$Lb(NFPrip&Oa}`I zAFuePQn`%$FArS?T9s`eOVIvVt`5L`&~dczzwol~@LaiS^hTu-$Mnbd#k^CKNU3c( zzrD&cH26;&xJqeej!s3g;v6`Y;K-7S_F%RDczfbE9V}|Xa*N>(5T{*VXH>n^ZCKow z+!sUNSqkJB=;QHsq|*L&Ng9%_;jjNu%!`h2Szxb3;tg{KK2NJ<<=-sKbHB}{RbwgZ zdG}f%u&*@cWP_5wx9lQ|6JAkGvap0%B5sOHzuQTynK5JOs*Al(XG~TEj9@`tdzTa7 zWf=j+%0L6~zY+m-_E?#ulclkwK-dWT;AFYr@61>RbLlA$B=|__oy9S&254Y8iSxi; zYows3bfu`p0iPml4Ys|`G2x?{iO;0U4)}ms9Fe%p&l|b3JWIL%*bhg=w{3Bxo;ya3fg@G;VeC%9fdLX1$EkvYkME?6@}I(pR7i0XoNJ6Ug!yjj{-U z+bS~C*%Pfb08iqk`q#Lw8eo@$(8FRzHw##*ABIgWhr#qA*IBGy+c?*j+)1Ofl2}CL z1Sx>v*5pEbkAdBH#>WjSpCew}6$M4@Z6%1tQ@hjOY+zeB4a!ui4lWpy3ECk3qvL7i zbaXzIuwTff1L}rGe6!6imx_-BoTQhYV;!A5tgl2{BLm$(?80{OQseh#zDyR@vgka% zkwqzp0d|GXl^4t`F1k#;%-#fKi5*fEKzhAOKPpt@%T#oZ`{3()<^8l+?Q%rm+Evt< zQ!T0D%U_RIMU}vO&#y?*gKpjGlpzcIg1MPVuXOlol8D|n&}k#n=r0gHQv(_eHBEI! zAy3LT-Yea$2r3!#2OK{q>+~~t`zM&ydYc;B=c`gaIG&k~cfPAZ^#|HVDIgW&mFdGV zU@v#e!Kqk;=O4gkb^KjdsS`ujp3STAmIu&4?Ks}THh=BKE)TF=?=&AdoCFS4*hWVA zIUn0HSN)4b_peJqjjn)09J^6m9=-op*>y%W)pTnVMFatnt`zA_jG>B@C{;v2KzfPv zB7!1Cy1p8k6d?i%Lg0P9kNJ1bqBQ1f1B=_*X_pW=tyS_hPver3SS##z& zv-ixLy`R~8PJ-fTFc1%%=H(B~9im@&126re0(O*NfW=KA=K6|LRr&;{u{tHd)(5l7 zF3*#Jn9Rhan%kf?*Ef~d48(v$jR`xw+;?IF8Imaz2ySp>%SpkCMMtmt?6{z(X9dkI zi`Tio4!o$f`KULr<=rtYP^{AQmd85DP&559>p1(;jlhKCr=$%FVE1fatS_JI)?`@X z099W8R$<6^0LBSFCb|1y*3RE9@T6xbE&iSdiAxSAA1(B&s@ccEYINNMF{b`3+ zRH?1v21XVwe%%xuc~6^pU8%A{i+pZjr@hHhk>x91?EAX6W#kU47!8WNXGIjx-R;8Z zdP*flr*h|k1^mrlkG^9a+Cqq#=fNeQa$0F>nc{V^t{w1GHDE52KF*?#^kM7kH66ZR zyjIq}FS>f2osawM;xLVemz3XrlQjM+H;%F@Wtce~1u{Cwxn277zGr>h^Wk{|;~PLY zMXDD4?>jzBTj{fr_iY5_N8JJYvVK!?NKTmV6~io=QBYEN&YpjRy5mwZ#SBp5&GKKlc@SYJab1`1{EgaQ1T> zzdIZ3@cHknZ+H%vjZSee@`TD7U3SC?D82~DGoU+ps6`Gs`_^!uc^&3>fx|On=`&yG z>y_Pt7rWvA+Xclz8(!&QK7_=0GWB3}8@?D_0-^gv-`uUutqK(aXQ#v6%7 z53dE?&WB3#5;pOb-~P0gK2>>(y?_lIJ6FMVX{m!y5zAaFUz>#I6`k2Ae=|tTtF(J6 z#FPGVwTLkZVT_kr+c0%JrE;z)cR=8H~ zA~whKVCTmSuu=P@NO66o-?k4-($MWmyvx)1zrie9QFOqsWLmu&X9}AV^*~xql`CCi$*U5B?%AO0$tfi*i zdC_MI=lS2wR{J&ygrXU4D35RevG+D@BAOGzJzSZ}RRF5d5(N(BE&&iP`a9;NMo zdfy$E?)FO`zI+n$B0+u_#Csmuk>H^x-;+<@wT-5SEwXL{qkALR^T5WnF!RQcvi53kQe#@o z#P9mru%XC=mb6$w@UWo2;SH6;=Mo^7=dXR7h`wlE&MWWE%UF9AyWP9Z=Vpcr@jm$e z?dc~;y&Q85@OE(?hbaENGWbt9IxeRq6Ualn6^Kr2%bSxe_e=;>HXaWXdV=RbW^0&s zEy`PGR@8}ORH1cVI5Wa7WY#A5iK4H1ivPb#eZ@6IM)AEz@9Y|RZDtY2P zC*RQ&n|&>LV|gsJ)qMI{S4jJv<~|QtQoT+lF2t}fE-4uE?%A)fZ`)xt9sSKAcWdo# z$}d%m*{3h_q#ki{CzVLZ6yn8U(HjrYrCzw%hOZM7RDh<&CI8_a)zmiktnYSHA1&p_ z`TQO7@4h(NSUc1AF6bgxww|`fn0twn_=fBAiwW#+{xTS167cg^GVND`PiHeiC+K}` zovQ3GKbA5t{7?$e72b!$bi53<1gM#T8`B;a_W;-vzK}akU%jBx3AAp-~Ii{tpQb^WC>~IXNfO+;iJNFklW%3O~w4a<2(t=zhLbN=(pK`Y;5=~omF)UvdiPk zEXE|O-C_rH02YqbdGN22nYDs7=1imR960Wb#NBuvMR-@&+t_@jM-CWZ(l|ycOHY$u zkEC}KN9qFfS@wwa!%FuSCUMWkLR9)5Rr1=Cj6o^9pB!KTHOIM>_S*j8&dptL6mgjp z`C8QLUu|Wr#sCm@SW8x)YWtsJK^+I~g5inXO69w@7w=q@rJtPiv%Bx9+D>H`PgJG- zjQv=}Y}qXLpj%<`z~&O5_9?Jz3u)dg=%tT(R-??O|JvuYILfnaW)`<(8xx11_K7Qj zz}7MSR&JO3N}uEvl{48i+}Q$R#LI-=DcTpMa}ksQ6``u612S$luNV~~WSO^&W%-X* z0ls62k;%aKK2FUY1|%zNLROPt(IwaeUlxA$UYtcF4`kYPdI>aA;s+8 z*QpLWW+cA!y51GiD+z4inCbYf`gYrq8MeUBm1$&0BU&TC8^ zEN}+$keIE?etBB}W}77p^YJmi(lN;;0UcZRs!ENEuDFoh}ChYto~JF5BmUgs>#0Quy-C1quTdZwiYzv z?*pF3$(^3(lGl!DnK#>~=3CBlxjzeS2YmY$>inkScUy(f7Bi{86QdxF!|i8Z^v;RC zwr&H>c9Zi9#XVr@es$`Zg->r>xObhU=DD|c*|$E{b014#Hgb>(s!m_o^>c!8#E zW8gs|x1pV?s!=TXYo=q*_wVH|3h-`|nw*<9-Fb1Pa3RpEdf;`ht4edJb%h>R4RTcU zLc;u0F>KTPj=5=oY5!_M1yZ!wsSGfvE1%Tz7iOy`bHi$wKWpGdUT1V)DR zWLua+*&{9`mOEET}QIgDupD2e4v|&_H-{$0*2ZEjLT? zV_oLErALLqgHqJ7H`$j3lv2No#yv`qs{SB9W@d?YeEGQ7AO;vTQhNdg9rQhXawY{! zHjiLfg7FiljHy|G2c8eEAB#zDJN(08CDtdwGhR$sj(IT7MUNQmK)j54N`RyhfvEpKdUcI*lo|c{Ub+S^C-(hjx!@W4Y z<$gy=J%V22hdyMyS8ijzNdyv+@`!!P4Opz;>P3&n*ZsEIsBcOzxbhYnCFAZtloa6=J|9^26cNUO;`77C&r6Vx5)0! z@D(FOV6ulsZw=?<_*d9MQ`_TqxJJ&wbwv1hq)z5Doviqp#P^FG&+V+2htmQ z_1A)qJPG!R=h?vZ{5pxJE;vx>z61 zD(lA}x-ntyg5_CE;Aw)~W=1HhIv_r#Vq^cx~m_Y3WT)zlh$j!mYi&t z!>$>CMXu zJm;s-U0k>`2L2V}P2^~mh_@0rnWp?v`LYN_gVmrkoTh})-HM6cM-J)5Z>=!1`E?(m zZ$6rW<5GK#(UG@@UMaR7P>%512o%*z;9$86MT>b&A_k*cLMTH6Dt@%kLsCtJBXtE1 zf{+Q1XbPY;q-NvMS`COc&DM5+L`EF0%<<4hHvDLR&_a%pWXNJ0b)^d#zPp3vi3;D} z-x!D@_0Wo`8v|3wD9YXta6}1(QdTDL&biv>&vUvV%p@#-k2Re&ZdlL87Q7Rv_BZ)*&x#X(Wp5M=2P{Kv4Fv zS*Y-xtuhd;ryhX}Io#R6z~}su5eJlkDQIgrd8HyFiZ&#^p-~0 zQ)fpSb}docm#pzwBW+Yda0Mzn@UXuT749GYV~n-}HxWqrb|#$moH`eFq>^;z#$t{) zQzEr2Y8`EE;B{n`iwN0f-2&+xWy@}#%s{Vqv^F&PM-kBzQ>Zq|=Eleb7gbF);BbAP zC+cVi3yIhs0YwqBOsH-SgR~lz+^C4djCvXjLW?oMWr2`KB^AhLGav_}q2^^$W5lja z)DO+WIUYYixTIu1&8Wkz*M6E|yM#F&1Tu1W2iBze^D>HnBJMRu0k=w2q*5nl{-Q1= zBO*c$>!aF^dZwUJ+v{6p)cLl?Bk7h3RqEl-4-p|Z?)Yl<($a~PBcb7;X$>r955E%a zK>G_&2be*Q+pMD@wuoFB7`AyIRqnZiK zC1?bJFjR&-8bLH6*GyBXNI11jjRO6{L8Ami+ej-}8PKEPlt_w7k5EzZC_;@|zNBB0 z1oXqL0g(7?8{ww(GHJe#o>a;ROq2=*HM#5`6HOG@1DkcK2(7kX_>@h?gtLYp&ej7 zkTik{VqPqK*Ka(7N<{9t?`{?K!2NoJb|@&xj1g$m41#DvEy1nxK=bXVp;8$&%3T$c3N#<4i zVvIde(4){ajejk~z(bB;U*?q5bX1<4H%Uo^xo0E_80R~`Gp+JKYs`LaHU+Dn_CCkY zwE$O(f33zBmhcg0=B>1Of75ax2D<(%ur!%lyY;CE8#@a`??OCm4@A4b-g(5By-g?b+>! zns3y-^%^|5{uf&XGCU+N53TxFsCrjL8z~DT9lk%Irf1MBpAi+Wo>)L5UX&gZ4QgUn zgBW3@Idh74N}1DW+Fjq1eS#JPPu5HB(3vuSUhPTx5S|QqW~bmKP7+ePN)R2sCiF$H z?P#Yvx@`(BZ_gmXRXZ)9%~;SkfstnOJG6CJYG)HA{v< zA9lajm}7q>#Qzfi>cMIdBlXSsqt0>+@!%!?VJ+lPC>+YT80a4{2Wc^OjJ!bG7u{Gs zGu3A|BH7IO+r9%%+>T`02%UZJ>6&6@P2+4zG;B7e@-DnLRE>6!L>6FIpRkHPYF=*? z6y}Y5E8p08cdApv^y}*my-lCHPEA&a@mE(w;H*jO=AWEKEJDj;t2UN}lx&YOWw82+ zHGIux)SM_GPKBVNBdc|JAG0qh2a(VEEsV^swn+K&oA9}1++mPLWmnF0T6ul-mpb}6 zA&KwL$*e_;*33gA>(V;ZOt9=7OUeAF9)Q9Qw>Ikipi%qTTzhlta_PUMOf2$mFaOwj zbbh=BU|xcTh2i#kO4grR$}i{u0RA#ot_ z;>eNAMnjc;tJvw+*pl1rnO;m1@Ro7&efy;TwZ5+_`1FF%Q(Gkq?uR!7in=M)R8f}p zo^bqEn8wb2JC7P=2X+21_sXDMbZT~dE3phBA057@cfr$&7#QHOT)lJp-WKOmo zJ#97V=E)s}F73Ih-ZOXm=d*AAfIMFE9V1IJiK$%*!&^nUo|>7N){hrNPWo)tNgVBx zld_{*S5ape60@TtzJIG4zqW7^qRz6L?)6SvQ9UQTn`A;=ld4T!exx{PQq*JgzDWR) zul8fOOHf8?wym$wg2v5#vhm2rB!<;q~N_X1f9eZ`oPCTpoC6!z}H0cNUZ z@o<`rHM*NVh3#FkLC9*DE<2HPK87JB8}_%BLN~8$is~joy||Tm94MaAE|O57JG@{A z&O%`CqtMg}{Gy+fxL*_M9(cwt)@8LMuXO0@o%t+>qhGV8q$)CtM)gY?HR8{eS9NAR zlvo(9;(2q$~^eYDNC_$!$l)l)|pHq(8k56OD!x zKl~lkgK}^^FkcVq37g~uq0N0hV_SJhF0i=d#{F1svLR{_tE_dDSr?p=a*xBM>fu|U zUAInPFkfm4u~epbIGeYuW~ha{(3hV_ZG6HIKZ|Oc`{Grg$q?p6>o({RdKDC;n?tbb zFgKbGZTeaACX&U@1QPm{nH&{v`y+X}btXSvp1`gd8BfU~`N@~%KR8vVUUc3qu#|ga z0X%JDSFfyjS#*6x>Zf%uWm$L%KEDq~^x^FNgs89i6i7~LE2LWYQAryDQ2@rdipVcH z{USw3Kv)eLc@$0GoW9dm5%~>00sP3OXcxatM@^Vw0edc7l{)>d(E9%I zkX0sRDI?9woZg0F5w5wi{OP3`Exx#%aPld;X!3H~LoQ?D&jQOuHF@Bz8v)YIwZYx3 z1z3-FDrurauMg7Lo_3MOUUrAvdYS!j;cz`Uo?C64B$a};QvL3Rz8aKt48eIdD0+WP zt6OkMD-%mGsTwd#D)!*>*W;al^TM5h+xedS>>a}_BhSP@nn(P9FI8_;cc)6L5U& z?xN_dqO9bm;O6YC1a<|Eu2A`_?xBzWfBi!Y+ToPbbaaU!baeXvUGG2ji=LvRdm7|% z)!E<8$<^7<$=~&Vkd&0bDoW07O3DgKt_lh+3QmgGz+gAU>q;sr?#kfn&QLJ)|6Byr z@&7?P9_o^1f$Hz6)6uE@3n+}~A5bqBKi~fV?(gFN2FNb2>-RJuy%a7wI@NyxI?MJC z&|??p{{ZK>^uK{&QGTQ!1GFdpDjl8fzrbAQ_y^{xi>KQorvNXP{{ZZNulYBS{SO&t ztkX`=-8A9B0?Y%NuE3{rFy6fnxDla&TJY|3O09|dK| z4h4k{1qDT48!G4GZ0+FT;NooK4t*kE{=miA!^P8`+s=tk_p7+Gt}H}mC{s@aCJWZ{ zGzg$2=%?hQBJ9FMKQjm4@?XT*^31_87A`-!XKPsF_+U!L3fNCbHMK7HrYB$*xG&T@O;X-Pzd=F^Ce?a5D9&OYwF95h%tt9V*+ z_HktI*Ye!<`r6FW$zBBo4cQO;RdjU( zQgQsM0!!tq*4;474Eww|`!bm*>Yt@Z84@l85f_72ez+LBAW|OJNxly+r8F-d2VZaq zPBT=G#`LhX0RGzmV&mqO@gU+mU+?7wF&o<#T$%V_+%Wy=<~gn#rd0`VnAZNs0E4k& zt~|b{u6=G4`BY>o73)1YIx=ee{4k+>8_*5IlQ*waqyHx~2-n6;^i7{P4HVrpuy)e` z`;Ex@z&9e}|JyQB5m9;5u=vd@o`1)jAJ!^Pe`8A(^G47PH+}m2eFw-B=cdn_K=h`9ijZ9n?7T2`V_e7^JbX!H=#K%EFXyD z#Ia4iws9DqOn;g$e}VJa)X6JQz1&Q5Lz78JP;WIhA5Q5 zq57^RgUwZ%i=StMeba=>O%wGX?OtdEnu@(F$O+7K_r_KmmkGwrJ@y+R+VlM@Lfo6? z;Wum`ll~PU(@hg>H%;`B-wdAi#@1;AEz!-r(ti^3dy_q2!2FL*^B*H8pMU4G$e#Th zJTZey9WW4_zl|n+RU�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 D@Qyg< literal 0 HcmV?d00001 From 1777f0aae717e5dc3f8746f2b0e84279647a3545 Mon Sep 17 00:00:00 2001 From: Vitor_Boss Date: Sun, 3 Mar 2019 01:43:43 -0300 Subject: [PATCH 23/51] STM32 update --- speeduino/auxiliaries.h | 12 ++-- speeduino/board_stm32.h | 36 ++++++++-- speeduino/board_stm32.ino | 68 +++++++++--------- speeduino/cancomms.h | 2 +- speeduino/comms.ino | 53 ++++++++------- speeduino/globals.h | 47 +++++++------ speeduino/idle.h | 4 +- speeduino/init.ino | 140 +++++++++++++++++++++++++++----------- speeduino/scheduler.ino | 35 +++++++++- speeduino/storage.ino | 22 +++--- speeduino/timers.ino | 2 +- 11 files changed, 268 insertions(+), 153 deletions(-) diff --git a/speeduino/auxiliaries.h b/speeduino/auxiliaries.h index c3d582b8..1aae707d 100644 --- a/speeduino/auxiliaries.h +++ b/speeduino/auxiliaries.h @@ -25,17 +25,17 @@ void fanControl(); #define READ_N2O_ARM_PIN() ((*n2o_arming_pin_port & n2o_arming_pin_mask) ? true : false) volatile PORT_TYPE *boost_pin_port; -volatile byte boost_pin_mask; +volatile PINMAKS_TYPE boost_pin_mask; volatile PORT_TYPE *vvt_pin_port; -volatile byte vvt_pin_mask; +volatile PINMAKS_TYPE vvt_pin_mask; volatile PORT_TYPE *fan_pin_port; -volatile byte fan_pin_mask; +volatile PINMAKS_TYPE fan_pin_mask; volatile PORT_TYPE *n2o_stage1_pin_port; -volatile byte n2o_stage1_pin_mask; +volatile PINMAKS_TYPE n2o_stage1_pin_mask; volatile PORT_TYPE *n2o_stage2_pin_port; -volatile byte n2o_stage2_pin_mask; +volatile PINMAKS_TYPE n2o_stage2_pin_mask; volatile PORT_TYPE *n2o_arming_pin_port; -volatile byte n2o_arming_pin_mask; +volatile PINMAKS_TYPE n2o_arming_pin_mask; volatile bool boost_pwm_state; unsigned int boost_pwm_max_count; //Used for variable PWM frequency diff --git a/speeduino/board_stm32.h b/speeduino/board_stm32.h index 81835bca..937aa21d 100644 --- a/speeduino/board_stm32.h +++ b/speeduino/board_stm32.h @@ -1,21 +1,29 @@ #ifndef STM32_H #define STM32_H #if defined(CORE_STM32) +#include /* *********************************************************************************************************** * General */ - #define PORT_TYPE uint8_t + #define PORT_TYPE uint32_t + #define PINMAKS_TYPE uint32_t #define micros_safe() micros() //timer5 method is not used on anything but AVR, the micros_safe() macro is simply an alias for the normal micros() + #ifndef USE_SERIAL3 #define USE_SERIAL3 + #endif void initBoard(); uint16_t freeRam(); - #if defined(USE_STM32GENERIC) + #ifndef Serial #define Serial Serial1 #endif + #if defined(ARDUINO_BLACK_F407VE) || defined(STM32F4) || defined(_STM32F4_) + FramClass EEPROM(PB0, PB3, PB4, PB5, 15000000); + #endif + //Much of the below is not correct, but included to allow compilation //STM32F1/variants/.../board.cpp #if defined (STM32F4) @@ -59,12 +67,26 @@ /* *********************************************************************************************************** * Schedules +* Timers Table for STM32F1 +* TIMER1 TIMER2 TIMER3 TIMER4 +* 1 - 1 - INJ1 1 - IGN1 1 - oneMSInterval +* 2 - BOOST 2 - INJ2 2 - IGN2 2 - +* 3 - VVT 3 - INJ3 3 - IGN3 3 - +* 4 - IDLE 4 - INJ4 4 - IGN4 4 - +* +* Timers Table for STM32F4 +* TIMER1 TIMER2 TIMER3 TIMER4 TIMER5 TIMER8 +* 1 - 1 - INJ1 1 - IGN1 1 - IGN5 1 - INJ5 1 - oneMSInterval +* 2 - BOOST 2 - INJ2 2 - IGN2 2 - IGN6 2 - INJ6 2 - +* 3 - VVT 3 - INJ3 3 - IGN3 3 - IGN7 3 - INJ7 3 - +* 4 - IDLE 4 - INJ4 4 - IGN4 4 - IGN8 4 - INJ8 4 - +* */ - #define MAX_TIMER_PERIOD 131070 //The longest period of time (in uS) that the timer can permit (IN this case it is 65535 * 2, as each timer tick is 2uS) - #define MAX_TIMER_PERIOD_SLOW 131070 //The longest period of time (in uS) that the timer can permit (IN this case it is 65535 * 2, as each timer tick is 2uS) + #define MAX_TIMER_PERIOD 65535*2 //The longest period of time (in uS) that the timer can permit (IN this case it is 65535 * 2, as each timer tick is 2uS) + #define MAX_TIMER_PERIOD_SLOW 65535*2 //The longest period of time (in uS) that the timer can permit (IN this case it is 65535 * 2, as each timer tick is 2uS) #define uS_TO_TIMER_COMPARE(uS) (uS >> 1) //Converts a given number of uS into the required number of timer ticks until that time has passed. #define uS_TO_TIMER_COMPARE_SLOW(uS) (uS >> 1) //Converts a given number of uS into the required number of timer ticks until that time has passed. - #if defined(ARDUINO_ARCH_STM32) // STM32GENERIC core + #if defined(ARDUINO_ARCH_STM32) && !defined(_VARIANT_ARDUINO_STM32_) // STM32GENERIC core #define FUEL1_COUNTER (TIM2)->CNT #define FUEL2_COUNTER (TIM2)->CNT #define FUEL3_COUNTER (TIM2)->CNT @@ -238,7 +260,7 @@ *********************************************************************************************************** * Auxilliaries */ - #if defined(ARDUINO_ARCH_STM32) // STM32GENERIC core + #if defined(ARDUINO_ARCH_STM32) && !defined(_VARIANT_ARDUINO_STM32_) // STM32GENERIC core #define ENABLE_BOOST_TIMER() (TIM1)->CCER |= TIM_CCER_CC2E #define DISABLE_BOOST_TIMER() (TIM1)->CCER &= ~TIM_CCER_CC2E @@ -266,7 +288,7 @@ *********************************************************************************************************** * Idle */ - #if defined(ARDUINO_ARCH_STM32) // STM32GENERIC core + #if defined(ARDUINO_ARCH_STM32) && !defined(_VARIANT_ARDUINO_STM32_) // STM32GENERIC core #define IDLE_COUNTER (TIM1)->CNT #define IDLE_COMPARE (TIM1)->CCR4 diff --git a/speeduino/board_stm32.ino b/speeduino/board_stm32.ino index 0b9242e5..c72de14d 100644 --- a/speeduino/board_stm32.ino +++ b/speeduino/board_stm32.ino @@ -5,8 +5,8 @@ #include "idle.h" #include "scheduler.h" #include "HardwareTimer.h" -#if defined(STM32F4) - //These should really be in the stm32GENERIC libs, but for somereason they only have timers 1-4 +#if defined(ARDUINO_ARCH_STM32) && defined(STM32_CORE_VERSION) + //These should really be in the stm32 libmaple libs, but for somereason they only have timers 1-4 #include HardwareTimer Timer5(TIM5, chip_tim5, sizeof(chip_tim5) / sizeof(chip_tim5[0])); HardwareTimer Timer8(TIM8, chip_tim8, sizeof(chip_tim8) / sizeof(chip_tim8[0])); @@ -18,9 +18,10 @@ void initBoard() *********************************************************************************************************** * General */ - #define FLASH_LENGTH 8192 - - + #ifndef FLASH_LENGTH + #define FLASH_LENGTH 8192 + #endif + delay(10); /* *********************************************************************************************************** * Idle @@ -33,8 +34,7 @@ void initBoard() //This must happen at the end of the idle init Timer1.setMode(4, TIMER_OUTPUT_COMPARE); //timer_set_mode(TIMER1, 4, TIMER_OUTPUT_COMPARE; - if(idle_pwm_max_count > 0) { Timer1.attachInterrupt(4, idleInterrupt);} //on first flash the configPage4.iacAlgorithm is invalid - Timer1.resume(); + if(idle_pwm_max_count > 0) { Timer1.attachInterrupt(4, idleInterrupt); } //on first flash the configPage4.iacAlgorithm is invalid /* @@ -67,32 +67,23 @@ void initBoard() Timer1.setMode(3, TIMER_OUTPUT_COMPARE); if(boost_pwm_max_count > 0) { Timer1.attachInterrupt(2, boostInterrupt);} if(vvt_pwm_max_count > 0) { Timer1.attachInterrupt(3, vvtInterrupt);} - Timer1.resume(); /* *********************************************************************************************************** * Schedules */ - #if defined(ARDUINO_ARCH_STM32) // STM32GENERIC core - //see https://github.com/rogerclarkmelbourne/Arduino_STM32/blob/754bc2969921f1ef262bd69e7faca80b19db7524/STM32F1/system/libmaple/include/libmaple/timer.h#L444 - Timer1.setPrescaleFactor((HAL_RCC_GetHCLKFreq() * 2U)-1); //2us resolution - Timer2.setPrescaleFactor((HAL_RCC_GetHCLKFreq() * 2U)-1); //2us resolution - Timer3.setPrescaleFactor((HAL_RCC_GetHCLKFreq() * 2U)-1); //2us resolution - #else //libmaple core aka STM32DUINO - //see https://github.com/rogerclarkmelbourne/Arduino_STM32/blob/754bc2969921f1ef262bd69e7faca80b19db7524/STM32F1/system/libmaple/include/libmaple/timer.h#L444 - #if defined (STM32F1) || defined(__STM32F1__) - //(CYCLES_PER_MICROSECOND == 72, APB2 at 72MHz, APB1 at 36MHz). - //Timer2 to 4 is on APB1, Timer1 on APB2. http://www.st.com/resource/en/datasheet/stm32f103cb.pdf sheet 12 - Timer1.setPrescaleFactor((72 * 2U)-1); //2us resolution - Timer2.setPrescaleFactor((36 * 2U)-1); //2us resolution - Timer3.setPrescaleFactor((36 * 2U)-1); //2us resolution - #elif defined(STM32F4) - //(CYCLES_PER_MICROSECOND == 168, APB2 at 84MHz, APB1 at 42MHz). - //Timer2 to 14 is on APB1, Timers 1, 8, 9 and 10 on APB2. http://www.st.com/resource/en/datasheet/stm32f407vg.pdf sheet 120 - Timer1.setPrescaleFactor((84 * 2U)-1); //2us resolution - Timer2.setPrescaleFactor((42 * 2U)-1); //2us resolution - Timer3.setPrescaleFactor((42 * 2U)-1); //2us resolution - #endif + #if defined (STM32F1) || defined(__STM32F1__) + //(CYCLES_PER_MICROSECOND == 72, APB2 at 72MHz, APB1 at 36MHz). + //Timer2 to 4 is on APB1, Timer1 on APB2. http://www.st.com/resource/en/datasheet/stm32f103cb.pdf sheet 12 + Timer1.setPrescaleFactor((72 * 2)-1); //2us resolution + Timer2.setPrescaleFactor((36 * 2)-1); //2us resolution + Timer3.setPrescaleFactor((36 * 2)-1); //2us resolution + #elif defined(STM32F4) + //(CYCLES_PER_MICROSECOND == 168, APB2 at 84MHz, APB1 at 42MHz). + //Timer2 to 14 is on APB1, Timers 1, 8, 9 and 10 on APB2. http://www.st.com/resource/en/datasheet/stm32f407vg.pdf sheet 120 + Timer1.setPrescaleFactor((168 * 2)-1); //2us resolution + Timer2.setPrescaleFactor((84 * 2)-1); //2us resolution + Timer3.setPrescaleFactor((84 * 2)-1); //2us resolution #endif Timer2.setMode(1, TIMER_OUTPUT_COMPARE); Timer2.setMode(2, TIMER_OUTPUT_COMPARE); @@ -112,51 +103,56 @@ void initBoard() Timer2.attachInterrupt(3, fuelSchedule3Interrupt); Timer2.attachInterrupt(4, fuelSchedule4Interrupt); #if (INJ_CHANNELS >= 5) + Timer5.setMode(1, TIMER_OUTPUT_COMPARE); Timer5.attachInterrupt(1, fuelSchedule5Interrupt); #endif #if (INJ_CHANNELS >= 6) + Timer5.setMode(2, TIMER_OUTPUT_COMPARE); Timer5.attachInterrupt(2, fuelSchedule6Interrupt); #endif #if (INJ_CHANNELS >= 7) + Timer5.setMode(3, TIMER_OUTPUT_COMPARE); Timer5.attachInterrupt(3, fuelSchedule7Interrupt); #endif #if (INJ_CHANNELS >= 8) + Timer5.setMode(4, TIMER_OUTPUT_COMPARE); Timer5.attachInterrupt(4, fuelSchedule8Interrupt); #endif //Ignition - #if (IGN_CHANNELS >= 1) Timer3.attachInterrupt(1, ignitionSchedule1Interrupt); - #endif - #if (IGN_CHANNELS >= 2) Timer3.attachInterrupt(2, ignitionSchedule2Interrupt); - #endif - #if (IGN_CHANNELS >= 3) Timer3.attachInterrupt(3, ignitionSchedule3Interrupt); - #endif - #if (IGN_CHANNELS >= 4) Timer3.attachInterrupt(4, ignitionSchedule4Interrupt); - #endif #if (IGN_CHANNELS >= 5) + Timer4.setMode(1, TIMER_OUTPUT_COMPARE); Timer4.attachInterrupt(1, ignitionSchedule5Interrupt); #endif #if (IGN_CHANNELS >= 6) + Timer4.setMode(2, TIMER_OUTPUT_COMPARE); Timer4.attachInterrupt(2, ignitionSchedule6Interrupt); #endif #if (IGN_CHANNELS >= 7) + Timer4.setMode(3, TIMER_OUTPUT_COMPARE); Timer4.attachInterrupt(3, ignitionSchedule7Interrupt); #endif #if (IGN_CHANNELS >= 8) + Timer4.setMode(4, TIMER_OUTPUT_COMPARE); Timer4.attachInterrupt(4, ignitionSchedule8Interrupt); #endif + Timer1.setOverflow(0xFFFF); Timer1.resume(); + Timer2.setOverflow(0xFFFF); Timer2.resume(); + Timer3.setOverflow(0xFFFF); Timer3.resume(); #if (IGN_CHANNELS >= 5) + Timer4.setOverflow(0xFFFF); Timer4.resume(); #endif #if (INJ_CHANNELS >= 5) + Timer5.setOverflow(0xFFFF); Timer5.resume(); #endif } diff --git a/speeduino/cancomms.h b/speeduino/cancomms.h index 08ca00f3..db532e60 100644 --- a/speeduino/cancomms.h +++ b/speeduino/cancomms.h @@ -15,7 +15,7 @@ uint8_t Glow, Ghigh; #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) HardwareSerial &CANSerial = Serial3; #elif defined(CORE_STM32) - #if defined(ARDUINO_ARCH_STM32) // STM32GENERIC core + #if defined(ARDUINO_ARCH_STM32) && !defined(_VARIANT_ARDUINO_STM32_) // STM32GENERIC core SerialUART &CANSerial = Serial2; #else //libmaple core aka STM32DUINO HardwareSerial &CANSerial = Serial2; diff --git a/speeduino/comms.ino b/speeduino/comms.ino index eab3a49d..09b5717a 100644 --- a/speeduino/comms.ino +++ b/speeduino/comms.ino @@ -11,6 +11,7 @@ A full copy of the license may be found in the projects root directory #include "maths.h" #include "utils.h" #include "decoders.h" +#include "scheduledIO.h" /* Processes the data on the serial buffer. @@ -195,7 +196,7 @@ void command() break; case 'Q': // send code version - Serial.print(F("speeduino 201903-dev")); + Serial.print(F("speeduino 201902")); break; case 'r': //New format for the optimised OutputChannels @@ -225,7 +226,7 @@ void command() break; case 'S': // send code version - Serial.print(F("Speeduino 2019.03-dev")); + Serial.print(F("Speeduino 2019.02")); currentStatus.secl = 0; //This is required in TS3 due to its stricter timings break; @@ -1514,14 +1515,14 @@ void commandButtons() { case 256: // cmd is stop BIT_CLEAR(currentStatus.testOutputs, 1); - digitalWrite(pinInjector1, LOW); - digitalWrite(pinInjector2, LOW); - digitalWrite(pinInjector3, LOW); - digitalWrite(pinInjector4, LOW); - digitalWrite(pinCoil1, LOW); - digitalWrite(pinCoil2, LOW); - digitalWrite(pinCoil3, LOW); - digitalWrite(pinCoil4, LOW); + endCoil1Charge(); + endCoil2Charge(); + endCoil3Charge(); + endCoil4Charge(); + closeInjector1(); + closeInjector2(); + closeInjector3(); + closeInjector4(); break; case 257: // cmd is enable @@ -1529,10 +1530,10 @@ void commandButtons() BIT_SET(currentStatus.testOutputs, 1); break; case 513: // cmd group is for injector1 on actions - if( BIT_CHECK(currentStatus.testOutputs, 1) ){ digitalWrite(pinInjector1, HIGH); } + if( BIT_CHECK(currentStatus.testOutputs, 1) ){ openInjector1(); } break; case 514: // cmd group is for injector1 off actions - if( BIT_CHECK(currentStatus.testOutputs, 1) ){digitalWrite(pinInjector1, LOW);} + if( BIT_CHECK(currentStatus.testOutputs, 1) ){ closeInjector1(); } break; case 515: // cmd group is for injector1 50% dc actions //for (byte dcloop = 0; dcloop < 11; dcloop++) @@ -1544,64 +1545,64 @@ void commandButtons() //} break; case 516: // cmd group is for injector2 on actions - if( BIT_CHECK(currentStatus.testOutputs, 1) ){ digitalWrite(pinInjector2, HIGH); } + if( BIT_CHECK(currentStatus.testOutputs, 1) ){ openInjector2(); } break; case 517: // cmd group is for injector2 off actions - if( BIT_CHECK(currentStatus.testOutputs, 1) ){ digitalWrite(pinInjector2, LOW); } + if( BIT_CHECK(currentStatus.testOutputs, 1) ){ closeInjector2(); } break; case 518: // cmd group is for injector2 50%dc actions break; case 519: // cmd group is for injector3 on actions - if( BIT_CHECK(currentStatus.testOutputs, 1) ) { digitalWrite(pinInjector3, HIGH); } + if( BIT_CHECK(currentStatus.testOutputs, 1) ){ openInjector3(); } break; case 520: // cmd group is for injector3 off actions - if( BIT_CHECK(currentStatus.testOutputs, 1) ) { digitalWrite(pinInjector3, LOW); } + if( BIT_CHECK(currentStatus.testOutputs, 1) ){ closeInjector3(); } break; case 521: // cmd group is for injector3 50%dc actions break; case 522: // cmd group is for injector4 on actions - if( BIT_CHECK(currentStatus.testOutputs, 1) ){ digitalWrite(pinInjector4, HIGH); } + if( BIT_CHECK(currentStatus.testOutputs, 1) ){ openInjector4(); } break; case 523: // cmd group is for injector4 off actions - if( BIT_CHECK(currentStatus.testOutputs, 1) ){ digitalWrite(pinInjector4, LOW); } + if( BIT_CHECK(currentStatus.testOutputs, 1) ){ closeInjector4(); } break; case 524: // cmd group is for injector4 50% dc actions break; case 769: // cmd group is for spark1 on actions - if( BIT_CHECK(currentStatus.testOutputs, 1) ) { digitalWrite(pinCoil1, HIGH); } + if( BIT_CHECK(currentStatus.testOutputs, 1) ) { digitalWrite(pinCoil1, coilHIGH); } break; case 770: // cmd group is for spark1 off actions - if( BIT_CHECK(currentStatus.testOutputs, 1) ) { digitalWrite(pinCoil1, LOW); } + if( BIT_CHECK(currentStatus.testOutputs, 1) ) { digitalWrite(pinCoil1, coilLOW); } break; case 771: // cmd group is for spark1 50%dc actions break; case 772: // cmd group is for spark2 on actions - if( BIT_CHECK(currentStatus.testOutputs, 1) ) { digitalWrite(pinCoil2, HIGH); } + if( BIT_CHECK(currentStatus.testOutputs, 1) ) { digitalWrite(pinCoil2, coilHIGH); } break; case 773: // cmd group is for spark2 off actions - if( BIT_CHECK(currentStatus.testOutputs, 1) ) { digitalWrite(pinCoil2, LOW); } + if( BIT_CHECK(currentStatus.testOutputs, 1) ) { digitalWrite(pinCoil2, coilLOW); } break; case 774: // cmd group is for spark2 50%dc actions break; case 775: // cmd group is for spark3 on actions - if( BIT_CHECK(currentStatus.testOutputs, 1) ) { digitalWrite(pinCoil3, HIGH); } + if( BIT_CHECK(currentStatus.testOutputs, 1) ) { digitalWrite(pinCoil3, coilHIGH); } break; case 776: // cmd group is for spark3 off actions - if( BIT_CHECK(currentStatus.testOutputs, 1) ) { digitalWrite(pinCoil3, LOW); } + if( BIT_CHECK(currentStatus.testOutputs, 1) ) { digitalWrite(pinCoil3, coilLOW); } break; case 777: // cmd group is for spark3 50%dc actions break; case 778: // cmd group is for spark4 on actions - if( BIT_CHECK(currentStatus.testOutputs, 1) ) { digitalWrite(pinCoil4, HIGH); } + if( BIT_CHECK(currentStatus.testOutputs, 1) ) { digitalWrite(pinCoil4, coilHIGH); } break; case 779: // cmd group is for spark4 off actions - if( BIT_CHECK(currentStatus.testOutputs, 1) ) { digitalWrite(pinCoil4, LOW); } + if( BIT_CHECK(currentStatus.testOutputs, 1) ) { digitalWrite(pinCoil4, coilLOW); } break; case 780: // cmd group is for spark4 50%dc actions diff --git a/speeduino/globals.h b/speeduino/globals.h index 65c96384..f69ed260 100644 --- a/speeduino/globals.h +++ b/speeduino/globals.h @@ -48,11 +48,11 @@ #define SMALL_FLASH_MODE #endif + #if __GNUC__ < 7 //Already included on GCC 7 extern "C" char* sbrk(int incr); //Used to freeRam - #if defined(ARDUINO_ARCH_STM32) // STM32GENERIC core + #endif + #if !defined(_VARIANT_ARDUINO_STM32_) // STM32GENERIC core inline unsigned char digitalPinToInterrupt(unsigned char Interrupt_pin) { return Interrupt_pin; } //This isn't included in the stm32duino libs (yet) - #define portOutputRegister(port) (volatile byte *)( &(port->ODR) ) - #define portInputRegister(port) (volatile byte *)( &(port->IDR) ) #else //libmaple core aka STM32DUINO //These are defined in STM32F1/variants/generic_stm32f103c/variant.h but return a non byte* value #define portOutputRegister(port) (volatile byte *)( &(port->regs->ODR) ) @@ -252,48 +252,48 @@ struct table2D knockWindowDurationTable; //These are for the direct port manipulation of the injectors, coils and aux outputs volatile PORT_TYPE *inj1_pin_port; -volatile byte inj1_pin_mask; +volatile PINMAKS_TYPE inj1_pin_mask; volatile PORT_TYPE *inj2_pin_port; -volatile byte inj2_pin_mask; +volatile PINMAKS_TYPE inj2_pin_mask; volatile PORT_TYPE *inj3_pin_port; -volatile byte inj3_pin_mask; +volatile PINMAKS_TYPE inj3_pin_mask; volatile PORT_TYPE *inj4_pin_port; -volatile byte inj4_pin_mask; +volatile PINMAKS_TYPE inj4_pin_mask; volatile PORT_TYPE *inj5_pin_port; -volatile byte inj5_pin_mask; +volatile PINMAKS_TYPE inj5_pin_mask; volatile PORT_TYPE *inj6_pin_port; -volatile byte inj6_pin_mask; +volatile PINMAKS_TYPE inj6_pin_mask; volatile PORT_TYPE *inj7_pin_port; -volatile byte inj7_pin_mask; +volatile PINMAKS_TYPE inj7_pin_mask; volatile PORT_TYPE *inj8_pin_port; -volatile byte inj8_pin_mask; +volatile PINMAKS_TYPE inj8_pin_mask; volatile PORT_TYPE *ign1_pin_port; -volatile byte ign1_pin_mask; +volatile PINMAKS_TYPE ign1_pin_mask; volatile PORT_TYPE *ign2_pin_port; -volatile byte ign2_pin_mask; +volatile PINMAKS_TYPE ign2_pin_mask; volatile PORT_TYPE *ign3_pin_port; -volatile byte ign3_pin_mask; +volatile PINMAKS_TYPE ign3_pin_mask; volatile PORT_TYPE *ign4_pin_port; -volatile byte ign4_pin_mask; +volatile PINMAKS_TYPE ign4_pin_mask; volatile PORT_TYPE *ign5_pin_port; -volatile byte ign5_pin_mask; +volatile PINMAKS_TYPE ign5_pin_mask; volatile PORT_TYPE *ign6_pin_port; -volatile byte ign6_pin_mask; +volatile PINMAKS_TYPE ign6_pin_mask; volatile PORT_TYPE *ign7_pin_port; -volatile byte ign7_pin_mask; +volatile PINMAKS_TYPE ign7_pin_mask; volatile PORT_TYPE *ign8_pin_port; -volatile byte ign8_pin_mask; +volatile PINMAKS_TYPE ign8_pin_mask; volatile PORT_TYPE *tach_pin_port; -volatile byte tach_pin_mask; +volatile PINMAKS_TYPE tach_pin_mask; volatile PORT_TYPE *pump_pin_port; -volatile byte pump_pin_mask; +volatile PINMAKS_TYPE pump_pin_mask; volatile PORT_TYPE *triggerPri_pin_port; -volatile byte triggerPri_pin_mask; +volatile PINMAKS_TYPE triggerPri_pin_mask; volatile PORT_TYPE *triggerSec_pin_port; -volatile byte triggerSec_pin_mask; +volatile PINMAKS_TYPE triggerSec_pin_mask; //These need to be here as they are used in both speeduino.ino and scheduler.ino bool channel1InjEnabled = true; @@ -313,7 +313,6 @@ int ignition5EndAngle = 0; //These are variables used across multiple files bool initialisationComplete = false; //Tracks whether the setup() function has run completely -byte fpPrimeTime = 0; //The time (in seconds, based on currentStatus.secl) that the fuel pump started priming volatile uint16_t mainLoopCount; unsigned long revolutionTime; //The time in uS that one revolution would take at current speed (The time tooth 1 was last seen, minus the time it was seen prior to that) volatile unsigned long timer5_overflow_count = 0; //Increments every time counter 5 overflows. Used for the fast version of micros() diff --git a/speeduino/idle.h b/speeduino/idle.h index 243d6b0c..b5b164e1 100644 --- a/speeduino/idle.h +++ b/speeduino/idle.h @@ -42,9 +42,9 @@ unsigned int iacStepTime; unsigned int completedHomeSteps; volatile PORT_TYPE *idle_pin_port; -volatile byte idle_pin_mask; +volatile PINMAKS_TYPE idle_pin_mask; volatile PORT_TYPE *idle2_pin_port; -volatile byte idle2_pin_mask; +volatile PINMAKS_TYPE idle2_pin_mask; volatile bool idle_pwm_state; unsigned int idle_pwm_max_count; //Used for variable PWM frequency diff --git a/speeduino/init.ino b/speeduino/init.ino index 73ca81ef..3d5d2836 100644 --- a/speeduino/init.ino +++ b/speeduino/init.ino @@ -131,6 +131,15 @@ void initialiseAll() endCoil3Charge(); endCoil4Charge(); endCoil5Charge(); + #if (INJ_CHANNELS >= 6) + endCoil6Charge(); + #endif + #if (INJ_CHANNELS >= 7) + endCoil7Charge(); + #endif + #if (INJ_CHANNELS >= 8) + endCoil8Charge(); + #endif //Similar for injectors, make sure they're turned off closeInjector1(); @@ -138,6 +147,15 @@ void initialiseAll() closeInjector3(); closeInjector4(); closeInjector5(); + #if (IGN_CHANNELS >= 6) + closeInjector6(); + #endif + #if (IGN_CHANNELS >= 7) + closeInjector7(); + #endif + #if (IGN_CHANNELS >= 8) + closeInjector8(); + #endif //Set the tacho output default state digitalWrite(pinTachOut, HIGH); @@ -928,6 +946,7 @@ void setPinMapping(byte boardID) //PC8~PC12 SDio //PA13~PA15 & PB4 SWD(debug) pins //PB0 EEPROM CS pin + //PA9 & PD10 Serial1 //PD5 & PD6 Serial2 pinInjector1 = PE7; //Output pin injector 1 is on pinInjector2 = PE8; //Output pin injector 2 is on @@ -935,18 +954,18 @@ void setPinMapping(byte boardID) pinInjector4 = PE10; //Output pin injector 4 is on pinInjector5 = PE11; //Output pin injector 5 is on pinInjector6 = PE12; //Output pin injector 6 is on - pinCoil1 = PB5; //Pin for coil 1 - pinCoil2 = PB6; //Pin for coil 2 - pinCoil3 = PB7; //Pin for coil 3 - pinCoil4 = PB8; //Pin for coil 4 - pinCoil5 = PB9; //Pin for coil 5 + pinCoil1 = PD0; //Pin for coil 1 + pinCoil2 = PD1; //Pin for coil 2 + pinCoil3 = PD2; //Pin for coil 3 + pinCoil4 = PD3; //Pin for coil 4 + pinCoil5 = PD4; //Pin for coil 5 pinTPS = A0; //TPS input pin pinMAP = A1; //MAP sensor pin pinIAT = A2; //IAT sensor pin pinCLT = A3; //CLT sensor pin pinO2 = A4; //O2 Sensor pin pinBat = A5; //Battery reference voltage pin - pinBaro = A10; + pinBaro = A9; pinIdle1 = PB8; //Single wire idle control pinIdle2 = PB9; //2 wire idle control pinBoost = PE0; //Boost control @@ -956,8 +975,8 @@ void setPinMapping(byte boardID) pinStepperEnable = PD9; //Enable pin for DRV8825 pinDisplayReset = PE1; // OLED reset pin pinFan = PE2; //Pin for the fan output - pinFuelPump = PA6; //Fuel pump output - pinTachOut = PA7; //Tacho output pin + pinFuelPump = PC0; //Fuel pump output + pinTachOut = PC1; //Tacho output pin //external interrupt enabled pins //external interrupts could be enalbed in any pin, except same port numbers (PA4,PE4) pinFlex = PE2; // Flex sensor (Must be external interrupt enabled) @@ -1323,37 +1342,80 @@ void setPinMapping(byte boardID) #endif default: - #ifndef SMALL_FLASH_MODE //No support for bluepill here anyway - //Pin mappings as per the v0.2 shield - pinInjector1 = 8; //Output pin injector 1 is on - pinInjector2 = 9; //Output pin injector 2 is on - pinInjector3 = 10; //Output pin injector 3 is on - pinInjector4 = 11; //Output pin injector 4 is on - pinInjector5 = 12; //Output pin injector 5 is on - pinCoil1 = 28; //Pin for coil 1 - pinCoil2 = 24; //Pin for coil 2 - pinCoil3 = 40; //Pin for coil 3 - pinCoil4 = 36; //Pin for coil 4 - pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now - pinTrigger = 20; //The CAS pin - pinTrigger2 = 21; //The Cam Sensor pin - pinTPS = A2; //TPS input pin - pinMAP = A3; //MAP sensor pin - pinIAT = A0; //IAT sensor pin - pinCLT = A1; //CLS sensor pin - pinO2 = A8; //O2 Sensor pin - pinBat = A4; //Battery reference voltage pin - pinStepperDir = 16; //Direction pin for DRV8825 driver - pinStepperStep = 17; //Step pin for DRV8825 driver - pinDisplayReset = 48; // OLED reset pin - pinFan = 47; //Pin for the fan output - pinFuelPump = 4; //Fuel pump output - pinTachOut = 49; //Tacho output pin - pinFlex = 3; // Flex sensor (Must be external interrupt enabled) - pinBoost = 5; - pinIdle1 = 6; - pinResetControl = 43; //Reset control output - #endif + #if defined(STM32F4) + //Black F407VE http://wiki.stm32duino.com/index.php?title=STM32F407 + //PC8~PC12 SDio + //PA13~PA15 & PB4 SWD(debug) pins + //PB0 EEPROM CS pin + //PA9 & PD10 Serial1 + //PD5 & PD6 Serial2 + pinInjector1 = PE7; //Output pin injector 1 is on + pinInjector2 = PE8; //Output pin injector 2 is on + pinInjector3 = PE9; //Output pin injector 3 is on + pinInjector4 = PE10; //Output pin injector 4 is on + pinInjector5 = PE11; //Output pin injector 5 is on + pinInjector6 = PE12; //Output pin injector 6 is on + pinCoil1 = PD0; //Pin for coil 1 + pinCoil2 = PD1; //Pin for coil 2 + pinCoil3 = PD2; //Pin for coil 3 + pinCoil4 = PD3; //Pin for coil 4 + pinCoil5 = PD4; //Pin for coil 5 + pinTPS = A0; //TPS input pin + pinMAP = A1; //MAP sensor pin + pinIAT = A2; //IAT sensor pin + pinCLT = A3; //CLT sensor pin + pinO2 = A4; //O2 Sensor pin + pinBat = A5; //Battery reference voltage pin + pinBaro = A9; + pinIdle1 = PB8; //Single wire idle control + pinIdle2 = PB9; //2 wire idle control + pinBoost = PE0; //Boost control + pinVVT_1 = PE1; //Default VVT output + pinStepperDir = PD8; //Direction pin for DRV8825 driver + pinStepperStep = PB15; //Step pin for DRV8825 driver + pinStepperEnable = PD9; //Enable pin for DRV8825 + pinDisplayReset = PE1; // OLED reset pin + pinFan = PE2; //Pin for the fan output + pinFuelPump = PC0; //Fuel pump output + pinTachOut = PC1; //Tacho output pin + //external interrupt enabled pins + //external interrupts could be enalbed in any pin, except same port numbers (PA4,PE4) + pinFlex = PE2; // Flex sensor (Must be external interrupt enabled) + pinTrigger = PE3; //The CAS pin + pinTrigger2 = PE4; //The Cam Sensor pin + #else + #ifndef SMALL_FLASH_MODE //No support for bluepill here anyway + //Pin mappings as per the v0.2 shield + pinInjector1 = 8; //Output pin injector 1 is on + pinInjector2 = 9; //Output pin injector 2 is on + pinInjector3 = 10; //Output pin injector 3 is on + pinInjector4 = 11; //Output pin injector 4 is on + pinInjector5 = 12; //Output pin injector 5 is on + pinCoil1 = 28; //Pin for coil 1 + pinCoil2 = 24; //Pin for coil 2 + pinCoil3 = 40; //Pin for coil 3 + pinCoil4 = 36; //Pin for coil 4 + pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now + pinTrigger = 20; //The CAS pin + pinTrigger2 = 21; //The Cam Sensor pin + pinTPS = A2; //TPS input pin + pinMAP = A3; //MAP sensor pin + pinIAT = A0; //IAT sensor pin + pinCLT = A1; //CLS sensor pin + pinO2 = A8; //O2 Sensor pin + pinBat = A4; //Battery reference voltage pin + pinStepperDir = 16; //Direction pin for DRV8825 driver + pinStepperStep = 17; //Step pin for DRV8825 driver + pinDisplayReset = 48; // OLED reset pin + pinFan = 47; //Pin for the fan output + pinFuelPump = 4; //Fuel pump output + pinTachOut = 49; //Tacho output pin + pinFlex = 3; // Flex sensor (Must be external interrupt enabled) + pinBoost = 5; + pinIdle1 = 6; + pinResetControl = 43; //Reset control output + #endif + #endif break; } diff --git a/speeduino/scheduler.ino b/speeduino/scheduler.ino index 135ee229..84acd274 100644 --- a/speeduino/scheduler.ino +++ b/speeduino/scheduler.ino @@ -64,20 +64,28 @@ void initialiseSchedulers() fuelSchedule8.schedulesSet = 0; fuelSchedule1.counter = &FUEL1_COUNTER; + fuelSchedule1.compare = &FUEL1_COMPARE; fuelSchedule2.counter = &FUEL2_COUNTER; + fuelSchedule2.compare = &FUEL2_COMPARE; fuelSchedule3.counter = &FUEL3_COUNTER; + fuelSchedule3.compare = &FUEL3_COMPARE; fuelSchedule4.counter = &FUEL4_COUNTER; + fuelSchedule4.compare = &FUEL4_COMPARE; #if (INJ_CHANNELS >= 5) fuelSchedule5.counter = &FUEL5_COUNTER; + fuelSchedule5.compare = &FUEL5_COMPARE; #endif #if (INJ_CHANNELS >= 6) fuelSchedule5.counter = &FUEL6_COUNTER; + fuelSchedule6.compare = &FUEL6_COMPARE; #endif #if (INJ_CHANNELS >= 7) fuelSchedule5.counter = &FUEL7_COUNTER; + fuelSchedule7.compare = &FUEL7_COMPARE; #endif #if (INJ_CHANNELS >= 8) - fuelSchedule5.counter = &FUEL8_COUNTER; + fuelSchedule8.counter = &FUEL8_COUNTER; + fuelSchedule8.compare = &FUEL8_COMPARE; #endif ignitionSchedule1.Status = OFF; @@ -98,6 +106,31 @@ void initialiseSchedulers() ignitionSchedule7.schedulesSet = 0; ignitionSchedule8.schedulesSet = 0; + ignitionSchedule1.counter = &IGN1_COUNTER; + ignitionSchedule1.compare = &IGN1_COMPARE; + ignitionSchedule2.counter = &IGN2_COUNTER; + ignitionSchedule2.compare = &IGN2_COMPARE; + ignitionSchedule3.counter = &IGN3_COUNTER; + ignitionSchedule3.compare = &IGN3_COMPARE; + ignitionSchedule4.counter = &IGN4_COUNTER; + ignitionSchedule4.compare = &IGN4_COMPARE; + #if (INJ_CHANNELS >= 5) + ignitionSchedule5.counter = &IGN5_COUNTER; + ignitionSchedule5.compare = &IGN5_COMPARE; + #endif + #if (INJ_CHANNELS >= 6) + ignitionSchedule5.counter = &IGN6_COUNTER; + ignitionSchedule6.compare = &IGN6_COMPARE; + #endif + #if (INJ_CHANNELS >= 7) + ignitionSchedule5.counter = &IGN7_COUNTER; + ignitionSchedule7.compare = &IGN7_COMPARE; + #endif + #if (INJ_CHANNELS >= 8) + ignitionSchedule8.counter = &IGN8_COUNTER; + ignitionSchedule8.compare = &IGN8_COMPARE; + #endif + } /* diff --git a/speeduino/storage.ino b/speeduino/storage.ino index 9451e842..c4fcf492 100644 --- a/speeduino/storage.ino +++ b/speeduino/storage.ino @@ -10,22 +10,24 @@ A full copy of the license may be found in the projects root directory #include "comms.h" #if defined(CORE_SAMD21) #include "src/FlashStorage/FlashAsEEPROM.h" +#elif defined(CORE_STM32) + #include #else #include #endif #include "storage.h" void writeAllConfig() { - writeConfig(1); - if (eepromWritesPending == false) { writeConfig(2); } - if (eepromWritesPending == false) { writeConfig(3); } - if (eepromWritesPending == false) { writeConfig(4); } - if (eepromWritesPending == false) { writeConfig(5); } - if (eepromWritesPending == false) { writeConfig(6); } - if (eepromWritesPending == false) { writeConfig(7); } - if (eepromWritesPending == false) { writeConfig(8); } - if (eepromWritesPending == false) { writeConfig(9); } - if (eepromWritesPending == false) { writeConfig(10); } + writeConfig(veSetPage); + if (eepromWritesPending == false) { writeConfig(veMapPage); } + if (eepromWritesPending == false) { writeConfig(ignMapPage); } + if (eepromWritesPending == false) { writeConfig(ignSetPage); } + if (eepromWritesPending == false) { writeConfig(afrMapPage); } + if (eepromWritesPending == false) { writeConfig(afrSetPage); } + if (eepromWritesPending == false) { writeConfig(boostvvtPage); } + if (eepromWritesPending == false) { writeConfig(seqFuelPage); } + if (eepromWritesPending == false) { writeConfig(canbusPage); } + if (eepromWritesPending == false) { writeConfig(warmupPage); } } diff --git a/speeduino/timers.ino b/speeduino/timers.ino index 415f5235..0642bb94 100644 --- a/speeduino/timers.ino +++ b/speeduino/timers.ino @@ -95,7 +95,7 @@ void oneMSInterval() //Most ARM chips can simply call a function { loop250ms = 0; //Reset Counter BIT_SET(TIMER_mask, BIT_TIMER_4HZ); - #if defined(CORE_STM32) //debug purpose, only visal for running code + #if defined(CORE_STM32) //debug purpose, only visual for running code digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); #endif From 191f7b2b3ead060cbd99845fdb3bf1a62dd5b794 Mon Sep 17 00:00:00 2001 From: Vitor_Boss Date: Sun, 3 Mar 2019 01:48:24 -0300 Subject: [PATCH 24/51] Fix last commit --- speeduino/globals.h | 1 + 1 file changed, 1 insertion(+) diff --git a/speeduino/globals.h b/speeduino/globals.h index f69ed260..426735a7 100644 --- a/speeduino/globals.h +++ b/speeduino/globals.h @@ -313,6 +313,7 @@ int ignition5EndAngle = 0; //These are variables used across multiple files bool initialisationComplete = false; //Tracks whether the setup() function has run completely +byte fpPrimeTime = 0; //The time (in seconds, based on currentStatus.secl) that the fuel pump started priming volatile uint16_t mainLoopCount; unsigned long revolutionTime; //The time in uS that one revolution would take at current speed (The time tooth 1 was last seen, minus the time it was seen prior to that) volatile unsigned long timer5_overflow_count = 0; //Increments every time counter 5 overflows. Used for the fast version of micros() From 7409fc0ce53dfb9b03832b3e2710abe000cccc76 Mon Sep 17 00:00:00 2001 From: Vitor_Boss Date: Sun, 3 Mar 2019 01:52:14 -0300 Subject: [PATCH 25/51] add a missing include --- speeduino/updates.ino | 2 ++ 1 file changed, 2 insertions(+) diff --git a/speeduino/updates.ino b/speeduino/updates.ino index 6873f21f..4cbc7d31 100644 --- a/speeduino/updates.ino +++ b/speeduino/updates.ino @@ -8,6 +8,8 @@ #include "storage.h" #if defined(CORE_SAMD21) #include "src/FlashStorage/FlashAsEEPROM.h" +#elif defined(CORE_STM32) + #include #else #include #endif From dd942c55aa86cd75bacc32dd89d86c37dbd134b8 Mon Sep 17 00:00:00 2001 From: Vitor_Boss Date: Sun, 3 Mar 2019 02:08:33 -0300 Subject: [PATCH 26/51] fix code version --- speeduino/comms.ino | 4 ++-- speeduino/scheduler.ino | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/speeduino/comms.ino b/speeduino/comms.ino index 09b5717a..2ff4d364 100644 --- a/speeduino/comms.ino +++ b/speeduino/comms.ino @@ -196,7 +196,7 @@ void command() break; case 'Q': // send code version - Serial.print(F("speeduino 201902")); + Serial.print(F("speeduino 201903-dev")); break; case 'r': //New format for the optimised OutputChannels @@ -226,7 +226,7 @@ void command() break; case 'S': // send code version - Serial.print(F("Speeduino 2019.02")); + Serial.print(F("Speeduino 2019.03-dev")); currentStatus.secl = 0; //This is required in TS3 due to its stricter timings break; diff --git a/speeduino/scheduler.ino b/speeduino/scheduler.ino index 84acd274..c55837cc 100644 --- a/speeduino/scheduler.ino +++ b/speeduino/scheduler.ino @@ -76,11 +76,11 @@ void initialiseSchedulers() fuelSchedule5.compare = &FUEL5_COMPARE; #endif #if (INJ_CHANNELS >= 6) - fuelSchedule5.counter = &FUEL6_COUNTER; + fuelSchedule6.counter = &FUEL6_COUNTER; fuelSchedule6.compare = &FUEL6_COMPARE; #endif #if (INJ_CHANNELS >= 7) - fuelSchedule5.counter = &FUEL7_COUNTER; + fuelSchedule7.counter = &FUEL7_COUNTER; fuelSchedule7.compare = &FUEL7_COMPARE; #endif #if (INJ_CHANNELS >= 8) @@ -119,11 +119,11 @@ void initialiseSchedulers() ignitionSchedule5.compare = &IGN5_COMPARE; #endif #if (INJ_CHANNELS >= 6) - ignitionSchedule5.counter = &IGN6_COUNTER; + ignitionSchedule6.counter = &IGN6_COUNTER; ignitionSchedule6.compare = &IGN6_COMPARE; #endif #if (INJ_CHANNELS >= 7) - ignitionSchedule5.counter = &IGN7_COUNTER; + ignitionSchedule7.counter = &IGN7_COUNTER; ignitionSchedule7.compare = &IGN7_COMPARE; #endif #if (INJ_CHANNELS >= 8) From e150936c7105ae20400b661d773b0c35aab603d2 Mon Sep 17 00:00:00 2001 From: Vitor_Boss Date: Sun, 3 Mar 2019 02:12:33 -0300 Subject: [PATCH 27/51] PINMAKS_TYPE defined to all boards --- speeduino/board_avr2560.h | 1 + speeduino/board_teensy35.h | 1 + speeduino/board_template.h | 1 + 3 files changed, 3 insertions(+) diff --git a/speeduino/board_avr2560.h b/speeduino/board_avr2560.h index c54f916b..936341b3 100644 --- a/speeduino/board_avr2560.h +++ b/speeduino/board_avr2560.h @@ -10,6 +10,7 @@ * General */ #define PORT_TYPE uint8_t //Size of the port variables (Eg inj1_pin_port). + #define PINMAKS_TYPE uint8_t void initBoard(); uint16_t freeRam(); diff --git a/speeduino/board_teensy35.h b/speeduino/board_teensy35.h index 280aa69e..f5e26a27 100644 --- a/speeduino/board_teensy35.h +++ b/speeduino/board_teensy35.h @@ -9,6 +9,7 @@ void initBoard(); uint16_t freeRam(); #define PORT_TYPE uint8_t //Size of the port variables + #define PINMAKS_TYPE uint8_t #define BOARD_DIGITAL_GPIO_PINS 34 #define BOARD_NR_GPIO_PINS 34 #define USE_SERIAL3 diff --git a/speeduino/board_template.h b/speeduino/board_template.h index 7c9374e6..dbe057be 100644 --- a/speeduino/board_template.h +++ b/speeduino/board_template.h @@ -7,6 +7,7 @@ * General */ #define PORT_TYPE uint32_t //Size of the port variables (Eg inj1_pin_port). Most systems use a byte, but SAMD21 and possibly others are a 32-bit unsigned int + #define PINMAKS_TYPE uint32_t #define BOARD_NR_GPIO_PINS 52 //Not sure this is correct #define BOARD_DIGITAL_GPIO_PINS 52 //Pretty sure this isn't right #define micros_safe() micros() //timer5 method is not used on anything but AVR, the micros_safe() macro is simply an alias for the normal micros() From 3532e1bfbcc5397f7ed075a1daaec8f613f11ce1 Mon Sep 17 00:00:00 2001 From: Vitor_Boss Date: Sun, 3 Mar 2019 19:15:57 -0300 Subject: [PATCH 28/51] Fix PINMAKS_TYPE typo --- speeduino/auxiliaries.h | 12 ++++++------ speeduino/board_avr2560.h | 2 +- speeduino/board_stm32.h | 2 +- speeduino/board_teensy35.h | 2 +- speeduino/board_template.h | 2 +- speeduino/globals.h | 40 +++++++++++++++++++------------------- speeduino/idle.h | 4 ++-- 7 files changed, 32 insertions(+), 32 deletions(-) diff --git a/speeduino/auxiliaries.h b/speeduino/auxiliaries.h index 1aae707d..d1607cf3 100644 --- a/speeduino/auxiliaries.h +++ b/speeduino/auxiliaries.h @@ -25,17 +25,17 @@ void fanControl(); #define READ_N2O_ARM_PIN() ((*n2o_arming_pin_port & n2o_arming_pin_mask) ? true : false) volatile PORT_TYPE *boost_pin_port; -volatile PINMAKS_TYPE boost_pin_mask; +volatile PINMASK_TYPE boost_pin_mask; volatile PORT_TYPE *vvt_pin_port; -volatile PINMAKS_TYPE vvt_pin_mask; +volatile PINMASK_TYPE vvt_pin_mask; volatile PORT_TYPE *fan_pin_port; -volatile PINMAKS_TYPE fan_pin_mask; +volatile PINMASK_TYPE fan_pin_mask; volatile PORT_TYPE *n2o_stage1_pin_port; -volatile PINMAKS_TYPE n2o_stage1_pin_mask; +volatile PINMASK_TYPE n2o_stage1_pin_mask; volatile PORT_TYPE *n2o_stage2_pin_port; -volatile PINMAKS_TYPE n2o_stage2_pin_mask; +volatile PINMASK_TYPE n2o_stage2_pin_mask; volatile PORT_TYPE *n2o_arming_pin_port; -volatile PINMAKS_TYPE n2o_arming_pin_mask; +volatile PINMASK_TYPE n2o_arming_pin_mask; volatile bool boost_pwm_state; unsigned int boost_pwm_max_count; //Used for variable PWM frequency diff --git a/speeduino/board_avr2560.h b/speeduino/board_avr2560.h index 936341b3..400d98e3 100644 --- a/speeduino/board_avr2560.h +++ b/speeduino/board_avr2560.h @@ -10,7 +10,7 @@ * General */ #define PORT_TYPE uint8_t //Size of the port variables (Eg inj1_pin_port). - #define PINMAKS_TYPE uint8_t + #define PINMASK_TYPE uint8_t void initBoard(); uint16_t freeRam(); diff --git a/speeduino/board_stm32.h b/speeduino/board_stm32.h index 937aa21d..82118539 100644 --- a/speeduino/board_stm32.h +++ b/speeduino/board_stm32.h @@ -8,7 +8,7 @@ * General */ #define PORT_TYPE uint32_t - #define PINMAKS_TYPE uint32_t + #define PINMASK_TYPE uint32_t #define micros_safe() micros() //timer5 method is not used on anything but AVR, the micros_safe() macro is simply an alias for the normal micros() #ifndef USE_SERIAL3 #define USE_SERIAL3 diff --git a/speeduino/board_teensy35.h b/speeduino/board_teensy35.h index f5e26a27..fb1f4871 100644 --- a/speeduino/board_teensy35.h +++ b/speeduino/board_teensy35.h @@ -9,7 +9,7 @@ void initBoard(); uint16_t freeRam(); #define PORT_TYPE uint8_t //Size of the port variables - #define PINMAKS_TYPE uint8_t + #define PINMASK_TYPE uint8_t #define BOARD_DIGITAL_GPIO_PINS 34 #define BOARD_NR_GPIO_PINS 34 #define USE_SERIAL3 diff --git a/speeduino/board_template.h b/speeduino/board_template.h index dbe057be..337650ac 100644 --- a/speeduino/board_template.h +++ b/speeduino/board_template.h @@ -7,7 +7,7 @@ * General */ #define PORT_TYPE uint32_t //Size of the port variables (Eg inj1_pin_port). Most systems use a byte, but SAMD21 and possibly others are a 32-bit unsigned int - #define PINMAKS_TYPE uint32_t + #define PINMASK_TYPE uint32_t #define BOARD_NR_GPIO_PINS 52 //Not sure this is correct #define BOARD_DIGITAL_GPIO_PINS 52 //Pretty sure this isn't right #define micros_safe() micros() //timer5 method is not used on anything but AVR, the micros_safe() macro is simply an alias for the normal micros() diff --git a/speeduino/globals.h b/speeduino/globals.h index 426735a7..3a026898 100644 --- a/speeduino/globals.h +++ b/speeduino/globals.h @@ -252,48 +252,48 @@ struct table2D knockWindowDurationTable; //These are for the direct port manipulation of the injectors, coils and aux outputs volatile PORT_TYPE *inj1_pin_port; -volatile PINMAKS_TYPE inj1_pin_mask; +volatile PINMASK_TYPE inj1_pin_mask; volatile PORT_TYPE *inj2_pin_port; -volatile PINMAKS_TYPE inj2_pin_mask; +volatile PINMASK_TYPE inj2_pin_mask; volatile PORT_TYPE *inj3_pin_port; -volatile PINMAKS_TYPE inj3_pin_mask; +volatile PINMASK_TYPE inj3_pin_mask; volatile PORT_TYPE *inj4_pin_port; -volatile PINMAKS_TYPE inj4_pin_mask; +volatile PINMASK_TYPE inj4_pin_mask; volatile PORT_TYPE *inj5_pin_port; -volatile PINMAKS_TYPE inj5_pin_mask; +volatile PINMASK_TYPE inj5_pin_mask; volatile PORT_TYPE *inj6_pin_port; -volatile PINMAKS_TYPE inj6_pin_mask; +volatile PINMASK_TYPE inj6_pin_mask; volatile PORT_TYPE *inj7_pin_port; -volatile PINMAKS_TYPE inj7_pin_mask; +volatile PINMASK_TYPE inj7_pin_mask; volatile PORT_TYPE *inj8_pin_port; -volatile PINMAKS_TYPE inj8_pin_mask; +volatile PINMASK_TYPE inj8_pin_mask; volatile PORT_TYPE *ign1_pin_port; -volatile PINMAKS_TYPE ign1_pin_mask; +volatile PINMASK_TYPE ign1_pin_mask; volatile PORT_TYPE *ign2_pin_port; -volatile PINMAKS_TYPE ign2_pin_mask; +volatile PINMASK_TYPE ign2_pin_mask; volatile PORT_TYPE *ign3_pin_port; -volatile PINMAKS_TYPE ign3_pin_mask; +volatile PINMASK_TYPE ign3_pin_mask; volatile PORT_TYPE *ign4_pin_port; -volatile PINMAKS_TYPE ign4_pin_mask; +volatile PINMASK_TYPE ign4_pin_mask; volatile PORT_TYPE *ign5_pin_port; -volatile PINMAKS_TYPE ign5_pin_mask; +volatile PINMASK_TYPE ign5_pin_mask; volatile PORT_TYPE *ign6_pin_port; -volatile PINMAKS_TYPE ign6_pin_mask; +volatile PINMASK_TYPE ign6_pin_mask; volatile PORT_TYPE *ign7_pin_port; -volatile PINMAKS_TYPE ign7_pin_mask; +volatile PINMASK_TYPE ign7_pin_mask; volatile PORT_TYPE *ign8_pin_port; -volatile PINMAKS_TYPE ign8_pin_mask; +volatile PINMASK_TYPE ign8_pin_mask; volatile PORT_TYPE *tach_pin_port; -volatile PINMAKS_TYPE tach_pin_mask; +volatile PINMASK_TYPE tach_pin_mask; volatile PORT_TYPE *pump_pin_port; -volatile PINMAKS_TYPE pump_pin_mask; +volatile PINMASK_TYPE pump_pin_mask; volatile PORT_TYPE *triggerPri_pin_port; -volatile PINMAKS_TYPE triggerPri_pin_mask; +volatile PINMASK_TYPE triggerPri_pin_mask; volatile PORT_TYPE *triggerSec_pin_port; -volatile PINMAKS_TYPE triggerSec_pin_mask; +volatile PINMASK_TYPE triggerSec_pin_mask; //These need to be here as they are used in both speeduino.ino and scheduler.ino bool channel1InjEnabled = true; diff --git a/speeduino/idle.h b/speeduino/idle.h index b5b164e1..8767f1fe 100644 --- a/speeduino/idle.h +++ b/speeduino/idle.h @@ -42,9 +42,9 @@ unsigned int iacStepTime; unsigned int completedHomeSteps; volatile PORT_TYPE *idle_pin_port; -volatile PINMAKS_TYPE idle_pin_mask; +volatile PINMASK_TYPE idle_pin_mask; volatile PORT_TYPE *idle2_pin_port; -volatile PINMAKS_TYPE idle2_pin_mask; +volatile PINMASK_TYPE idle2_pin_mask; volatile bool idle_pwm_state; unsigned int idle_pwm_max_count; //Used for variable PWM frequency From f3870cd35093afe7dfb08a88073c6cee1bba05ef Mon Sep 17 00:00:00 2001 From: Josh Stewart Date: Mon, 4 Mar 2019 17:18:10 +1100 Subject: [PATCH 29/51] Remove some random files from the last few merges --- Screenshot_TS_stm32F407.png | Bin 373434 -> 0 bytes Screenshot_logicanalyser_stm32F407.png | Bin 37428 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 Screenshot_TS_stm32F407.png delete mode 100644 Screenshot_logicanalyser_stm32F407.png diff --git a/Screenshot_TS_stm32F407.png b/Screenshot_TS_stm32F407.png deleted file mode 100644 index 6100e84cef9c0073a829558c67dc03b4c9676383..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 373434 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∨G^t9+`X=y1bANI6pGIF_h#O5E4%sS5QI0To# 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 From f96999dd2d49cb153e9d3ed0fed3242b4e682063 Mon Sep 17 00:00:00 2001 From: Josh Stewart Date: Mon, 4 Mar 2019 23:45:33 +1100 Subject: [PATCH 30/51] Multiple stm32 and general arch cleanup/fix from last merge --- platformio.ini | 6 +- speeduino/board_avr2560.ino | 525 +--------- speeduino/board_stm32F407VE.ino | 901 ------------------ .../{board_stm32.h => board_stm32_generic.h} | 8 +- ...oard_stm32.ino => board_stm32_generic.ino} | 4 +- ...d_stm32F407VE.h => board_stm32_official.h} | 25 +- speeduino/board_stm32_official.ino | 178 ++++ speeduino/decoders.ino | 4 +- speeduino/globals.h | 14 +- speeduino/speeduino.ino | 1 + speeduino/storage.ino | 2 +- speeduino/updates.ino | 2 +- 12 files changed, 217 insertions(+), 1453 deletions(-) delete mode 100644 speeduino/board_stm32F407VE.ino rename speeduino/{board_stm32.h => board_stm32_generic.h} (98%) rename speeduino/{board_stm32.ino => board_stm32_generic.ino} (99%) rename speeduino/{board_stm32F407VE.h => board_stm32_official.h} (92%) create mode 100644 speeduino/board_stm32_official.ino diff --git a/platformio.ini b/platformio.ini index 569b19dc..6b4c413d 100644 --- a/platformio.ini +++ b/platformio.ini @@ -46,14 +46,16 @@ board = genericSTM32F103RB lib_deps = EEPROM, HardwareTimer, Flash_STM32 build_flags = -fpermissive -std=gnu++11 -UBOARD_NR_GPIO_PINS -DUSE_STM32GENERIC -DMENU_USB_SERIAL +;STM32 Official core [env:black_F407VE] ;platform = ststm32@~4.5.0 platform = ststm32 framework = arduino ; framework-arduinoststm32 -board = black_F407VE +board = genericSTM32F407VET6 lib_deps = EEPROM -build_flags = -fpermissive -std=gnu++11 -UBOARD_NR_GPIO_PINS -DUSE_STM32GENERIC -DMENU_USB_SERIAL +build_flags = -fpermissive -std=gnu++11 -UBOARD_NR_GPIO_PINS -DMENU_USB_SERIAL +upload_protocol = dfu [env:bluepill_f103c8] platform = ststm32 diff --git a/speeduino/board_avr2560.ino b/speeduino/board_avr2560.ino index bb6de349..0453ceae 100644 --- a/speeduino/board_avr2560.ino +++ b/speeduino/board_avr2560.ino @@ -76,527 +76,6 @@ static inline unsigned long micros_safe() return newMicros; } -#endif -void setPinMapping(byte boardID) -{ - switch (boardID) - { - case 0: - //Pin mappings as per the v0.1 shield - pinInjector1 = 8; //Output pin injector 1 is on - pinInjector2 = 9; //Output pin injector 2 is on - pinInjector3 = 11; //Output pin injector 3 is on - pinInjector4 = 10; //Output pin injector 4 is on - pinInjector5 = 12; //Output pin injector 5 is on - pinCoil1 = 6; //Pin for coil 1 - pinCoil2 = 7; //Pin for coil 2 - pinCoil3 = 12; //Pin for coil 3 - pinCoil4 = 13; //Pin for coil 4 - pinCoil5 = 14; //Pin for coil 5 - pinTrigger = 2; //The CAS pin - pinTrigger2 = 3; //The CAS pin - pinTPS = A0; //TPS input pin - pinMAP = A1; //MAP sensor pin - pinIAT = A2; //IAT sensor pin - pinCLT = A3; //CLS sensor pin - pinO2 = A4; //O2 Sensor pin - pinIdle1 = 46; //Single wire idle control - pinIdle2 = 47; //2 wire idle control - pinStepperDir = 16; //Direction pin for DRV8825 driver - pinStepperStep = 17; //Step pin for DRV8825 driver - pinFan = 47; //Pin for the fan output - pinFuelPump = 4; //Fuel pump output - pinTachOut = 49; //Tacho output pin - pinFlex = 19; // Flex sensor (Must be external interrupt enabled) - pinResetControl = 43; //Reset control output - break; - case 1: - //Pin mappings as per the v0.2 shield - pinInjector1 = 8; //Output pin injector 1 is on - pinInjector2 = 9; //Output pin injector 2 is on - pinInjector3 = 10; //Output pin injector 3 is on - pinInjector4 = 11; //Output pin injector 4 is on - pinInjector5 = 12; //Output pin injector 5 is on - pinCoil1 = 28; //Pin for coil 1 - pinCoil2 = 24; //Pin for coil 2 - pinCoil3 = 40; //Pin for coil 3 - pinCoil4 = 36; //Pin for coil 4 - pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now - pinTrigger = 20; //The CAS pin - pinTrigger2 = 21; //The Cam Sensor pin - pinTPS = A2; //TPS input pin - pinMAP = A3; //MAP sensor pin - pinIAT = A0; //IAT sensor pin - pinCLT = A1; //CLS sensor pin - pinO2 = A8; //O2 Sensor pin - pinBat = A4; //Battery reference voltage pin - pinDisplayReset = 48; // OLED reset pin - pinTachOut = 49; //Tacho output pin - pinIdle1 = 30; //Single wire idle control - pinIdle2 = 31; //2 wire idle control - pinStepperDir = 16; //Direction pin for DRV8825 driver - pinStepperStep = 17; //Step pin for DRV8825 driver - pinFan = 47; //Pin for the fan output - pinFuelPump = 4; //Fuel pump output - pinFlex = 2; // Flex sensor (Must be external interrupt enabled) - pinResetControl = 43; //Reset control output - break; - case 2: - //Pin mappings as per the v0.3 shield - pinInjector1 = 8; //Output pin injector 1 is on - pinInjector2 = 9; //Output pin injector 2 is on - pinInjector3 = 10; //Output pin injector 3 is on - pinInjector4 = 11; //Output pin injector 4 is on - pinInjector5 = 12; //Output pin injector 5 is on - pinCoil1 = 28; //Pin for coil 1 - pinCoil2 = 24; //Pin for coil 2 - pinCoil3 = 40; //Pin for coil 3 - pinCoil4 = 36; //Pin for coil 4 - pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now - pinTrigger = 19; //The CAS pin - pinTrigger2 = 18; //The Cam Sensor pin - pinTPS = A2;//TPS input pin - pinMAP = A3; //MAP sensor pin - pinIAT = A0; //IAT sensor pin - pinCLT = A1; //CLS sensor pin - pinO2 = A8; //O2 Sensor pin - pinBat = A4; //Battery reference voltage pin - pinDisplayReset = 48; // OLED reset pin - pinTachOut = 49; //Tacho output pin - pinIdle1 = 5; //Single wire idle control - pinIdle2 = 53; //2 wire idle control - pinBoost = 7; //Boost control - pinVVT_1 = 6; //Default VVT output - pinFuelPump = 4; //Fuel pump output - pinStepperDir = 16; //Direction pin for DRV8825 driver - pinStepperStep = 17; //Step pin for DRV8825 driver - pinStepperEnable = 26; //Enable pin for DRV8825 - pinFan = A13; //Pin for the fan output - pinLaunch = 51; //Can be overwritten below - pinFlex = 2; // Flex sensor (Must be external interrupt enabled) - pinResetControl = 50; //Reset control output - break; +#endif //TIMER5_MICROS - case 3: - //Pin mappings as per the v0.4 shield - pinInjector1 = 8; //Output pin injector 1 is on - pinInjector2 = 9; //Output pin injector 2 is on - pinInjector3 = 10; //Output pin injector 3 is on - pinInjector4 = 11; //Output pin injector 4 is on - pinInjector5 = 12; //Output pin injector 5 is on - pinInjector6 = 50; //CAUTION: Uses the same as Coil 4 below. - pinCoil1 = 40; //Pin for coil 1 - pinCoil2 = 38; //Pin for coil 2 - pinCoil3 = 52; //Pin for coil 3 - pinCoil4 = 50; //Pin for coil 4 - pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now - pinTrigger = 19; //The CAS pin - pinTrigger2 = 18; //The Cam Sensor pin - pinTPS = A2;//TPS input pin - pinMAP = A3; //MAP sensor pin - pinIAT = A0; //IAT sensor pin - pinCLT = A1; //CLS sensor pin - pinO2 = A8; //O2 Sensor pin - pinBat = A4; //Battery reference voltage pin - pinDisplayReset = 48; // OLED reset pin - pinTachOut = 49; //Tacho output pin (Goes to ULN2803) - pinIdle1 = 5; //Single wire idle control - pinIdle2 = 6; //2 wire idle control - pinBoost = 7; //Boost control - pinVVT_1 = 4; //Default VVT output - pinFuelPump = 45; //Fuel pump output (Goes to ULN2803) - pinStepperDir = 16; //Direction pin for DRV8825 driver - pinStepperStep = 17; //Step pin for DRV8825 driver - pinStepperEnable = 24; //Enable pin for DRV8825 - pinFan = 47; //Pin for the fan output (Goes to ULN2803) - pinLaunch = 51; //Can be overwritten below - pinFlex = 2; // Flex sensor (Must be external interrupt enabled) - pinResetControl = 43; //Reset control output - - break; - - case 9: - //Pin mappings as per the MX5 PNP shield - pinInjector1 = 11; //Output pin injector 1 is on - pinInjector2 = 10; //Output pin injector 2 is on - pinInjector3 = 9; //Output pin injector 3 is on - pinInjector4 = 8; //Output pin injector 4 is on - pinInjector5 = 14; //Output pin injector 5 is on - pinCoil1 = 39; //Pin for coil 1 - pinCoil2 = 41; //Pin for coil 2 - pinCoil3 = 32; //Pin for coil 3 - pinCoil4 = 33; //Pin for coil 4 - pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now - pinTrigger = 19; //The CAS pin - pinTrigger2 = 18; //The Cam Sensor pin - pinTPS = A2;//TPS input pin - pinMAP = A5; //MAP sensor pin - pinIAT = A0; //IAT sensor pin - pinCLT = A1; //CLS sensor pin - pinO2 = A3; //O2 Sensor pin - pinBat = A4; //Battery reference voltage pin - pinDisplayReset = 48; // OLED reset pin - pinTachOut = 49; //Tacho output pin (Goes to ULN2803) - pinIdle1 = 2; //Single wire idle control - pinBoost = 4; - pinIdle2 = 4; //2 wire idle control (Note this is shared with boost!!!) - pinFuelPump = 37; //Fuel pump output - pinStepperDir = 16; //Direction pin for DRV8825 driver - pinStepperStep = 17; //Step pin for DRV8825 driver - pinFan = 35; //Pin for the fan output - pinLaunch = 12; //Can be overwritten below - pinFlex = 3; // Flex sensor (Must be external interrupt enabled) - pinResetControl = 44; //Reset control output - - break; - - case 10: - - //Pin mappings for user turtanas PCB - pinInjector1 = 4; //Output pin injector 1 is on - pinInjector2 = 5; //Output pin injector 2 is on - pinInjector3 = 6; //Output pin injector 3 is on - pinInjector4 = 7; //Output pin injector 4 is on - pinInjector5 = 8; //Placeholder only - NOT USED - pinInjector6 = 9; //Placeholder only - NOT USED - pinInjector7 = 10; //Placeholder only - NOT USED - pinInjector8 = 11; //Placeholder only - NOT USED - pinCoil1 = 24; //Pin for coil 1 - pinCoil2 = 28; //Pin for coil 2 - pinCoil3 = 36; //Pin for coil 3 - pinCoil4 = 40; //Pin for coil 4 - pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now - pinTrigger = 18; //The CAS pin - pinTrigger2 = 19; //The Cam Sensor pin - pinTPS = A2;//TPS input pin - pinMAP = A3; //MAP sensor pin - pinMAP2 = A8; //MAP2 sensor pin - pinIAT = A0; //IAT sensor pin - pinCLT = A1; //CLS sensor pin - pinO2 = A4; //O2 Sensor pin - pinBat = A7; //Battery reference voltage pin - pinDisplayReset = 48; // OLED reset pin - pinSpareTemp1 = A6; - pinSpareTemp2 = A5; - pinTachOut = 41; //Tacho output pin transistori puuttuu 2n2222 tähän ja 1k 12v - pinFuelPump = 42; //Fuel pump output 2n2222 - pinFan = 47; //Pin for the fan output - pinTachOut = 49; //Tacho output pin - pinFlex = 2; // Flex sensor (Must be external interrupt enabled) - pinResetControl = 26; //Reset control output - - - break; - - case 20: - //Pin mappings as per the Plazomat In/Out shields Rev 0.1 - pinInjector1 = 8; //Output pin injector 1 is on - pinInjector2 = 9; //Output pin injector 2 is on - pinInjector3 = 10; //Output pin injector 3 is on - pinInjector4 = 11; //Output pin injector 4 is on - pinInjector5 = 12; //Output pin injector 5 is on - pinCoil1 = 28; //Pin for coil 1 - pinCoil2 = 24; //Pin for coil 2 - pinCoil3 = 40; //Pin for coil 3 - pinCoil4 = 36; //Pin for coil 4 - pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now - pinSpareOut1 = 4; //Spare LSD Output 1(PWM) - pinSpareOut2 = 5; //Spare LSD Output 2(PWM) - pinSpareOut3 = 6; //Spare LSD Output 3(PWM) - pinSpareOut4 = 7; //Spare LSD Output 4(PWM) - pinSpareOut5 = 50; //Spare LSD Output 5(digital) - pinSpareOut6 = 52; //Spare LSD Output 6(digital) - pinTrigger = 20; //The CAS pin - pinTrigger2 = 21; //The Cam Sensor pin - pinSpareTemp2 = A15; //spare Analog input 2 - pinSpareTemp1 = A14; //spare Analog input 1 - pinO2 = A8; //O2 Sensor pin - pinBat = A4; //Battery reference voltage pin - pinMAP = A3; //MAP sensor pin - pinTPS = A2;//TPS input pin - pinCLT = A1; //CLS sensor pin - pinIAT = A0; //IAT sensor pin - pinFan = 47; //Pin for the fan output - pinFuelPump = 4; //Fuel pump output - pinTachOut = 49; //Tacho output pin - pinResetControl = 26; //Reset control output - break; - - case 30: - //Pin mappings as per the dazv6 shield - pinInjector1 = 8; //Output pin injector 1 is on - pinInjector2 = 9; //Output pin injector 2 is on - pinInjector3 = 10; //Output pin injector 3 is on - pinInjector4 = 11; //Output pin injector 4 is on - pinInjector5 = 12; //Output pin injector 5 is on - pinCoil1 = 40; //Pin for coil 1 - pinCoil2 = 38; //Pin for coil 2 - pinCoil3 = 50; //Pin for coil 3 - pinCoil4 = 52; //Pin for coil 4 - pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now - pinTrigger = 19; //The CAS pin - pinTrigger2 = 18; //The Cam Sensor pin - pinTrigger3 = 17; // cam sensor 2 pin - pinTPS = A2;//TPS input pin - pinMAP = A3; //MAP sensor pin - pinIAT = A0; //IAT sensor pin - pinCLT = A1; //CLS sensor pin - pinO2 = A8; //O2 Sensor pin - pinO2_2 = A9; //O2 sensor pin (second sensor) - pinBat = A4; //Battery reference voltage pin - pinDisplayReset = 48; // OLED reset pin - pinTachOut = 49; //Tacho output pin - pinIdle1 = 5; //Single wire idle control - pinFuelPump = 45; //Fuel pump output - pinStepperDir = 20; //Direction pin for DRV8825 driver - pinStepperStep = 21; //Step pin for DRV8825 driver - pinSpareHOut1 = 4; // high current output spare1 - pinSpareHOut2 = 6; // high current output spare2 - pinBoost = 7; - pinSpareLOut1 = 43; //low current output spare1 - pinSpareLOut2 = 47; - pinSpareLOut3 = 49; - pinSpareLOut4 = 51; - pinSpareLOut5 = 53; - pinFan = 47; //Pin for the fan output - break; - - case 40: - //Pin mappings as per the NO2C shield - pinInjector1 = 8; //Output pin injector 1 is on - pinInjector2 = 9; //Output pin injector 2 is on - pinInjector3 = 11; //Output pin injector 3 is on - NOT USED - pinInjector4 = 12; //Output pin injector 4 is on - NOT USED - pinInjector5 = 13; //Placeholder only - NOT USED - pinCoil1 = 23; //Pin for coil 1 - pinCoil2 = 22; //Pin for coil 2 - pinCoil3 = 2; //Pin for coil 3 - ONLY WITH DB2 - pinCoil4 = 3; //Pin for coil 4 - ONLY WITH DB2 - pinCoil5 = 46; //Placeholder only - NOT USED - pinTrigger = 19; //The CAS pin - pinTrigger2 = 18; //The Cam Sensor pin - pinTPS = A3; //TPS input pin - pinMAP = A0; //MAP sensor pin - pinIAT = A5; //IAT sensor pin - pinCLT = A4; //CLT sensor pin - pinO2 = A2; //O2 sensor pin - pinBat = A1; //Battery reference voltage pin - pinBaro = A6; //Baro sensor pin - ONLY WITH DB - pinSpareTemp1 = A7; //spare Analog input 1 - ONLY WITH DB - pinDisplayReset = 48; // OLED reset pin - NOT USED - pinTachOut = 38; //Tacho output pin - pinIdle1 = 5; //Single wire idle control - pinIdle2 = 47; //2 wire idle control - NOT USED - pinBoost = 7; //Boost control - pinVVT_1 = 6; //Default VVT output - pinFuelPump = 4; //Fuel pump output - pinStepperDir = 25; //Direction pin for DRV8825 driver - pinStepperStep = 24; //Step pin for DRV8825 driver - pinStepperEnable = 27; //Enable pin for DRV8825 driver - pinLaunch = 10; //Can be overwritten below - pinFlex = 20; // Flex sensor (Must be external interrupt enabled) - ONLY WITH DB - pinFan = 30; //Pin for the fan output - ONLY WITH DB - pinSpareLOut1 = 32; //low current output spare1 - ONLY WITH DB - pinSpareLOut2 = 34; //low current output spare2 - ONLY WITH DB - pinSpareLOut3 = 36; //low current output spare3 - ONLY WITH DB - pinResetControl = 26; //Reset control output - break; - - case 41: - //Pin mappings as per the UA4C shield - pinInjector1 = 8; //Output pin injector 1 is on - pinInjector2 = 7; //Output pin injector 2 is on - pinInjector3 = 6; //Output pin injector 3 is on - pinInjector4 = 5; //Output pin injector 4 is on - pinInjector5 = 45; //Output pin injector 5 is on PLACEHOLDER value for now - pinCoil1 = 35; //Pin for coil 1 - pinCoil2 = 36; //Pin for coil 2 - pinCoil3 = 33; //Pin for coil 3 - pinCoil4 = 34; //Pin for coil 4 - pinCoil5 = 44; //Pin for coil 5 PLACEHOLDER value for now - pinTrigger = 19; //The CAS pin - pinTrigger2 = 18; //The Cam Sensor pin - pinFlex = 20; // Flex sensor - pinTPS = A3; //TPS input pin - pinMAP = A0; //MAP sensor pin - pinBaro = A7; //Baro sensor pin - pinIAT = A5; //IAT sensor pin - pinCLT = A4; //CLS sensor pin - pinO2 = A1; //O2 Sensor pin - pinO2_2 = A9; //O2 sensor pin (second sensor) - pinBat = A2; //Battery reference voltage pin - pinSpareTemp1 = A8; //spare Analog input 1 - pinLaunch = 37; //Can be overwritten below - pinDisplayReset = 48; // OLED reset pin PLACEHOLDER value for now - pinTachOut = 22; //Tacho output pin - pinIdle1 = 9; //Single wire idle control - pinIdle2 = 10; //2 wire idle control - pinFuelPump = 23; //Fuel pump output - pinVVT_1 = 11; //Default VVT output - pinStepperDir = 32; //Direction pin for DRV8825 driver - pinStepperStep = 31; //Step pin for DRV8825 driver - pinStepperEnable = 30; //Enable pin for DRV8825 driver - pinBoost = 12; //Boost control - pinSpareLOut1 = 26; //low current output spare1 - pinSpareLOut2 = 27; //low current output spare2 - pinSpareLOut3 = 28; //low current output spare3 - pinSpareLOut4 = 29; //low current output spare4 - pinFan = 24; //Pin for the fan output - pinResetControl = 46; //Reset control output PLACEHOLDER value for now - break; - - default: - //Pin mappings as per the v0.2 shield - pinInjector1 = 8; //Output pin injector 1 is on - pinInjector2 = 9; //Output pin injector 2 is on - pinInjector3 = 10; //Output pin injector 3 is on - pinInjector4 = 11; //Output pin injector 4 is on - pinInjector5 = 12; //Output pin injector 5 is on - pinCoil1 = 28; //Pin for coil 1 - pinCoil2 = 24; //Pin for coil 2 - pinCoil3 = 40; //Pin for coil 3 - pinCoil4 = 36; //Pin for coil 4 - pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now - pinTrigger = 20; //The CAS pin - pinTrigger2 = 21; //The Cam Sensor pin - pinTPS = A2; //TPS input pin - pinMAP = A3; //MAP sensor pin - pinIAT = A0; //IAT sensor pin - pinCLT = A1; //CLS sensor pin - pinO2 = A8; //O2 Sensor pin - pinBat = A4; //Battery reference voltage pin - pinStepperDir = 16; //Direction pin for DRV8825 driver - pinStepperStep = 17; //Step pin for DRV8825 driver - pinDisplayReset = 48; // OLED reset pin - pinFan = 47; //Pin for the fan output - pinFuelPump = 4; //Fuel pump output - pinTachOut = 49; //Tacho output pin - pinFlex = 3; // Flex sensor (Must be external interrupt enabled) - pinBoost = 5; - pinIdle1 = 6; - pinResetControl = 43; //Reset control output - break; - } - - //Setup any devices that are using selectable pins - - if ( (configPage6.launchPin != 0) && (configPage6.launchPin < BOARD_NR_GPIO_PINS) ) { pinLaunch = pinTranslate(configPage6.launchPin); } - if ( (configPage4.ignBypassPin != 0) && (configPage4.ignBypassPin < BOARD_NR_GPIO_PINS) ) { pinIgnBypass = pinTranslate(configPage4.ignBypassPin); } - if ( (configPage2.tachoPin != 0) && (configPage2.tachoPin < BOARD_NR_GPIO_PINS) ) { pinTachOut = pinTranslate(configPage2.tachoPin); } - if ( (configPage4.fuelPumpPin != 0) && (configPage4.fuelPumpPin < BOARD_NR_GPIO_PINS) ) { pinFuelPump = pinTranslate(configPage4.fuelPumpPin); } - if ( (configPage6.fanPin != 0) && (configPage6.fanPin < BOARD_NR_GPIO_PINS) ) { pinFan = pinTranslate(configPage6.fanPin); } - if ( (configPage6.boostPin != 0) && (configPage6.boostPin < BOARD_NR_GPIO_PINS) ) { pinBoost = pinTranslate(configPage6.boostPin); } - if ( (configPage6.vvtPin != 0) && (configPage6.vvtPin < BOARD_NR_GPIO_PINS) ) { pinVVT_1 = pinTranslate(configPage6.vvtPin); } - if ( (configPage6.useExtBaro != 0) && (configPage6.baroPin < BOARD_NR_GPIO_PINS) ) { pinBaro = configPage6.baroPin + A0; } - if ( (configPage6.useEMAP != 0) && (configPage10.EMAPPin < BOARD_NR_GPIO_PINS) ) { pinEMAP = configPage10.EMAPPin + A0; } - - //Currently there's no default pin for Idle Up - pinIdleUp = pinTranslate(configPage2.idleUpPin); - - /* Reset control is a special case. If reset control is enabled, it needs its initial state set BEFORE its pinMode. - If that doesn't happen and reset control is in "Serial Command" mode, the Arduino will end up in a reset loop - because the control pin will go low as soon as the pinMode is set to OUTPUT. */ - if ( (configPage4.resetControl != 0) && (configPage4.resetControlPin < BOARD_NR_GPIO_PINS) ) - { - resetControl = configPage4.resetControl; - pinResetControl = pinTranslate(configPage4.resetControlPin); - setResetControlPinState(); - pinMode(pinResetControl, OUTPUT); - } - - //Finally, set the relevant pin modes for outputs - pinMode(pinCoil1, OUTPUT); - pinMode(pinCoil2, OUTPUT); - pinMode(pinCoil3, OUTPUT); - pinMode(pinCoil4, OUTPUT); - pinMode(pinCoil5, OUTPUT); - pinMode(pinInjector1, OUTPUT); - pinMode(pinInjector2, OUTPUT); - pinMode(pinInjector3, OUTPUT); - pinMode(pinInjector4, OUTPUT); - pinMode(pinInjector5, OUTPUT); - pinMode(pinTachOut, OUTPUT); - pinMode(pinIdle1, OUTPUT); - pinMode(pinIdle2, OUTPUT); - pinMode(pinFuelPump, OUTPUT); - pinMode(pinIgnBypass, OUTPUT); - pinMode(pinFan, OUTPUT); - pinMode(pinStepperDir, OUTPUT); - pinMode(pinStepperStep, OUTPUT); - pinMode(pinStepperEnable, OUTPUT); - pinMode(pinBoost, OUTPUT); - pinMode(pinVVT_1, OUTPUT); - - inj1_pin_port = portOutputRegister(digitalPinToPort(pinInjector1)); - inj1_pin_mask = digitalPinToBitMask(pinInjector1); - inj2_pin_port = portOutputRegister(digitalPinToPort(pinInjector2)); - inj2_pin_mask = digitalPinToBitMask(pinInjector2); - inj3_pin_port = portOutputRegister(digitalPinToPort(pinInjector3)); - inj3_pin_mask = digitalPinToBitMask(pinInjector3); - inj4_pin_port = portOutputRegister(digitalPinToPort(pinInjector4)); - inj4_pin_mask = digitalPinToBitMask(pinInjector4); - inj5_pin_port = portOutputRegister(digitalPinToPort(pinInjector5)); - inj5_pin_mask = digitalPinToBitMask(pinInjector5); - inj6_pin_port = portOutputRegister(digitalPinToPort(pinInjector6)); - inj6_pin_mask = digitalPinToBitMask(pinInjector6); - inj7_pin_port = portOutputRegister(digitalPinToPort(pinInjector7)); - inj7_pin_mask = digitalPinToBitMask(pinInjector7); - inj8_pin_port = portOutputRegister(digitalPinToPort(pinInjector8)); - inj8_pin_mask = digitalPinToBitMask(pinInjector8); - - ign1_pin_port = portOutputRegister(digitalPinToPort(pinCoil1)); - ign1_pin_mask = digitalPinToBitMask(pinCoil1); - ign2_pin_port = portOutputRegister(digitalPinToPort(pinCoil2)); - ign2_pin_mask = digitalPinToBitMask(pinCoil2); - ign3_pin_port = portOutputRegister(digitalPinToPort(pinCoil3)); - ign3_pin_mask = digitalPinToBitMask(pinCoil3); - ign4_pin_port = portOutputRegister(digitalPinToPort(pinCoil4)); - ign4_pin_mask = digitalPinToBitMask(pinCoil4); - ign5_pin_port = portOutputRegister(digitalPinToPort(pinCoil5)); - ign5_pin_mask = digitalPinToBitMask(pinCoil5); - ign6_pin_port = portOutputRegister(digitalPinToPort(pinCoil6)); - ign6_pin_mask = digitalPinToBitMask(pinCoil6); - ign7_pin_port = portOutputRegister(digitalPinToPort(pinCoil7)); - ign7_pin_mask = digitalPinToBitMask(pinCoil7); - ign8_pin_port = portOutputRegister(digitalPinToPort(pinCoil8)); - ign8_pin_mask = digitalPinToBitMask(pinCoil8); - - tach_pin_port = portOutputRegister(digitalPinToPort(pinTachOut)); - tach_pin_mask = digitalPinToBitMask(pinTachOut); - pump_pin_port = portOutputRegister(digitalPinToPort(pinFuelPump)); - pump_pin_mask = digitalPinToBitMask(pinFuelPump); - - pinMode(pinTrigger, INPUT); - pinMode(pinTrigger2, INPUT); - pinMode(pinTrigger3, INPUT); - - //Each of the below are only set when their relevant function is enabled. This can help prevent pin conflicts that users aren't aware of with unused functions - if(configPage2.flexEnabled > 0) - { - pinMode(pinFlex, INPUT); //Standard GM / Continental flex sensor requires pullup, but this should be onboard. The internal pullup will not work (Requires ~3.3k)! - } - if(configPage6.launchEnabled > 0) - { - if (configPage6.lnchPullRes == true) { pinMode(pinLaunch, INPUT_PULLUP); } - else { pinMode(pinLaunch, INPUT); } //If Launch Pull Resistor is not set make input float. - } - if(configPage2.idleUpEnabled > 0) - { - if (configPage2.idleUpPolarity == 0) { pinMode(pinIdleUp, INPUT_PULLUP); } //Normal setting - else { pinMode(pinIdleUp, INPUT); } //inverted setting - } - - - //These must come after the above pinMode statements - triggerPri_pin_port = portInputRegister(digitalPinToPort(pinTrigger)); - triggerPri_pin_mask = digitalPinToBitMask(pinTrigger); - triggerSec_pin_port = portInputRegister(digitalPinToPort(pinTrigger2)); - triggerSec_pin_mask = digitalPinToBitMask(pinTrigger2); - - //Set default values - digitalWrite(pinMAP, HIGH); - //digitalWrite(pinO2, LOW); - digitalWrite(pinTPS, LOW); - -} -#endif +#endif //CORE_AVR diff --git a/speeduino/board_stm32F407VE.ino b/speeduino/board_stm32F407VE.ino deleted file mode 100644 index b0942550..00000000 --- a/speeduino/board_stm32F407VE.ino +++ /dev/null @@ -1,901 +0,0 @@ -#if defined(ARDUINO_BLACK_F407VE) -#include "board_stm32F407VE.h" -#include "globals.h" -#include "auxiliaries.h" -#include "idle.h" -#include "scheduler.h" -#if defined(STM32F4) - #define NR_OFF_TIMERS 9 - //stimer_t HardwareTimers[NR_OFF_TIMERS + 1]; - stimer_t HardwareTimers_1; - stimer_t HardwareTimers_2; - stimer_t HardwareTimers_3; - stimer_t HardwareTimers_4; - stimer_t HardwareTimers_5; - stimer_t HardwareTimers_8; - #define LED_BUILTIN PA7 - //These should really be in the stm32GENERIC libs, but for somereason they only have timers 1-4 -// #include -// #include "src/HardwareTimers/HardwareTimer.h" -// HardwareTimer Timer5(TIM5, chip_tim5, sizeof(chip_tim5) / sizeof(chip_tim5[0])); -// HardwareTimer Timer8(TIM8, chip_tim8, sizeof(chip_tim8) / sizeof(chip_tim8[0])); -#else - #include "HardwareTimer.h" -#endif -extern void oneMSIntervalIRQ(stimer_t *Timer){oneMSInterval();} - -extern void EmptyIRQCallback(stimer_t *Timer, uint32_t channel){} - - - - -void initBoard() -{ - /* - * Initialize timers - */ - - HardwareTimers_1.timer = TIM1; - HardwareTimers_2.timer = TIM2; - HardwareTimers_3.timer = TIM3; - HardwareTimers_4.timer = TIM4; - - HardwareTimers_5.timer = TIM5; - HardwareTimers_8.timer = TIM8; - - - /* - *********************************************************************************************************** - * General - */ - #define FLASH_LENGTH 8192 - - /* - *********************************************************************************************************** - * Idle - */ - if( (configPage6.iacAlgorithm == IAC_ALGORITHM_PWM_OL) || (configPage6.iacAlgorithm == IAC_ALGORITHM_PWM_CL) ) - { - idle_pwm_max_count = 1000000L / (configPage6.idleFreq * 2); //Converts the frequency in Hz to the number of ticks (at 2uS) it takes to complete 1 cycle. Note that the frequency is divided by 2 coming from TS to allow for up to 5KHz - } - - //This must happen at the end of the idle init - TimerPulseInit(&HardwareTimers_1, 0xFFFF, 0, EmptyIRQCallback); - //setTimerPrescalerRegister(&HardwareTimers_1, (uint32_t)(getTimerClkFreq(HardwareTimers_1.timer) / (500000)) - 1); - if(idle_pwm_max_count > 0) { attachIntHandleOC(&HardwareTimers_1, idleInterrupt, 4, 0);} //on first flash the configPage4.iacAlgorithm is invalid - //Timer1.setMode(4, TIMER_OUTPUT_COMPARE); - //timer_set_mode(TIMER1, 4, TIMER_OUTPUT_COMPARE; - //if(idle_pwm_max_count > 0) { Timer1.attachInterrupt(4, idleInterrupt);} //on first flash the configPage4.iacAlgorithm is invalid - //Timer1.resume(); - - - /* - *********************************************************************************************************** - * Timers - */ - #if defined(ARDUINO_BLACK_F407VE) || defined(STM32F4) || defined(_STM32F4_) - TimerHandleInit(&HardwareTimers_8, 1000, 168); - attachIntHandle(&HardwareTimers_8, oneMSIntervalIRQ); - #else - Timer4.setPeriod(1000); // Set up period - Timer4.setMode(1, TIMER_OUTPUT_COMPARE); - Timer4.attachInterrupt(1, oneMSInterval); - Timer4.resume(); //Start Timer - #endif - pinMode(LED_BUILTIN, OUTPUT); //Visual WDT - - /* - *********************************************************************************************************** - * Auxilliaries - */ - //2uS resolution Min 8Hz, Max 5KHz - boost_pwm_max_count = 1000000L / (2 * configPage6.boostFreq * 2); //Converts the frequency in Hz to the number of ticks (at 2uS) it takes to complete 1 cycle. The x2 is there because the frequency is stored at half value (in a byte) to allow freqneucies up to 511Hz - vvt_pwm_max_count = 1000000L / (2 * configPage6.vvtFreq * 2); //Converts the frequency in Hz to the number of ticks (at 2uS) it takes to complete 1 cycle - - //Need to be initialised last due to instant interrupt -// Timer1.setMode(2, TIMER_OUTPUT_COMPARE); -// Timer1.setMode(3, TIMER_OUTPUT_COMPARE); -// if(boost_pwm_max_count > 0) { Timer1.attachInterrupt(2, boostInterrupt);} -// if(vvt_pwm_max_count > 0) { Timer1.attachInterrupt(3, vvtInterrupt);} - if(idle_pwm_max_count > 0) { attachIntHandleOC(&HardwareTimers_1, boostInterrupt, 2, 0);} - if(vvt_pwm_max_count > 0) { attachIntHandleOC(&HardwareTimers_1, vvtInterrupt, 3, 0);} -// Timer1.resume(); - - TimerPulseInit(&HardwareTimers_3, 0xFFFF, 0, EmptyIRQCallback); - attachIntHandleOC(&HardwareTimers_3, fuelSchedule1Interrupt, 1, 0); - attachIntHandleOC(&HardwareTimers_3, fuelSchedule2Interrupt, 2, 0); - attachIntHandleOC(&HardwareTimers_3, fuelSchedule3Interrupt, 3, 0); - attachIntHandleOC(&HardwareTimers_3, fuelSchedule4Interrupt, 4, 0); - - - TimerPulseInit(&HardwareTimers_2, 0xFFFF, 0, EmptyIRQCallback); - attachIntHandleOC(&HardwareTimers_2, ignitionSchedule1Interrupt, 1, 0); - attachIntHandleOC(&HardwareTimers_2, ignitionSchedule2Interrupt, 2, 0); - attachIntHandleOC(&HardwareTimers_2, ignitionSchedule3Interrupt, 3, 0); - attachIntHandleOC(&HardwareTimers_2, ignitionSchedule4Interrupt, 4, 0); - - //Attach interupt functions - //Injection - - TimerPulseInit(&HardwareTimers_5, 0xFFFF, 0, EmptyIRQCallback); - //setTimerPrescalerRegister(&HardwareTimers_5, (uint32_t)(getTimerClkFreq(HardwareTimers_5.timer) / (1000000)) - 1); - #if (INJ_CHANNELS >= 5) - attachIntHandleOC(&HardwareTimers_5, fuelSchedule5Interrupt, 1, 0); - //Timer5.attachInterrupt(1, fuelSchedule5Interrupt); - #endif - #if (INJ_CHANNELS >= 6) - attachIntHandleOC(&HardwareTimers_5, fuelSchedule6Interrupt, 2, 0); - //Timer5.attachInterrupt(2, fuelSchedule6Interrupt); - #endif - #if (INJ_CHANNELS >= 7) - attachIntHandleOC(&HardwareTimers_5, fuelSchedule7Interrupt, 3, 0); - //Timer5.attachInterrupt(3, fuelSchedule7Interrupt); - #endif - #if (INJ_CHANNELS >= 8) - attachIntHandleOC(&HardwareTimers_5, fuelSchedule8Interrupt, 4, 0); - //Timer5.attachInterrupt(4, fuelSchedule8Interrupt); - #endif - - TimerPulseInit(&HardwareTimers_4, 0xFFFF, 0, EmptyIRQCallback); - //setTimerPrescalerRegister(&HardwareTimers_4, (uint32_t)(getTimerClkFreq(HardwareTimers_4.timer) / (1000000)) - 1); - #if (IGN_CHANNELS >= 5) - attachIntHandleOC(&HardwareTimers_4, ignitionSchedule5Interrupt, 1, 0); - //Timer4.attachInterrupt(1, ignitionSchedule5Interrupt); - #endif - #if (IGN_CHANNELS >= 6) - attachIntHandleOC(&HardwareTimers_4, ignitionSchedule6Interrupt, 2, 0); - //Timer4.attachInterrupt(2, ignitionSchedule6Interrupt); - #endif - #if (IGN_CHANNELS >= 7) - attachIntHandleOC(&HardwareTimers_4, ignitionSchedule7Interrupt, 3, 0); - //Timer4.attachInterrupt(3, ignitionSchedule7Interrupt); - #endif - #if (IGN_CHANNELS >= 8) - attachIntHandleOC(&HardwareTimers_4, ignitionSchedule8Interrupt, 4, 0); - //Timer4.attachInterrupt(4, ignitionSchedule8Interrupt); - #endif - - setTimerPrescalerRegister(&HardwareTimers_2, (uint32_t)(getTimerClkFreq(HardwareTimers_2.timer) / (250000)) - 1); - setTimerPrescalerRegister(&HardwareTimers_3, (uint32_t)(getTimerClkFreq(HardwareTimers_3.timer) / (250000)) - 1); - setTimerPrescalerRegister(&HardwareTimers_4, (uint32_t)(getTimerClkFreq(HardwareTimers_4.timer) / (250000)) - 1); - setTimerPrescalerRegister(&HardwareTimers_5, (uint32_t)(getTimerClkFreq(HardwareTimers_5.timer) / (250000)) - 1); -} - -uint16_t freeRam() -{ - char top = 't'; - return &top - reinterpret_cast(sbrk(0)); -} - -//pinmapping the STM32F407 for different boards, at this moment no board is desgined. -//All boards are set to the default just to be sure. -void setPinMapping(byte boardID) -{ - switch (boardID) - { - case 0: - //Pin mappings as per the v0.4 shield - - //Black F407VE http://wiki.stm32duino.com/index.php?title=STM32F407 - //PC8~PC12 SDio - - //PA9..PA10 Serial1 - //PA11..PA12 USB - //PA13..PA15 & PB4 SWD(debug) pins - //PB0 EEPROM CS pin - //PB1 LCD - //PB2 BOOT1 - //PB3..PB5 SPI interface - //PB6..PB8 NRF interface - - //PD5 & PD6 Serial2 - pinInjector1 = PA1; //Output pin injector 1 is on - pinInjector2 = PA2; //Output pin injector 2 is on - pinInjector3 = PA3; //Output pin injector 3 is on - pinInjector4 = PA4; //Output pin injector 4 is on - pinInjector5 = PA5; //Output pin injector 5 is on - pinInjector6 = PD4; //Output pin injector 6 is on - pinCoil1 = PD7; //Pin for coil 1 - pinCoil2 = PB9; //Pin for coil 2 - pinCoil3 = PA8; //Pin for coil 3 - pinCoil4 = PB10; //Pin for coil 4 - pinCoil5 = PB11; //Pin for coil 5 - pinMAP = PC0; //MAP sensor pin - pinTPS = PC1;//TPS input pin - pinIAT = PC2; //IAT sensor pin - pinCLT = PC3; //CLS sensor pin - pinO2 = PC5; //O2 Sensor pin - pinBat = PB1; //Battery reference voltage pin - pinBaro = PC4; - pinIdle1 = PB12; //Single wire idle control - pinIdle2 = PB11; //2 wire idle control - pinBoost = PC7; //Boost control - pinVVT_1 = PD3; //Default VVT output - pinStepperDir = PE0; //Direction pin for DRV8825 driver - pinStepperStep = PE1; //Step pin for DRV8825 driver - pinStepperEnable = PE2; //Enable pin for DRV8825 - pinDisplayReset = PE5; // OLED reset pin - pinFan = PE6; //Pin for the fan output - - pinFuelPump = PA6; //Fuel pump output - pinTachOut = PD15; //Tacho output pin - // pinLaunch = 51; //Can be overwritten below - // pinResetControl = 43; //Reset control output - - //external interrupt enabled pins - //external interrupts could be enalbed in any pin, except same port numbers (PA4,PE4) - pinFlex = PD4; // Flex sensor (Must be external interrupt enabled) - pinTrigger = PD13; //The CAS pin - pinTrigger2 = PD14; //The Cam Sensor pin - break; - case 1: - //Pin mappings as per the v0.4 shield - - //Black F407VE http://wiki.stm32duino.com/index.php?title=STM32F407 - //PC8~PC12 SDio - - //PA9..PA10 Serial1 - //PA11..PA12 USB - //PA13..PA15 & PB4 SWD(debug) pins - //PB0 EEPROM CS pin - //PB1 LCD - //PB2 BOOT1 - //PB3..PB5 SPI interface - //PB6..PB8 NRF interface - - //PD5 & PD6 Serial2 - pinInjector1 = PA1; //Output pin injector 1 is on - pinInjector2 = PA2; //Output pin injector 2 is on - pinInjector3 = PA3; //Output pin injector 3 is on - pinInjector4 = PA4; //Output pin injector 4 is on - pinInjector5 = PA5; //Output pin injector 5 is on - pinInjector6 = PD4; //Output pin injector 6 is on - pinCoil1 = PD7; //Pin for coil 1 - pinCoil2 = PB9; //Pin for coil 2 - pinCoil3 = PA8; //Pin for coil 3 - pinCoil4 = PB10; //Pin for coil 4 - pinCoil5 = PB11; //Pin for coil 5 - pinMAP = PC0; //MAP sensor pin - pinTPS = PC1;//TPS input pin - pinIAT = PC2; //IAT sensor pin - pinCLT = PC3; //CLS sensor pin - pinO2 = PC5; //O2 Sensor pin - pinBat = PB1; //Battery reference voltage pin - pinBaro = PC4; - pinIdle1 = PB12; //Single wire idle control - pinIdle2 = PB11; //2 wire idle control - pinBoost = PC7; //Boost control - pinVVT_1 = PD3; //Default VVT output - pinStepperDir = PE0; //Direction pin for DRV8825 driver - pinStepperStep = PE1; //Step pin for DRV8825 driver - pinStepperEnable = PE2; //Enable pin for DRV8825 - pinDisplayReset = PE5; // OLED reset pin - pinFan = PE6; //Pin for the fan output - - pinFuelPump = PA6; //Fuel pump output - pinTachOut = PD15; //Tacho output pin - // pinLaunch = 51; //Can be overwritten below - // pinResetControl = 43; //Reset control output - - //external interrupt enabled pins - //external interrupts could be enalbed in any pin, except same port numbers (PA4,PE4) - pinFlex = PD4; // Flex sensor (Must be external interrupt enabled) - pinTrigger = PD13; //The CAS pin - pinTrigger2 = PD14; //The Cam Sensor pin - break; - - case 2: - //Pin mappings as per the v0.4 shield - - //Black F407VE http://wiki.stm32duino.com/index.php?title=STM32F407 - //PC8~PC12 SDio - - //PA9..PA10 Serial1 - //PA11..PA12 USB - //PA13..PA15 & PB4 SWD(debug) pins - //PB0 EEPROM CS pin - //PB1 LCD - //PB2 BOOT1 - //PB3..PB5 SPI interface - //PB6..PB8 NRF interface - - //PD5 & PD6 Serial2 - pinInjector1 = PA1; //Output pin injector 1 is on - pinInjector2 = PA2; //Output pin injector 2 is on - pinInjector3 = PA3; //Output pin injector 3 is on - pinInjector4 = PA4; //Output pin injector 4 is on - pinInjector5 = PA5; //Output pin injector 5 is on - pinInjector6 = PD4; //Output pin injector 6 is on - pinCoil1 = PD7; //Pin for coil 1 - pinCoil2 = PB9; //Pin for coil 2 - pinCoil3 = PA8; //Pin for coil 3 - pinCoil4 = PB10; //Pin for coil 4 - pinCoil5 = PB11; //Pin for coil 5 - pinMAP = PC0; //MAP sensor pin - pinTPS = PC1;//TPS input pin - pinIAT = PC2; //IAT sensor pin - pinCLT = PC3; //CLS sensor pin - pinO2 = PC5; //O2 Sensor pin - pinBat = PB1; //Battery reference voltage pin - pinBaro = PC4; - pinIdle1 = PB12; //Single wire idle control - pinIdle2 = PB11; //2 wire idle control - pinBoost = PC7; //Boost control - pinVVT_1 = PD3; //Default VVT output - pinStepperDir = PE0; //Direction pin for DRV8825 driver - pinStepperStep = PE1; //Step pin for DRV8825 driver - pinStepperEnable = PE2; //Enable pin for DRV8825 - pinDisplayReset = PE5; // OLED reset pin - pinFan = PE6; //Pin for the fan output - - pinFuelPump = PA6; //Fuel pump output - pinTachOut = PD15; //Tacho output pin - // pinLaunch = 51; //Can be overwritten below - // pinResetControl = 43; //Reset control output - - //external interrupt enabled pins - //external interrupts could be enalbed in any pin, except same port numbers (PA4,PE4) - pinFlex = PD4; // Flex sensor (Must be external interrupt enabled) - pinTrigger = PD13; //The CAS pin - pinTrigger2 = PD14; //The Cam Sensor pin - break; - - case 3: - //Pin mappings as per the v0.4 shield - - //Black F407VE http://wiki.stm32duino.com/index.php?title=STM32F407 - //PC8~PC12 SDio - - //PA9..PA10 Serial1 - //PA11..PA12 USB - //PA13..PA15 & PB4 SWD(debug) pins - //PB0 EEPROM CS pin - //PB1 LCD - //PB2 BOOT1 - //PB3..PB5 SPI interface - //PB6..PB8 NRF interface - - //PD5 & PD6 Serial2 - pinInjector1 = PA1; //Output pin injector 1 is on - pinInjector2 = PA2; //Output pin injector 2 is on - pinInjector3 = PA3; //Output pin injector 3 is on - pinInjector4 = PA4; //Output pin injector 4 is on - pinInjector5 = PA5; //Output pin injector 5 is on - pinInjector6 = PD4; //Output pin injector 6 is on - pinCoil1 = PD7; //Pin for coil 1 - pinCoil2 = PB9; //Pin for coil 2 - pinCoil3 = PA8; //Pin for coil 3 - pinCoil4 = PB10; //Pin for coil 4 - pinCoil5 = PB11; //Pin for coil 5 - pinMAP = PC0; //MAP sensor pin - pinTPS = PC1;//TPS input pin - pinIAT = PC2; //IAT sensor pin - pinCLT = PC3; //CLS sensor pin - pinO2 = PC5; //O2 Sensor pin - pinBat = PB1; //Battery reference voltage pin - pinBaro = PC4; - pinIdle1 = PB12; //Single wire idle control - pinIdle2 = PB11; //2 wire idle control - pinBoost = PC7; //Boost control - pinVVT_1 = PD3; //Default VVT output - pinStepperDir = PE0; //Direction pin for DRV8825 driver - pinStepperStep = PE1; //Step pin for DRV8825 driver - pinStepperEnable = PE2; //Enable pin for DRV8825 - pinDisplayReset = PE5; // OLED reset pin - pinFan = PE6; //Pin for the fan output - - pinFuelPump = PA6; //Fuel pump output - pinTachOut = PD15; //Tacho output pin - // pinLaunch = 51; //Can be overwritten below - // pinResetControl = 43; //Reset control output - - //external interrupt enabled pins - //external interrupts could be enalbed in any pin, except same port numbers (PA4,PE4) - pinFlex = PD4; // Flex sensor (Must be external interrupt enabled) - pinTrigger = PD13; //The CAS pin - pinTrigger2 = PD14; //The Cam Sensor pin - break; - - case 9: - //Pin mappings as per the MX5 PNP shield - pinInjector1 = 11; //Output pin injector 1 is on - pinInjector2 = 10; //Output pin injector 2 is on - pinInjector3 = 9; //Output pin injector 3 is on - pinInjector4 = 8; //Output pin injector 4 is on - pinInjector5 = 14; //Output pin injector 5 is on - pinCoil1 = 39; //Pin for coil 1 - pinCoil2 = 41; //Pin for coil 2 - pinCoil3 = 32; //Pin for coil 3 - pinCoil4 = 33; //Pin for coil 4 - pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now - pinTrigger = 19; //The CAS pin - pinTrigger2 = 18; //The Cam Sensor pin - pinTPS = A2;//TPS input pin - pinMAP = A5; //MAP sensor pin - pinIAT = A0; //IAT sensor pin - pinCLT = A1; //CLS sensor pin - pinO2 = A3; //O2 Sensor pin - pinBat = A4; //Battery reference voltage pin - pinDisplayReset = 48; // OLED reset pin - pinTachOut = 49; //Tacho output pin (Goes to ULN2803) - pinIdle1 = 2; //Single wire idle control - pinBoost = 4; - pinIdle2 = 4; //2 wire idle control (Note this is shared with boost!!!) - pinFuelPump = 37; //Fuel pump output - pinStepperDir = 16; //Direction pin for DRV8825 driver - pinStepperStep = 17; //Step pin for DRV8825 driver - pinFan = 35; //Pin for the fan output - pinLaunch = 12; //Can be overwritten below - pinFlex = 3; // Flex sensor (Must be external interrupt enabled) - pinResetControl = 44; //Reset control output - - break; - - case 10: - //Pin mappings as per the v0.4 shield - - //Black F407VE http://wiki.stm32duino.com/index.php?title=STM32F407 - //PC8~PC12 SDio - - //PA9..PA10 Serial1 - //PA11..PA12 USB - //PA13..PA15 & PB4 SWD(debug) pins - //PB0 EEPROM CS pin - //PB1 LCD - //PB2 BOOT1 - //PB3..PB5 SPI interface - //PB6..PB8 NRF interface - - //PD5 & PD6 Serial2 - pinInjector1 = PA1; //Output pin injector 1 is on - pinInjector2 = PA2; //Output pin injector 2 is on - pinInjector3 = PA3; //Output pin injector 3 is on - pinInjector4 = PA4; //Output pin injector 4 is on - pinInjector5 = PA5; //Output pin injector 5 is on - pinInjector6 = PD4; //Output pin injector 6 is on - pinCoil1 = PD7; //Pin for coil 1 - pinCoil2 = PB9; //Pin for coil 2 - pinCoil3 = PA8; //Pin for coil 3 - pinCoil4 = PB10; //Pin for coil 4 - pinCoil5 = PB11; //Pin for coil 5 - pinMAP = PC0; //MAP sensor pin - pinTPS = PC1;//TPS input pin - pinIAT = PC2; //IAT sensor pin - pinCLT = PC3; //CLS sensor pin - pinO2 = PC5; //O2 Sensor pin - pinBat = PB1; //Battery reference voltage pin - pinBaro = PC4; - pinIdle1 = PB12; //Single wire idle control - pinIdle2 = PB11; //2 wire idle control - pinBoost = PC7; //Boost control - pinVVT_1 = PD3; //Default VVT output - pinStepperDir = PE0; //Direction pin for DRV8825 driver - pinStepperStep = PE1; //Step pin for DRV8825 driver - pinStepperEnable = PE2; //Enable pin for DRV8825 - pinDisplayReset = PE5; // OLED reset pin - pinFan = PE6; //Pin for the fan output - - pinFuelPump = PA6; //Fuel pump output - pinTachOut = PD15; //Tacho output pin - // pinLaunch = 51; //Can be overwritten below - // pinResetControl = 43; //Reset control output - - //external interrupt enabled pins - //external interrupts could be enalbed in any pin, except same port numbers (PA4,PE4) - pinFlex = PD4; // Flex sensor (Must be external interrupt enabled) - pinTrigger = PD13; //The CAS pin - pinTrigger2 = PD14; //The Cam Sensor pin - break; - - case 20: - //Pin mappings as per the v0.4 shield - - //Black F407VE http://wiki.stm32duino.com/index.php?title=STM32F407 - //PC8~PC12 SDio - - //PA9..PA10 Serial1 - //PA11..PA12 USB - //PA13..PA15 & PB4 SWD(debug) pins - //PB0 EEPROM CS pin - //PB1 LCD - //PB2 BOOT1 - //PB3..PB5 SPI interface - //PB6..PB8 NRF interface - - //PD5 & PD6 Serial2 - pinInjector1 = PA1; //Output pin injector 1 is on - pinInjector2 = PA2; //Output pin injector 2 is on - pinInjector3 = PA3; //Output pin injector 3 is on - pinInjector4 = PA4; //Output pin injector 4 is on - pinInjector5 = PA5; //Output pin injector 5 is on - pinInjector6 = PD4; //Output pin injector 6 is on - pinCoil1 = PD7; //Pin for coil 1 - pinCoil2 = PB9; //Pin for coil 2 - pinCoil3 = PA8; //Pin for coil 3 - pinCoil4 = PB10; //Pin for coil 4 - pinCoil5 = PB11; //Pin for coil 5 - pinMAP = PC0; //MAP sensor pin - pinTPS = PC1;//TPS input pin - pinIAT = PC2; //IAT sensor pin - pinCLT = PC3; //CLS sensor pin - pinO2 = PC5; //O2 Sensor pin - pinBat = PB1; //Battery reference voltage pin - pinBaro = PC4; - pinIdle1 = PB12; //Single wire idle control - pinIdle2 = PB11; //2 wire idle control - pinBoost = PC7; //Boost control - pinVVT_1 = PD3; //Default VVT output - pinStepperDir = PE0; //Direction pin for DRV8825 driver - pinStepperStep = PE1; //Step pin for DRV8825 driver - pinStepperEnable = PE2; //Enable pin for DRV8825 - pinDisplayReset = PE5; // OLED reset pin - pinFan = PE6; //Pin for the fan output - - pinFuelPump = PA6; //Fuel pump output - pinTachOut = PD15; //Tacho output pin - // pinLaunch = 51; //Can be overwritten below - // pinResetControl = 43; //Reset control output - - //external interrupt enabled pins - //external interrupts could be enalbed in any pin, except same port numbers (PA4,PE4) - pinFlex = PD4; // Flex sensor (Must be external interrupt enabled) - pinTrigger = PD13; //The CAS pin - pinTrigger2 = PD14; //The Cam Sensor pin - break; - - case 30: - //Pin mappings as per the v0.4 shield - - //Black F407VE http://wiki.stm32duino.com/index.php?title=STM32F407 - //PC8~PC12 SDio - - //PA9..PA10 Serial1 - //PA11..PA12 USB - //PA13..PA15 & PB4 SWD(debug) pins - //PB0 EEPROM CS pin - //PB1 LCD - //PB2 BOOT1 - //PB3..PB5 SPI interface - //PB6..PB8 NRF interface - - //PD5 & PD6 Serial2 - pinInjector1 = PA1; //Output pin injector 1 is on - pinInjector2 = PA2; //Output pin injector 2 is on - pinInjector3 = PA3; //Output pin injector 3 is on - pinInjector4 = PA4; //Output pin injector 4 is on - pinInjector5 = PA5; //Output pin injector 5 is on - pinInjector6 = PD4; //Output pin injector 6 is on - pinCoil1 = PD7; //Pin for coil 1 - pinCoil2 = PB9; //Pin for coil 2 - pinCoil3 = PA8; //Pin for coil 3 - pinCoil4 = PB10; //Pin for coil 4 - pinCoil5 = PB11; //Pin for coil 5 - pinMAP = PC0; //MAP sensor pin - pinTPS = PC1;//TPS input pin - pinIAT = PC2; //IAT sensor pin - pinCLT = PC3; //CLS sensor pin - pinO2 = PC5; //O2 Sensor pin - pinBat = PB1; //Battery reference voltage pin - pinBaro = PC4; - pinIdle1 = PB12; //Single wire idle control - pinIdle2 = PB11; //2 wire idle control - pinBoost = PC7; //Boost control - pinVVT_1 = PD3; //Default VVT output - pinStepperDir = PE0; //Direction pin for DRV8825 driver - pinStepperStep = PE1; //Step pin for DRV8825 driver - pinStepperEnable = PE2; //Enable pin for DRV8825 - pinDisplayReset = PE5; // OLED reset pin - pinFan = PE6; //Pin for the fan output - - pinFuelPump = PA6; //Fuel pump output - pinTachOut = PD15; //Tacho output pin - // pinLaunch = 51; //Can be overwritten below - // pinResetControl = 43; //Reset control output - - //external interrupt enabled pins - //external interrupts could be enalbed in any pin, except same port numbers (PA4,PE4) - pinFlex = PD4; // Flex sensor (Must be external interrupt enabled) - pinTrigger = PD13; //The CAS pin - pinTrigger2 = PD14; //The Cam Sensor pin - break; - - case 40: - //Pin mappings as per the v0.4 shield - - //Black F407VE http://wiki.stm32duino.com/index.php?title=STM32F407 - //PC8~PC12 SDio - - //PA9..PA10 Serial1 - //PA11..PA12 USB - //PA13..PA15 & PB4 SWD(debug) pins - //PB0 EEPROM CS pin - //PB1 LCD - //PB2 BOOT1 - //PB3..PB5 SPI interface - //PB6..PB8 NRF interface - - //PD5 & PD6 Serial2 - pinInjector1 = PA1; //Output pin injector 1 is on - pinInjector2 = PA2; //Output pin injector 2 is on - pinInjector3 = PA3; //Output pin injector 3 is on - pinInjector4 = PA4; //Output pin injector 4 is on - pinInjector5 = PA5; //Output pin injector 5 is on - pinInjector6 = PD4; //Output pin injector 6 is on - pinCoil1 = PD7; //Pin for coil 1 - pinCoil2 = PB9; //Pin for coil 2 - pinCoil3 = PA8; //Pin for coil 3 - pinCoil4 = PB10; //Pin for coil 4 - pinCoil5 = PB11; //Pin for coil 5 - pinMAP = PC0; //MAP sensor pin - pinTPS = PC1;//TPS input pin - pinIAT = PC2; //IAT sensor pin - pinCLT = PC3; //CLS sensor pin - pinO2 = PC5; //O2 Sensor pin - pinBat = PB1; //Battery reference voltage pin - pinBaro = PC4; - pinIdle1 = PB12; //Single wire idle control - pinIdle2 = PB11; //2 wire idle control - pinBoost = PC7; //Boost control - pinVVT_1 = PD3; //Default VVT output - pinStepperDir = PE0; //Direction pin for DRV8825 driver - pinStepperStep = PE1; //Step pin for DRV8825 driver - pinStepperEnable = PE2; //Enable pin for DRV8825 - pinDisplayReset = PE5; // OLED reset pin - pinFan = PE6; //Pin for the fan output - - pinFuelPump = PA6; //Fuel pump output - pinTachOut = PD15; //Tacho output pin - // pinLaunch = 51; //Can be overwritten below - // pinResetControl = 43; //Reset control output - - //external interrupt enabled pins - //external interrupts could be enalbed in any pin, except same port numbers (PA4,PE4) - pinFlex = PD4; // Flex sensor (Must be external interrupt enabled) - pinTrigger = PD13; //The CAS pin - pinTrigger2 = PD14; //The Cam Sensor pin - - case 41: - //Pin mappings as per the v0.4 shield - - //Black F407VE http://wiki.stm32duino.com/index.php?title=STM32F407 - //PC8~PC12 SDio - - //PA9..PA10 Serial1 - //PA11..PA12 USB - //PA13..PA15 & PB4 SWD(debug) pins - //PB0 EEPROM CS pin - //PB1 LCD - //PB2 BOOT1 - //PB3..PB5 SPI interface - //PB6..PB8 NRF interface - - //PD5 & PD6 Serial2 - pinInjector1 = PA1; //Output pin injector 1 is on - pinInjector2 = PA2; //Output pin injector 2 is on - pinInjector3 = PA3; //Output pin injector 3 is on - pinInjector4 = PA4; //Output pin injector 4 is on - pinInjector5 = PA5; //Output pin injector 5 is on - pinInjector6 = PD4; //Output pin injector 6 is on - pinCoil1 = PD7; //Pin for coil 1 - pinCoil2 = PB9; //Pin for coil 2 - pinCoil3 = PA8; //Pin for coil 3 - pinCoil4 = PB10; //Pin for coil 4 - pinCoil5 = PB11; //Pin for coil 5 - pinMAP = PC0; //MAP sensor pin - pinTPS = PC1;//TPS input pin - pinIAT = PC2; //IAT sensor pin - pinCLT = PC3; //CLS sensor pin - pinO2 = PC5; //O2 Sensor pin - pinBat = PB1; //Battery reference voltage pin - pinBaro = PC4; - pinIdle1 = PB12; //Single wire idle control - pinIdle2 = PB11; //2 wire idle control - pinBoost = PC7; //Boost control - pinVVT_1 = PD3; //Default VVT output - pinStepperDir = PE0; //Direction pin for DRV8825 driver - pinStepperStep = PE1; //Step pin for DRV8825 driver - pinStepperEnable = PE2; //Enable pin for DRV8825 - pinDisplayReset = PE5; // OLED reset pin - pinFan = PE6; //Pin for the fan output - - pinFuelPump = PA6; //Fuel pump output - pinTachOut = PD15; //Tacho output pin - // pinLaunch = 51; //Can be overwritten below - // pinResetControl = 43; //Reset control output - - //external interrupt enabled pins - //external interrupts could be enalbed in any pin, except same port numbers (PA4,PE4) - pinFlex = PD4; // Flex sensor (Must be external interrupt enabled) - pinTrigger = PD13; //The CAS pin - pinTrigger2 = PD14; //The Cam Sensor pin - break; - - default: - //Pin mappings as per the v0.4 shield - - //Black F407VE http://wiki.stm32duino.com/index.php?title=STM32F407 - //PC8~PC12 SDio - - //PA9..PA10 Serial1 - //PA11..PA12 USB - //PA13..PA15 & PB4 SWD(debug) pins - //PB0 EEPROM CS pin - //PB1 LCD - //PB2 BOOT1 - //PB3..PB5 SPI interface - //PB6..PB8 NRF interface - - //PD5 & PD6 Serial2 - pinInjector1 = PA1; //Output pin injector 1 is on - pinInjector2 = PA2; //Output pin injector 2 is on - pinInjector3 = PA3; //Output pin injector 3 is on - pinInjector4 = PA4; //Output pin injector 4 is on - pinInjector5 = PA5; //Output pin injector 5 is on - pinInjector6 = PD4; //Output pin injector 6 is on - pinCoil1 = PD7; //Pin for coil 1 - pinCoil2 = PB9; //Pin for coil 2 - pinCoil3 = PA8; //Pin for coil 3 - pinCoil4 = PB10; //Pin for coil 4 - pinCoil5 = PB11; //Pin for coil 5 - pinMAP = PC0; //MAP sensor pin - pinTPS = PC1;//TPS input pin - pinIAT = PC2; //IAT sensor pin - pinCLT = PC3; //CLS sensor pin - pinO2 = PC5; //O2 Sensor pin - pinBat = PB1; //Battery reference voltage pin - pinBaro = PC4; - pinIdle1 = PB12; //Single wire idle control - pinIdle2 = PB11; //2 wire idle control - pinBoost = PC7; //Boost control - pinVVT_1 = PD3; //Default VVT output - pinStepperDir = PE0; //Direction pin for DRV8825 driver - pinStepperStep = PE1; //Step pin for DRV8825 driver - pinStepperEnable = PE2; //Enable pin for DRV8825 - pinDisplayReset = PE5; // OLED reset pin - pinFan = PE6; //Pin for the fan output - - pinFuelPump = PA6; //Fuel pump output - pinTachOut = PD15; //Tacho output pin - // pinLaunch = 51; //Can be overwritten below - // pinResetControl = 43; //Reset control output - - //external interrupt enabled pins - //external interrupts could be enalbed in any pin, except same port numbers (PA4,PE4) - pinFlex = PD4; // Flex sensor (Must be external interrupt enabled) - pinTrigger = PD13; //The CAS pin - pinTrigger2 = PD14; //The Cam Sensor pin - break; - } - - //Setup any devices that are using selectable pins - - if ( (configPage6.launchPin != 0) && (configPage6.launchPin < BOARD_NR_GPIO_PINS) ) { pinLaunch = pinTranslate(configPage6.launchPin); } - if ( (configPage4.ignBypassPin != 0) && (configPage4.ignBypassPin < BOARD_NR_GPIO_PINS) ) { pinIgnBypass = pinTranslate(configPage4.ignBypassPin); } - if ( (configPage2.tachoPin != 0) && (configPage2.tachoPin < BOARD_NR_GPIO_PINS) ) { pinTachOut = pinTranslate(configPage2.tachoPin); } - if ( (configPage4.fuelPumpPin != 0) && (configPage4.fuelPumpPin < BOARD_NR_GPIO_PINS) ) { pinFuelPump = pinTranslate(configPage4.fuelPumpPin); } - if ( (configPage6.fanPin != 0) && (configPage6.fanPin < BOARD_NR_GPIO_PINS) ) { pinFan = pinTranslate(configPage6.fanPin); } - if ( (configPage6.boostPin != 0) && (configPage6.boostPin < BOARD_NR_GPIO_PINS) ) { pinBoost = pinTranslate(configPage6.boostPin); } - if ( (configPage6.vvtPin != 0) && (configPage6.vvtPin < BOARD_NR_GPIO_PINS) ) { pinVVT_1 = pinTranslate(configPage6.vvtPin); } - if ( (configPage6.useExtBaro != 0) && (configPage6.baroPin < BOARD_NR_GPIO_PINS) ) { pinBaro = configPage6.baroPin + A0; } - if ( (configPage6.useEMAP != 0) && (configPage10.EMAPPin < BOARD_NR_GPIO_PINS) ) { pinEMAP = configPage10.EMAPPin + A0; } - - //Currently there's no default pin for Idle Up - pinIdleUp = pinTranslate(configPage2.idleUpPin); - - /* Reset control is a special case. If reset control is enabled, it needs its initial state set BEFORE its pinMode. - If that doesn't happen and reset control is in "Serial Command" mode, the Arduino will end up in a reset loop - because the control pin will go low as soon as the pinMode is set to OUTPUT. */ - if ( (configPage4.resetControl != 0) && (configPage4.resetControlPin < BOARD_NR_GPIO_PINS) ) - { - resetControl = configPage4.resetControl; - pinResetControl = pinTranslate(configPage4.resetControlPin); - setResetControlPinState(); - pinMode(pinResetControl, OUTPUT); - } - - //Finally, set the relevant pin modes for outputs - pinMode(pinCoil1, OUTPUT); - pinMode(pinCoil2, OUTPUT); - pinMode(pinCoil3, OUTPUT); - pinMode(pinCoil4, OUTPUT); - pinMode(pinCoil5, OUTPUT); - pinMode(pinInjector1, OUTPUT); - pinMode(pinInjector2, OUTPUT); - pinMode(pinInjector3, OUTPUT); - pinMode(pinInjector4, OUTPUT); - pinMode(pinInjector5, OUTPUT); - pinMode(pinTachOut, OUTPUT); - pinMode(pinIdle1, OUTPUT); - pinMode(pinIdle2, OUTPUT); - pinMode(pinFuelPump, OUTPUT); - pinMode(pinIgnBypass, OUTPUT); - pinMode(pinFan, OUTPUT); - pinMode(pinStepperDir, OUTPUT); - pinMode(pinStepperStep, OUTPUT); - pinMode(pinStepperEnable, OUTPUT); - pinMode(pinBoost, OUTPUT); - pinMode(pinVVT_1, OUTPUT); - - inj1_pin_port = portOutputRegister(digitalPinToPort(pinInjector1)); - inj1_pin_mask = digitalPinToBitMask(pinInjector1); - inj2_pin_port = portOutputRegister(digitalPinToPort(pinInjector2)); - inj2_pin_mask = digitalPinToBitMask(pinInjector2); - inj3_pin_port = portOutputRegister(digitalPinToPort(pinInjector3)); - inj3_pin_mask = digitalPinToBitMask(pinInjector3); - inj4_pin_port = portOutputRegister(digitalPinToPort(pinInjector4)); - inj4_pin_mask = digitalPinToBitMask(pinInjector4); - inj5_pin_port = portOutputRegister(digitalPinToPort(pinInjector5)); - inj5_pin_mask = digitalPinToBitMask(pinInjector5); - inj6_pin_port = portOutputRegister(digitalPinToPort(pinInjector6)); - inj6_pin_mask = digitalPinToBitMask(pinInjector6); - inj7_pin_port = portOutputRegister(digitalPinToPort(pinInjector7)); - inj7_pin_mask = digitalPinToBitMask(pinInjector7); - inj8_pin_port = portOutputRegister(digitalPinToPort(pinInjector8)); - inj8_pin_mask = digitalPinToBitMask(pinInjector8); - - ign1_pin_port = portOutputRegister(digitalPinToPort(pinCoil1)); - ign1_pin_mask = digitalPinToBitMask(pinCoil1); - ign2_pin_port = portOutputRegister(digitalPinToPort(pinCoil2)); - ign2_pin_mask = digitalPinToBitMask(pinCoil2); - ign3_pin_port = portOutputRegister(digitalPinToPort(pinCoil3)); - ign3_pin_mask = digitalPinToBitMask(pinCoil3); - ign4_pin_port = portOutputRegister(digitalPinToPort(pinCoil4)); - ign4_pin_mask = digitalPinToBitMask(pinCoil4); - ign5_pin_port = portOutputRegister(digitalPinToPort(pinCoil5)); - ign5_pin_mask = digitalPinToBitMask(pinCoil5); - ign6_pin_port = portOutputRegister(digitalPinToPort(pinCoil6)); - ign6_pin_mask = digitalPinToBitMask(pinCoil6); - ign7_pin_port = portOutputRegister(digitalPinToPort(pinCoil7)); - ign7_pin_mask = digitalPinToBitMask(pinCoil7); - ign8_pin_port = portOutputRegister(digitalPinToPort(pinCoil8)); - ign8_pin_mask = digitalPinToBitMask(pinCoil8); - - tach_pin_port = portOutputRegister(digitalPinToPort(pinTachOut)); - tach_pin_mask = digitalPinToBitMask(pinTachOut); - pump_pin_port = portOutputRegister(digitalPinToPort(pinFuelPump)); - pump_pin_mask = digitalPinToBitMask(pinFuelPump); - - //And for inputs - pinMode(pinMAP, INPUT); - pinMode(pinO2, INPUT); - pinMode(pinO2_2, INPUT); - pinMode(pinTPS, INPUT); - pinMode(pinIAT, INPUT); - pinMode(pinCLT, INPUT); - pinMode(pinBat, INPUT); - pinMode(pinBaro, INPUT); - - pinMode(pinTrigger, INPUT); - pinMode(pinTrigger2, INPUT); - pinMode(pinTrigger3, INPUT); - - //Each of the below are only set when their relevant function is enabled. This can help prevent pin conflicts that users aren't aware of with unused functions - if(configPage2.flexEnabled > 0) - { - pinMode(pinFlex, INPUT); //Standard GM / Continental flex sensor requires pullup, but this should be onboard. The internal pullup will not work (Requires ~3.3k)! - } - if(configPage6.launchEnabled > 0) - { - if (configPage6.lnchPullRes == true) { pinMode(pinLaunch, INPUT_PULLUP); } - else { pinMode(pinLaunch, INPUT); } //If Launch Pull Resistor is not set make input float. - } - if(configPage2.idleUpEnabled > 0) - { - if (configPage2.idleUpPolarity == 0) { pinMode(pinIdleUp, INPUT_PULLUP); } //Normal setting - else { pinMode(pinIdleUp, INPUT); } //inverted setting - } - - - //These must come after the above pinMode statements - triggerPri_pin_port = portInputRegister(digitalPinToPort(pinTrigger)); - triggerPri_pin_mask = digitalPinToBitMask(pinTrigger); - triggerSec_pin_port = portInputRegister(digitalPinToPort(pinTrigger2)); - triggerSec_pin_mask = digitalPinToBitMask(pinTrigger2); - - //Set default values - digitalWrite(pinMAP, HIGH); - //digitalWrite(pinO2, LOW); - digitalWrite(pinTPS, LOW); - -} -#endif diff --git a/speeduino/board_stm32.h b/speeduino/board_stm32_generic.h similarity index 98% rename from speeduino/board_stm32.h rename to speeduino/board_stm32_generic.h index 82118539..80325828 100644 --- a/speeduino/board_stm32.h +++ b/speeduino/board_stm32_generic.h @@ -1,7 +1,6 @@ #ifndef STM32_H #define STM32_H -#if defined(CORE_STM32) -#include +#if defined(CORE_STM32_GENERIC) /* *********************************************************************************************************** @@ -20,8 +19,9 @@ #define Serial Serial1 #endif - #if defined(ARDUINO_BLACK_F407VE) || defined(STM32F4) || defined(_STM32F4_) - FramClass EEPROM(PB0, PB3, PB4, PB5, 15000000); + #if defined(USE_FRAM) + #include + FramClass EEPROM(PB0, PB3, PB4, PB5, 15000000); #endif //Much of the below is not correct, but included to allow compilation diff --git a/speeduino/board_stm32.ino b/speeduino/board_stm32_generic.ino similarity index 99% rename from speeduino/board_stm32.ino rename to speeduino/board_stm32_generic.ino index 3c617c17..07dde9b4 100644 --- a/speeduino/board_stm32.ino +++ b/speeduino/board_stm32_generic.ino @@ -1,5 +1,5 @@ -#if defined(CORE_STM32) && !defined(ARDUINO_BLACK_F407VE) -#include "board_stm32.h" +#if defined(CORE_STM32_GENERIC) && !defined(ARDUINO_BLACK_F407VE) +#include "board_stm32_generic.h" #include "globals.h" #include "auxiliaries.h" #include "idle.h" diff --git a/speeduino/board_stm32F407VE.h b/speeduino/board_stm32_official.h similarity index 92% rename from speeduino/board_stm32F407VE.h rename to speeduino/board_stm32_official.h index 11f40f92..d6bb9fc3 100644 --- a/speeduino/board_stm32F407VE.h +++ b/speeduino/board_stm32_official.h @@ -1,22 +1,23 @@ #ifndef STM32F407VE_H #define STM32F407VE_H -#if defined(ARDUINO_BLACK_F407VE) +#if defined(CORE_STM32_OFFICIAL) +#include /* *********************************************************************************************************** * General */ - #define PORT_TYPE uint32_t - #define PINMAKS_TYPE uint32_t - #define micros_safe() micros() //timer5 method is not used on anything but AVR, the micros_safe() macro is simply an alias for the normal micros() - - #define USE_SERIAL3 - void initBoard(); - uint16_t freeRam(); -// extern void oneMSIntervalIRQ(stimer_t *Timer); - - extern void EmptyIRQCallback(stimer_t *Timer, uint32_t channel); - /* +#define PORT_TYPE uint32_t +#define PINMASK_TYPE uint32_t +#define micros_safe() micros() //timer5 method is not used on anything but AVR, the micros_safe() macro is simply an alias for the normal micros() + +#define USE_SERIAL3 +void initBoard(); +uint16_t freeRam(); +extern void oneMSIntervalIRQ(stimer_t *Timer); +extern void EmptyIRQCallback(stimer_t *Timer, uint32_t channel); + +/* *********************************************************************************************************** * Schedules */ diff --git a/speeduino/board_stm32_official.ino b/speeduino/board_stm32_official.ino new file mode 100644 index 00000000..401698c9 --- /dev/null +++ b/speeduino/board_stm32_official.ino @@ -0,0 +1,178 @@ +#if defined(CORE_STM32_OFFICIAL) +#include "board_stm32_official.h" +#include "globals.h" +#include "auxiliaries.h" +#include "idle.h" +#include "scheduler.h" +#include + +#if defined(STM32F4) + #define NR_OFF_TIMERS 9 + //stimer_t HardwareTimers[NR_OFF_TIMERS + 1]; + stimer_t HardwareTimers_1; + stimer_t HardwareTimers_2; + stimer_t HardwareTimers_3; + stimer_t HardwareTimers_4; + stimer_t HardwareTimers_5; + stimer_t HardwareTimers_8; + #define LED_BUILTIN PA7 + //These should really be in the stm32GENERIC libs, but for somereason they only have timers 1-4 + // #include + // #include "src/HardwareTimers/HardwareTimer.h" + // HardwareTimer Timer5(TIM5, chip_tim5, sizeof(chip_tim5) / sizeof(chip_tim5[0])); + // HardwareTimer Timer8(TIM8, chip_tim8, sizeof(chip_tim8) / sizeof(chip_tim8[0])); +#else + #include "HardwareTimer.h" +#endif + + extern void oneMSIntervalIRQ(stimer_t *Timer) + { + oneMSInterval(); + } + extern void EmptyIRQCallback(stimer_t *Timer, uint32_t channel) + { + + } + + void initBoard() + { + /* + * Initialize timers + */ + + HardwareTimers_1.timer = TIM1; + HardwareTimers_2.timer = TIM2; + HardwareTimers_3.timer = TIM3; + HardwareTimers_4.timer = TIM4; + + HardwareTimers_5.timer = TIM5; + HardwareTimers_8.timer = TIM8; + + + /* + *********************************************************************************************************** + * General + */ + #define FLASH_LENGTH 8192 + + /* + *********************************************************************************************************** + * Idle + */ + if( (configPage6.iacAlgorithm == IAC_ALGORITHM_PWM_OL) || (configPage6.iacAlgorithm == IAC_ALGORITHM_PWM_CL) ) + { + idle_pwm_max_count = 1000000L / (configPage6.idleFreq * 2); //Converts the frequency in Hz to the number of ticks (at 2uS) it takes to complete 1 cycle. Note that the frequency is divided by 2 coming from TS to allow for up to 5KHz + } + + //This must happen at the end of the idle init + TimerPulseInit(&HardwareTimers_1, 0xFFFF, 0, EmptyIRQCallback); + //setTimerPrescalerRegister(&HardwareTimers_1, (uint32_t)(getTimerClkFreq(HardwareTimers_1.timer) / (500000)) - 1); + if(idle_pwm_max_count > 0) { attachIntHandleOC(&HardwareTimers_1, idleInterrupt, 4, 0);} //on first flash the configPage4.iacAlgorithm is invalid + //Timer1.setMode(4, TIMER_OUTPUT_COMPARE); + //timer_set_mode(TIMER1, 4, TIMER_OUTPUT_COMPARE; + //if(idle_pwm_max_count > 0) { Timer1.attachInterrupt(4, idleInterrupt);} //on first flash the configPage4.iacAlgorithm is invalid + //Timer1.resume(); + + + /* + *********************************************************************************************************** + * Timers + */ + #if defined(ARDUINO_BLACK_F407VE) || defined(STM32F4) || defined(_STM32F4_) + TimerHandleInit(&HardwareTimers_8, 1000, 168); + attachIntHandle(&HardwareTimers_8, oneMSIntervalIRQ); + #else + Timer4.setPeriod(1000); // Set up period + Timer4.setMode(1, TIMER_OUTPUT_COMPARE); + Timer4.attachInterrupt(1, oneMSInterval); + Timer4.resume(); //Start Timer + #endif + pinMode(LED_BUILTIN, OUTPUT); //Visual WDT + + /* + *********************************************************************************************************** + * Auxilliaries + */ + //2uS resolution Min 8Hz, Max 5KHz + boost_pwm_max_count = 1000000L / (2 * configPage6.boostFreq * 2); //Converts the frequency in Hz to the number of ticks (at 2uS) it takes to complete 1 cycle. The x2 is there because the frequency is stored at half value (in a byte) to allow freqneucies up to 511Hz + vvt_pwm_max_count = 1000000L / (2 * configPage6.vvtFreq * 2); //Converts the frequency in Hz to the number of ticks (at 2uS) it takes to complete 1 cycle + + //Need to be initialised last due to instant interrupt + // Timer1.setMode(2, TIMER_OUTPUT_COMPARE); + // Timer1.setMode(3, TIMER_OUTPUT_COMPARE); + // if(boost_pwm_max_count > 0) { Timer1.attachInterrupt(2, boostInterrupt);} + // if(vvt_pwm_max_count > 0) { Timer1.attachInterrupt(3, vvtInterrupt);} + if(idle_pwm_max_count > 0) { attachIntHandleOC(&HardwareTimers_1, boostInterrupt, 2, 0);} + if(vvt_pwm_max_count > 0) { attachIntHandleOC(&HardwareTimers_1, vvtInterrupt, 3, 0);} + // Timer1.resume(); + + TimerPulseInit(&HardwareTimers_3, 0xFFFF, 0, EmptyIRQCallback); + attachIntHandleOC(&HardwareTimers_3, fuelSchedule1Interrupt, 1, 0); + attachIntHandleOC(&HardwareTimers_3, fuelSchedule2Interrupt, 2, 0); + attachIntHandleOC(&HardwareTimers_3, fuelSchedule3Interrupt, 3, 0); + attachIntHandleOC(&HardwareTimers_3, fuelSchedule4Interrupt, 4, 0); + + + TimerPulseInit(&HardwareTimers_2, 0xFFFF, 0, EmptyIRQCallback); + attachIntHandleOC(&HardwareTimers_2, ignitionSchedule1Interrupt, 1, 0); + attachIntHandleOC(&HardwareTimers_2, ignitionSchedule2Interrupt, 2, 0); + attachIntHandleOC(&HardwareTimers_2, ignitionSchedule3Interrupt, 3, 0); + attachIntHandleOC(&HardwareTimers_2, ignitionSchedule4Interrupt, 4, 0); + + //Attach interupt functions + //Injection + + TimerPulseInit(&HardwareTimers_5, 0xFFFF, 0, EmptyIRQCallback); + //setTimerPrescalerRegister(&HardwareTimers_5, (uint32_t)(getTimerClkFreq(HardwareTimers_5.timer) / (1000000)) - 1); + #if (INJ_CHANNELS >= 5) + attachIntHandleOC(&HardwareTimers_5, fuelSchedule5Interrupt, 1, 0); + //Timer5.attachInterrupt(1, fuelSchedule5Interrupt); + #endif + #if (INJ_CHANNELS >= 6) + attachIntHandleOC(&HardwareTimers_5, fuelSchedule6Interrupt, 2, 0); + //Timer5.attachInterrupt(2, fuelSchedule6Interrupt); + #endif + #if (INJ_CHANNELS >= 7) + attachIntHandleOC(&HardwareTimers_5, fuelSchedule7Interrupt, 3, 0); + //Timer5.attachInterrupt(3, fuelSchedule7Interrupt); + #endif + #if (INJ_CHANNELS >= 8) + attachIntHandleOC(&HardwareTimers_5, fuelSchedule8Interrupt, 4, 0); + //Timer5.attachInterrupt(4, fuelSchedule8Interrupt); + #endif + + TimerPulseInit(&HardwareTimers_4, 0xFFFF, 0, EmptyIRQCallback); + //setTimerPrescalerRegister(&HardwareTimers_4, (uint32_t)(getTimerClkFreq(HardwareTimers_4.timer) / (1000000)) - 1); + #if (IGN_CHANNELS >= 5) + attachIntHandleOC(&HardwareTimers_4, ignitionSchedule5Interrupt, 1, 0); + //Timer4.attachInterrupt(1, ignitionSchedule5Interrupt); + #endif + #if (IGN_CHANNELS >= 6) + attachIntHandleOC(&HardwareTimers_4, ignitionSchedule6Interrupt, 2, 0); + //Timer4.attachInterrupt(2, ignitionSchedule6Interrupt); + #endif + #if (IGN_CHANNELS >= 7) + attachIntHandleOC(&HardwareTimers_4, ignitionSchedule7Interrupt, 3, 0); + //Timer4.attachInterrupt(3, ignitionSchedule7Interrupt); + #endif + #if (IGN_CHANNELS >= 8) + attachIntHandleOC(&HardwareTimers_4, ignitionSchedule8Interrupt, 4, 0); + //Timer4.attachInterrupt(4, ignitionSchedule8Interrupt); + #endif + + setTimerPrescalerRegister(&HardwareTimers_2, (uint32_t)(getTimerClkFreq(HardwareTimers_2.timer) / (250000)) - 1); + setTimerPrescalerRegister(&HardwareTimers_3, (uint32_t)(getTimerClkFreq(HardwareTimers_3.timer) / (250000)) - 1); + setTimerPrescalerRegister(&HardwareTimers_4, (uint32_t)(getTimerClkFreq(HardwareTimers_4.timer) / (250000)) - 1); + setTimerPrescalerRegister(&HardwareTimers_5, (uint32_t)(getTimerClkFreq(HardwareTimers_5.timer) / (250000)) - 1); + } + + uint16_t freeRam() + { + char top = 't'; + return &top - reinterpret_cast(sbrk(0)); + } + + //pinmapping the STM32F407 for different boards, at this moment no board is desgined. + //All boards are set to the default just to be sure. + +#endif diff --git a/speeduino/decoders.ino b/speeduino/decoders.ino index c17007c0..a4039b3c 100644 --- a/speeduino/decoders.ino +++ b/speeduino/decoders.ino @@ -206,7 +206,7 @@ static inline int crankingGetRPM(byte totalTeeth) On decoders that are enabled for per tooth based timing adjustments, this function performs the timer compare changes on the schedules themselves For each ignition channel, a check is made whether we're at the relevant tooth and whether that ignition schedule is currently running Only if both these conditions are met will the schedule be updated with the latest timing information. -If it's the correct tooth, but +If it's the correct tooth, but the schedule is not yet started, calculate and an end compare value (This situation occurs when both the start and end of the ignition pulse happen after the end tooth, but before the next tooth) */ #define checkPerToothTiming(crankAngle, currentTooth) \ { \ @@ -215,7 +215,7 @@ If it's the correct tooth, but if ( (currentTooth == ignition1EndTooth) ) \ { \ if( (ignitionSchedule1.Status == RUNNING) ) { IGN1_COMPARE = IGN1_COUNTER + uS_TO_TIMER_COMPARE( fastDegreesToUS( ignitionLimits( (ignition1EndAngle - crankAngle) ) ) ); } \ - else { ignitionSchedule1.endCompare = IGN1_COUNTER + uS_TO_TIMER_COMPARE( fastDegreesToUS( ignitionLimits( (ignition1EndAngle - crankAngle) ) ) ); ignitionSchedule1.endScheduleSetByDecoder = true; } \ + else if(currentStatus.startRevolutions > 2) { ignitionSchedule1.endCompare = IGN1_COUNTER + uS_TO_TIMER_COMPARE( fastDegreesToUS( ignitionLimits( (ignition1EndAngle - crankAngle) ) ) ); ignitionSchedule1.endScheduleSetByDecoder = true; } \ } \ \ else if ( (currentTooth == ignition2EndTooth) ) \ diff --git a/speeduino/globals.h b/speeduino/globals.h index 22a0c9e5..e0a2cea9 100644 --- a/speeduino/globals.h +++ b/speeduino/globals.h @@ -20,8 +20,8 @@ #define BOARD_H "board_teensy35.h" #elif defined(STM32_MCU_SERIES) || defined(ARDUINO_ARCH_STM32) || defined(__STM32F1__) || defined(STM32F4) || defined(STM32) - #define CORE_STM32 - #define BOARD_H "board_stm32.h" + #define CORE_STM32_GENERIC + #define BOARD_H "board_stm32_generic.h" #ifndef word #define word(h, l) ((h << 8) | l) //word() function not defined for this platform in the main library #endif @@ -32,7 +32,9 @@ #define LED_BUILTIN PB1 //Maple Mini #endif #elif defined(ARDUINO_BLACK_F407VE) || defined(STM32F4) - #define BOARD_H "board_stm32F407VE.h" + //Need to identify the official core better + #define CORE_STM32_OFFICIAL + #define BOARD_H "board_stm32_official.h" #define BOARD_DIGITAL_GPIO_PINS 80 #define BOARD_NR_GPIO_PINS 80 @@ -55,8 +57,10 @@ inline unsigned char digitalPinToInterrupt(unsigned char Interrupt_pin) { return Interrupt_pin; } //This isn't included in the stm32duino libs (yet) #else //libmaple core aka STM32DUINO //These are defined in STM32F1/variants/generic_stm32f103c/variant.h but return a non byte* value - #define portOutputRegister(port) (volatile byte *)( &(port->regs->ODR) ) - #define portInputRegister(port) (volatile byte *)( &(port->regs->IDR) ) + #ifndef portOutputRegister + #define portOutputRegister(port) (volatile byte *)( &(port->regs->ODR) ) + #define portInputRegister(port) (volatile byte *)( &(port->regs->IDR) ) + #endif #endif #elif defined(__SAMD21G18A__) #define BOARD_H "board_samd21.h" diff --git a/speeduino/speeduino.ino b/speeduino/speeduino.ino index c07abfd7..b7371503 100644 --- a/speeduino/speeduino.ino +++ b/speeduino/speeduino.ino @@ -679,6 +679,7 @@ void loop() //If ignition timing is being tracked per tooth, perform the calcs to get the end teeth //This only needs to be run if the advance figure has changed, otherwise the end teeth will still be the same if( (configPage2.perToothIgn == true) && (lastToothCalcAdvance != currentStatus.advance) ) { triggerSetEndTeeth(); } + //if( (configPage2.perToothIgn == true) ) { triggerSetEndTeeth(); } //*********************************************************************************************** //| BEGIN FUEL SCHEDULES diff --git a/speeduino/storage.ino b/speeduino/storage.ino index 066d8757..198872fe 100644 --- a/speeduino/storage.ino +++ b/speeduino/storage.ino @@ -12,7 +12,7 @@ A full copy of the license may be found in the projects root directory #include "src/FlashStorage/FlashAsEEPROM.h" #elif defined(ARDUINO_BLACK_F407VE) #include "src/BackupSram/BackupSramAsEEPROM.h" -#elif defined(CORE_STM32) +#elif defined(USE_FRAM) #include #else #include diff --git a/speeduino/updates.ino b/speeduino/updates.ino index 4f55b1d1..fb5fd24e 100644 --- a/speeduino/updates.ino +++ b/speeduino/updates.ino @@ -10,7 +10,7 @@ #include "src/FlashStorage/FlashAsEEPROM.h" #elif defined(ARDUINO_BLACK_F407VE) #include "src/BackupSram/BackupSramAsEEPROM.h" -#elif defined(CORE_STM32) +#elif defined(USE_FRAM) #include #else #include From 942e4491c0f235bb8ddc891bb8713ad5b6c2b301 Mon Sep 17 00:00:00 2001 From: Josh Stewart Date: Tue, 5 Mar 2019 01:02:02 +1100 Subject: [PATCH 31/51] Add board variable to set where the EEPROM class will come from --- speeduino/board_avr2560.h | 1 + speeduino/board_stm32_generic.h | 1 + speeduino/board_stm32_official.h | 3 +++ speeduino/board_teensy35.h | 1 + speeduino/board_template.h | 1 + speeduino/storage.ino | 10 +--------- 6 files changed, 8 insertions(+), 9 deletions(-) diff --git a/speeduino/board_avr2560.h b/speeduino/board_avr2560.h index 400d98e3..34e60d13 100644 --- a/speeduino/board_avr2560.h +++ b/speeduino/board_avr2560.h @@ -11,6 +11,7 @@ */ #define PORT_TYPE uint8_t //Size of the port variables (Eg inj1_pin_port). #define PINMASK_TYPE uint8_t + #define EEPROM_LIB_H void initBoard(); uint16_t freeRam(); diff --git a/speeduino/board_stm32_generic.h b/speeduino/board_stm32_generic.h index 80325828..98cd7f16 100644 --- a/speeduino/board_stm32_generic.h +++ b/speeduino/board_stm32_generic.h @@ -11,6 +11,7 @@ #define micros_safe() micros() //timer5 method is not used on anything but AVR, the micros_safe() macro is simply an alias for the normal micros() #ifndef USE_SERIAL3 #define USE_SERIAL3 + #define EEPROM_LIB_H #endif void initBoard(); uint16_t freeRam(); diff --git a/speeduino/board_stm32_official.h b/speeduino/board_stm32_official.h index d6bb9fc3..d259a545 100644 --- a/speeduino/board_stm32_official.h +++ b/speeduino/board_stm32_official.h @@ -3,6 +3,7 @@ #if defined(CORE_STM32_OFFICIAL) #include +#include /* *********************************************************************************************************** * General @@ -10,6 +11,8 @@ #define PORT_TYPE uint32_t #define PINMASK_TYPE uint32_t #define micros_safe() micros() //timer5 method is not used on anything but AVR, the micros_safe() macro is simply an alias for the normal micros() +#define EEPROM_LIB_H "src/BackupSram/BackupSramAsEEPROM.h" +#define digitalPinToInterrupt(p) (p) #define USE_SERIAL3 void initBoard(); diff --git a/speeduino/board_teensy35.h b/speeduino/board_teensy35.h index fb1f4871..aa6dd4d7 100644 --- a/speeduino/board_teensy35.h +++ b/speeduino/board_teensy35.h @@ -13,6 +13,7 @@ #define BOARD_DIGITAL_GPIO_PINS 34 #define BOARD_NR_GPIO_PINS 34 #define USE_SERIAL3 + #define EEPROM_LIB_H #define micros_safe() micros() //timer5 method is not used on anything but AVR, the micros_safe() macro is simply an alias for the normal micros() diff --git a/speeduino/board_template.h b/speeduino/board_template.h index 337650ac..0b16e6d7 100644 --- a/speeduino/board_template.h +++ b/speeduino/board_template.h @@ -10,6 +10,7 @@ #define PINMASK_TYPE uint32_t #define BOARD_NR_GPIO_PINS 52 //Not sure this is correct #define BOARD_DIGITAL_GPIO_PINS 52 //Pretty sure this isn't right + #define EEPROM_LIB_H //The name of the file that provides the EEPROM class #define micros_safe() micros() //timer5 method is not used on anything but AVR, the micros_safe() macro is simply an alias for the normal micros() void initBoard(); uint16_t freeRam(); diff --git a/speeduino/storage.ino b/speeduino/storage.ino index 198872fe..254f6b72 100644 --- a/speeduino/storage.ino +++ b/speeduino/storage.ino @@ -8,15 +8,7 @@ A full copy of the license may be found in the projects root directory #include "globals.h" #include "table.h" #include "comms.h" -#if defined(CORE_SAMD21) - #include "src/FlashStorage/FlashAsEEPROM.h" -#elif defined(ARDUINO_BLACK_F407VE) - #include "src/BackupSram/BackupSramAsEEPROM.h" -#elif defined(USE_FRAM) - #include -#else - #include -#endif +#include EEPROM_LIB_H //This is defined in the board .h files #include "storage.h" void writeAllConfig() From 7550a6a0a0058771bf4ffd450bab89aed1188a9f Mon Sep 17 00:00:00 2001 From: Josh Stewart Date: Tue, 5 Mar 2019 01:02:53 +1100 Subject: [PATCH 32/51] Remove extra pinMappings (for now) and pass the CORE_STM32_OFFICIAL in the compile options --- platformio.ini | 2 +- speeduino/board_stm32_generic.ino | 730 ----------------------------- speeduino/board_teensy35.ino | 746 ------------------------------ speeduino/globals.h | 14 +- speeduino/updates.ino | 10 +- 5 files changed, 11 insertions(+), 1491 deletions(-) diff --git a/platformio.ini b/platformio.ini index 6b4c413d..bd98b919 100644 --- a/platformio.ini +++ b/platformio.ini @@ -54,7 +54,7 @@ framework = arduino ; framework-arduinoststm32 board = genericSTM32F407VET6 lib_deps = EEPROM -build_flags = -fpermissive -std=gnu++11 -UBOARD_NR_GPIO_PINS -DMENU_USB_SERIAL +build_flags = -fpermissive -std=gnu++11 -UBOARD_NR_GPIO_PINS -DCORE_STM32_OFFICIAL -DMENU_USB_SERIAL upload_protocol = dfu [env:bluepill_f103c8] diff --git a/speeduino/board_stm32_generic.ino b/speeduino/board_stm32_generic.ino index 07dde9b4..87ac5e8d 100644 --- a/speeduino/board_stm32_generic.ino +++ b/speeduino/board_stm32_generic.ino @@ -162,735 +162,5 @@ uint16_t freeRam() char top = 't'; return &top - reinterpret_cast(sbrk(0)); } -//pinmapping the STM32F407 for different boards, at this moment no board is desgined. -//All boards are set to the default just to be sure. -void setPinMapping(byte boardID) -{ - switch (boardID) - { - case 0: - //Pin mappings as per the v0.4 shield - //Black F407VE http://wiki.stm32duino.com/index.php?title=STM32F407 - //PC8~PC12 SDio - - //PA9..PA10 Serial1 - //PA11..PA12 USB - //PA13..PA15 & PB4 SWD(debug) pins - //PB0 EEPROM CS pin - //PB1 LCD - //PB2 BOOT1 - //PB3..PB5 SPI interface - //PB6..PB8 NRF interface - - //PD5 & PD6 Serial2 - pinInjector1 = PA1; //Output pin injector 1 is on - pinInjector2 = PA2; //Output pin injector 2 is on - pinInjector3 = PA3; //Output pin injector 3 is on - pinInjector4 = PA4; //Output pin injector 4 is on - pinInjector5 = PA5; //Output pin injector 5 is on - pinInjector6 = PD4; //Output pin injector 6 is on - pinCoil1 = PD7; //Pin for coil 1 - pinCoil2 = PB9; //Pin for coil 2 - pinCoil3 = PA8; //Pin for coil 3 - pinCoil4 = PB10; //Pin for coil 4 - pinCoil5 = PB11; //Pin for coil 5 - pinMAP = PC0; //MAP sensor pin - pinTPS = PC1;//TPS input pin - pinIAT = PC2; //IAT sensor pin - pinCLT = PC3; //CLS sensor pin - pinO2 = PC5; //O2 Sensor pin - pinBat = PB1; //Battery reference voltage pin - pinBaro = PC4; - pinIdle1 = PB12; //Single wire idle control - pinIdle2 = PB11; //2 wire idle control - pinBoost = PC7; //Boost control - pinVVT_1 = PD3; //Default VVT output - pinStepperDir = PE0; //Direction pin for DRV8825 driver - pinStepperStep = PE1; //Step pin for DRV8825 driver - pinStepperEnable = PE2; //Enable pin for DRV8825 - pinDisplayReset = PE5; // OLED reset pin - pinFan = PE6; //Pin for the fan output - - pinFuelPump = PA6; //Fuel pump output - pinTachOut = PD15; //Tacho output pin - // pinLaunch = 51; //Can be overwritten below - // pinResetControl = 43; //Reset control output - - //external interrupt enabled pins - //external interrupts could be enalbed in any pin, except same port numbers (PA4,PE4) - pinFlex = PD4; // Flex sensor (Must be external interrupt enabled) - pinTrigger = PD13; //The CAS pin - pinTrigger2 = PD14; //The Cam Sensor pin - break; - case 1: - //Pin mappings as per the v0.4 shield - - //Black F407VE http://wiki.stm32duino.com/index.php?title=STM32F407 - //PC8~PC12 SDio - - //PA9..PA10 Serial1 - //PA11..PA12 USB - //PA13..PA15 & PB4 SWD(debug) pins - //PB0 EEPROM CS pin - //PB1 LCD - //PB2 BOOT1 - //PB3..PB5 SPI interface - //PB6..PB8 NRF interface - - //PD5 & PD6 Serial2 - pinInjector1 = PA1; //Output pin injector 1 is on - pinInjector2 = PA2; //Output pin injector 2 is on - pinInjector3 = PA3; //Output pin injector 3 is on - pinInjector4 = PA4; //Output pin injector 4 is on - pinInjector5 = PA5; //Output pin injector 5 is on - pinInjector6 = PD4; //Output pin injector 6 is on - pinCoil1 = PD7; //Pin for coil 1 - pinCoil2 = PB9; //Pin for coil 2 - pinCoil3 = PA8; //Pin for coil 3 - pinCoil4 = PB10; //Pin for coil 4 - pinCoil5 = PB11; //Pin for coil 5 - pinMAP = PC0; //MAP sensor pin - pinTPS = PC1;//TPS input pin - pinIAT = PC2; //IAT sensor pin - pinCLT = PC3; //CLS sensor pin - pinO2 = PC5; //O2 Sensor pin - pinBat = PB1; //Battery reference voltage pin - pinBaro = PC4; - pinIdle1 = PB12; //Single wire idle control - pinIdle2 = PB11; //2 wire idle control - pinBoost = PC7; //Boost control - pinVVT_1 = PD3; //Default VVT output - pinStepperDir = PE0; //Direction pin for DRV8825 driver - pinStepperStep = PE1; //Step pin for DRV8825 driver - pinStepperEnable = PE2; //Enable pin for DRV8825 - pinDisplayReset = PE5; // OLED reset pin - pinFan = PE6; //Pin for the fan output - - pinFuelPump = PA6; //Fuel pump output - pinTachOut = PD15; //Tacho output pin - // pinLaunch = 51; //Can be overwritten below - // pinResetControl = 43; //Reset control output - - //external interrupt enabled pins - //external interrupts could be enalbed in any pin, except same port numbers (PA4,PE4) - pinFlex = PD4; // Flex sensor (Must be external interrupt enabled) - pinTrigger = PD13; //The CAS pin - pinTrigger2 = PD14; //The Cam Sensor pin - break; - - case 2: - //Pin mappings as per the v0.4 shield - - //Black F407VE http://wiki.stm32duino.com/index.php?title=STM32F407 - //PC8~PC12 SDio - - //PA9..PA10 Serial1 - //PA11..PA12 USB - //PA13..PA15 & PB4 SWD(debug) pins - //PB0 EEPROM CS pin - //PB1 LCD - //PB2 BOOT1 - //PB3..PB5 SPI interface - //PB6..PB8 NRF interface - - //PD5 & PD6 Serial2 - pinInjector1 = PA1; //Output pin injector 1 is on - pinInjector2 = PA2; //Output pin injector 2 is on - pinInjector3 = PA3; //Output pin injector 3 is on - pinInjector4 = PA4; //Output pin injector 4 is on - pinInjector5 = PA5; //Output pin injector 5 is on - pinInjector6 = PD4; //Output pin injector 6 is on - pinCoil1 = PD7; //Pin for coil 1 - pinCoil2 = PB9; //Pin for coil 2 - pinCoil3 = PA8; //Pin for coil 3 - pinCoil4 = PB10; //Pin for coil 4 - pinCoil5 = PB11; //Pin for coil 5 - pinMAP = PC0; //MAP sensor pin - pinTPS = PC1;//TPS input pin - pinIAT = PC2; //IAT sensor pin - pinCLT = PC3; //CLS sensor pin - pinO2 = PC5; //O2 Sensor pin - pinBat = PB1; //Battery reference voltage pin - pinBaro = PC4; - pinIdle1 = PB12; //Single wire idle control - pinIdle2 = PB11; //2 wire idle control - pinBoost = PC7; //Boost control - pinVVT_1 = PD3; //Default VVT output - pinStepperDir = PE0; //Direction pin for DRV8825 driver - pinStepperStep = PE1; //Step pin for DRV8825 driver - pinStepperEnable = PE2; //Enable pin for DRV8825 - pinDisplayReset = PE5; // OLED reset pin - pinFan = PE6; //Pin for the fan output - - pinFuelPump = PA6; //Fuel pump output - pinTachOut = PD15; //Tacho output pin - // pinLaunch = 51; //Can be overwritten below - // pinResetControl = 43; //Reset control output - - //external interrupt enabled pins - //external interrupts could be enalbed in any pin, except same port numbers (PA4,PE4) - pinFlex = PD4; // Flex sensor (Must be external interrupt enabled) - pinTrigger = PD13; //The CAS pin - pinTrigger2 = PD14; //The Cam Sensor pin - break; - - case 3: - //Pin mappings as per the v0.4 shield - - //Black F407VE http://wiki.stm32duino.com/index.php?title=STM32F407 - //PC8~PC12 SDio - - //PA9..PA10 Serial1 - //PA11..PA12 USB - //PA13..PA15 & PB4 SWD(debug) pins - //PB0 EEPROM CS pin - //PB1 LCD - //PB2 BOOT1 - //PB3..PB5 SPI interface - //PB6..PB8 NRF interface - - //PD5 & PD6 Serial2 - pinInjector1 = PA1; //Output pin injector 1 is on - pinInjector2 = PA2; //Output pin injector 2 is on - pinInjector3 = PA3; //Output pin injector 3 is on - pinInjector4 = PA4; //Output pin injector 4 is on - pinInjector5 = PA5; //Output pin injector 5 is on - pinInjector6 = PD4; //Output pin injector 6 is on - pinCoil1 = PD7; //Pin for coil 1 - pinCoil2 = PB9; //Pin for coil 2 - pinCoil3 = PA8; //Pin for coil 3 - pinCoil4 = PB10; //Pin for coil 4 - pinCoil5 = PB11; //Pin for coil 5 - pinMAP = PC0; //MAP sensor pin - pinTPS = PC1;//TPS input pin - pinIAT = PC2; //IAT sensor pin - pinCLT = PC3; //CLS sensor pin - pinO2 = PC5; //O2 Sensor pin - pinBat = PB1; //Battery reference voltage pin - pinBaro = PC4; - pinIdle1 = PB12; //Single wire idle control - pinIdle2 = PB11; //2 wire idle control - pinBoost = PC7; //Boost control - pinVVT_1 = PD3; //Default VVT output - pinStepperDir = PE0; //Direction pin for DRV8825 driver - pinStepperStep = PE1; //Step pin for DRV8825 driver - pinStepperEnable = PE2; //Enable pin for DRV8825 - pinDisplayReset = PE5; // OLED reset pin - pinFan = PE6; //Pin for the fan output - - pinFuelPump = PA6; //Fuel pump output - pinTachOut = PD15; //Tacho output pin - // pinLaunch = 51; //Can be overwritten below - // pinResetControl = 43; //Reset control output - - //external interrupt enabled pins - //external interrupts could be enalbed in any pin, except same port numbers (PA4,PE4) - pinFlex = PD4; // Flex sensor (Must be external interrupt enabled) - pinTrigger = PD13; //The CAS pin - pinTrigger2 = PD14; //The Cam Sensor pin - break; - - case 9: - //Pin mappings as per the MX5 PNP shield - pinInjector1 = 11; //Output pin injector 1 is on - pinInjector2 = 10; //Output pin injector 2 is on - pinInjector3 = 9; //Output pin injector 3 is on - pinInjector4 = 8; //Output pin injector 4 is on - pinInjector5 = 14; //Output pin injector 5 is on - pinCoil1 = 39; //Pin for coil 1 - pinCoil2 = 41; //Pin for coil 2 - pinCoil3 = 32; //Pin for coil 3 - pinCoil4 = 33; //Pin for coil 4 - pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now - pinTrigger = 19; //The CAS pin - pinTrigger2 = 18; //The Cam Sensor pin - pinTPS = A2;//TPS input pin - pinMAP = A5; //MAP sensor pin - pinIAT = A0; //IAT sensor pin - pinCLT = A1; //CLS sensor pin - pinO2 = A3; //O2 Sensor pin - pinBat = A4; //Battery reference voltage pin - pinDisplayReset = 48; // OLED reset pin - pinTachOut = 49; //Tacho output pin (Goes to ULN2803) - pinIdle1 = 2; //Single wire idle control - pinBoost = 4; - pinIdle2 = 4; //2 wire idle control (Note this is shared with boost!!!) - pinFuelPump = 37; //Fuel pump output - pinStepperDir = 16; //Direction pin for DRV8825 driver - pinStepperStep = 17; //Step pin for DRV8825 driver - pinFan = 35; //Pin for the fan output - pinLaunch = 12; //Can be overwritten below - pinFlex = 3; // Flex sensor (Must be external interrupt enabled) - pinResetControl = 44; //Reset control output - - break; - - case 10: - //Pin mappings as per the v0.4 shield - - //Black F407VE http://wiki.stm32duino.com/index.php?title=STM32F407 - //PC8~PC12 SDio - - //PA9..PA10 Serial1 - //PA11..PA12 USB - //PA13..PA15 & PB4 SWD(debug) pins - //PB0 EEPROM CS pin - //PB1 LCD - //PB2 BOOT1 - //PB3..PB5 SPI interface - //PB6..PB8 NRF interface - - //PD5 & PD6 Serial2 - pinInjector1 = PA1; //Output pin injector 1 is on - pinInjector2 = PA2; //Output pin injector 2 is on - pinInjector3 = PA3; //Output pin injector 3 is on - pinInjector4 = PA4; //Output pin injector 4 is on - pinInjector5 = PA5; //Output pin injector 5 is on - pinInjector6 = PD4; //Output pin injector 6 is on - pinCoil1 = PD7; //Pin for coil 1 - pinCoil2 = PB9; //Pin for coil 2 - pinCoil3 = PA8; //Pin for coil 3 - pinCoil4 = PB10; //Pin for coil 4 - pinCoil5 = PB11; //Pin for coil 5 - pinMAP = PC0; //MAP sensor pin - pinTPS = PC1;//TPS input pin - pinIAT = PC2; //IAT sensor pin - pinCLT = PC3; //CLS sensor pin - pinO2 = PC5; //O2 Sensor pin - pinBat = PB1; //Battery reference voltage pin - pinBaro = PC4; - pinIdle1 = PB12; //Single wire idle control - pinIdle2 = PB11; //2 wire idle control - pinBoost = PC7; //Boost control - pinVVT_1 = PD3; //Default VVT output - pinStepperDir = PE0; //Direction pin for DRV8825 driver - pinStepperStep = PE1; //Step pin for DRV8825 driver - pinStepperEnable = PE2; //Enable pin for DRV8825 - pinDisplayReset = PE5; // OLED reset pin - pinFan = PE6; //Pin for the fan output - - pinFuelPump = PA6; //Fuel pump output - pinTachOut = PD15; //Tacho output pin - // pinLaunch = 51; //Can be overwritten below - // pinResetControl = 43; //Reset control output - - //external interrupt enabled pins - //external interrupts could be enalbed in any pin, except same port numbers (PA4,PE4) - pinFlex = PD4; // Flex sensor (Must be external interrupt enabled) - pinTrigger = PD13; //The CAS pin - pinTrigger2 = PD14; //The Cam Sensor pin - break; - - case 20: - //Pin mappings as per the v0.4 shield - - //Black F407VE http://wiki.stm32duino.com/index.php?title=STM32F407 - //PC8~PC12 SDio - - //PA9..PA10 Serial1 - //PA11..PA12 USB - //PA13..PA15 & PB4 SWD(debug) pins - //PB0 EEPROM CS pin - //PB1 LCD - //PB2 BOOT1 - //PB3..PB5 SPI interface - //PB6..PB8 NRF interface - - //PD5 & PD6 Serial2 - pinInjector1 = PA1; //Output pin injector 1 is on - pinInjector2 = PA2; //Output pin injector 2 is on - pinInjector3 = PA3; //Output pin injector 3 is on - pinInjector4 = PA4; //Output pin injector 4 is on - pinInjector5 = PA5; //Output pin injector 5 is on - pinInjector6 = PD4; //Output pin injector 6 is on - pinCoil1 = PD7; //Pin for coil 1 - pinCoil2 = PB9; //Pin for coil 2 - pinCoil3 = PA8; //Pin for coil 3 - pinCoil4 = PB10; //Pin for coil 4 - pinCoil5 = PB11; //Pin for coil 5 - pinMAP = PC0; //MAP sensor pin - pinTPS = PC1;//TPS input pin - pinIAT = PC2; //IAT sensor pin - pinCLT = PC3; //CLS sensor pin - pinO2 = PC5; //O2 Sensor pin - pinBat = PB1; //Battery reference voltage pin - pinBaro = PC4; - pinIdle1 = PB12; //Single wire idle control - pinIdle2 = PB11; //2 wire idle control - pinBoost = PC7; //Boost control - pinVVT_1 = PD3; //Default VVT output - pinStepperDir = PE0; //Direction pin for DRV8825 driver - pinStepperStep = PE1; //Step pin for DRV8825 driver - pinStepperEnable = PE2; //Enable pin for DRV8825 - pinDisplayReset = PE5; // OLED reset pin - pinFan = PE6; //Pin for the fan output - - pinFuelPump = PA6; //Fuel pump output - pinTachOut = PD15; //Tacho output pin - // pinLaunch = 51; //Can be overwritten below - // pinResetControl = 43; //Reset control output - - //external interrupt enabled pins - //external interrupts could be enalbed in any pin, except same port numbers (PA4,PE4) - pinFlex = PD4; // Flex sensor (Must be external interrupt enabled) - pinTrigger = PD13; //The CAS pin - pinTrigger2 = PD14; //The Cam Sensor pin - break; - - case 30: - //Pin mappings as per the v0.4 shield - - //Black F407VE http://wiki.stm32duino.com/index.php?title=STM32F407 - //PC8~PC12 SDio - - //PA9..PA10 Serial1 - //PA11..PA12 USB - //PA13..PA15 & PB4 SWD(debug) pins - //PB0 EEPROM CS pin - //PB1 LCD - //PB2 BOOT1 - //PB3..PB5 SPI interface - //PB6..PB8 NRF interface - - //PD5 & PD6 Serial2 - pinInjector1 = PA1; //Output pin injector 1 is on - pinInjector2 = PA2; //Output pin injector 2 is on - pinInjector3 = PA3; //Output pin injector 3 is on - pinInjector4 = PA4; //Output pin injector 4 is on - pinInjector5 = PA5; //Output pin injector 5 is on - pinInjector6 = PD4; //Output pin injector 6 is on - pinCoil1 = PD7; //Pin for coil 1 - pinCoil2 = PB9; //Pin for coil 2 - pinCoil3 = PA8; //Pin for coil 3 - pinCoil4 = PB10; //Pin for coil 4 - pinCoil5 = PB11; //Pin for coil 5 - pinMAP = PC0; //MAP sensor pin - pinTPS = PC1;//TPS input pin - pinIAT = PC2; //IAT sensor pin - pinCLT = PC3; //CLS sensor pin - pinO2 = PC5; //O2 Sensor pin - pinBat = PB1; //Battery reference voltage pin - pinBaro = PC4; - pinIdle1 = PB12; //Single wire idle control - pinIdle2 = PB11; //2 wire idle control - pinBoost = PC7; //Boost control - pinVVT_1 = PD3; //Default VVT output - pinStepperDir = PE0; //Direction pin for DRV8825 driver - pinStepperStep = PE1; //Step pin for DRV8825 driver - pinStepperEnable = PE2; //Enable pin for DRV8825 - pinDisplayReset = PE5; // OLED reset pin - pinFan = PE6; //Pin for the fan output - - pinFuelPump = PA6; //Fuel pump output - pinTachOut = PD15; //Tacho output pin - // pinLaunch = 51; //Can be overwritten below - // pinResetControl = 43; //Reset control output - - //external interrupt enabled pins - //external interrupts could be enalbed in any pin, except same port numbers (PA4,PE4) - pinFlex = PD4; // Flex sensor (Must be external interrupt enabled) - pinTrigger = PD13; //The CAS pin - pinTrigger2 = PD14; //The Cam Sensor pin - break; - - case 40: - //Pin mappings as per the v0.4 shield - - //Black F407VE http://wiki.stm32duino.com/index.php?title=STM32F407 - //PC8~PC12 SDio - - //PA9..PA10 Serial1 - //PA11..PA12 USB - //PA13..PA15 & PB4 SWD(debug) pins - //PB0 EEPROM CS pin - //PB1 LCD - //PB2 BOOT1 - //PB3..PB5 SPI interface - //PB6..PB8 NRF interface - - //PD5 & PD6 Serial2 - pinInjector1 = PA1; //Output pin injector 1 is on - pinInjector2 = PA2; //Output pin injector 2 is on - pinInjector3 = PA3; //Output pin injector 3 is on - pinInjector4 = PA4; //Output pin injector 4 is on - pinInjector5 = PA5; //Output pin injector 5 is on - pinInjector6 = PD4; //Output pin injector 6 is on - pinCoil1 = PD7; //Pin for coil 1 - pinCoil2 = PB9; //Pin for coil 2 - pinCoil3 = PA8; //Pin for coil 3 - pinCoil4 = PB10; //Pin for coil 4 - pinCoil5 = PB11; //Pin for coil 5 - pinMAP = PC0; //MAP sensor pin - pinTPS = PC1;//TPS input pin - pinIAT = PC2; //IAT sensor pin - pinCLT = PC3; //CLS sensor pin - pinO2 = PC5; //O2 Sensor pin - pinBat = PB1; //Battery reference voltage pin - pinBaro = PC4; - pinIdle1 = PB12; //Single wire idle control - pinIdle2 = PB11; //2 wire idle control - pinBoost = PC7; //Boost control - pinVVT_1 = PD3; //Default VVT output - pinStepperDir = PE0; //Direction pin for DRV8825 driver - pinStepperStep = PE1; //Step pin for DRV8825 driver - pinStepperEnable = PE2; //Enable pin for DRV8825 - pinDisplayReset = PE5; // OLED reset pin - pinFan = PE6; //Pin for the fan output - - pinFuelPump = PA6; //Fuel pump output - pinTachOut = PD15; //Tacho output pin - // pinLaunch = 51; //Can be overwritten below - // pinResetControl = 43; //Reset control output - - //external interrupt enabled pins - //external interrupts could be enalbed in any pin, except same port numbers (PA4,PE4) - pinFlex = PD4; // Flex sensor (Must be external interrupt enabled) - pinTrigger = PD13; //The CAS pin - pinTrigger2 = PD14; //The Cam Sensor pin - - case 41: - //Pin mappings as per the v0.4 shield - - //Black F407VE http://wiki.stm32duino.com/index.php?title=STM32F407 - //PC8~PC12 SDio - - //PA9..PA10 Serial1 - //PA11..PA12 USB - //PA13..PA15 & PB4 SWD(debug) pins - //PB0 EEPROM CS pin - //PB1 LCD - //PB2 BOOT1 - //PB3..PB5 SPI interface - //PB6..PB8 NRF interface - - //PD5 & PD6 Serial2 - pinInjector1 = PA1; //Output pin injector 1 is on - pinInjector2 = PA2; //Output pin injector 2 is on - pinInjector3 = PA3; //Output pin injector 3 is on - pinInjector4 = PA4; //Output pin injector 4 is on - pinInjector5 = PA5; //Output pin injector 5 is on - pinInjector6 = PD4; //Output pin injector 6 is on - pinCoil1 = PD7; //Pin for coil 1 - pinCoil2 = PB9; //Pin for coil 2 - pinCoil3 = PA8; //Pin for coil 3 - pinCoil4 = PB10; //Pin for coil 4 - pinCoil5 = PB11; //Pin for coil 5 - pinMAP = PC0; //MAP sensor pin - pinTPS = PC1;//TPS input pin - pinIAT = PC2; //IAT sensor pin - pinCLT = PC3; //CLS sensor pin - pinO2 = PC5; //O2 Sensor pin - pinBat = PB1; //Battery reference voltage pin - pinBaro = PC4; - pinIdle1 = PB12; //Single wire idle control - pinIdle2 = PB11; //2 wire idle control - pinBoost = PC7; //Boost control - pinVVT_1 = PD3; //Default VVT output - pinStepperDir = PE0; //Direction pin for DRV8825 driver - pinStepperStep = PE1; //Step pin for DRV8825 driver - pinStepperEnable = PE2; //Enable pin for DRV8825 - pinDisplayReset = PE5; // OLED reset pin - pinFan = PE6; //Pin for the fan output - - pinFuelPump = PA6; //Fuel pump output - pinTachOut = PD15; //Tacho output pin - // pinLaunch = 51; //Can be overwritten below - // pinResetControl = 43; //Reset control output - - //external interrupt enabled pins - //external interrupts could be enalbed in any pin, except same port numbers (PA4,PE4) - pinFlex = PD4; // Flex sensor (Must be external interrupt enabled) - pinTrigger = PD13; //The CAS pin - pinTrigger2 = PD14; //The Cam Sensor pin - break; - - default: - //Pin mappings as per the v0.4 shield - - //Black F407VE http://wiki.stm32duino.com/index.php?title=STM32F407 - //PC8~PC12 SDio - - //PA9..PA10 Serial1 - //PA11..PA12 USB - //PA13..PA15 & PB4 SWD(debug) pins - //PB0 EEPROM CS pin - //PB1 LCD - //PB2 BOOT1 - //PB3..PB5 SPI interface - //PB6..PB8 NRF interface - - //PD5 & PD6 Serial2 - pinInjector1 = PA1; //Output pin injector 1 is on - pinInjector2 = PA2; //Output pin injector 2 is on - pinInjector3 = PA3; //Output pin injector 3 is on - pinInjector4 = PA4; //Output pin injector 4 is on - pinInjector5 = PA5; //Output pin injector 5 is on - pinInjector6 = PD4; //Output pin injector 6 is on - pinCoil1 = PD7; //Pin for coil 1 - pinCoil2 = PB9; //Pin for coil 2 - pinCoil3 = PA8; //Pin for coil 3 - pinCoil4 = PB10; //Pin for coil 4 - pinCoil5 = PB11; //Pin for coil 5 - pinMAP = PC0; //MAP sensor pin - pinTPS = PC1;//TPS input pin - pinIAT = PC2; //IAT sensor pin - pinCLT = PC3; //CLS sensor pin - pinO2 = PC5; //O2 Sensor pin - pinBat = PB1; //Battery reference voltage pin - pinBaro = PC4; - pinIdle1 = PB12; //Single wire idle control - pinIdle2 = PB11; //2 wire idle control - pinBoost = PC7; //Boost control - pinVVT_1 = PD3; //Default VVT output - pinStepperDir = PE0; //Direction pin for DRV8825 driver - pinStepperStep = PE1; //Step pin for DRV8825 driver - pinStepperEnable = PE2; //Enable pin for DRV8825 - pinDisplayReset = PE5; // OLED reset pin - pinFan = PE6; //Pin for the fan output - - pinFuelPump = PA6; //Fuel pump output - pinTachOut = PD15; //Tacho output pin - // pinLaunch = 51; //Can be overwritten below - // pinResetControl = 43; //Reset control output - - //external interrupt enabled pins - //external interrupts could be enalbed in any pin, except same port numbers (PA4,PE4) - pinFlex = PD4; // Flex sensor (Must be external interrupt enabled) - pinTrigger = PD13; //The CAS pin - pinTrigger2 = PD14; //The Cam Sensor pin - break; - } - - //Setup any devices that are using selectable pins - - if ( (configPage6.launchPin != 0) && (configPage6.launchPin < BOARD_NR_GPIO_PINS) ) { pinLaunch = pinTranslate(configPage6.launchPin); } - if ( (configPage4.ignBypassPin != 0) && (configPage4.ignBypassPin < BOARD_NR_GPIO_PINS) ) { pinIgnBypass = pinTranslate(configPage4.ignBypassPin); } - if ( (configPage2.tachoPin != 0) && (configPage2.tachoPin < BOARD_NR_GPIO_PINS) ) { pinTachOut = pinTranslate(configPage2.tachoPin); } - if ( (configPage4.fuelPumpPin != 0) && (configPage4.fuelPumpPin < BOARD_NR_GPIO_PINS) ) { pinFuelPump = pinTranslate(configPage4.fuelPumpPin); } - if ( (configPage6.fanPin != 0) && (configPage6.fanPin < BOARD_NR_GPIO_PINS) ) { pinFan = pinTranslate(configPage6.fanPin); } - if ( (configPage6.boostPin != 0) && (configPage6.boostPin < BOARD_NR_GPIO_PINS) ) { pinBoost = pinTranslate(configPage6.boostPin); } - if ( (configPage6.vvtPin != 0) && (configPage6.vvtPin < BOARD_NR_GPIO_PINS) ) { pinVVT_1 = pinTranslate(configPage6.vvtPin); } - if ( (configPage6.useExtBaro != 0) && (configPage6.baroPin < BOARD_NR_GPIO_PINS) ) { pinBaro = configPage6.baroPin + A0; } - if ( (configPage6.useEMAP != 0) && (configPage10.EMAPPin < BOARD_NR_GPIO_PINS) ) { pinEMAP = configPage10.EMAPPin + A0; } - - //Currently there's no default pin for Idle Up - pinIdleUp = pinTranslate(configPage2.idleUpPin); - - /* Reset control is a special case. If reset control is enabled, it needs its initial state set BEFORE its pinMode. - If that doesn't happen and reset control is in "Serial Command" mode, the Arduino will end up in a reset loop - because the control pin will go low as soon as the pinMode is set to OUTPUT. */ - if ( (configPage4.resetControl != 0) && (configPage4.resetControlPin < BOARD_NR_GPIO_PINS) ) - { - resetControl = configPage4.resetControl; - pinResetControl = pinTranslate(configPage4.resetControlPin); - setResetControlPinState(); - pinMode(pinResetControl, OUTPUT); - } - - //Finally, set the relevant pin modes for outputs - pinMode(pinCoil1, OUTPUT); - pinMode(pinCoil2, OUTPUT); - pinMode(pinCoil3, OUTPUT); - pinMode(pinCoil4, OUTPUT); - pinMode(pinCoil5, OUTPUT); - pinMode(pinInjector1, OUTPUT); - pinMode(pinInjector2, OUTPUT); - pinMode(pinInjector3, OUTPUT); - pinMode(pinInjector4, OUTPUT); - pinMode(pinInjector5, OUTPUT); - pinMode(pinTachOut, OUTPUT); - pinMode(pinIdle1, OUTPUT); - pinMode(pinIdle2, OUTPUT); - pinMode(pinFuelPump, OUTPUT); - pinMode(pinIgnBypass, OUTPUT); - pinMode(pinFan, OUTPUT); - pinMode(pinStepperDir, OUTPUT); - pinMode(pinStepperStep, OUTPUT); - pinMode(pinStepperEnable, OUTPUT); - pinMode(pinBoost, OUTPUT); - pinMode(pinVVT_1, OUTPUT); - - inj1_pin_port = portOutputRegister(digitalPinToPort(pinInjector1)); - inj1_pin_mask = digitalPinToBitMask(pinInjector1); - inj2_pin_port = portOutputRegister(digitalPinToPort(pinInjector2)); - inj2_pin_mask = digitalPinToBitMask(pinInjector2); - inj3_pin_port = portOutputRegister(digitalPinToPort(pinInjector3)); - inj3_pin_mask = digitalPinToBitMask(pinInjector3); - inj4_pin_port = portOutputRegister(digitalPinToPort(pinInjector4)); - inj4_pin_mask = digitalPinToBitMask(pinInjector4); - inj5_pin_port = portOutputRegister(digitalPinToPort(pinInjector5)); - inj5_pin_mask = digitalPinToBitMask(pinInjector5); - inj6_pin_port = portOutputRegister(digitalPinToPort(pinInjector6)); - inj6_pin_mask = digitalPinToBitMask(pinInjector6); - inj7_pin_port = portOutputRegister(digitalPinToPort(pinInjector7)); - inj7_pin_mask = digitalPinToBitMask(pinInjector7); - inj8_pin_port = portOutputRegister(digitalPinToPort(pinInjector8)); - inj8_pin_mask = digitalPinToBitMask(pinInjector8); - - ign1_pin_port = portOutputRegister(digitalPinToPort(pinCoil1)); - ign1_pin_mask = digitalPinToBitMask(pinCoil1); - ign2_pin_port = portOutputRegister(digitalPinToPort(pinCoil2)); - ign2_pin_mask = digitalPinToBitMask(pinCoil2); - ign3_pin_port = portOutputRegister(digitalPinToPort(pinCoil3)); - ign3_pin_mask = digitalPinToBitMask(pinCoil3); - ign4_pin_port = portOutputRegister(digitalPinToPort(pinCoil4)); - ign4_pin_mask = digitalPinToBitMask(pinCoil4); - ign5_pin_port = portOutputRegister(digitalPinToPort(pinCoil5)); - ign5_pin_mask = digitalPinToBitMask(pinCoil5); - ign6_pin_port = portOutputRegister(digitalPinToPort(pinCoil6)); - ign6_pin_mask = digitalPinToBitMask(pinCoil6); - ign7_pin_port = portOutputRegister(digitalPinToPort(pinCoil7)); - ign7_pin_mask = digitalPinToBitMask(pinCoil7); - ign8_pin_port = portOutputRegister(digitalPinToPort(pinCoil8)); - ign8_pin_mask = digitalPinToBitMask(pinCoil8); - - tach_pin_port = portOutputRegister(digitalPinToPort(pinTachOut)); - tach_pin_mask = digitalPinToBitMask(pinTachOut); - pump_pin_port = portOutputRegister(digitalPinToPort(pinFuelPump)); - pump_pin_mask = digitalPinToBitMask(pinFuelPump); - - //And for inputs - pinMode(pinMAP, INPUT); - pinMode(pinO2, INPUT); - pinMode(pinO2_2, INPUT); - pinMode(pinTPS, INPUT); - pinMode(pinIAT, INPUT); - pinMode(pinCLT, INPUT); - pinMode(pinBat, INPUT); - pinMode(pinBaro, INPUT); - - pinMode(pinTrigger, INPUT); - pinMode(pinTrigger2, INPUT); - pinMode(pinTrigger3, INPUT); - - //Each of the below are only set when their relevant function is enabled. This can help prevent pin conflicts that users aren't aware of with unused functions - if(configPage2.flexEnabled > 0) - { - pinMode(pinFlex, INPUT); //Standard GM / Continental flex sensor requires pullup, but this should be onboard. The internal pullup will not work (Requires ~3.3k)! - } - if(configPage6.launchEnabled > 0) - { - if (configPage6.lnchPullRes == true) { pinMode(pinLaunch, INPUT_PULLUP); } - else { pinMode(pinLaunch, INPUT); } //If Launch Pull Resistor is not set make input float. - } - if(configPage2.idleUpEnabled > 0) - { - if (configPage2.idleUpPolarity == 0) { pinMode(pinIdleUp, INPUT_PULLUP); } //Normal setting - else { pinMode(pinIdleUp, INPUT); } //inverted setting - } - - - //These must come after the above pinMode statements - triggerPri_pin_port = portInputRegister(digitalPinToPort(pinTrigger)); - triggerPri_pin_mask = digitalPinToBitMask(pinTrigger); - triggerSec_pin_port = portInputRegister(digitalPinToPort(pinTrigger2)); - triggerSec_pin_mask = digitalPinToBitMask(pinTrigger2); - - //Set default values - digitalWrite(pinMAP, HIGH); - //digitalWrite(pinO2, LOW); - digitalWrite(pinTPS, LOW); - -} #endif \ No newline at end of file diff --git a/speeduino/board_teensy35.ino b/speeduino/board_teensy35.ino index d758ba9e..be5e0400 100644 --- a/speeduino/board_teensy35.ino +++ b/speeduino/board_teensy35.ino @@ -259,752 +259,6 @@ uint16_t freeRam() // The difference is the free, available ram. return (uint16_t)stackTop - heapTop; } -void setPinMapping(byte boardID) -{ - switch (boardID) - { - case 0: - #ifndef SMALL_FLASH_MODE //No support for bluepill here anyway - //Pin mappings as per the v0.1 shield - pinInjector1 = 8; //Output pin injector 1 is on - pinInjector2 = 9; //Output pin injector 2 is on - pinInjector3 = 11; //Output pin injector 3 is on - pinInjector4 = 10; //Output pin injector 4 is on - pinInjector5 = 12; //Output pin injector 5 is on - pinCoil1 = 6; //Pin for coil 1 - pinCoil2 = 7; //Pin for coil 2 - pinCoil3 = 12; //Pin for coil 3 - pinCoil4 = 13; //Pin for coil 4 - pinCoil5 = 14; //Pin for coil 5 - pinTrigger = 2; //The CAS pin - pinTrigger2 = 3; //The CAS pin - pinTPS = A0; //TPS input pin - pinMAP = A1; //MAP sensor pin - pinIAT = A2; //IAT sensor pin - pinCLT = A3; //CLS sensor pin - pinO2 = A4; //O2 Sensor pin - pinIdle1 = 46; //Single wire idle control - pinIdle2 = 47; //2 wire idle control - pinStepperDir = 16; //Direction pin for DRV8825 driver - pinStepperStep = 17; //Step pin for DRV8825 driver - pinFan = 47; //Pin for the fan output - pinFuelPump = 4; //Fuel pump output - pinTachOut = 49; //Tacho output pin - pinFlex = 19; // Flex sensor (Must be external interrupt enabled) - pinResetControl = 43; //Reset control output - #endif - break; - case 1: - #ifndef SMALL_FLASH_MODE //No support for bluepill here anyway - //Pin mappings as per the v0.2 shield - pinInjector1 = 8; //Output pin injector 1 is on - pinInjector2 = 9; //Output pin injector 2 is on - pinInjector3 = 10; //Output pin injector 3 is on - pinInjector4 = 11; //Output pin injector 4 is on - pinInjector5 = 12; //Output pin injector 5 is on - pinCoil1 = 28; //Pin for coil 1 - pinCoil2 = 24; //Pin for coil 2 - pinCoil3 = 40; //Pin for coil 3 - pinCoil4 = 36; //Pin for coil 4 - pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now - pinTrigger = 20; //The CAS pin - pinTrigger2 = 21; //The Cam Sensor pin - pinTPS = A2; //TPS input pin - pinMAP = A3; //MAP sensor pin - pinIAT = A0; //IAT sensor pin - pinCLT = A1; //CLS sensor pin - pinO2 = A8; //O2 Sensor pin - pinBat = A4; //Battery reference voltage pin - pinDisplayReset = 48; // OLED reset pin - pinTachOut = 49; //Tacho output pin - pinIdle1 = 30; //Single wire idle control - pinIdle2 = 31; //2 wire idle control - pinStepperDir = 16; //Direction pin for DRV8825 driver - pinStepperStep = 17; //Step pin for DRV8825 driver - pinFan = 47; //Pin for the fan output - pinFuelPump = 4; //Fuel pump output - pinFlex = 2; // Flex sensor (Must be external interrupt enabled) - pinResetControl = 43; //Reset control output - break; - #endif - case 2: - #ifndef SMALL_FLASH_MODE //No support for bluepill here anyway - //Pin mappings as per the v0.3 shield - pinInjector1 = 8; //Output pin injector 1 is on - pinInjector2 = 9; //Output pin injector 2 is on - pinInjector3 = 10; //Output pin injector 3 is on - pinInjector4 = 11; //Output pin injector 4 is on - pinInjector5 = 12; //Output pin injector 5 is on - pinCoil1 = 28; //Pin for coil 1 - pinCoil2 = 24; //Pin for coil 2 - pinCoil3 = 40; //Pin for coil 3 - pinCoil4 = 36; //Pin for coil 4 - pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now - pinTrigger = 19; //The CAS pin - pinTrigger2 = 18; //The Cam Sensor pin - pinTPS = A2;//TPS input pin - pinMAP = A3; //MAP sensor pin - pinIAT = A0; //IAT sensor pin - pinCLT = A1; //CLS sensor pin - pinO2 = A8; //O2 Sensor pin - pinBat = A4; //Battery reference voltage pin - pinDisplayReset = 48; // OLED reset pin - pinTachOut = 49; //Tacho output pin - pinIdle1 = 5; //Single wire idle control - pinIdle2 = 53; //2 wire idle control - pinBoost = 7; //Boost control - pinVVT_1 = 6; //Default VVT output - pinFuelPump = 4; //Fuel pump output - pinStepperDir = 16; //Direction pin for DRV8825 driver - pinStepperStep = 17; //Step pin for DRV8825 driver - pinStepperEnable = 26; //Enable pin for DRV8825 - pinFan = A13; //Pin for the fan output - pinLaunch = 51; //Can be overwritten below - pinFlex = 2; // Flex sensor (Must be external interrupt enabled) - pinResetControl = 50; //Reset control output - #if defined(CORE_TEENSY) - pinTrigger = 23; - pinStepperDir = 33; - pinStepperStep = 34; - pinCoil1 = 31; - pinTachOut = 28; - pinFan = 27; - pinCoil4 = 21; - pinCoil3 = 30; - pinO2 = A22; - #endif - #endif - break; - - case 3: - //Pin mappings as per the v0.4 shield - pinInjector1 = 8; //Output pin injector 1 is on - pinInjector2 = 9; //Output pin injector 2 is on - pinInjector3 = 10; //Output pin injector 3 is on - pinInjector4 = 11; //Output pin injector 4 is on - pinInjector5 = 12; //Output pin injector 5 is on - pinInjector6 = 50; //CAUTION: Uses the same as Coil 4 below. - pinCoil1 = 40; //Pin for coil 1 - pinCoil2 = 38; //Pin for coil 2 - pinCoil3 = 52; //Pin for coil 3 - pinCoil4 = 50; //Pin for coil 4 - pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now - pinTrigger = 19; //The CAS pin - pinTrigger2 = 18; //The Cam Sensor pin - pinTPS = A2;//TPS input pin - pinMAP = A3; //MAP sensor pin - pinIAT = A0; //IAT sensor pin - pinCLT = A1; //CLS sensor pin - pinO2 = A8; //O2 Sensor pin - pinBat = A4; //Battery reference voltage pin - pinDisplayReset = 48; // OLED reset pin - pinTachOut = 49; //Tacho output pin (Goes to ULN2803) - pinIdle1 = 5; //Single wire idle control - pinIdle2 = 6; //2 wire idle control - pinBoost = 7; //Boost control - pinVVT_1 = 4; //Default VVT output - pinFuelPump = 45; //Fuel pump output (Goes to ULN2803) - pinStepperDir = 16; //Direction pin for DRV8825 driver - pinStepperStep = 17; //Step pin for DRV8825 driver - pinStepperEnable = 24; //Enable pin for DRV8825 - pinFan = 47; //Pin for the fan output (Goes to ULN2803) - pinLaunch = 51; //Can be overwritten below - pinFlex = 2; // Flex sensor (Must be external interrupt enabled) - pinResetControl = 43; //Reset control output - - #if defined(CORE_TEENSY) - pinInjector6 = 51; - - pinTrigger = 23; - pinTrigger2 = 36; - pinStepperDir = 34; - pinStepperStep = 35; - pinCoil1 = 31; - pinCoil2 = 32; - pinTachOut = 28; - pinFan = 27; - pinCoil4 = 29; - pinCoil3 = 30; - pinO2 = A22; - #elif defined(STM32F4) - //Black F407VE http://wiki.stm32duino.com/index.php?title=STM32F407 - //PC8~PC12 SDio - //PA13~PA15 & PB4 SWD(debug) pins - //PB0 EEPROM CS pin - //PD5 & PD6 Serial2 - pinInjector1 = PE7; //Output pin injector 1 is on - pinInjector2 = PE8; //Output pin injector 2 is on - pinInjector3 = PE9; //Output pin injector 3 is on - pinInjector4 = PE10; //Output pin injector 4 is on - pinInjector5 = PE11; //Output pin injector 5 is on - pinInjector6 = PE12; //Output pin injector 6 is on - pinCoil1 = PB5; //Pin for coil 1 - pinCoil2 = PB6; //Pin for coil 2 - pinCoil3 = PB7; //Pin for coil 3 - pinCoil4 = PB8; //Pin for coil 4 - pinCoil5 = PB9; //Pin for coil 5 - pinTPS = A0; //TPS input pin - pinMAP = A1; //MAP sensor pin - pinIAT = A2; //IAT sensor pin - pinCLT = A3; //CLT sensor pin - pinO2 = A4; //O2 Sensor pin - pinBat = A5; //Battery reference voltage pin - pinBaro = A10; - pinIdle1 = PB8; //Single wire idle control - pinIdle2 = PB9; //2 wire idle control - pinBoost = PE0; //Boost control - pinVVT_1 = PE1; //Default VVT output - pinStepperDir = PD8; //Direction pin for DRV8825 driver - pinStepperStep = PB15; //Step pin for DRV8825 driver - pinStepperEnable = PD9; //Enable pin for DRV8825 - pinDisplayReset = PE1; // OLED reset pin - pinFan = PE2; //Pin for the fan output - pinFuelPump = PA6; //Fuel pump output - pinTachOut = PA7; //Tacho output pin - //external interrupt enabled pins - //external interrupts could be enalbed in any pin, except same port numbers (PA4,PE4) - pinFlex = PE2; // Flex sensor (Must be external interrupt enabled) - pinTrigger = PE3; //The CAS pin - pinTrigger2 = PE4; //The Cam Sensor pin - #elif defined(CORE_STM32) - //blue pill http://wiki.stm32duino.com/index.php?title=Blue_Pill - //Maple mini http://wiki.stm32duino.com/index.php?title=Maple_Mini - //pins PA12, PA11 are used for USB or CAN couldn't be used for GPIO - pinInjector1 = PB7; //Output pin injector 1 is on - pinInjector2 = PB6; //Output pin injector 2 is on - pinInjector3 = PB5; //Output pin injector 3 is on - pinInjector4 = PB4; //Output pin injector 4 is on - pinCoil1 = PB3; //Pin for coil 1 - pinCoil2 = PA15; //Pin for coil 2 - pinCoil3 = PA14; //Pin for coil 3 - pinCoil4 = PA9; //Pin for coil 4 - pinCoil5 = PA8; //Pin for coil 5 - pinTPS = A0; //TPS input pin - pinMAP = A1; //MAP sensor pin - pinIAT = A2; //IAT sensor pin - pinCLT = A3; //CLS sensor pin - pinO2 = A4; //O2 Sensor pin - pinBat = A5; //Battery reference voltage pin - pinBaro = pinMAP; - pinIdle1 = PB2; //Single wire idle control - pinIdle2 = PA2; //2 wire idle control - pinBoost = PA1; //Boost control - pinVVT_1 = PA0; //Default VVT output - pinStepperDir = PC15; //Direction pin for DRV8825 driver - pinStepperStep = PC14; //Step pin for DRV8825 driver - pinStepperEnable = PC13; //Enable pin for DRV8825 - pinDisplayReset = PB2; // OLED reset pin - pinFan = PB1; //Pin for the fan output - pinFuelPump = PB11; //Fuel pump output - pinTachOut = PB10; //Tacho output pin - //external interrupt enabled pins - pinFlex = PB8; // Flex sensor (Must be external interrupt enabled) - pinTrigger = PA10; //The CAS pin - pinTrigger2 = PA13; //The Cam Sensor pin - #endif - break; - - case 9: - //Pin mappings as per the MX5 PNP shield - pinInjector1 = 11; //Output pin injector 1 is on - pinInjector2 = 10; //Output pin injector 2 is on - pinInjector3 = 9; //Output pin injector 3 is on - pinInjector4 = 8; //Output pin injector 4 is on - pinInjector5 = 14; //Output pin injector 5 is on - pinCoil1 = 39; //Pin for coil 1 - pinCoil2 = 41; //Pin for coil 2 - pinCoil3 = 32; //Pin for coil 3 - pinCoil4 = 33; //Pin for coil 4 - pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now - pinTrigger = 19; //The CAS pin - pinTrigger2 = 18; //The Cam Sensor pin - pinTPS = A2;//TPS input pin - pinMAP = A5; //MAP sensor pin - pinIAT = A0; //IAT sensor pin - pinCLT = A1; //CLS sensor pin - pinO2 = A3; //O2 Sensor pin - pinBat = A4; //Battery reference voltage pin - pinDisplayReset = 48; // OLED reset pin - pinTachOut = 49; //Tacho output pin (Goes to ULN2803) - pinIdle1 = 2; //Single wire idle control - pinBoost = 4; - pinIdle2 = 4; //2 wire idle control (Note this is shared with boost!!!) - pinFuelPump = 37; //Fuel pump output - pinStepperDir = 16; //Direction pin for DRV8825 driver - pinStepperStep = 17; //Step pin for DRV8825 driver - pinFan = 35; //Pin for the fan output - pinLaunch = 12; //Can be overwritten below - pinFlex = 3; // Flex sensor (Must be external interrupt enabled) - pinResetControl = 44; //Reset control output - - #if defined(CORE_TEENSY) - pinTrigger = 23; - pinTrigger2 = 36; - pinStepperDir = 34; - pinStepperStep = 35; - pinCoil1 = 33; //Done - pinCoil2 = 24; //Done - pinCoil3 = 51; //Won't work (No mapping for pin 32) - pinCoil4 = 52; //Won't work (No mapping for pin 33) - pinFuelPump = 26; //Requires PVT4 adapter or above - pinFan = 50; //Won't work (No mapping for pin 35) - pinTachOut = 28; //Done - #endif - break; - - case 10: - #ifndef SMALL_FLASH_MODE //No support for bluepill here anyway - //Pin mappings for user turtanas PCB - pinInjector1 = 4; //Output pin injector 1 is on - pinInjector2 = 5; //Output pin injector 2 is on - pinInjector3 = 6; //Output pin injector 3 is on - pinInjector4 = 7; //Output pin injector 4 is on - pinInjector5 = 8; //Placeholder only - NOT USED - pinInjector6 = 9; //Placeholder only - NOT USED - pinInjector7 = 10; //Placeholder only - NOT USED - pinInjector8 = 11; //Placeholder only - NOT USED - pinCoil1 = 24; //Pin for coil 1 - pinCoil2 = 28; //Pin for coil 2 - pinCoil3 = 36; //Pin for coil 3 - pinCoil4 = 40; //Pin for coil 4 - pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now - pinTrigger = 18; //The CAS pin - pinTrigger2 = 19; //The Cam Sensor pin - pinTPS = A2;//TPS input pin - pinMAP = A3; //MAP sensor pin - pinMAP2 = A8; //MAP2 sensor pin - pinIAT = A0; //IAT sensor pin - pinCLT = A1; //CLS sensor pin - pinO2 = A4; //O2 Sensor pin - pinBat = A7; //Battery reference voltage pin - pinDisplayReset = 48; // OLED reset pin - pinSpareTemp1 = A6; - pinSpareTemp2 = A5; - pinTachOut = 41; //Tacho output pin transistori puuttuu 2n2222 tähän ja 1k 12v - pinFuelPump = 42; //Fuel pump output 2n2222 - pinFan = 47; //Pin for the fan output - pinTachOut = 49; //Tacho output pin - pinFlex = 2; // Flex sensor (Must be external interrupt enabled) - pinResetControl = 26; //Reset control output - - #endif - break; - - case 20: - #ifndef SMALL_FLASH_MODE //No support for bluepill here anyway - //Pin mappings as per the Plazomat In/Out shields Rev 0.1 - pinInjector1 = 8; //Output pin injector 1 is on - pinInjector2 = 9; //Output pin injector 2 is on - pinInjector3 = 10; //Output pin injector 3 is on - pinInjector4 = 11; //Output pin injector 4 is on - pinInjector5 = 12; //Output pin injector 5 is on - pinCoil1 = 28; //Pin for coil 1 - pinCoil2 = 24; //Pin for coil 2 - pinCoil3 = 40; //Pin for coil 3 - pinCoil4 = 36; //Pin for coil 4 - pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now - pinSpareOut1 = 4; //Spare LSD Output 1(PWM) - pinSpareOut2 = 5; //Spare LSD Output 2(PWM) - pinSpareOut3 = 6; //Spare LSD Output 3(PWM) - pinSpareOut4 = 7; //Spare LSD Output 4(PWM) - pinSpareOut5 = 50; //Spare LSD Output 5(digital) - pinSpareOut6 = 52; //Spare LSD Output 6(digital) - pinTrigger = 20; //The CAS pin - pinTrigger2 = 21; //The Cam Sensor pin - pinSpareTemp2 = A15; //spare Analog input 2 - pinSpareTemp1 = A14; //spare Analog input 1 - pinO2 = A8; //O2 Sensor pin - pinBat = A4; //Battery reference voltage pin - pinMAP = A3; //MAP sensor pin - pinTPS = A2;//TPS input pin - pinCLT = A1; //CLS sensor pin - pinIAT = A0; //IAT sensor pin - pinFan = 47; //Pin for the fan output - pinFuelPump = 4; //Fuel pump output - pinTachOut = 49; //Tacho output pin - pinResetControl = 26; //Reset control output - #endif - break; - - case 30: - #ifndef SMALL_FLASH_MODE //No support for bluepill here anyway - //Pin mappings as per the dazv6 shield - pinInjector1 = 8; //Output pin injector 1 is on - pinInjector2 = 9; //Output pin injector 2 is on - pinInjector3 = 10; //Output pin injector 3 is on - pinInjector4 = 11; //Output pin injector 4 is on - pinInjector5 = 12; //Output pin injector 5 is on - pinCoil1 = 40; //Pin for coil 1 - pinCoil2 = 38; //Pin for coil 2 - pinCoil3 = 50; //Pin for coil 3 - pinCoil4 = 52; //Pin for coil 4 - pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now - pinTrigger = 19; //The CAS pin - pinTrigger2 = 18; //The Cam Sensor pin - pinTrigger3 = 17; // cam sensor 2 pin - pinTPS = A2;//TPS input pin - pinMAP = A3; //MAP sensor pin - pinIAT = A0; //IAT sensor pin - pinCLT = A1; //CLS sensor pin - pinO2 = A8; //O2 Sensor pin - pinO2_2 = A9; //O2 sensor pin (second sensor) - pinBat = A4; //Battery reference voltage pin - pinDisplayReset = 48; // OLED reset pin - pinTachOut = 49; //Tacho output pin - pinIdle1 = 5; //Single wire idle control - pinFuelPump = 45; //Fuel pump output - pinStepperDir = 20; //Direction pin for DRV8825 driver - pinStepperStep = 21; //Step pin for DRV8825 driver - pinSpareHOut1 = 4; // high current output spare1 - pinSpareHOut2 = 6; // high current output spare2 - pinBoost = 7; - pinSpareLOut1 = 43; //low current output spare1 - pinSpareLOut2 = 47; - pinSpareLOut3 = 49; - pinSpareLOut4 = 51; - pinSpareLOut5 = 53; - pinFan = 47; //Pin for the fan output - #endif - break; - - case 40: - //Pin mappings as per the NO2C shield - pinInjector1 = 8; //Output pin injector 1 is on - pinInjector2 = 9; //Output pin injector 2 is on - pinInjector3 = 11; //Output pin injector 3 is on - NOT USED - pinInjector4 = 12; //Output pin injector 4 is on - NOT USED - pinInjector5 = 13; //Placeholder only - NOT USED - pinCoil1 = 23; //Pin for coil 1 - pinCoil2 = 22; //Pin for coil 2 - pinCoil3 = 2; //Pin for coil 3 - ONLY WITH DB2 - pinCoil4 = 3; //Pin for coil 4 - ONLY WITH DB2 - pinCoil5 = 46; //Placeholder only - NOT USED - pinTrigger = 19; //The CAS pin - pinTrigger2 = 18; //The Cam Sensor pin - pinTPS = A3; //TPS input pin - pinMAP = A0; //MAP sensor pin - pinIAT = A5; //IAT sensor pin - pinCLT = A4; //CLT sensor pin - pinO2 = A2; //O2 sensor pin - pinBat = A1; //Battery reference voltage pin - pinBaro = A6; //Baro sensor pin - ONLY WITH DB - pinSpareTemp1 = A7; //spare Analog input 1 - ONLY WITH DB - pinDisplayReset = 48; // OLED reset pin - NOT USED - pinTachOut = 38; //Tacho output pin - pinIdle1 = 5; //Single wire idle control - pinIdle2 = 47; //2 wire idle control - NOT USED - pinBoost = 7; //Boost control - pinVVT_1 = 6; //Default VVT output - pinFuelPump = 4; //Fuel pump output - pinStepperDir = 25; //Direction pin for DRV8825 driver - pinStepperStep = 24; //Step pin for DRV8825 driver - pinStepperEnable = 27; //Enable pin for DRV8825 driver - pinLaunch = 10; //Can be overwritten below - pinFlex = 20; // Flex sensor (Must be external interrupt enabled) - ONLY WITH DB - pinFan = 30; //Pin for the fan output - ONLY WITH DB - pinSpareLOut1 = 32; //low current output spare1 - ONLY WITH DB - pinSpareLOut2 = 34; //low current output spare2 - ONLY WITH DB - pinSpareLOut3 = 36; //low current output spare3 - ONLY WITH DB - pinResetControl = 26; //Reset control output - break; - - case 41: - #ifndef SMALL_FLASH_MODE //No support for bluepill here anyway - //Pin mappings as per the UA4C shield - pinInjector1 = 8; //Output pin injector 1 is on - pinInjector2 = 7; //Output pin injector 2 is on - pinInjector3 = 6; //Output pin injector 3 is on - pinInjector4 = 5; //Output pin injector 4 is on - pinInjector5 = 45; //Output pin injector 5 is on PLACEHOLDER value for now - pinCoil1 = 35; //Pin for coil 1 - pinCoil2 = 36; //Pin for coil 2 - pinCoil3 = 33; //Pin for coil 3 - pinCoil4 = 34; //Pin for coil 4 - pinCoil5 = 44; //Pin for coil 5 PLACEHOLDER value for now - pinTrigger = 19; //The CAS pin - pinTrigger2 = 18; //The Cam Sensor pin - pinFlex = 20; // Flex sensor - pinTPS = A3; //TPS input pin - pinMAP = A0; //MAP sensor pin - pinBaro = A7; //Baro sensor pin - pinIAT = A5; //IAT sensor pin - pinCLT = A4; //CLS sensor pin - pinO2 = A1; //O2 Sensor pin - pinO2_2 = A9; //O2 sensor pin (second sensor) - pinBat = A2; //Battery reference voltage pin - pinSpareTemp1 = A8; //spare Analog input 1 - pinLaunch = 37; //Can be overwritten below - pinDisplayReset = 48; // OLED reset pin PLACEHOLDER value for now - pinTachOut = 22; //Tacho output pin - pinIdle1 = 9; //Single wire idle control - pinIdle2 = 10; //2 wire idle control - pinFuelPump = 23; //Fuel pump output - pinVVT_1 = 11; //Default VVT output - pinStepperDir = 32; //Direction pin for DRV8825 driver - pinStepperStep = 31; //Step pin for DRV8825 driver - pinStepperEnable = 30; //Enable pin for DRV8825 driver - pinBoost = 12; //Boost control - pinSpareLOut1 = 26; //low current output spare1 - pinSpareLOut2 = 27; //low current output spare2 - pinSpareLOut3 = 28; //low current output spare3 - pinSpareLOut4 = 29; //low current output spare4 - pinFan = 24; //Pin for the fan output - pinResetControl = 46; //Reset control output PLACEHOLDER value for now - #endif - break; - - #if defined(CORE_TEENSY) - case 50: - //Pin mappings as per the teensy rev A shield - pinInjector1 = 2; //Output pin injector 1 is on - pinInjector2 = 10; //Output pin injector 2 is on - pinInjector3 = 6; //Output pin injector 3 is on - pinInjector4 = 9; //Output pin injector 4 is on - //Placeholder only - NOT USED: - //pinInjector5 = 13; - pinCoil1 = 29; //Pin for coil 1 - pinCoil2 = 30; //Pin for coil 2 - pinCoil3 = 31; //Pin for coil 3 - ONLY WITH DB2 - pinCoil4 = 32; //Pin for coil 4 - ONLY WITH DB2 - //Placeholder only - NOT USED: - //pinCoil5 = 46; - pinTrigger = 23; //The CAS pin - pinTrigger2 = 36; //The Cam Sensor pin - pinTPS = 16; //TPS input pin - pinMAP = 17; //MAP sensor pin - pinIAT = 14; //IAT sensor pin - pinCLT = 15; //CLT sensor pin - pinO2 = A22; //O2 sensor pin - pinO2_2 = A21; //O2 sensor pin (second sensor) - pinBat = 18; //Battery reference voltage pin - pinTachOut = 20; //Tacho output pin - pinIdle1 = 5; //Single wire idle control - pinBoost = 11; //Boost control - pinFuelPump = 38; //Fuel pump output - pinStepperDir = 34; //Direction pin for DRV8825 driver - pinStepperStep = 35; //Step pin for DRV8825 driver - pinStepperEnable = 33; //Enable pin for DRV8825 driver - pinLaunch = 26; //Can be overwritten below - pinFan = 37; //Pin for the fan output - ONLY WITH DB - pinSpareHOut1 = 8; // high current output spare1 - pinSpareHOut2 = 7; // high current output spare2 - pinSpareLOut1 = 21; //low current output spare1 - break; - - case 51: - //Pin mappings as per the teensy revB board shield - pinInjector1 = 2; //Output pin injector 1 is on - pinInjector2 = 10; //Output pin injector 2 is on - pinInjector3 = 6; //Output pin injector 3 is on - NOT USED - pinInjector4 = 9; //Output pin injector 4 is on - NOT USED - pinCoil1 = 29; //Pin for coil 1 - pinCoil2 = 30; //Pin for coil 2 - pinCoil3 = 31; //Pin for coil 3 - ONLY WITH DB2 - pinCoil4 = 32; //Pin for coil 4 - ONLY WITH DB2 - pinTrigger = 23; //The CAS pin - pinTrigger2 = 36; //The Cam Sensor pin - pinTPS = 16; //TPS input pin - pinMAP = 17; //MAP sensor pin - pinIAT = 14; //IAT sensor pin - pinCLT = 15; //CLT sensor pin - pinO2 = A22; //O2 sensor pin - pinO2_2 = A21; //O2 sensor pin (second sensor) - pinBat = 18; //Battery reference voltage pin - pinTachOut = 20; //Tacho output pin - pinIdle1 = 5; //Single wire idle control - pinBoost = 11; //Boost control - pinFuelPump = 38; //Fuel pump output - pinStepperDir = 34; //Direction pin for DRV8825 driver - pinStepperStep = 35; //Step pin for DRV8825 driver - pinStepperEnable = 33; //Enable pin for DRV8825 driver - pinLaunch = 26; //Can be overwritten below - pinFan = 37; //Pin for the fan output - ONLY WITH DB - pinSpareHOut1 = 8; // high current output spare1 - pinSpareHOut2 = 7; // high current output spare2 - pinSpareLOut1 = 21; //low current output spare1 - break; - #endif - - default: - #ifndef SMALL_FLASH_MODE //No support for bluepill here anyway - //Pin mappings as per the v0.2 shield - pinInjector1 = 8; //Output pin injector 1 is on - pinInjector2 = 9; //Output pin injector 2 is on - pinInjector3 = 10; //Output pin injector 3 is on - pinInjector4 = 11; //Output pin injector 4 is on - pinInjector5 = 12; //Output pin injector 5 is on - pinCoil1 = 28; //Pin for coil 1 - pinCoil2 = 24; //Pin for coil 2 - pinCoil3 = 40; //Pin for coil 3 - pinCoil4 = 36; //Pin for coil 4 - pinCoil5 = 34; //Pin for coil 5 PLACEHOLDER value for now - pinTrigger = 20; //The CAS pin - pinTrigger2 = 21; //The Cam Sensor pin - pinTPS = A2; //TPS input pin - pinMAP = A3; //MAP sensor pin - pinIAT = A0; //IAT sensor pin - pinCLT = A1; //CLS sensor pin - pinO2 = A8; //O2 Sensor pin - pinBat = A4; //Battery reference voltage pin - pinStepperDir = 16; //Direction pin for DRV8825 driver - pinStepperStep = 17; //Step pin for DRV8825 driver - pinDisplayReset = 48; // OLED reset pin - pinFan = 47; //Pin for the fan output - pinFuelPump = 4; //Fuel pump output - pinTachOut = 49; //Tacho output pin - pinFlex = 3; // Flex sensor (Must be external interrupt enabled) - pinBoost = 5; - pinIdle1 = 6; - pinResetControl = 43; //Reset control output - #endif - break; - } - - //Setup any devices that are using selectable pins - - if ( (configPage6.launchPin != 0) && (configPage6.launchPin < BOARD_NR_GPIO_PINS) ) { pinLaunch = pinTranslate(configPage6.launchPin); } - if ( (configPage4.ignBypassPin != 0) && (configPage4.ignBypassPin < BOARD_NR_GPIO_PINS) ) { pinIgnBypass = pinTranslate(configPage4.ignBypassPin); } - if ( (configPage2.tachoPin != 0) && (configPage2.tachoPin < BOARD_NR_GPIO_PINS) ) { pinTachOut = pinTranslate(configPage2.tachoPin); } - if ( (configPage4.fuelPumpPin != 0) && (configPage4.fuelPumpPin < BOARD_NR_GPIO_PINS) ) { pinFuelPump = pinTranslate(configPage4.fuelPumpPin); } - if ( (configPage6.fanPin != 0) && (configPage6.fanPin < BOARD_NR_GPIO_PINS) ) { pinFan = pinTranslate(configPage6.fanPin); } - if ( (configPage6.boostPin != 0) && (configPage6.boostPin < BOARD_NR_GPIO_PINS) ) { pinBoost = pinTranslate(configPage6.boostPin); } - if ( (configPage6.vvtPin != 0) && (configPage6.vvtPin < BOARD_NR_GPIO_PINS) ) { pinVVT_1 = pinTranslate(configPage6.vvtPin); } - if ( (configPage6.useExtBaro != 0) && (configPage6.baroPin < BOARD_NR_GPIO_PINS) ) { pinBaro = configPage6.baroPin + A0; } - if ( (configPage6.useEMAP != 0) && (configPage10.EMAPPin < BOARD_NR_GPIO_PINS) ) { pinEMAP = configPage10.EMAPPin + A0; } - - //Currently there's no default pin for Idle Up - pinIdleUp = pinTranslate(configPage2.idleUpPin); - - /* Reset control is a special case. If reset control is enabled, it needs its initial state set BEFORE its pinMode. - If that doesn't happen and reset control is in "Serial Command" mode, the Arduino will end up in a reset loop - because the control pin will go low as soon as the pinMode is set to OUTPUT. */ - if ( (configPage4.resetControl != 0) && (configPage4.resetControlPin < BOARD_NR_GPIO_PINS) ) - { - resetControl = configPage4.resetControl; - pinResetControl = pinTranslate(configPage4.resetControlPin); - setResetControlPinState(); - pinMode(pinResetControl, OUTPUT); - } - - //Finally, set the relevant pin modes for outputs - pinMode(pinCoil1, OUTPUT); - pinMode(pinCoil2, OUTPUT); - pinMode(pinCoil3, OUTPUT); - pinMode(pinCoil4, OUTPUT); - pinMode(pinCoil5, OUTPUT); - pinMode(pinInjector1, OUTPUT); - pinMode(pinInjector2, OUTPUT); - pinMode(pinInjector3, OUTPUT); - pinMode(pinInjector4, OUTPUT); - pinMode(pinInjector5, OUTPUT); - pinMode(pinTachOut, OUTPUT); - pinMode(pinIdle1, OUTPUT); - pinMode(pinIdle2, OUTPUT); - pinMode(pinFuelPump, OUTPUT); - pinMode(pinIgnBypass, OUTPUT); - pinMode(pinFan, OUTPUT); - pinMode(pinStepperDir, OUTPUT); - pinMode(pinStepperStep, OUTPUT); - pinMode(pinStepperEnable, OUTPUT); - pinMode(pinBoost, OUTPUT); - pinMode(pinVVT_1, OUTPUT); - - inj1_pin_port = portOutputRegister(digitalPinToPort(pinInjector1)); - inj1_pin_mask = digitalPinToBitMask(pinInjector1); - inj2_pin_port = portOutputRegister(digitalPinToPort(pinInjector2)); - inj2_pin_mask = digitalPinToBitMask(pinInjector2); - inj3_pin_port = portOutputRegister(digitalPinToPort(pinInjector3)); - inj3_pin_mask = digitalPinToBitMask(pinInjector3); - inj4_pin_port = portOutputRegister(digitalPinToPort(pinInjector4)); - inj4_pin_mask = digitalPinToBitMask(pinInjector4); - inj5_pin_port = portOutputRegister(digitalPinToPort(pinInjector5)); - inj5_pin_mask = digitalPinToBitMask(pinInjector5); - inj6_pin_port = portOutputRegister(digitalPinToPort(pinInjector6)); - inj6_pin_mask = digitalPinToBitMask(pinInjector6); - inj7_pin_port = portOutputRegister(digitalPinToPort(pinInjector7)); - inj7_pin_mask = digitalPinToBitMask(pinInjector7); - inj8_pin_port = portOutputRegister(digitalPinToPort(pinInjector8)); - inj8_pin_mask = digitalPinToBitMask(pinInjector8); - - ign1_pin_port = portOutputRegister(digitalPinToPort(pinCoil1)); - ign1_pin_mask = digitalPinToBitMask(pinCoil1); - ign2_pin_port = portOutputRegister(digitalPinToPort(pinCoil2)); - ign2_pin_mask = digitalPinToBitMask(pinCoil2); - ign3_pin_port = portOutputRegister(digitalPinToPort(pinCoil3)); - ign3_pin_mask = digitalPinToBitMask(pinCoil3); - ign4_pin_port = portOutputRegister(digitalPinToPort(pinCoil4)); - ign4_pin_mask = digitalPinToBitMask(pinCoil4); - ign5_pin_port = portOutputRegister(digitalPinToPort(pinCoil5)); - ign5_pin_mask = digitalPinToBitMask(pinCoil5); - ign6_pin_port = portOutputRegister(digitalPinToPort(pinCoil6)); - ign6_pin_mask = digitalPinToBitMask(pinCoil6); - ign7_pin_port = portOutputRegister(digitalPinToPort(pinCoil7)); - ign7_pin_mask = digitalPinToBitMask(pinCoil7); - ign8_pin_port = portOutputRegister(digitalPinToPort(pinCoil8)); - ign8_pin_mask = digitalPinToBitMask(pinCoil8); - - tach_pin_port = portOutputRegister(digitalPinToPort(pinTachOut)); - tach_pin_mask = digitalPinToBitMask(pinTachOut); - pump_pin_port = portOutputRegister(digitalPinToPort(pinFuelPump)); - pump_pin_mask = digitalPinToBitMask(pinFuelPump); - - //And for inputs - #if defined(CORE_STM32) - #ifndef ARDUINO_ARCH_STM32 //libmaple core aka STM32DUINO - pinMode(pinMAP, INPUT_ANALOG); - pinMode(pinO2, INPUT_ANALOG); - pinMode(pinO2_2, INPUT_ANALOG); - pinMode(pinTPS, INPUT_ANALOG); - pinMode(pinIAT, INPUT_ANALOG); - pinMode(pinCLT, INPUT_ANALOG); - pinMode(pinBat, INPUT_ANALOG); - pinMode(pinBaro, INPUT_ANALOG); - #else - pinMode(pinMAP, INPUT); - pinMode(pinO2, INPUT); - pinMode(pinO2_2, INPUT); - pinMode(pinTPS, INPUT); - pinMode(pinIAT, INPUT); - pinMode(pinCLT, INPUT); - pinMode(pinBat, INPUT); - pinMode(pinBaro, INPUT); - #endif - #endif - pinMode(pinTrigger, INPUT); - pinMode(pinTrigger2, INPUT); - pinMode(pinTrigger3, INPUT); - - //Each of the below are only set when their relevant function is enabled. This can help prevent pin conflicts that users aren't aware of with unused functions - if(configPage2.flexEnabled > 0) - { - pinMode(pinFlex, INPUT); //Standard GM / Continental flex sensor requires pullup, but this should be onboard. The internal pullup will not work (Requires ~3.3k)! - } - if(configPage6.launchEnabled > 0) - { - if (configPage6.lnchPullRes == true) { pinMode(pinLaunch, INPUT_PULLUP); } - else { pinMode(pinLaunch, INPUT); } //If Launch Pull Resistor is not set make input float. - } - if(configPage2.idleUpEnabled > 0) - { - if (configPage2.idleUpPolarity == 0) { pinMode(pinIdleUp, INPUT_PULLUP); } //Normal setting - else { pinMode(pinIdleUp, INPUT); } //inverted setting - } - - - //These must come after the above pinMode statements - triggerPri_pin_port = portInputRegister(digitalPinToPort(pinTrigger)); - triggerPri_pin_mask = digitalPinToBitMask(pinTrigger); - triggerSec_pin_port = portInputRegister(digitalPinToPort(pinTrigger2)); - triggerSec_pin_mask = digitalPinToBitMask(pinTrigger2); - - #if defined(CORE_STM32) - #else - //Set default values - digitalWrite(pinMAP, HIGH); - //digitalWrite(pinO2, LOW); - digitalWrite(pinTPS, LOW); - #endif -} #endif \ No newline at end of file diff --git a/speeduino/globals.h b/speeduino/globals.h index e0a2cea9..045e53a8 100644 --- a/speeduino/globals.h +++ b/speeduino/globals.h @@ -20,8 +20,6 @@ #define BOARD_H "board_teensy35.h" #elif defined(STM32_MCU_SERIES) || defined(ARDUINO_ARCH_STM32) || defined(__STM32F1__) || defined(STM32F4) || defined(STM32) - #define CORE_STM32_GENERIC - #define BOARD_H "board_stm32_generic.h" #ifndef word #define word(h, l) ((h << 8) | l) //word() function not defined for this platform in the main library #endif @@ -32,9 +30,6 @@ #define LED_BUILTIN PB1 //Maple Mini #endif #elif defined(ARDUINO_BLACK_F407VE) || defined(STM32F4) - //Need to identify the official core better - #define CORE_STM32_OFFICIAL - #define BOARD_H "board_stm32_official.h" #define BOARD_DIGITAL_GPIO_PINS 80 #define BOARD_NR_GPIO_PINS 80 @@ -45,6 +40,15 @@ #define IGN_CHANNELS 8 #endif + #if defined(CORE_STM32_OFFICIAL) + //Need to identify the official core better + #define CORE_STM32_OFFICIAL + #define BOARD_H "board_stm32_official.h" + #else + #define CORE_STM32_GENERIC + #define BOARD_H "board_stm32_generic.h" + #endif + //Specific mode for Bluepill due to its small flash size. This disables a number of strings from being compiled into the flash #if defined(MCU_STM32F103C8) || defined(MCU_STM32F103CB) #define SMALL_FLASH_MODE diff --git a/speeduino/updates.ino b/speeduino/updates.ino index fb5fd24e..6bcda00e 100644 --- a/speeduino/updates.ino +++ b/speeduino/updates.ino @@ -6,15 +6,7 @@ */ #include "globals.h" #include "storage.h" -#if defined(CORE_SAMD21) - #include "src/FlashStorage/FlashAsEEPROM.h" -#elif defined(ARDUINO_BLACK_F407VE) - #include "src/BackupSram/BackupSramAsEEPROM.h" -#elif defined(USE_FRAM) - #include -#else - #include -#endif +#include EEPROM_LIB_H //This is defined in the board .h files void doUpdates() { From 9101356c5a480b73931c0500ecbc8c72dd3c0491 Mon Sep 17 00:00:00 2001 From: Josh Stewart Date: Wed, 6 Mar 2019 16:58:26 +1100 Subject: [PATCH 33/51] Workaround for potential stray spark signals on startup --- speeduino/board_avr2560.h | 11 ++++++++--- speeduino/board_avr2560.ino | 36 ++++++++++++++++++++++++++++++++++++ speeduino/decoders.ino | 33 ++++++++++++++++++++++++--------- speeduino/scheduler.ino | 32 -------------------------------- speeduino/timers.ino | 2 +- 5 files changed, 69 insertions(+), 45 deletions(-) diff --git a/speeduino/board_avr2560.h b/speeduino/board_avr2560.h index 34e60d13..6695feb7 100644 --- a/speeduino/board_avr2560.h +++ b/speeduino/board_avr2560.h @@ -87,9 +87,14 @@ #define FUEL7_TIMER_DISABLE() TIMSK5 &= ~(1 << OCIE5C); // #define FUEL8_TIMER_DISABLE() TIMSK5 &= ~(1 << OCIE5B); // - #define IGN1_TIMER_ENABLE() TIMSK5 |= (1 << OCIE5A) //Turn on the A compare unit (ie turn on the interrupt) - #define IGN2_TIMER_ENABLE() TIMSK5 |= (1 << OCIE5B) //Turn on the B compare unit (ie turn on the interrupt) - #define IGN3_TIMER_ENABLE() TIMSK5 |= (1 << OCIE5C) //Turn on the C compare unit (ie turn on the interrupt) + //These have the TIFR5 bits set to 1 to clear the interrupt flag. This prevents a false interrupt being called the first time the channel is enabled. + //I'm not sure why these are necessary as these should all be reset upon initialisation, but they do for the problem when added here + #define IGN1_TIMER_ENABLE() TIFR5 |= (1< 0) \ { \ if ( (currentTooth == ignition1EndTooth) ) \ { \ if( (ignitionSchedule1.Status == RUNNING) ) { IGN1_COMPARE = IGN1_COUNTER + uS_TO_TIMER_COMPARE( fastDegreesToUS( ignitionLimits( (ignition1EndAngle - crankAngle) ) ) ); } \ - else if(currentStatus.startRevolutions > 2) { ignitionSchedule1.endCompare = IGN1_COUNTER + uS_TO_TIMER_COMPARE( fastDegreesToUS( ignitionLimits( (ignition1EndAngle - crankAngle) ) ) ); ignitionSchedule1.endScheduleSetByDecoder = true; } \ + else if(currentStatus.startRevolutions > MIN_CYCLES_FOR_ENDCOMPARE) { ignitionSchedule1.endCompare = IGN1_COUNTER + uS_TO_TIMER_COMPARE( fastDegreesToUS( ignitionLimits( (ignition1EndAngle - crankAngle) ) ) ); ignitionSchedule1.endScheduleSetByDecoder = true; } \ } \ \ else if ( (currentTooth == ignition2EndTooth) ) \ { \ if( (ignitionSchedule2.Status == RUNNING) ) { IGN2_COMPARE = IGN2_COUNTER + uS_TO_TIMER_COMPARE( fastDegreesToUS( ignitionLimits( (ignition2EndAngle - crankAngle) ) ) ); } \ - else { ignitionSchedule2.endCompare = IGN2_COUNTER + uS_TO_TIMER_COMPARE( fastDegreesToUS( ignitionLimits( (ignition2EndAngle - crankAngle) ) ) ); ignitionSchedule2.endScheduleSetByDecoder = true; } \ + else if(currentStatus.startRevolutions > MIN_CYCLES_FOR_ENDCOMPARE) { ignitionSchedule2.endCompare = IGN2_COUNTER + uS_TO_TIMER_COMPARE( fastDegreesToUS( ignitionLimits( (ignition2EndAngle - crankAngle) ) ) ); ignitionSchedule2.endScheduleSetByDecoder = true; } \ } \ \ else if ( (currentTooth == ignition3EndTooth) ) \ { \ if( (ignitionSchedule3.Status == RUNNING) ) { IGN3_COMPARE = IGN3_COUNTER + uS_TO_TIMER_COMPARE( fastDegreesToUS( ignitionLimits( (ignition3EndAngle - crankAngle) ) ) ); } \ - else { ignitionSchedule3.endCompare = IGN3_COUNTER + uS_TO_TIMER_COMPARE( fastDegreesToUS( ignitionLimits( (ignition3EndAngle - crankAngle) ) ) ); ignitionSchedule3.endScheduleSetByDecoder = true; } \ + else if(currentStatus.startRevolutions > MIN_CYCLES_FOR_ENDCOMPARE) { ignitionSchedule3.endCompare = IGN3_COUNTER + uS_TO_TIMER_COMPARE( fastDegreesToUS( ignitionLimits( (ignition3EndAngle - crankAngle) ) ) ); ignitionSchedule3.endScheduleSetByDecoder = true; } \ } \ else if ( (currentTooth == ignition4EndTooth) ) \ { \ if( (ignitionSchedule4.Status == RUNNING) ) { IGN4_COMPARE = IGN4_COUNTER + uS_TO_TIMER_COMPARE_SLOW( fastDegreesToUS( ignitionLimits( (ignition4EndAngle - crankAngle) ) ) ); } \ - else { ignitionSchedule4.endCompare = IGN4_COUNTER + uS_TO_TIMER_COMPARE_SLOW( fastDegreesToUS( ignitionLimits( (ignition4EndAngle - crankAngle) ) ) ); ignitionSchedule4.endScheduleSetByDecoder = true; } \ + else if(currentStatus.startRevolutions > MIN_CYCLES_FOR_ENDCOMPARE) { ignitionSchedule4.endCompare = IGN4_COUNTER + uS_TO_TIMER_COMPARE_SLOW( fastDegreesToUS( ignitionLimits( (ignition4EndAngle - crankAngle) ) ) ); ignitionSchedule4.endScheduleSetByDecoder = true; } \ } \ } \ } @@ -276,6 +277,7 @@ void triggerPri_missingTooth() validTrigger = true; //Flag this pulse as being a valid trigger (ie that it passed filters) //if(toothCurrentCount > checkSyncToothCount || currentStatus.hasSync == false) + if( (toothLastToothTime > 0) && (toothLastMinusOneToothTime > 0) ) { //Begin the missing tooth detection //If the time between the current tooth and the last is greater than 1.5x the time between the last tooth and the tooth before that, we make the assertion that we must be at the first tooth after the gap @@ -287,7 +289,7 @@ void triggerPri_missingTooth() if ( (curGap > targetGap) || (toothCurrentCount > triggerActualTeeth) ) { //Missing tooth detected - if(toothCurrentCount < (triggerActualTeeth) && (currentStatus.hasSync == true) ) + if( (toothCurrentCount < triggerActualTeeth) && (currentStatus.hasSync == true) ) { //This occurs when we're at tooth #1, but haven't seen all the other teeth. This indicates a signal issue so we flag lost sync so this will attempt to resync on the next revolution. currentStatus.hasSync = false; @@ -297,13 +299,19 @@ void triggerPri_missingTooth() //else if (currentStatus.hasSync == false && toothCurrentCount < checkSyncToothCount ) { triggerFilterTime = 0; } else { + if(currentStatus.hasSync == true) + { + currentStatus.startRevolutions++; //Counter + if ( configPage4.TrigSpeed == CAM_SPEED ) { currentStatus.startRevolutions++; } //Add an extra revolution count if we're running at cam speed + } + else { currentStatus.startRevolutions = 0; } + toothCurrentCount = 1; revolutionOne = !revolutionOne; //Flip sequential revolution tracker toothOneMinusOneTime = toothOneTime; toothOneTime = curTime; currentStatus.hasSync = true; - currentStatus.startRevolutions++; //Counter - if ( configPage4.TrigSpeed == CAM_SPEED ) { currentStatus.startRevolutions++; } //Add an extra revolution count if we're running at cam speed + triggerFilterTime = 0; //This is used to prevent a condition where serious intermitent signals (Eg someone furiously plugging the sensor wire in and out) can leave the filter in an unrecoverable state toothLastMinusOneToothTime = toothLastToothTime; toothLastToothTime = curTime; @@ -320,6 +328,12 @@ void triggerPri_missingTooth() } } + else + { + toothLastMinusOneToothTime = toothLastToothTime; + toothLastToothTime = curTime; + } + //NEW IGNITION MODE if( (configPage2.perToothIgn == true) && (!BIT_CHECK(currentStatus.engine, BIT_ENGINE_CRANK)) ) @@ -1083,7 +1097,8 @@ void triggerPri_4G63() } //EXPERIMENTAL! - if(configPage2.perToothIgn == true) + //New ignition mode is ONLY available on 4g63 when the trigger angle is set to the stock value of 0. + if( (configPage2.perToothIgn == true) && (configPage4.triggerAngle == 0) ) { if(configPage2.nCylinders == 4) { diff --git a/speeduino/scheduler.ino b/speeduino/scheduler.ino index c55837cc..7f904931 100644 --- a/speeduino/scheduler.ino +++ b/speeduino/scheduler.ino @@ -13,38 +13,6 @@ void initialiseSchedulers() { nullSchedule.Status = OFF; -#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega2561__) //AVR chips use the ISR for this - //Much help in this from http://arduinomega.blogspot.com.au/2011/05/timer2-and-overflow-interrupt-lets-get.html - //Fuel Schedules, which uses timer 3 - TCCR3B = 0x00; //Disable Timer3 while we set it up - TCNT3 = 0; //Reset Timer Count - TIFR3 = 0x00; //Timer3 INT Flag Reg: Clear Timer Overflow Flag - TCCR3A = 0x00; //Timer3 Control Reg A: Wave Gen Mode normal - TCCR3B = (1 << CS12); //Timer3 Control Reg B: Timer Prescaler set to 256. Refer to http://www.instructables.com/files/orig/F3T/TIKL/H3WSA4V7/F3TTIKLH3WSA4V7.jpg - //TCCR3B = 0x03; //Timer3 Control Reg B: Timer Prescaler set to 64. Refer to http://www.instructables.com/files/orig/F3T/TIKL/H3WSA4V7/F3TTIKLH3WSA4V7.jpg - - //Ignition Schedules, which uses timer 5. This is also used by the fast version of micros(). If the speed of this timer is changed from 4uS ticks, that MUST be changed as well. See globals.h and timers.ino - TCCR5B = 0x00; //Disable Timer5 while we set it up - TCNT5 = 0; //Reset Timer Count - TIFR5 = 0x00; //Timer5 INT Flag Reg: Clear Timer Overflow Flag - TCCR5A = 0x00; //Timer5 Control Reg A: Wave Gen Mode normal - //TCCR5B = (1 << CS12); //Timer5 Control Reg B: Timer Prescaler set to 256. Refer to http://www.instructables.com/files/orig/F3T/TIKL/H3WSA4V7/F3TTIKLH3WSA4V7.jpg - TCCR5B = 0x03; //aka Divisor = 64 = 490.1Hz - - #if defined(TIMER5_MICROS) - TIMSK5 |= (1 << TOIE5); //Enable the timer5 overflow interrupt (See timers.ino for ISR) - TIMSK0 &= ~_BV(TOIE0); // disable timer0 overflow interrupt - #endif - - //The remaining Schedules (Schedules 4 for fuel and ignition) use Timer4 - TCCR4B = 0x00; //Disable Timer4 while we set it up - TCNT4 = 0; //Reset Timer Count - TIFR4 = 0x00; //Timer4 INT Flag Reg: Clear Timer Overflow Flag - TCCR4A = 0x00; //Timer4 Control Reg A: Wave Gen Mode normal - TCCR4B = (1 << CS12); //Timer4 Control Reg B: aka Divisor = 256 = 122.5HzTimer Prescaler set to 256. Refer to http://www.instructables.com/files/orig/F3T/TIKL/H3WSA4V7/F3TTIKLH3WSA4V7.jpg - -#endif - fuelSchedule1.Status = OFF; fuelSchedule2.Status = OFF; fuelSchedule3.Status = OFF; diff --git a/speeduino/timers.ino b/speeduino/timers.ino index 0642bb94..7634b740 100644 --- a/speeduino/timers.ino +++ b/speeduino/timers.ino @@ -194,7 +194,7 @@ void oneMSInterval() //Most ARM chips can simply call a function #if defined(CORE_AVR) //AVR chips use the ISR for this //Reset Timer2 to trigger in another ~1ms TCNT2 = 131; //Preload timer2 with 100 cycles, leaving 156 till overflow. - TIFR2 = 0x00; //Timer2 INT Flag Reg: Clear Timer Overflow Flag + //TIFR2 = 0x00; //Timer2 INT Flag Reg: Clear Timer Overflow Flag #endif } From 05e3d928ad41f138de89cfd2dc4f076138a3a9a0 Mon Sep 17 00:00:00 2001 From: Josh Stewart Date: Wed, 6 Mar 2019 18:17:33 +1100 Subject: [PATCH 34/51] Minor bits missed from last commit --- speeduino/board_avr2560.ino | 3 ++- speeduino/decoders.ino | 2 +- speeduino/scheduler.ino | 25 +++++++++++++++++++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/speeduino/board_avr2560.ino b/speeduino/board_avr2560.ino index 23326e47..31af70da 100644 --- a/speeduino/board_avr2560.ino +++ b/speeduino/board_avr2560.ino @@ -66,7 +66,8 @@ void initBoard() //TCCR5B = (1 << CS12); //Timer5 Control Reg B: Timer Prescaler set to 256. Refer to http://www.instructables.com/files/orig/F3T/TIKL/H3WSA4V7/F3TTIKLH3WSA4V7.jpg //TCCR5B = 0x03; //aka Divisor = 64 = 490.1Hz TCCR5B = (1 << CS11) | (1 << CS10); //Timer5 Control Reg B: Timer Prescaler set to 64. Refer to http://www.instructables.com/files/orig/F3T/TIKL/H3WSA4V7/F3TTIKLH3WSA4V7.jpg - TIFR5 = 0xFF; + TIFR5 |= (1 << OCF5A) | (1< 0) \ diff --git a/speeduino/scheduler.ino b/speeduino/scheduler.ino index 7f904931..35afa1cd 100644 --- a/speeduino/scheduler.ino +++ b/speeduino/scheduler.ino @@ -65,6 +65,11 @@ void initialiseSchedulers() ignitionSchedule7.Status = OFF; ignitionSchedule8.Status = OFF; + IGN1_TIMER_ENABLE(); + IGN2_TIMER_ENABLE(); + IGN3_TIMER_ENABLE(); + IGN4_TIMER_ENABLE(); + ignitionSchedule1.schedulesSet = 0; ignitionSchedule2.schedulesSet = 0; ignitionSchedule3.schedulesSet = 0; @@ -1009,6 +1014,11 @@ static inline void ignitionSchedule1Interrupt() //Most ARM chips can simply call ignitionCount += 1; //Increment the igintion counter IGN1_TIMER_DISABLE(); } + else if (ignitionSchedule1.Status == OFF) + { + //Catch any spurious interrupts. This really shouldn't ever be called, but there as a safety + IGN1_TIMER_DISABLE(); + } } #endif @@ -1036,6 +1046,11 @@ static inline void ignitionSchedule2Interrupt() //Most ARM chips can simply call ignitionCount += 1; //Increment the igintion counter IGN2_TIMER_DISABLE(); } + else if (ignitionSchedule2.Status == OFF) + { + //Catch any spurious interrupts. This really shouldn't ever be called, but there as a safety + IGN2_TIMER_DISABLE(); + } } #endif @@ -1073,6 +1088,11 @@ static inline void ignitionSchedule3Interrupt() //Most ARM chips can simply call } else { IGN3_TIMER_DISABLE(); } } + else if (ignitionSchedule3.Status == OFF) + { + //Catch any spurious interrupts. This really shouldn't ever be called, but there as a safety + IGN3_TIMER_DISABLE(); + } } #endif @@ -1109,6 +1129,11 @@ static inline void ignitionSchedule4Interrupt() //Most ARM chips can simply call } else { IGN4_TIMER_DISABLE(); } } + else if (ignitionSchedule4.Status == OFF) + { + //Catch any spurious interrupts. This really shouldn't ever be called, but there as a safety + IGN4_TIMER_DISABLE(); + } } #endif From 430032d3ab89b05cfc028f729f46e7bc4089c141 Mon Sep 17 00:00:00 2001 From: Josh Stewart Date: Thu, 7 Mar 2019 22:47:22 +1100 Subject: [PATCH 35/51] Bring in stm32f407 official core support within platformio --- platformio.ini | 15 ++++++----- speeduino/board_stm32_official.h | 17 +++++++++--- speeduino/board_stm32_official.ino | 9 +------ speeduino/globals.h | 26 +++++++++---------- speeduino/scheduler.h | 2 +- .../src/BackupSram/BackupSramAsEEPROM.cpp | 5 +++- speeduino/src/BackupSram/BackupSramAsEEPROM.h | 5 +--- speeduino/timers.h | 2 +- 8 files changed, 42 insertions(+), 39 deletions(-) diff --git a/platformio.ini b/platformio.ini index bd98b919..432f8aad 100644 --- a/platformio.ini +++ b/platformio.ini @@ -32,10 +32,9 @@ lib_deps = EEPROM, FlexCAN [env:genericSTM32F103RB] platform = ststm32@~4.5.0 framework = arduino -; framework-arduinoststm32 board = genericSTM32F103RB lib_deps = EEPROM -build_flags = -fpermissive -std=gnu++11 +build_flags = -fpermissive -std=gnu++11 -DCORE_STM32_OFFICIAL [env:genericSTM32F103RB_STM32GENERIC] ;platform = ststm32@~4.5.0 @@ -51,11 +50,13 @@ build_flags = -fpermissive -std=gnu++11 -UBOARD_NR_GPIO_PINS -DUSE_STM32GENERIC ;platform = ststm32@~4.5.0 platform = ststm32 framework = arduino -; framework-arduinoststm32 -board = genericSTM32F407VET6 +;board = genericSTM32F407VET6 +board = black_f407ve lib_deps = EEPROM -build_flags = -fpermissive -std=gnu++11 -UBOARD_NR_GPIO_PINS -DCORE_STM32_OFFICIAL -DMENU_USB_SERIAL -upload_protocol = dfu +board_build.core = stm32 +build_flags = -fpermissive -std=gnu++11 -UBOARD_NR_GPIO_PINS -DCORE_STM32_OFFICIAL -DSPI_AS_EEPROM + + [env:bluepill_f103c8] platform = ststm32 @@ -64,7 +65,7 @@ framework = arduino board = bluepill_f103c8 lib_deps = EEPROM ;build_flags = -fpermissive -std=gnu++11 -Os -ffunction-sections -fdata-sections -Wl,--gc-sections -Wl,-Map,output.map -build_flags = -fpermissive -std=gnu++11 -Os -UBOARD_NR_GPIO_PINS +build_flags = -fpermissive -std=gnu++11 -Os -DCORE_STM32_OFFICIAL -UBOARD_NR_GPIO_PINS ;SAMD21 [env:samd21] diff --git a/speeduino/board_stm32_official.h b/speeduino/board_stm32_official.h index d259a545..78bf8233 100644 --- a/speeduino/board_stm32_official.h +++ b/speeduino/board_stm32_official.h @@ -1,9 +1,9 @@ #ifndef STM32F407VE_H #define STM32F407VE_H #if defined(CORE_STM32_OFFICIAL) - +#include #include -#include +#include "stm32f4xx_ll_tim.h" /* *********************************************************************************************************** * General @@ -11,8 +11,17 @@ #define PORT_TYPE uint32_t #define PINMASK_TYPE uint32_t #define micros_safe() micros() //timer5 method is not used on anything but AVR, the micros_safe() macro is simply an alias for the normal micros() -#define EEPROM_LIB_H "src/BackupSram/BackupSramAsEEPROM.h" -#define digitalPinToInterrupt(p) (p) +#if defined(SRAM_AS_EEPROM) + #define EEPROM_LIB_H "src/BackupSram/BackupSramAsEEPROM.h" +#elif defined(SPI_AS_EEPROM) + #define EEPROM_LIB_H "src/SPIAsEEPROM/SPIAsEEPROM.h" +#else + #define EEPROM_LIB_H +#endif + +#ifndef LED_BUILTIN + #define LED_BUILTIN PA7 +#endif #define USE_SERIAL3 void initBoard(); diff --git a/speeduino/board_stm32_official.ino b/speeduino/board_stm32_official.ino index 401698c9..7dbfe65b 100644 --- a/speeduino/board_stm32_official.ino +++ b/speeduino/board_stm32_official.ino @@ -15,7 +15,6 @@ stimer_t HardwareTimers_4; stimer_t HardwareTimers_5; stimer_t HardwareTimers_8; - #define LED_BUILTIN PA7 //These should really be in the stm32GENERIC libs, but for somereason they only have timers 1-4 // #include // #include "src/HardwareTimers/HardwareTimer.h" @@ -78,15 +77,9 @@ *********************************************************************************************************** * Timers */ - #if defined(ARDUINO_BLACK_F407VE) || defined(STM32F4) || defined(_STM32F4_) + //#if defined(ARDUINO_BLACK_F407VE) || defined(STM32F4) || defined(_STM32F4_) TimerHandleInit(&HardwareTimers_8, 1000, 168); attachIntHandle(&HardwareTimers_8, oneMSIntervalIRQ); - #else - Timer4.setPeriod(1000); // Set up period - Timer4.setMode(1, TIMER_OUTPUT_COMPARE); - Timer4.attachInterrupt(1, oneMSInterval); - Timer4.resume(); //Start Timer - #endif pinMode(LED_BUILTIN, OUTPUT); //Visual WDT /* diff --git a/speeduino/globals.h b/speeduino/globals.h index 045e53a8..4e92b2f5 100644 --- a/speeduino/globals.h +++ b/speeduino/globals.h @@ -3,23 +3,27 @@ #include #include "table.h" -//These are configuration options for changing around the outputs that are used. THese are just the defaults and may be changed in the sections below based on the hardware in use. -#define INJ_CHANNELS 4 -#define IGN_CHANNELS 5 - #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega2561__) #define BOARD_DIGITAL_GPIO_PINS 54 #define BOARD_NR_GPIO_PINS 62 #define LED_BUILTIN 13 #define CORE_AVR #define BOARD_H "board_avr2560.h" + #define INJ_CHANNELS 4 + #define IGN_CHANNELS 5 //#define TIMER5_MICROS #elif defined(CORE_TEENSY) #define BOARD_H "board_teensy35.h" + #define INJ_CHANNELS 8 + #define IGN_CHANNELS 8 #elif defined(STM32_MCU_SERIES) || defined(ARDUINO_ARCH_STM32) || defined(__STM32F1__) || defined(STM32F4) || defined(STM32) + //These should be updated to 8 later, but there's bits missing currently + #define INJ_CHANNELS 4 + #define IGN_CHANNELS 5 + #ifndef word #define word(h, l) ((h << 8) | l) //word() function not defined for this platform in the main library #endif @@ -32,17 +36,11 @@ #elif defined(ARDUINO_BLACK_F407VE) || defined(STM32F4) #define BOARD_DIGITAL_GPIO_PINS 80 #define BOARD_NR_GPIO_PINS 80 - - //These boards always make 8/8 channels available - #undef INJ_CHANNELS - #undef IGN_CHANNELS - #define INJ_CHANNELS 8 - #define IGN_CHANNELS 8 #endif #if defined(CORE_STM32_OFFICIAL) //Need to identify the official core better - #define CORE_STM32_OFFICIAL + //#define CORE_STM32_OFFICIAL #define BOARD_H "board_stm32_official.h" #else #define CORE_STM32_GENERIC @@ -334,8 +332,10 @@ volatile uint8_t compositeLogHistory[TOOTH_LOG_BUFFER]; volatile bool fpPrimed = false; //Tracks whether or not the fuel pump priming has been completed yet volatile unsigned int toothHistoryIndex = 0; volatile byte toothHistorySerialIndex = 0; -byte primaryTriggerEdge; -byte secondaryTriggerEdge; + + byte primaryTriggerEdge; + byte secondaryTriggerEdge; + int CRANK_ANGLE_MAX = 720; int CRANK_ANGLE_MAX_IGN = 360; int CRANK_ANGLE_MAX_INJ = 360; //The number of crank degrees that the system track over. 360 for wasted / timed batch and 720 for sequential diff --git a/speeduino/scheduler.h b/speeduino/scheduler.h index f185181a..5487efc5 100644 --- a/speeduino/scheduler.h +++ b/speeduino/scheduler.h @@ -50,7 +50,7 @@ void setIgnitionSchedule8(void (*startCallback)(), unsigned long timeout, unsign static inline void refreshIgnitionSchedule1(unsigned long timeToEnd) __attribute__((always_inline)); //The ARM cores use seprate functions for their ISRs -#if defined(CORE_STM32) || defined(CORE_TEENSY) +#if defined(CORE_STM32_OFFICIAL) || defined(CORE_STM32_GENERIC) || defined(CORE_TEENSY) static inline void fuelSchedule1Interrupt(); static inline void fuelSchedule2Interrupt(); static inline void fuelSchedule3Interrupt(); diff --git a/speeduino/src/BackupSram/BackupSramAsEEPROM.cpp b/speeduino/src/BackupSram/BackupSramAsEEPROM.cpp index 022476d3..89806c63 100644 --- a/speeduino/src/BackupSram/BackupSramAsEEPROM.cpp +++ b/speeduino/src/BackupSram/BackupSramAsEEPROM.cpp @@ -1,6 +1,9 @@ -#if defined(ARDUINO_BLACK_F407VE) +//#if defined(ARDUINO_BLACK_F407VE) +#if defined(CORE_STM32_OFFICIAL) && defined(SRAM_AS_EEPROM) #include "BackupSramAsEEPROM.h" +#include "libmaple/rccF4.h" + BackupSramAsEEPROM::BackupSramAsEEPROM(){ //Enable the power interface clock RCC->APB1ENR |= RCC_APB1ENR_PWREN; diff --git a/speeduino/src/BackupSram/BackupSramAsEEPROM.h b/speeduino/src/BackupSram/BackupSramAsEEPROM.h index e376a2c9..b79da490 100644 --- a/speeduino/src/BackupSram/BackupSramAsEEPROM.h +++ b/speeduino/src/BackupSram/BackupSramAsEEPROM.h @@ -1,9 +1,6 @@ //Backup sram stores data in the battery backuped sram portion. //The backup battery is available on the ebay stm32F407VET6 black boards. - - - -#if defined(ARDUINO_BLACK_F407VE) +#if defined(CORE_STM32_OFFICIAL) && defined(SRAM_AS_EEPROM) //UGLY HACK TO PREVENT EEPROM LIBRARY BEING IMPORTED FIRST!! //Use with black_F407VE board diff --git a/speeduino/timers.h b/speeduino/timers.h index c172adc5..1deeff84 100644 --- a/speeduino/timers.h +++ b/speeduino/timers.h @@ -32,7 +32,7 @@ volatile uint16_t last250msLoopCount = 1000; //Set to effectively random number #if defined (CORE_TEENSY) IntervalTimer lowResTimer; void oneMSInterval(); -#elif defined(CORE_STM32) +#elif defined(CORE_STM32_OFFICIAL) || defined(CORE_STM32_GENERIC) void oneMSInterval(); #endif void initialiseTimers(); From 733c1dd71e682a8efd62a142eb57c143d5ecfcef Mon Sep 17 00:00:00 2001 From: Josh Stewart Date: Thu, 7 Mar 2019 22:48:09 +1100 Subject: [PATCH 36/51] Initial import of SPIMemory library and non-working EEPROM shim --- .../src/BackupSram/BackupSramAsEEPROM.cpp | 2 - speeduino/src/SPIAsEEPROM/DMASAM.cpp | 304 ++++ speeduino/src/SPIAsEEPROM/DMASAM.h | 59 + speeduino/src/SPIAsEEPROM/DMASAMD.h | 140 ++ speeduino/src/SPIAsEEPROM/SPIAsEEPROM.cpp | 42 + speeduino/src/SPIAsEEPROM/SPIAsEEPROM.h | 21 + speeduino/src/SPIAsEEPROM/SPIFlash.cpp | 1248 +++++++++++++++++ speeduino/src/SPIAsEEPROM/SPIFlash.h | 399 ++++++ speeduino/src/SPIAsEEPROM/SPIFlashIO.cpp | 604 ++++++++ speeduino/src/SPIAsEEPROM/SPIFlashSFDP.cpp | 356 +++++ speeduino/src/SPIAsEEPROM/SPIMemory.cpp | 30 + speeduino/src/SPIAsEEPROM/SPIMemory.h | 134 ++ speeduino/src/SPIAsEEPROM/defines.h | 290 ++++ speeduino/src/SPIAsEEPROM/diagnostics.cpp | 158 +++ speeduino/src/SPIAsEEPROM/diagnostics.h | 77 + 15 files changed, 3862 insertions(+), 2 deletions(-) create mode 100755 speeduino/src/SPIAsEEPROM/DMASAM.cpp create mode 100755 speeduino/src/SPIAsEEPROM/DMASAM.h create mode 100755 speeduino/src/SPIAsEEPROM/DMASAMD.h create mode 100644 speeduino/src/SPIAsEEPROM/SPIAsEEPROM.cpp create mode 100644 speeduino/src/SPIAsEEPROM/SPIAsEEPROM.h create mode 100755 speeduino/src/SPIAsEEPROM/SPIFlash.cpp create mode 100755 speeduino/src/SPIAsEEPROM/SPIFlash.h create mode 100755 speeduino/src/SPIAsEEPROM/SPIFlashIO.cpp create mode 100755 speeduino/src/SPIAsEEPROM/SPIFlashSFDP.cpp create mode 100755 speeduino/src/SPIAsEEPROM/SPIMemory.cpp create mode 100755 speeduino/src/SPIAsEEPROM/SPIMemory.h create mode 100755 speeduino/src/SPIAsEEPROM/defines.h create mode 100755 speeduino/src/SPIAsEEPROM/diagnostics.cpp create mode 100755 speeduino/src/SPIAsEEPROM/diagnostics.h diff --git a/speeduino/src/BackupSram/BackupSramAsEEPROM.cpp b/speeduino/src/BackupSram/BackupSramAsEEPROM.cpp index 89806c63..ddfa6e1b 100644 --- a/speeduino/src/BackupSram/BackupSramAsEEPROM.cpp +++ b/speeduino/src/BackupSram/BackupSramAsEEPROM.cpp @@ -2,8 +2,6 @@ #if defined(CORE_STM32_OFFICIAL) && defined(SRAM_AS_EEPROM) #include "BackupSramAsEEPROM.h" -#include "libmaple/rccF4.h" - BackupSramAsEEPROM::BackupSramAsEEPROM(){ //Enable the power interface clock RCC->APB1ENR |= RCC_APB1ENR_PWREN; diff --git a/speeduino/src/SPIAsEEPROM/DMASAM.cpp b/speeduino/src/SPIAsEEPROM/DMASAM.cpp new file mode 100755 index 00000000..57bbcc37 --- /dev/null +++ b/speeduino/src/SPIAsEEPROM/DMASAM.cpp @@ -0,0 +1,304 @@ +/* Arduino SPIMemory Library v.2.6.0 + * Copyright (C) 2017 by Prajwal Bhattaram + * Created by Prajwal Bhattaram - 30/09/2016 + * Modified by Prajwal Bhattaram - 14/04/2017 + * Original code from @manitou48 + * + * This file is part of the Arduino SPIMemory Library. This library is for + * Winbond NOR flash memory modules. In its current form it enables reading + * and writing individual data variables, structs and arrays from and to various locations; + * reading and writing pages; continuous read functions; sector, block and chip erase; + * suspending and resuming programming/erase and powering down for low power operation. + * + * This Library 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. + * + * This Library 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 v3.0 + * along with the Arduino SPIMemory Library. If not, see + * . + */ +#if defined (ARDUINO_ARCH_SAM) +#include "SPIMemory.h" + +// Constructor +//DMASAM::DMASAM(){} +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// +// Private functions used by Arduino Due DMA operations // +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// +// Disable DMA Controller +void DMASAM::_dmac_disable() { + DMAC->DMAC_EN &= (~DMAC_EN_ENABLE); +} +// Enable DMA Controller. +void DMASAM::_dmac_enable() { + DMAC->DMAC_EN = DMAC_EN_ENABLE; +} +// Disable DMA Channel +void DMASAM::_dmac_channel_disable(uint32_t ul_num) { + DMAC->DMAC_CHDR = DMAC_CHDR_DIS0 << ul_num; +} +// Enable DMA Channel +void DMASAM::_dmac_channel_enable(uint32_t ul_num) { + DMAC->DMAC_CHER = DMAC_CHER_ENA0 << ul_num; +} +// Poll for transfer complete +bool DMASAM::_dmac_channel_transfer_done(uint32_t ul_num) { + return (DMAC->DMAC_CHSR & (DMAC_CHSR_ENA0 << ul_num)) ? false : true; +} +// start RX DMA +void DMASAM::SPIDmaRX(uint8_t* dst, uint16_t count) { + _dmac_channel_disable(SPI_DMAC_RX_CH); + DMAC->DMAC_CH_NUM[SPI_DMAC_RX_CH].DMAC_SADDR = (uint32_t)&SPI0->SPI_RDR; + DMAC->DMAC_CH_NUM[SPI_DMAC_RX_CH].DMAC_DADDR = (uint32_t)dst; + DMAC->DMAC_CH_NUM[SPI_DMAC_RX_CH].DMAC_DSCR = 0; + DMAC->DMAC_CH_NUM[SPI_DMAC_RX_CH].DMAC_CTRLA = count | + DMAC_CTRLA_SRC_WIDTH_BYTE | DMAC_CTRLA_DST_WIDTH_BYTE; + DMAC->DMAC_CH_NUM[SPI_DMAC_RX_CH].DMAC_CTRLB = DMAC_CTRLB_SRC_DSCR | + DMAC_CTRLB_DST_DSCR | DMAC_CTRLB_FC_PER2MEM_DMA_FC | + DMAC_CTRLB_SRC_INCR_FIXED | DMAC_CTRLB_DST_INCR_INCREMENTING; + DMAC->DMAC_CH_NUM[SPI_DMAC_RX_CH].DMAC_CFG = DMAC_CFG_SRC_PER(SPI_RX_IDX) | + DMAC_CFG_SRC_H2SEL | DMAC_CFG_SOD | DMAC_CFG_FIFOCFG_ASAP_CFG; + _dmac_channel_enable(SPI_DMAC_RX_CH); +} +void DMASAM::SPIDmaRX(char* dst, uint16_t count) { + _dmac_channel_disable(SPI_DMAC_RX_CH); + DMAC->DMAC_CH_NUM[SPI_DMAC_RX_CH].DMAC_SADDR = (uint32_t)&SPI0->SPI_RDR; + DMAC->DMAC_CH_NUM[SPI_DMAC_RX_CH].DMAC_DADDR = (uint32_t)dst; + DMAC->DMAC_CH_NUM[SPI_DMAC_RX_CH].DMAC_DSCR = 0; + DMAC->DMAC_CH_NUM[SPI_DMAC_RX_CH].DMAC_CTRLA = count | + DMAC_CTRLA_SRC_WIDTH_BYTE | DMAC_CTRLA_DST_WIDTH_BYTE; + DMAC->DMAC_CH_NUM[SPI_DMAC_RX_CH].DMAC_CTRLB = DMAC_CTRLB_SRC_DSCR | + DMAC_CTRLB_DST_DSCR | DMAC_CTRLB_FC_PER2MEM_DMA_FC | + DMAC_CTRLB_SRC_INCR_FIXED | DMAC_CTRLB_DST_INCR_INCREMENTING; + DMAC->DMAC_CH_NUM[SPI_DMAC_RX_CH].DMAC_CFG = DMAC_CFG_SRC_PER(SPI_RX_IDX) | + DMAC_CFG_SRC_H2SEL | DMAC_CFG_SOD | DMAC_CFG_FIFOCFG_ASAP_CFG; + _dmac_channel_enable(SPI_DMAC_RX_CH); +} +// start TX DMA +void DMASAM::SPIDmaTX(const uint8_t* src, uint16_t count) { + static uint8_t ff = 0XFF; + uint32_t src_incr = DMAC_CTRLB_SRC_INCR_INCREMENTING; + if (!src) { + src = &ff; + src_incr = DMAC_CTRLB_SRC_INCR_FIXED; + } + _dmac_channel_disable(SPI_DMAC_TX_CH); + DMAC->DMAC_CH_NUM[SPI_DMAC_TX_CH].DMAC_SADDR = (uint32_t)src; + DMAC->DMAC_CH_NUM[SPI_DMAC_TX_CH].DMAC_DADDR = (uint32_t)&SPI0->SPI_TDR; + DMAC->DMAC_CH_NUM[SPI_DMAC_TX_CH].DMAC_DSCR = 0; + DMAC->DMAC_CH_NUM[SPI_DMAC_TX_CH].DMAC_CTRLA = count | + DMAC_CTRLA_SRC_WIDTH_BYTE | DMAC_CTRLA_DST_WIDTH_BYTE; + + DMAC->DMAC_CH_NUM[SPI_DMAC_TX_CH].DMAC_CTRLB = DMAC_CTRLB_SRC_DSCR | + DMAC_CTRLB_DST_DSCR | DMAC_CTRLB_FC_MEM2PER_DMA_FC | + src_incr | DMAC_CTRLB_DST_INCR_FIXED; + + DMAC->DMAC_CH_NUM[SPI_DMAC_TX_CH].DMAC_CFG = DMAC_CFG_DST_PER(SPI_TX_IDX) | + DMAC_CFG_DST_H2SEL | DMAC_CFG_SOD | DMAC_CFG_FIFOCFG_ALAP_CFG; + + _dmac_channel_enable(SPI_DMAC_TX_CH); +} + +void DMASAM::SPIDmaCharTX(const char* src, uint16_t count) { + static char ff = 0XFF; + uint32_t src_incr = DMAC_CTRLB_SRC_INCR_INCREMENTING; + if (!src) { + src = &ff; + src_incr = DMAC_CTRLB_SRC_INCR_FIXED; + } + _dmac_channel_disable(SPI_DMAC_TX_CH); + DMAC->DMAC_CH_NUM[SPI_DMAC_TX_CH].DMAC_SADDR = (uint32_t)src; + DMAC->DMAC_CH_NUM[SPI_DMAC_TX_CH].DMAC_DADDR = (uint32_t)&SPI0->SPI_TDR; + DMAC->DMAC_CH_NUM[SPI_DMAC_TX_CH].DMAC_DSCR = 0; + DMAC->DMAC_CH_NUM[SPI_DMAC_TX_CH].DMAC_CTRLA = count | + DMAC_CTRLA_SRC_WIDTH_BYTE | DMAC_CTRLA_DST_WIDTH_BYTE; + + DMAC->DMAC_CH_NUM[SPI_DMAC_TX_CH].DMAC_CTRLB = DMAC_CTRLB_SRC_DSCR | + DMAC_CTRLB_DST_DSCR | DMAC_CTRLB_FC_MEM2PER_DMA_FC | + src_incr | DMAC_CTRLB_DST_INCR_FIXED; + + DMAC->DMAC_CH_NUM[SPI_DMAC_TX_CH].DMAC_CFG = DMAC_CFG_DST_PER(SPI_TX_IDX) | + DMAC_CFG_DST_H2SEL | DMAC_CFG_SOD | DMAC_CFG_FIFOCFG_ALAP_CFG; + + _dmac_channel_enable(SPI_DMAC_TX_CH); +} + +void DMASAM::SPIBegin() { + PIO_Configure( + g_APinDescription[PIN_SPI_MOSI].pPort, + g_APinDescription[PIN_SPI_MOSI].ulPinType, + g_APinDescription[PIN_SPI_MOSI].ulPin, + g_APinDescription[PIN_SPI_MOSI].ulPinConfiguration); + PIO_Configure( + g_APinDescription[PIN_SPI_MISO].pPort, + g_APinDescription[PIN_SPI_MISO].ulPinType, + g_APinDescription[PIN_SPI_MISO].ulPin, + g_APinDescription[PIN_SPI_MISO].ulPinConfiguration); + PIO_Configure( + g_APinDescription[PIN_SPI_SCK].pPort, + g_APinDescription[PIN_SPI_SCK].ulPinType, + g_APinDescription[PIN_SPI_SCK].ulPin, + g_APinDescription[PIN_SPI_SCK].ulPinConfiguration); + pmc_enable_periph_clk(ID_SPI0); +#if USE_SAM3X_DMAC + pmc_enable_periph_clk(ID_DMAC); + _dmac_disable(); + DMAC->DMAC_GCFG = DMAC_GCFG_ARB_CFG_FIXED; + _dmac_enable(); +#if USE_SAM3X_BUS_MATRIX_FIX + MATRIX->MATRIX_WPMR = 0x4d415400; + MATRIX->MATRIX_MCFG[1] = 1; + MATRIX->MATRIX_MCFG[2] = 1; + MATRIX->MATRIX_SCFG[0] = 0x01000010; + MATRIX->MATRIX_SCFG[1] = 0x01000010; + MATRIX->MATRIX_SCFG[7] = 0x01000010; +#endif // USE_SAM3X_BUS_MATRIX_FIX +#endif // USE_SAM3X_DMAC +} +// initialize SPI controller +void DMASAM::SPIInit(uint8_t dueSckDivisor) { +#if ENABLE_SPI_TRANSACTIONS + SPI.beginTransaction(SPISettings()); +#endif // ENABLE_SPI_TRANSACTIONS + uint8_t scbr = dueSckDivisor; + Spi* pSpi = SPI0; + // disable SPI + pSpi->SPI_CR = SPI_CR_SPIDIS; + // reset SPI + pSpi->SPI_CR = SPI_CR_SWRST; + // no mode fault detection, set master mode + pSpi->SPI_MR = SPI_PCS(SPI_CHIP_SEL) | SPI_MR_MODFDIS | SPI_MR_MSTR; + // mode 0, 8-bit, + pSpi->SPI_CSR[SPI_CHIP_SEL] = SPI_CSR_SCBR(scbr) | SPI_CSR_NCPHA; + // enable SPI + pSpi->SPI_CR |= SPI_CR_SPIEN; +} +uint8_t DMASAM::SPITransfer(uint8_t b) { + Spi* pSpi = SPI0; + + pSpi->SPI_TDR = b; + while ((pSpi->SPI_SR & SPI_SR_RDRF) == 0) {} + b = pSpi->SPI_RDR; + return b; +} +// SPI receive a byte +uint8_t DMASAM::SPIRecByte() { + return SPITransfer(0XFF); +} +// SPI receive multiple bytes +uint8_t DMASAM::SPIRecByte(uint8_t* buf, size_t len) { + Spi* pSpi = SPI0; + int rtn = 0; +#if USE_SAM3X_DMAC + // clear overrun error + uint32_t s = pSpi->SPI_SR; + + SPIDmaRX(buf, len); + SPIDmaTX(0, len); + + uint32_t m = millis(); + while (!_dmac_channel_transfer_done(SPI_DMAC_RX_CH)) { + if ((millis() - m) > SAM3X_DMA_TIMEOUT) { + _dmac_channel_disable(SPI_DMAC_RX_CH); + _dmac_channel_disable(SPI_DMAC_TX_CH); + rtn = 2; + break; + } + } + if (pSpi->SPI_SR & SPI_SR_OVRES) rtn |= 1; +#else // USE_SAM3X_DMAC + for (size_t i = 0; i < len; i++) { + pSpi->SPI_TDR = 0XFF; + while ((pSpi->SPI_SR & SPI_SR_RDRF) == 0) {} + buf[i] = pSpi->SPI_RDR; + } +#endif // USE_SAM3X_DMAC + return rtn; +} +// SPI receive a char +int8_t DMASAM::SPIRecChar() { + return SPITransfer(0XFF); +} +// SPI receive multiple chars +int8_t DMASAM::SPIRecChar(char* buf, size_t len) { + Spi* pSpi = SPI0; + char rtn = 0; +#if USE_SAM3X_DMAC + // clear overrun error + uint32_t s = pSpi->SPI_SR; + + SPIDmaRX(buf, len); + SPIDmaTX(0, len); + + uint32_t m = millis(); + while (!_dmac_channel_transfer_done(SPI_DMAC_RX_CH)) { + if ((millis() - m) > SAM3X_DMA_TIMEOUT) { + _dmac_channel_disable(SPI_DMAC_RX_CH); + _dmac_channel_disable(SPI_DMAC_TX_CH); + rtn = 2; + break; + } + } + if (pSpi->SPI_SR & SPI_SR_OVRES) rtn |= 1; +#else // USE_SAM3X_DMAC + for (size_t i = 0; i < len; i++) { + pSpi->SPI_TDR = 0XFF; + while ((pSpi->SPI_SR & SPI_SR_RDRF) == 0) {} + buf[i] = pSpi->SPI_RDR; + } +#endif // USE_SAM3X_DMAC + return rtn; +} +// SPI send a byte +void DMASAM::SPISendByte(uint8_t b) { + SPITransfer(b); +} + +void DMASAM::SPISendByte(const uint8_t* buf, size_t len) { + Spi* pSpi = SPI0; +#if USE_SAM3X_DMAC + SPIDmaTX(buf, len); + while (!_dmac_channel_transfer_done(SPI_DMAC_TX_CH)) {} +#else // #if USE_SAM3X_DMAC + while ((pSpi->SPI_SR & SPI_SR_TXEMPTY) == 0) {} + for (size_t i = 0; i < len; i++) { + pSpi->SPI_TDR = buf[i]; + while ((pSpi->SPI_SR & SPI_SR_TDRE) == 0) {} + } +#endif // #if USE_SAM3X_DMAC + while ((pSpi->SPI_SR & SPI_SR_TXEMPTY) == 0) {} + // leave RDR empty + uint8_t b = pSpi->SPI_RDR; +} +// SPI send a char +void DMASAM::SPISendChar(char b) { + SPITransfer(b); +} +//SPI send multiple chars +void DMASAM::SPISendChar(const char* buf, size_t len) { + Spi* pSpi = SPI0; +#if USE_SAM3X_DMAC + SPIDmaCharTX(buf, len); + while (!_dmac_channel_transfer_done(SPI_DMAC_TX_CH)) {} +#else // #if USE_SAM3X_DMAC + while ((pSpi->SPI_SR & SPI_SR_TXEMPTY) == 0) {} + for (size_t i = 0; i < len; i++) { + pSpi->SPI_TDR = buf[i]; + while ((pSpi->SPI_SR & SPI_SR_TDRE) == 0) {} + } +#endif // #if USE_SAM3X_DMAC + while ((pSpi->SPI_SR & SPI_SR_TXEMPTY) == 0) {} + // leave RDR empty + char b = pSpi->SPI_RDR; +} + +DMASAM due; // default instantiation of DMASAM object + +#endif diff --git a/speeduino/src/SPIAsEEPROM/DMASAM.h b/speeduino/src/SPIAsEEPROM/DMASAM.h new file mode 100755 index 00000000..bfade080 --- /dev/null +++ b/speeduino/src/SPIAsEEPROM/DMASAM.h @@ -0,0 +1,59 @@ +/* Arduino SPIMemory Library v.3.2.0 + * Copyright (C) 2017 by Prajwal Bhattaram + * Created by Prajwal Bhattaram - 19/04/2018 + * Modified by Prajwal Bhattaram - 20/04/2018 + * + * This file is part of the Arduino SPIMemory Library. This library is for + * Winbond NOR flash memory modules. In its current form it enables reading + * and writing individual data variables, structs and arrays from and to various locations; + * reading and writing pages; continuous read functions; sector, block and chip erase; + * suspending and resuming programming/erase and powering down for low power operation. + * + * This Library 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. + * + * This Library 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 v3.0 + * along with the Arduino SPIMemory Library. If not, see + * . + */ + +#ifndef SAM_DMASPI_H +#define SAM_DMASPI_H +#include "SPIMemory.h" +class DMASAM { +public: + DMASAM(void){}; + ~DMASAM(void){}; + void SPIDmaRX(uint8_t* dst, uint16_t count); + void SPIDmaRX(char* dst, uint16_t count); + void SPIDmaTX(const uint8_t* src, uint16_t count); + void SPIDmaCharTX(const char* src, uint16_t count); + void SPIBegin(void); + void SPIInit(uint8_t dueSckDivisor); + uint8_t SPITransfer(uint8_t b); + uint8_t SPIRecByte(void); + uint8_t SPIRecByte(uint8_t* buf, size_t len); + int8_t SPIRecChar(void); + int8_t SPIRecChar(char* buf, size_t len); + void SPISendByte(uint8_t b); + void SPISendByte(const uint8_t* buf, size_t len); + void SPISendChar(char b); + void SPISendChar(const char* buf, size_t len); +private: + void _dmac_disable(void); + void _dmac_enable(void); + void _dmac_channel_disable(uint32_t ul_num); + void _dmac_channel_enable(uint32_t ul_num); + bool _dmac_channel_transfer_done(uint32_t ul_num); +}; + +extern DMASAM due; ///< default DMASAM instance + +#endif diff --git a/speeduino/src/SPIAsEEPROM/DMASAMD.h b/speeduino/src/SPIAsEEPROM/DMASAMD.h new file mode 100755 index 00000000..a3195559 --- /dev/null +++ b/speeduino/src/SPIAsEEPROM/DMASAMD.h @@ -0,0 +1,140 @@ +// DMA memory to memory ZERO +// ch 18 beat burst block +// xdk sam0/drivers/dma/dma.c +// packages/arduino/tools/CMSIS/4.0.0-atmel/Device/ATMEL/samd21/include/component/dmac.h +// http://asf.atmel.com/docs/3.16.0/samd21/html/asfdoc_sam0_sercom_spi_dma_use_case.html +// assume normal SPI setup, then we take over with DMA +#ifdef ARDUINO_ARCH_SAMD +#include + +#define PRREG(x) Serial.print(#x" 0x"); Serial.println(x,HEX) + + +#define BYTES 1024 +char txbuf[BYTES], rxbuf[BYTES]; + +/*void prmbs(char *lbl,unsigned long us,int bits) { + float mbs = (float)bits/us; + Serial.print(mbs,2); Serial.print(" mbs "); + Serial.print(us); Serial.print(" us "); + Serial.println(lbl); +}*/ + +// DMA 12 channels +typedef struct { + uint16_t btctrl; + uint16_t btcnt; + uint32_t srcaddr; + uint32_t dstaddr; + uint32_t descaddr; +} dmacdescriptor ; +volatile dmacdescriptor wrb[12] __attribute__ ((aligned (16))); +dmacdescriptor descriptor_section[12] __attribute__ ((aligned (16))); +dmacdescriptor descriptor __attribute__ ((aligned (16))); + +static uint32_t chnltx = 0, chnlrx = 1; // DMA channels +enum XfrType { DoTX, DoRX, DoTXRX}; +static XfrType xtype; +static uint8_t rxsink[1], txsrc[1] = {0xFF}; +volatile uint32_t dmadone; + +void DMAC_Handler() { + // interrupts DMAC_CHINTENCLR_TERR DMAC_CHINTENCLR_TCMPL DMAC_CHINTENCLR_SUSP + uint8_t active_channel; + + // disable irqs ? + __disable_irq(); + active_channel = DMAC->INTPEND.reg & DMAC_INTPEND_ID_Msk; // get channel number + DMAC->CHID.reg = DMAC_CHID_ID(active_channel); + dmadone = DMAC->CHINTFLAG.reg; + DMAC->CHINTFLAG.reg = DMAC_CHINTENCLR_TCMPL; // clear + DMAC->CHINTFLAG.reg = DMAC_CHINTENCLR_TERR; + DMAC->CHINTFLAG.reg = DMAC_CHINTENCLR_SUSP; + __enable_irq(); +} + +void dma_init() { + // probably on by default + PM->AHBMASK.reg |= PM_AHBMASK_DMAC ; + PM->APBBMASK.reg |= PM_APBBMASK_DMAC ; + NVIC_EnableIRQ( DMAC_IRQn ) ; + + DMAC->BASEADDR.reg = (uint32_t)descriptor_section; + DMAC->WRBADDR.reg = (uint32_t)wrb; + DMAC->CTRL.reg = DMAC_CTRL_DMAENABLE | DMAC_CTRL_LVLEN(0xf); +} + + +Sercom *sercom = (Sercom *)SERCOM4; // SPI SERCOM + +void spi_xfr(void *txdata, void *rxdata, size_t n) { + uint32_t temp_CHCTRLB_reg; + + // set up transmit channel + DMAC->CHID.reg = DMAC_CHID_ID(chnltx); + DMAC->CHCTRLA.reg &= ~DMAC_CHCTRLA_ENABLE; + DMAC->CHCTRLA.reg = DMAC_CHCTRLA_SWRST; + DMAC->SWTRIGCTRL.reg &= (uint32_t)(~(1 << chnltx)); + temp_CHCTRLB_reg = DMAC_CHCTRLB_LVL(0) | + DMAC_CHCTRLB_TRIGSRC(SERCOM4_DMAC_ID_TX) | DMAC_CHCTRLB_TRIGACT_BEAT; + DMAC->CHCTRLB.reg = temp_CHCTRLB_reg; + DMAC->CHINTENSET.reg = DMAC_CHINTENSET_MASK ; // enable all 3 interrupts + descriptor.descaddr = 0; + descriptor.dstaddr = (uint32_t) &sercom->SPI.DATA.reg; + descriptor.btcnt = n; + descriptor.srcaddr = (uint32_t)txdata; + descriptor.btctrl = DMAC_BTCTRL_VALID; + if (xtype != DoRX) { + descriptor.srcaddr += n; + descriptor.btctrl |= DMAC_BTCTRL_SRCINC; + } + memcpy(&descriptor_section[chnltx],&descriptor, sizeof(dmacdescriptor)); + + // rx channel enable interrupts + DMAC->CHID.reg = DMAC_CHID_ID(chnlrx); + DMAC->CHCTRLA.reg &= ~DMAC_CHCTRLA_ENABLE; + DMAC->CHCTRLA.reg = DMAC_CHCTRLA_SWRST; + DMAC->SWTRIGCTRL.reg &= (uint32_t)(~(1 << chnlrx)); + temp_CHCTRLB_reg = DMAC_CHCTRLB_LVL(0) | + DMAC_CHCTRLB_TRIGSRC(SERCOM4_DMAC_ID_RX) | DMAC_CHCTRLB_TRIGACT_BEAT; + DMAC->CHCTRLB.reg = temp_CHCTRLB_reg; + DMAC->CHINTENSET.reg = DMAC_CHINTENSET_MASK ; // enable all 3 interrupts + dmadone = 0; + descriptor.descaddr = 0; + descriptor.srcaddr = (uint32_t) &sercom->SPI.DATA.reg; + descriptor.btcnt = n; + descriptor.dstaddr = (uint32_t)rxdata; + descriptor.btctrl = DMAC_BTCTRL_VALID; + if (xtype != DoTX) { + descriptor.dstaddr += n; + descriptor.btctrl |= DMAC_BTCTRL_DSTINC; + } + memcpy(&descriptor_section[chnlrx],&descriptor, sizeof(dmacdescriptor)); + + // start both channels ? order matter ? + DMAC->CHID.reg = DMAC_CHID_ID(chnltx); + DMAC->CHCTRLA.reg |= DMAC_CHCTRLA_ENABLE; + DMAC->CHID.reg = DMAC_CHID_ID(chnlrx); + DMAC->CHCTRLA.reg |= DMAC_CHCTRLA_ENABLE; + + while(!dmadone); // await DMA done isr + + DMAC->CHID.reg = DMAC_CHID_ID(chnltx); //disable DMA to allow lib SPI + DMAC->CHCTRLA.reg &= ~DMAC_CHCTRLA_ENABLE; + DMAC->CHID.reg = DMAC_CHID_ID(chnlrx); + DMAC->CHCTRLA.reg &= ~DMAC_CHCTRLA_ENABLE; +} + +void spi_write(void *data, size_t n) { + xtype = DoTX; + spi_xfr(data,rxsink,n); +} +void spi_read(void *data, size_t n) { + xtype = DoRX; + spi_xfr(txsrc,data,n); +} +void spi_transfer(void *txdata, void *rxdata, size_t n) { + xtype = DoTXRX; + spi_xfr(txdata,rxdata,n); +} +#endif diff --git a/speeduino/src/SPIAsEEPROM/SPIAsEEPROM.cpp b/speeduino/src/SPIAsEEPROM/SPIAsEEPROM.cpp new file mode 100644 index 00000000..f2492adb --- /dev/null +++ b/speeduino/src/SPIAsEEPROM/SPIAsEEPROM.cpp @@ -0,0 +1,42 @@ +/* +* This file implements a shim layer for the SPIMemory library (https://github.com/Marzogh/SPIMemory) to mimic a minimal +* subset of the standard Arduino EEPROM library +*/ +#if defined(SPI_AS_EEPROM) + +#include "SPIAsEEPROM.h" +#include "SPIMemory.h" + +SPIFlash flash; +//SPIFlash flash(SS1, &SPI1); //Use this constructor if using an SPI bus other than the default SPI. Only works with chips with more than one hardware SPI bus + +SPIAsEEPROM::SPIAsEEPROM() +{ + //Do some init stuff here + + flash.begin(); + //To use a custom flash memory size (if using memory from manufacturers not officially supported by the library) - declare a size variable according to the list in defines.h + //flash.begin(MB(1)); + +} + +uint8_t SPIAsEEPROM::read(uint16_t address) { + + uint8_t val = 0; + + return val; +} + +int8_t SPIAsEEPROM::write(uint16_t address, uint8_t val) +{ + return 0; +} + +int8_t SPIAsEEPROM::update(uint16_t address, uint8_t val) +{ + return 0; +} + +SPIAsEEPROM EEPROM; + +#endif \ No newline at end of file diff --git a/speeduino/src/SPIAsEEPROM/SPIAsEEPROM.h b/speeduino/src/SPIAsEEPROM/SPIAsEEPROM.h new file mode 100644 index 00000000..0acaf828 --- /dev/null +++ b/speeduino/src/SPIAsEEPROM/SPIAsEEPROM.h @@ -0,0 +1,21 @@ +#ifndef SPI_AS_EEPROM_H +#define SPI_AS_EEPROM_H + +#if defined(SPI_AS_EEPROM) + +#include + +class SPIAsEEPROM { + private: + + public: + SPIAsEEPROM(); + uint8_t read(uint16_t address); + int8_t write(uint16_t address, uint8_t val); + int8_t update(uint16_t address, uint8_t val); +}; + +extern SPIAsEEPROM EEPROM; + +#endif +#endif \ No newline at end of file diff --git a/speeduino/src/SPIAsEEPROM/SPIFlash.cpp b/speeduino/src/SPIAsEEPROM/SPIFlash.cpp new file mode 100755 index 00000000..1dcfe4d4 --- /dev/null +++ b/speeduino/src/SPIAsEEPROM/SPIFlash.cpp @@ -0,0 +1,1248 @@ +/* Arduino SPIMemory Library v.3.2.1 + * Copyright (C) 2017 by Prajwal Bhattaram + * Created by Prajwal Bhattaram - 19/05/2015 + * Modified by @boseji - 02/03/2017 + * Modified by Prajwal Bhattaram - 21/05/2018 + * + * This file is part of the Arduino SPIMemory Library. This library is for + * Winbond NOR flash memory modules. In its current form it enables reading + * and writing individual data variables, structs and arrays from and to various locations; + * reading and writing pages; continuous read functions; sector, block and chip erase; + * suspending and resuming programming/erase and powering down for low power operation. + * + * This Library 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. + * + * This Library 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 v3.0 + * along with the Arduino SPIMemory Library. If not, see + * . + */ + +#include "SPIFlash.h" + +// Constructor +//If board has multiple SPI interfaces, this constructor lets the user choose between them +// Adding Low level HAL API to initialize the Chip select pinMode on RTL8195A - @boseji 2nd March 2017 +#if defined (ARDUINO_ARCH_AVR) +SPIFlash::SPIFlash(uint8_t cs) { + csPin = cs; + cs_mask = digitalPinToBitMask(csPin); + pinMode(csPin, OUTPUT); + CHIP_DESELECT +} +#elif defined (ARDUINO_ARCH_SAMD) || defined (ARCH_STM32) +SPIFlash::SPIFlash(uint8_t cs, SPIClass *spiinterface) { + _spi = spiinterface; //Sets SPI interface - if no user selection is made, this defaults to SPI + csPin = cs; + pinMode(csPin, OUTPUT); + CHIP_DESELECT +} +#elif defined (BOARD_RTL8195A) +SPIFlash::SPIFlash(PinName cs) { + gpio_init(&csPin, cs); + gpio_dir(&csPin, PIN_OUTPUT); + gpio_mode(&csPin, PullNone); + gpio_write(&csPin, 1); + CHIP_DESELECT +} +#else +SPIFlash::SPIFlash(uint8_t cs) { + csPin = cs; + pinMode(csPin, OUTPUT); + CHIP_DESELECT +} +#endif + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// +// Public functions used for read, write and erase operations // +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// + +//Identifies chip and establishes parameters +bool SPIFlash::begin(uint32_t flashChipSize) { +#ifdef RUNDIAGNOSTIC + Serial.println("Chip Diagnostics initiated."); + Serial.println(); +#endif +#ifdef HIGHSPEED + Serial.println("Highspeed mode initiated."); + Serial.println(); +#endif + BEGIN_SPI +#ifdef SPI_HAS_TRANSACTION + //Define the settings to be used by the SPI bus + _settings = SPISettings(SPI_CLK, MSBFIRST, SPI_MODE0); +#endif + bool retVal = _chipID(flashChipSize); + _endSPI(); + chipPoweredDown = false; + return retVal; +} + +//Allows the setting of a custom clock speed for the SPI bus to communicate with the chip. +//Only works if the SPI library in use supports SPI Transactions +#ifdef SPI_HAS_TRANSACTION +void SPIFlash::setClock(uint32_t clockSpeed) { + _settings = SPISettings(clockSpeed, MSBFIRST, SPI_MODE0); +} +#endif + +uint8_t SPIFlash::error(bool _verbosity) { + if (!_verbosity) { + return diagnostics.errorcode; + } + else { + _troubleshoot(diagnostics.errorcode, PRINTOVERRIDE); + return diagnostics.errorcode; + } +} + +//Returns capacity of chip +uint32_t SPIFlash::getCapacity(void) { + return _chip.capacity; +} + +//Returns maximum number of pages +uint32_t SPIFlash::getMaxPage(void) { + return (_chip.capacity / _pageSize); +} + +//Returns the time taken to run a function. Must be called immediately after a function is run as the variable returned is overwritten each time a function from this library is called. Primarily used in the diagnostics sketch included in the library to track function time. +//This function can only be called if #define RUNDIAGNOSTIC is uncommented in SPIFlash.h +float SPIFlash::functionRunTime(void) { +#ifdef RUNDIAGNOSTIC + return _spifuncruntime; +#else + return 0; +#endif +} + +//Returns the library version as three bytes +bool SPIFlash::libver(uint8_t *b1, uint8_t *b2, uint8_t *b3) { + *b1 = LIBVER; + *b2 = LIBSUBVER; + *b3 = BUGFIXVER; + return true; +} + +//Checks to see if SFDP is present +bool SPIFlash::sfdpPresent(void) { + return _chip.sfdpAvailable; +} + +//Checks for and initiates the chip by requesting the Manufacturer ID which is returned as a 16 bit int +uint16_t SPIFlash::getManID(void) { + uint8_t b1, b2; + _getManId(&b1, &b2); + uint32_t id = b1; + id = (id << 8)|(b2 << 0); + return id; +} + +//Returns JEDEC ID which is returned as a 32 bit int +uint32_t SPIFlash::getJEDECID(void) { + uint32_t id = 0; + id = _chip.manufacturerID; + id = (id << 8)|(_chip.memoryTypeID << 0); + id = (id << 8)|(_chip.capacityID << 0); + return id; +} + +// Returns a 64-bit Unique ID that is unique to each flash memory chip +uint64_t SPIFlash::getUniqueID(void) { + if(!_notBusy() || _isChipPoweredDown()) { + return false; + } + _beginSPI(UNIQUEID); + for (uint8_t i = 0; i < 4; i++) { + _nextByte(WRITE, DUMMYBYTE); + } + if (address4ByteEnabled) { + _nextByte(WRITE, DUMMYBYTE); + } + + for (uint8_t i = 0; i < 8; i++) { + _uniqueID[i] = _nextByte(READ); + } + CHIP_DESELECT + + long long _uid = 0; + for (uint8_t i = 0; i < 8; i++) { + _uid += _uniqueID[i]; + _uid = _uid << 8; + } + return _uid; +} + +//Gets the next available address for use. +// Takes the size of the data as an argument and returns a 32-bit address +// All addresses in the in the sketch must be obtained via this function or not at all. +uint32_t SPIFlash::getAddress(uint16_t size) { + if (!_addressCheck(currentAddress, size)){ + return false; + } + while (!_notPrevWritten(currentAddress, size)) { + currentAddress+=size; + _currentAddress = currentAddress; + if (_currentAddress >= _chip.capacity) { + if (_loopedOver) { + return false; + } + #ifdef DISABLEOVERFLOW + _troubleshoot(OUTOFBOUNDS); + return false; // At end of memory - (!pageOverflow) + #else + currentAddress = 0x00;// At end of memory - (pageOverflow) + _loopedOver = true; + #endif + } + } + uint32_t _addr = currentAddress; + currentAddress+=size; + return _addr; +} + +//Function for returning the size of the string (only to be used for the getAddress() function) +uint16_t SPIFlash::sizeofStr(String &inputStr) { + uint16_t size; + size = (sizeof(char)*(inputStr.length()+1)); + size+=sizeof(inputStr.length()+1); + + return size; +} + +// Reads a byte of data from a specific location in a page. +// Takes two arguments - +// 1. _addr --> Any address from 0 to capacity +// 2. fastRead --> defaults to false - executes _beginFastRead() if set to true +uint8_t SPIFlash::readByte(uint32_t _addr, bool fastRead) { + uint8_t data = 0; + _read(_addr, data, sizeof(data), fastRead); + return data; +} + +// Reads a char of data from a specific location in a page. +// Takes two arguments - +// 1. _addr --> Any address from 0 to capacity +// 2. fastRead --> defaults to false - executes _beginFastRead() if set to true +int8_t SPIFlash::readChar(uint32_t _addr, bool fastRead) { + int8_t data = 0; + _read(_addr, data, sizeof(data), fastRead); + return data; +} + +// Reads an array of bytes starting from a specific location in a page. +// Takes four arguments +// 1. _addr --> Any address from 0 to capacity +// 2. data_buffer --> The array of bytes to be read from the flash memory - starting at the address indicated +// 3. bufferSize --> The size of the buffer - in number of bytes. +// 4. fastRead --> defaults to false - executes _beginFastRead() if set to true + +bool SPIFlash::readByteArray(uint32_t _addr, uint8_t *data_buffer, size_t bufferSize, bool fastRead) { + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros(); + #endif + if (!_prep(READDATA, _addr, bufferSize)) { + return false; + } + if(fastRead) { + _beginSPI(FASTREAD); + } + else { + _beginSPI(READDATA); + } + _nextBuf(READDATA, &(*data_buffer), bufferSize); + _endSPI(); + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros() - _spifuncruntime; + #endif + return true; +} + +// Reads an array of chars starting from a specific location in a page.. +// Takes four arguments +// 1. _addr --> Any address from 0 to capacity +// 2. data_buffer --> The array of bytes to be read from the flash memory - starting at the address indicated +// 3. bufferSize --> The size of the buffer - in number of bytes. +// 4. fastRead --> defaults to false - executes _beginFastRead() if set to true +bool SPIFlash::readCharArray(uint32_t _addr, char *data_buffer, size_t bufferSize, bool fastRead) { + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros(); + #endif + if (!_prep(READDATA, _addr, bufferSize)) { + return false; + } + if(fastRead) { + _beginSPI(FASTREAD); + } + else { + _beginSPI(READDATA); + } + _nextBuf(READDATA, (uint8_t*) &(*data_buffer), bufferSize); + _endSPI(); + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros() - _spifuncruntime; + #endif + return true; +} + +// Reads an unsigned int of data from a specific location in a page. +// Takes two arguments - +// 1. _addr --> Any address from 0 to capacity +// 2. fastRead --> defaults to false - executes _beginFastRead() if set to true +uint16_t SPIFlash::readWord(uint32_t _addr, bool fastRead) { + uint16_t data; + _read(_addr, data, sizeof(data), fastRead); + return data; +} + +// Reads a signed int of data from a specific location in a page. +// Takes two arguments - +// 1. _addr --> Any address from 0 to capacity +// 2. fastRead --> defaults to false - executes _beginFastRead() if set to true +int16_t SPIFlash::readShort(uint32_t _addr, bool fastRead) { + int16_t data; + _read(_addr, data, sizeof(data), fastRead); + return data; +} + +// Reads an unsigned long of data from a specific location in a page. +// Takes two arguments - +// 1. _addr --> Any address from 0 to capacity +// 2. fastRead --> defaults to false - executes _beginFastRead() if set to true +uint32_t SPIFlash::readULong(uint32_t _addr, bool fastRead) { + uint32_t data; + _read(_addr, data, sizeof(data), fastRead); + return data; +} + +// Reads a signed long of data from a specific location in a page. +// Takes two arguments - +// 1. _addr --> Any address from 0 to capacity +// 2. fastRead --> defaults to false - executes _beginFastRead() if set to true +int32_t SPIFlash::readLong(uint32_t _addr, bool fastRead) { + int32_t data; + _read(_addr, data, sizeof(data), fastRead); + return data; +} + +// Reads a float of data from a specific location in a page. +// Takes two arguments - +// 1. _addr --> Any address from 0 to capacity +// 2. fastRead --> defaults to false - executes _beginFastRead() if set to true +float SPIFlash::readFloat(uint32_t _addr, bool fastRead) { + float data; + _read(_addr, data, sizeof(data), fastRead); + return data; +} + +// Reads a string from a specific location on a page. +// Takes three arguments +// 1. _addr --> Any address from 0 to capacity +// 2. outputString --> String variable to write the output to +// 3. fastRead --> defaults to false - executes _beginFastRead() if set to true +bool SPIFlash::readStr(uint32_t _addr, String &data, bool fastRead) { + return _read(_addr, data, sizeof(data), fastRead); +} + +// Writes a byte of data to a specific location in a page. +// Takes three arguments - +// 1. _addr --> Any address - from 0 to capacity +// 2. data --> One byte to be written to a particular location on a page +// 3. errorCheck --> Turned on by default. Checks for writing errors +// WARNING: You can only write to previously erased memory locations (see datasheet). +// Use the eraseSector()/eraseBlock32K/eraseBlock64K commands to first clear memory (write 0xFFs) +bool SPIFlash::writeByte(uint32_t _addr, uint8_t data, bool errorCheck) { + //return _write(_addr, data, sizeof(data), errorCheck, _BYTE_); + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros(); + #endif + if(!_prep(PAGEPROG, _addr, sizeof(data))) { + return false; + } + + _beginSPI(PAGEPROG); + _nextByte(WRITE, data); + CHIP_DESELECT + + if (!errorCheck) { + _endSPI(); + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros() - _spifuncruntime; + #endif + return true; + } + else { + if (!_notBusy()) { + return false; + } + _currentAddress = _addr; + CHIP_SELECT + _nextByte(WRITE, READDATA); + _transferAddress(); + if (data != _nextByte(READ)) { + _endSPI(); + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros() - _spifuncruntime; + #endif + return false; + } + else { + _endSPI(); + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros() - _spifuncruntime; + #endif + return true; + } + } + return true; +} + +// Writes a char of data to a specific location in a page. +// Takes three arguments - +// 1. _addr --> Any address - from 0 to capacity +// 2. data --> One char to be written to a particular location on a page +// 3. errorCheck --> Turned on by default. Checks for writing errors +// WARNING: You can only write to previously erased memory locations (see datasheet). +// Use the eraseSector()/eraseBlock32K/eraseBlock64K commands to first clear memory (write 0xFFs) +bool SPIFlash::writeChar(uint32_t _addr, int8_t data, bool errorCheck) { + //return _write(_addr, data, sizeof(data), errorCheck, _CHAR_); + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros(); + #endif + if(!_prep(PAGEPROG, _addr, sizeof(data))) { + return false; + } + + _beginSPI(PAGEPROG); + _nextByte(WRITE, data); + CHIP_DESELECT + + if (!errorCheck) { + _endSPI(); + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros() - _spifuncruntime; + #endif + return true; + } + else { + if (!_notBusy()) { + return false; + } + _currentAddress = _addr; + CHIP_SELECT + _nextByte(WRITE, READDATA); + _transferAddress(); + if (data != (int8_t)_nextByte(READ)) { + _endSPI(); + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros() - _spifuncruntime; + #endif + return false; + } + else { + _endSPI(); + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros() - _spifuncruntime; + #endif + return true; + } + } + return true; +} + +// Writes an array of bytes starting from a specific location in a page. +// Takes four arguments - +// 1. _addr --> Any address - from 0 to capacity +// 2. data_buffer --> The pointer to the array of bytes be written to a particular location on a page +// 3. bufferSize --> Size of the array of bytes - in number of bytes +// 4. errorCheck --> Turned on by default. Checks for writing errors +// WARNING: You can only write to previously erased memory locations (see datasheet). +// Use the eraseSector()/eraseBlock32K/eraseBlock64K commands to first clear memory (write 0xFFs) +bool SPIFlash::writeByteArray(uint32_t _addr, uint8_t *data_buffer, size_t bufferSize, bool errorCheck) { + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros(); + #endif + if (!_prep(PAGEPROG, _addr, bufferSize)) { + return false; + } + uint16_t maxBytes = SPI_PAGESIZE-(_addr % SPI_PAGESIZE); // Force the first set of bytes to stay within the first page + + if (bufferSize <= maxBytes) { + CHIP_SELECT + _nextByte(WRITE, PAGEPROG); + _transferAddress(); + //_nextBuf(PAGEPROG, &data_buffer[0], bufferSize); + for (uint16_t i = 0; i < bufferSize; ++i) { + _nextByte(WRITE, data_buffer[i]); + } + CHIP_DESELECT + } + else { + uint16_t length = bufferSize; + uint16_t writeBufSz; + uint16_t data_offset = 0; + + do { + writeBufSz = (length<=maxBytes) ? length : maxBytes; + + CHIP_SELECT + _nextByte(WRITE, PAGEPROG); + _transferAddress(); + //_nextBuf(PAGEPROG, &data_buffer[data_offset], writeBufSz); + for (uint16_t i = 0; i < writeBufSz; ++i) { + _nextByte(WRITE, data_buffer[data_offset + i]); + } + CHIP_DESELECT + + _currentAddress += writeBufSz; + data_offset += writeBufSz; + length -= writeBufSz; + maxBytes = 256; // Now we can do up to 256 bytes per loop + + if(!_notBusy() || !_writeEnable()){ + return false; + } + + } while (length > 0); + } + + if (!errorCheck) { + _endSPI(); + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros() - _spifuncruntime; + #endif + return true; + } + else { + if (!_notBusy()) { + return false; + } + _currentAddress = _addr; + CHIP_SELECT + _nextByte(WRITE, READDATA); + _transferAddress(); + for (uint16_t j = 0; j < bufferSize; j++) { + if (_nextByte(READ) != data_buffer[j]) { + return false; + } + } + _endSPI(); + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros() - _spifuncruntime; + #endif + return true; + } +} + +// Writes an array of bytes starting from a specific location in a page. +// Takes four arguments - +// 1. _addr --> Any address - from 0 to capacity +// 2. data_buffer --> The pointer to the array of chars be written to a particular location on a page +// 3. bufferSize --> Size of the array of chars - in number of bytes +// 4. errorCheck --> Turned on by default. Checks for writing errors +// WARNING: You can only write to previously erased memory locations (see datasheet). +// Use the eraseSector()/eraseBlock32K/eraseBlock64K commands to first clear memory (write 0xFFs) +bool SPIFlash::writeCharArray(uint32_t _addr, char *data_buffer, size_t bufferSize, bool errorCheck) { + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros(); + #endif + if (!_prep(PAGEPROG, _addr, bufferSize)) { + return false; + } + uint16_t maxBytes = SPI_PAGESIZE-(_addr % SPI_PAGESIZE); // Force the first set of bytes to stay within the first page + + if (bufferSize <= maxBytes) { + CHIP_SELECT + _nextByte(WRITE, PAGEPROG); + _transferAddress(); + //_nextBuf(PAGEPROG, &data_buffer[0], bufferSize); + for (uint16_t i = 0; i < bufferSize; ++i) { + _nextByte(WRITE, data_buffer[i]); + } + CHIP_DESELECT + } + else { + uint16_t length = bufferSize; + uint16_t writeBufSz; + uint16_t data_offset = 0; + + do { + writeBufSz = (length<=maxBytes) ? length : maxBytes; + + CHIP_SELECT + _nextByte(WRITE, PAGEPROG); + _transferAddress(); + for (uint16_t i = 0; i < writeBufSz; ++i) { + _nextByte(WRITE, data_buffer[data_offset + i]); + } + CHIP_DESELECT + + _currentAddress += writeBufSz; + data_offset += writeBufSz; + length -= writeBufSz; + maxBytes = 256; // Now we can do up to 256 bytes per loop + + if(!_notBusy() || !_writeEnable()){ + return false; + } + + } while (length > 0); + } + + if (!errorCheck) { + _endSPI(); + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros() - _spifuncruntime; + #endif + return true; + } + else { + if (!_notBusy()) { + return false; + } + _currentAddress = _addr; + CHIP_SELECT + _nextByte(WRITE, READDATA); + _transferAddress(); + for (uint16_t j = 0; j < bufferSize; j++) { + if ((char)_nextByte(READ) != data_buffer[j]) { + return false; + } + } + _endSPI(); + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros() - _spifuncruntime; + #endif + return true; + } +} + +// Writes an unsigned int as two bytes starting from a specific location in a page. +// Takes three arguments - +// 1. _addr --> Any address - from 0 to capacity +// 2. data --> One word to be written to a particular location on a page +// 3. errorCheck --> Turned on by default. Checks for writing errors +// WARNING: You can only write to previously erased memory locations (see datasheet). +// Use the eraseSector()/eraseBlock32K/eraseBlock64K commands to first clear memory (write 0xFFs) +bool SPIFlash::writeWord(uint32_t _addr, uint16_t data, bool errorCheck) { + //return _write(_addr, data, sizeof(data), errorCheck, _WORD_); + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros(); + #endif + if(!_prep(PAGEPROG, _addr, sizeof(data))) { + return false; + } + + _beginSPI(PAGEPROG); + for (uint8_t i = 0; i < sizeof(data); i++) { + _nextByte(WRITE, data >> (8*i)); + } + CHIP_DESELECT + + if (!errorCheck) { + _endSPI(); + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros() - _spifuncruntime; + #endif + return true; + } + else { + if (!_notBusy()) { + return false; + } + union { + uint8_t byte[2]; + uint16_t word; + } dataIn; + _currentAddress = _addr; + CHIP_SELECT + _nextByte(WRITE, READDATA); + _transferAddress(); + for (uint8_t i = 0; i < sizeof(data); i++) { + dataIn.byte[i] = _nextByte(READ); + } + _endSPI(); + if (dataIn.word != data) { + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros() - _spifuncruntime; + #endif + return false; + } + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros() - _spifuncruntime; + #endif + } + return true; +} + +// Writes a signed int as two bytes starting from a specific location in a page +// Takes three arguments - +// 1. _addr --> Any address - from 0 to capacity +// 2. data --> One short to be written to a particular location on a page +// 3. errorCheck --> Turned on by default. Checks for writing errors +// WARNING: You can only write to previously erased memory locations (see datasheet). +// Use the eraseSector()/eraseBlock32K/eraseBlock64K commands to first clear memory (write 0xFFs) +bool SPIFlash::writeShort(uint32_t _addr, int16_t data, bool errorCheck) { + //return _write(_addr, data, sizeof(data), errorCheck, _SHORT_); + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros(); + #endif + if(!_prep(PAGEPROG, _addr, sizeof(data))) { + return false; + } + + _beginSPI(PAGEPROG); + for (uint8_t i = 0; i < sizeof(data); i++) { + _nextByte(WRITE, data >> (8*i)); + } + CHIP_DESELECT + + if (!errorCheck) { + _endSPI(); + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros() - _spifuncruntime; + #endif + return true; + } + else { + if (!_notBusy()) { + return false; + } + union { + uint8_t byte[2]; + int16_t short_; + } dataIn; + _currentAddress = _addr; + CHIP_SELECT + _nextByte(WRITE, READDATA); + _transferAddress(); + for (uint8_t i = 0; i < sizeof(data); i++) { + dataIn.byte[i] = _nextByte(READ); + } + _endSPI(); + if (dataIn.short_ != data) { + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros() - _spifuncruntime; + #endif + return false; + } + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros() - _spifuncruntime; + #endif + } + return true; +} + +// Writes an unsigned long as four bytes starting from a specific location in a page. +// Takes three arguments - +// 1. _addr --> Any address - from 0 to capacity +// 2. data --> One unsigned long to be written to a particular location on a page +// 3. errorCheck --> Turned on by default. Checks for writing errors +// WARNING: You can only write to previously erased memory locations (see datasheet). +// Use the eraseSector()/eraseBlock32K/eraseBlock64K commands to first clear memory (write 0xFFs) +bool SPIFlash::writeULong(uint32_t _addr, uint32_t data, bool errorCheck) { + //return _write(_addr, data, sizeof(data), errorCheck, _ULONG_); + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros(); + #endif + if(!_prep(PAGEPROG, _addr, sizeof(data))) { + return false; + } + + _beginSPI(PAGEPROG); + for (uint8_t i = 0; i < sizeof(data); i++) { + _nextByte(WRITE, data >> (8*i)); + } + CHIP_DESELECT + + if (!errorCheck) { + _endSPI(); + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros() - _spifuncruntime; + #endif + return true; + } + else { + if (!_notBusy()) { + return false; + } + union { + uint8_t byte[4]; + uint32_t uLong; + } dataIn; + _currentAddress = _addr; + CHIP_SELECT + _nextByte(WRITE, READDATA); + _transferAddress(); + for (uint8_t i = 0; i < sizeof(data); i++) { + dataIn.byte[i] = _nextByte(READ); + } + _endSPI(); + if (dataIn.uLong != data) { + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros() - _spifuncruntime; + #endif + return false; + } + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros() - _spifuncruntime; + #endif + } + return true; +} + +// Writes a signed long as four bytes starting from a specific location in a page +// Takes three arguments - +// 1. _addr --> Any address - from 0 to capacity +// 2. data --> One signed long to be written to a particular location on a page +// 3. errorCheck --> Turned on by default. Checks for writing errors +// WARNING: You can only write to previously erased memory locations (see datasheet). +// Use the eraseSector()/eraseBlock32K/eraseBlock64K commands to first clear memory (write 0xFFs) +bool SPIFlash::writeLong(uint32_t _addr, int32_t data, bool errorCheck) { + //return _write(_addr, data, sizeof(data), errorCheck, _LONG_); + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros(); + #endif + if(!_prep(PAGEPROG, _addr, sizeof(data))) { + return false; + } + + _beginSPI(PAGEPROG); + for (uint8_t i = 0; i < sizeof(data); i++) { + _nextByte(WRITE, data >> (8*i)); + } + CHIP_DESELECT + + if (!errorCheck) { + _endSPI(); + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros() - _spifuncruntime; + #endif + return true; + } + else { + if (!_notBusy()) { + return false; + } + union { + uint8_t byte[4]; + int32_t Long; + } dataIn; + _currentAddress = _addr; + CHIP_SELECT + _nextByte(WRITE, READDATA); + _transferAddress(); + for (uint8_t i = 0; i < sizeof(data); i++) { + dataIn.byte[i] = _nextByte(READ); + } + _endSPI(); + if (dataIn.Long != data) { + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros() - _spifuncruntime; + #endif + return false; + } + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros() - _spifuncruntime; + #endif + } + return true; +} + +// Writes a float as four bytes starting from a specific location in a page +// Takes three arguments - +// 1. _addr --> Any address - from 0 to capacity +// 2. data --> One float to be written to a particular location on a page +// 3. errorCheck --> Turned on by default. Checks for writing errors +// WARNING: You can only write to previously erased memory locations (see datasheet). +// Use the eraseSector()/eraseBlock32K/eraseBlock64K commands to first clear memory (write 0xFFs) +bool SPIFlash::writeFloat(uint32_t _addr, float data, bool errorCheck) { + //return _write(_addr, data, sizeof(data), errorCheck, _FLOAT_); + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros(); + #endif + if(!_prep(PAGEPROG, _addr, sizeof(data))) { + return false; + } + + union { + float Float; + uint8_t byte[sizeof(float)]; + } dataOut; + dataOut.Float = data; + + _beginSPI(PAGEPROG); + for (uint8_t i = 0; i < sizeof(data); i++) { + _nextByte(WRITE, dataOut.byte[i]); + } + CHIP_DESELECT + + if (!errorCheck) { + _endSPI(); + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros() - _spifuncruntime; + #endif + return true; + } + else { + if (!_notBusy()) { + return false; + } + union { + uint8_t byte[4]; + float Float; + } dataIn; + _currentAddress = _addr; + CHIP_SELECT + _nextByte(WRITE, READDATA); + _transferAddress(); + for (uint8_t i = 0; i < sizeof(data); i++) { + dataIn.byte[i] = _nextByte(READ); + } + _endSPI(); + if (dataIn.Float != data) { + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros() - _spifuncruntime; + #endif + return false; + } + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros() - _spifuncruntime; + #endif + } + return true; +} + +// Writes a string to a specific location on a page +// Takes three arguments - +// 1. _addr --> Any address - from 0 to capacity +// 2. data --> One String to be written to a particular location on a page +// 3. errorCheck --> Turned on by default. Checks for writing errors +// WARNING: You can only write to previously erased memory locations (see datasheet). +// Use the eraseSector()/eraseBlock32K/eraseBlock64K commands to first clear memory (write 0xFFs) +bool SPIFlash::writeStr(uint32_t _addr, String &data, bool errorCheck) { + return _write(_addr, data, sizeof(data), errorCheck, _STRING_); +} + + + +// Erases a number of sectors or blocks as needed by the data being input. +// Takes an address and the size of the data being input as the arguments and erases the block/s of memory containing the address. +bool SPIFlash::eraseSection(uint32_t _addr, uint32_t _sz) { + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros(); + #endif + + if (!_prep(ERASEFUNC, _addr, _sz)) { + return false; + } + + // If size of data is > 4KB more than one sector needs to be erased. So the number of erase sessions is determined by the quotient of _sz/KB(4). If the _sz is not perfectly divisible by KB(4), then an additional sector has to be erased. + uint32_t noOfEraseRunsB4Boundary = 0; + uint32_t noOf4KBEraseRuns, KB64Blocks, KB32Blocks, KB4Blocks, totalBlocks; + + if (_sz/KB(4)) { + noOf4KBEraseRuns = _sz/KB(4); + } + else { + noOf4KBEraseRuns = 1; + } + KB64Blocks = noOf4KBEraseRuns/16; + KB32Blocks = (noOf4KBEraseRuns % 16) / 8; + KB4Blocks = (noOf4KBEraseRuns % 8); + totalBlocks = KB64Blocks + KB32Blocks + KB4Blocks; + //Serial.print("noOf4KBEraseRuns: "); + //Serial.println(noOf4KBEraseRuns); + //Serial.print("totalBlocks: "); + //Serial.println(totalBlocks); + + uint16_t _eraseFuncOrder[totalBlocks]; + + if (KB64Blocks) { + for (uint32_t i = 0; i < KB64Blocks; i++) { + _eraseFuncOrder[i] = kb64Erase.opcode; + } + } + if (KB32Blocks) { + for (uint32_t i = KB64Blocks; i < (KB64Blocks + KB32Blocks); i++) { + _eraseFuncOrder[i] = kb32Erase.opcode; + } + } + if (KB4Blocks) { + for (uint32_t i = (KB64Blocks + KB32Blocks); i < totalBlocks; i++) { + _eraseFuncOrder[i] = kb4Erase.opcode; + } + } + +// Now that the number of blocks to be erased have been calculated and the information saved, the erase function is carried out. + if (_addressOverflow) { + noOfEraseRunsB4Boundary = (_sz - _addressOverflow)/16; + noOfEraseRunsB4Boundary += ((_sz - _addressOverflow) % 16) / 8; + noOfEraseRunsB4Boundary += ((_sz - _addressOverflow) % 8); + //Serial.print("noOfEraseRunsB4Boundary: "); + //Serial.println(noOfEraseRunsB4Boundary); + } + if (!_addressOverflow) { + for (uint32_t j = 0; j < totalBlocks; j++) { + _beginSPI(_eraseFuncOrder[j]); //The address is transferred as a part of this function + _endSPI(); + + + //Serial.print("_eraseFuncOrder: 0x"); + //Serial.println(_eraseFuncOrder[j], HEX); + + uint16_t _timeFactor = 0; + if (_eraseFuncOrder[j] == kb64Erase.opcode) { + _timeFactor = kb64Erase.time; + } + if (_eraseFuncOrder[j] == kb32Erase.opcode) { + _timeFactor = kb32Erase.time; + } + if (_eraseFuncOrder[j] == kb4Erase.opcode) { + _timeFactor = kb4Erase.time; + } + if(!_notBusy(_timeFactor * 1000L)) { + return false; + } + if (j == noOfEraseRunsB4Boundary) { + if (!_prep(ERASEFUNC, (_addr + (_sz - _addressOverflow)), _sz)) { + return false; + } + //Serial.print("Overflow triggered"); + } + } + } + //_writeDisable(); + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros() - _spifuncruntime; + #endif + + return true; +} + +// Erases one 4k sector. +// Takes an address as the argument and erases the block containing the address. +bool SPIFlash::eraseSector(uint32_t _addr) { + if (!kb4Erase.supported) { + _troubleshoot(UNSUPPORTEDFUNC); + return false; + } + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros(); + #endif + if (!_prep(ERASEFUNC, _addr, KB(4))) { + return false; + } + _beginSPI(kb4Erase.opcode); //The address is transferred as a part of this function + _endSPI(); + + if(!_notBusy(kb4Erase.time)) { + return false; //Datasheet says erasing a sector takes 400ms max + } + //_writeDisable(); + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros() - _spifuncruntime; + #endif + + return true; +} + +// Erases one 32k block. +// Takes an address as the argument and erases the block containing the address. +bool SPIFlash::eraseBlock32K(uint32_t _addr) { + if (!kb32Erase.supported) { + _troubleshoot(UNSUPPORTEDFUNC); + return false; + } + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros(); + #endif + if (!_prep(ERASEFUNC, _addr, KB(32))) { + return false; + } + _beginSPI(kb32Erase.opcode); + _endSPI(); + + if(!_notBusy(kb32Erase.time)) { + return false; //Datasheet says erasing a sector takes 400ms max + } + _writeDisable(); + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros() - _spifuncruntime; + #endif + + return true; +} + +// Erases one 64k block. +// Takes an address as the argument and erases the block containing the address. +bool SPIFlash::eraseBlock64K(uint32_t _addr) { + if (!kb64Erase.supported) { + _troubleshoot(UNSUPPORTEDFUNC); + return false; + } + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros(); + #endif + if (!_prep(ERASEFUNC, _addr, KB(64))) { + return false; + } + + _beginSPI(kb64Erase.opcode); + _endSPI(); + + if(!_notBusy(kb64Erase.time)) { + return false; //Datasheet says erasing a sector takes 400ms max + } + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros() - _spifuncruntime; + #endif + return true; +} + +//Erases whole chip. Think twice before using. +bool SPIFlash::eraseChip(void) { + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros(); + #endif + if(_isChipPoweredDown() || !_notBusy() || !_writeEnable()) { + return false; + } + + _beginSPI(chipErase.opcode); + _endSPI(); + + while(_readStat1() & BUSY) { + //_delay_us(30000L); + } + _endSPI(); + + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros() - _spifuncruntime; + #endif + return true; + +} + +//Suspends current Block Erase/Sector Erase/Page Program. Does not suspend chipErase(). +//Page Program, Write Status Register, Erase instructions are not allowed. +//Erase suspend is only allowed during Block/Sector erase. +//Program suspend is only allowed during Page/Quad Page Program +bool SPIFlash::suspendProg(void) { + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros(); + #endif + if(_isChipPoweredDown() || _notBusy()) { + return false; + } + + if(!_noSuspend()) { + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros() - _spifuncruntime; + #endif + return true; + } + + _beginSPI(SUSPEND); + _endSPI(); + _delay_us(20); + if(!_notBusy(50) || _noSuspend()) { + return false; + } + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros() - _spifuncruntime; + #endif + return true; +} + +//Resumes previously suspended Block Erase/Sector Erase/Page Program. +bool SPIFlash::resumeProg(void) { + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros(); + #endif + if(_isChipPoweredDown() || !_notBusy() || _noSuspend()) { + return false; + } + + _beginSPI(RESUME); + _endSPI(); + + _delay_us(20); + + if(_notBusy(10) || !_noSuspend()) { + return false; + } + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros() - _spifuncruntime; + #endif + return true; + +} + +//Puts device in low power state. Good for battery powered operations. +//In powerDown() the chip will only respond to powerUp() +bool SPIFlash::powerDown(void) { + if (_chip.manufacturerID != MICROCHIP_MANID) { + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros(); + #endif + if(!_notBusy(20)) + return false; + + _beginSPI(POWERDOWN); + _endSPI(); + + _delay_us(5); + + #ifdef RUNDIAGNOSTIC + chipPoweredDown = true; + bool _retVal = !_writeEnable(false); + _spifuncruntime = micros() - _spifuncruntime; + return _retVal; + #else + chipPoweredDown = true; + return !_writeEnable(false); + #endif + } + else { + _troubleshoot(UNSUPPORTEDFUNC); + return false; + } +} + +//Wakes chip from low power state. +bool SPIFlash::powerUp(void) { + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros(); + #endif + _beginSPI(RELEASE); + _endSPI(); + _delay_us(3); //Max release enable time according to the Datasheet + + #ifdef RUNDIAGNOSTIC + if (_writeEnable(false)) { + _writeDisable(); + _spifuncruntime = micros() - _spifuncruntime; + chipPoweredDown = false; + return true; + } + return false; + #else + if (_writeEnable(false)) { + _writeDisable(); + chipPoweredDown = false; + return true; + } + return false; + #endif +} + +/* Note: _writeDisable() is not required at the end of any function that writes to the Flash memory because the Write Enable Latch (WEL) flag is cleared to 0 i.e. to write disable state upon the following conditions being completed: +Power-up, Write Disable, Page Program, Quad Page Program, Sector Erase, Block Erase, Chip Erase, Write Status Register, Erase Security Register and Program Security register */ diff --git a/speeduino/src/SPIAsEEPROM/SPIFlash.h b/speeduino/src/SPIAsEEPROM/SPIFlash.h new file mode 100755 index 00000000..bff1393f --- /dev/null +++ b/speeduino/src/SPIAsEEPROM/SPIFlash.h @@ -0,0 +1,399 @@ +/* Arduino SPIMemory Library v.3.2.1 + * Copyright (C) 2017 by Prajwal Bhattaram + * Created by Prajwal Bhattaram - 19/05/2015 + * Modified by @boseji - 02/03/2017 + * Modified by Prajwal Bhattaram - 21/05/2018 + * + * This file is part of the Arduino SPIMemory Library. This library is for + * Winbond NOR flash memory modules. In its current form it enables reading + * and writing individual data variables, structs and arrays from and to various locations; + * reading and writing pages; continuous read functions; sector, block and chip erase; + * suspending and resuming programming/erase and powering down for low power operation. + * + * This Library 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. + * + * This Library 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 v3.0 + * along with the Arduino SPIMemory Library. If not, see + * . + */ + +#ifndef SPIFLASH_H +#define SPIFLASH_H + +#include "SPIMemory.h" + +class SPIFlash { +public: + //------------------------------------ Constructor ------------------------------------// + //New Constructor to Accept the PinNames as a Chip select Parameter - @boseji 02.03.17 + #if defined (ARDUINO_ARCH_SAMD) || defined(ARCH_STM32) + SPIFlash(uint8_t cs = CS, SPIClass *spiinterface=&SPI); + #elif defined (BOARD_RTL8195A) + SPIFlash(PinName cs = CS); + #else + SPIFlash(uint8_t cs = CS); + #endif + //----------------------------- Initial / Chip Functions ------------------------------// + bool begin(uint32_t flashChipSize = 0); + void setClock(uint32_t clockSpeed); + bool libver(uint8_t *b1, uint8_t *b2, uint8_t *b3); + bool sfdpPresent(void); + uint8_t error(bool verbosity = false); + uint16_t getManID(void); + uint32_t getJEDECID(void); + uint64_t getUniqueID(void); + uint32_t getAddress(uint16_t size); + uint16_t sizeofStr(String &inputStr); + uint32_t getCapacity(void); + uint32_t getMaxPage(void); + float functionRunTime(void); + //-------------------------------- Write / Read Bytes ---------------------------------// + bool writeByte(uint32_t _addr, uint8_t data, bool errorCheck = true); + uint8_t readByte(uint32_t _addr, bool fastRead = false); + //----------------------------- Write / Read Byte Arrays ------------------------------// + bool writeByteArray(uint32_t _addr, uint8_t *data_buffer, size_t bufferSize, bool errorCheck = true); + bool readByteArray(uint32_t _addr, uint8_t *data_buffer, size_t bufferSize, bool fastRead = false); + //-------------------------------- Write / Read Chars ---------------------------------// + bool writeChar(uint32_t _addr, int8_t data, bool errorCheck = true); + int8_t readChar(uint32_t _addr, bool fastRead = false); + //------------------------------ Write / Read Char Arrays -----------------------------// + bool writeCharArray(uint32_t _addr, char *data_buffer, size_t bufferSize, bool errorCheck = true); + bool readCharArray(uint32_t _addr, char *data_buffer, size_t buffer_size, bool fastRead = false); + //-------------------------------- Write / Read Shorts --------------------------------// + bool writeShort(uint32_t _addr, int16_t data, bool errorCheck = true); + int16_t readShort(uint32_t _addr, bool fastRead = false); + //-------------------------------- Write / Read Words ---------------------------------// + bool writeWord(uint32_t _addr, uint16_t data, bool errorCheck = true); + uint16_t readWord(uint32_t _addr, bool fastRead = false); + //-------------------------------- Write / Read Longs ---------------------------------// + bool writeLong(uint32_t _addr, int32_t data, bool errorCheck = true); + int32_t readLong(uint32_t _addr, bool fastRead = false); + //--------------------------- Write / Read Unsigned Longs -----------------------------// + bool writeULong(uint32_t _addr, uint32_t data, bool errorCheck = true); + uint32_t readULong(uint32_t _addr, bool fastRead = false); + //-------------------------------- Write / Read Floats --------------------------------// + bool writeFloat(uint32_t _addr, float data, bool errorCheck = true); + float readFloat(uint32_t _addr, bool fastRead = false); + //-------------------------------- Write / Read Strings -------------------------------// + bool writeStr(uint32_t _addr, String &data, bool errorCheck = true); + bool readStr(uint32_t _addr, String &data, bool fastRead = false); + //------------------------------- Write / Read Anything -------------------------------// + + template bool writeAnything(uint32_t _addr, const T& data, bool errorCheck = true); + template bool readAnything(uint32_t _addr, T& data, bool fastRead = false); + //-------------------------------- Erase functions ------------------------------------// + bool eraseSection(uint32_t _addr, uint32_t _sz); + bool eraseSector(uint32_t _addr); + bool eraseBlock32K(uint32_t _addr); + bool eraseBlock64K(uint32_t _addr); + bool eraseChip(void); + //-------------------------------- Power functions ------------------------------------// + bool suspendProg(void); + bool resumeProg(void); + bool powerDown(void); + bool powerUp(void); + //-------------------------- Public Arduino Due Functions -----------------------------// +//#if defined (ARDUINO_ARCH_SAM) + //uint32_t freeRAM(void); +//#endif + //------------------------------- Public variables ------------------------------------// + +private: + //------------------------------- Private functions -----------------------------------// + unsigned _createMask(unsigned a, unsigned b); + void _troubleshoot(uint8_t _code, bool printoverride = false); + void _endSPI(void); + bool _disableGlobalBlockProtect(void); + bool _isChipPoweredDown(void); + bool _prep(uint8_t opcode, uint32_t _addr, uint32_t size = 0); + bool _startSPIBus(void); + bool _beginSPI(uint8_t opcode); + bool _noSuspend(void); + bool _notBusy(uint32_t timeout = BUSY_TIMEOUT); + bool _notPrevWritten(uint32_t _addr, uint32_t size = 1); + bool _writeEnable(bool _troubleshootEnable = true); + bool _writeDisable(void); + bool _getJedecId(void); + bool _getManId(uint8_t *b1, uint8_t *b2); + bool _chipID(uint32_t flashChipSize = 0); + bool _transferAddress(void); + bool _addressCheck(uint32_t _addr, uint32_t size = 1); + bool _enable4ByteAddressing(void); + bool _disable4ByteAddressing(void); + uint8_t _nextByte(char IOType, uint8_t data = NULLBYTE); + uint16_t _nextInt(uint16_t = NULLINT); + void _nextBuf(uint8_t opcode, uint8_t *data_buffer, uint32_t size); + uint8_t _readStat1(void); + uint8_t _readStat2(void); + uint8_t _readStat3(void); + bool _getSFDPTable(uint32_t _tableAddress, uint8_t *data_buffer, uint8_t numberOfDWords); + bool _getSFDPData(uint32_t _address, uint8_t *data_buffer, uint8_t numberOfBytes); + uint32_t _getSFDPdword(uint32_t _tableAddress, uint8_t dWordNumber); + uint16_t _getSFDPint(uint32_t _tableAddress, uint8_t dWordNumber, uint8_t startByte); + uint8_t _getSFDPbyte(uint32_t _tableAddress, uint8_t dWordNumber, uint8_t byteNumber); + bool _getSFDPbit(uint32_t _tableAddress, uint8_t dWordNumber, uint8_t bitNumber); + uint32_t _getSFDPTableAddr(uint32_t paramHeaderNum); + uint32_t _calcSFDPEraseTimeUnits(uint8_t _unitBits); + bool _checkForSFDP(void); + void _getSFDPEraseParam(void); + void _getSFDPProgramTimeParam(void); + bool _getSFDPFlashParam(void); + template bool _write(uint32_t _addr, const T& value, uint32_t _sz, bool errorCheck, uint8_t _dataType); + template bool _read(uint32_t _addr, T& value, uint32_t _sz, bool fastRead = false, uint8_t _dataType = 0x00); + //template bool _writeErrorCheck(uint32_t _addr, const T& value); + template bool _writeErrorCheck(uint32_t _addr, const T& value, uint32_t _sz, uint8_t _dataType = 0x00); + //-------------------------------- Private variables ----------------------------------// + #ifdef SPI_HAS_TRANSACTION + SPISettings _settings; + #endif + //If multiple SPI ports are available this variable is used to choose between them (SPI, SPI1, SPI2 etc.) + SPIClass *_spi; + #if !defined (BOARD_RTL8195A) + uint8_t csPin; + #else + // Object declaration for the GPIO HAL type for csPin - @boseji 02.03.17 + gpio_t csPin; + #endif + volatile uint8_t *cs_port; + bool pageOverflow, SPIBusState; + bool chipPoweredDown = false; + bool address4ByteEnabled = false; + bool _loopedOver = false; + uint8_t cs_mask, errorcode, stat1, stat2, stat3, _SPCR, _SPSR, _a0, _a1, _a2; + char READ = 'R'; + char WRITE = 'W'; + float _spifuncruntime = 0; + struct chipID { + bool supported; + bool supportedMan; + bool sfdpAvailable; + uint8_t manufacturerID; + uint8_t memoryTypeID; + uint8_t capacityID; + uint32_t capacity; + uint32_t eraseTime; + }; + chipID _chip; + struct eraseParam{ + bool supported; + uint8_t opcode; + uint32_t time; + } kb4Erase, kb32Erase, kb64Erase, kb256Erase, chipErase; + uint8_t _noOfParamHeaders, _noOfBasicParamDwords; + uint16_t _eraseTimeMultiplier, _prgmTimeMultiplier, _pageSize; + uint32_t currentAddress, _currentAddress = 0; + uint32_t _addressOverflow = false; + uint32_t _BasicParamTableAddr, _SectorMapParamTableAddr, _byteFirstPrgmTime, _byteAddnlPrgmTime, _pagePrgmTime; + uint8_t _uniqueID[8]; + const uint8_t _capID[16] = + {0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x43, 0x4B, 0x00, 0x01, 0x13, 0x37}; + + const uint32_t _memSize[16] = + {KB(64), KB(128), KB(256), KB(512), MB(1), MB(2), MB(4), MB(8), MB(16), MB(32), MB(8), MB(8), KB(256), KB(512), MB(4), KB(512)}; + // To understand the _memSize definitions check defines.h + + const uint8_t _supportedManID[7] = {WINBOND_MANID, MICROCHIP_MANID, CYPRESS_MANID, ADESTO_MANID, MICRON_MANID, ON_MANID, AMIC_MANID}; + + const uint8_t _altChipEraseReq[3] = {A25L512, M25P40, SST26}; +}; + +//--------------------------------- Public Templates ------------------------------------// + +// Writes any type of data to a specific location in the flash memory. +// Takes three arguments - +// 1. _addr --> Any address from 0 to maxAddress +// 2. T& value --> Variable to write +// 3. errorCheck --> Turned on by default. Checks for writing errors +// WARNING: You can only write to previously erased memory locations (see datasheet). +// Use the eraseSector()/eraseBlock32K/eraseBlock64K commands to first clear memory (write 0xFFs) +template bool SPIFlash::writeAnything(uint32_t _addr, const T& data, bool errorCheck) { + return _write(_addr, data, sizeof(data), errorCheck, _STRUCT_); +} + +// Reads any type of data from a specific location in the flash memory. +// Takes three arguments - +// 1. _addr --> Any address from 0 to maxAddress +// 2. T& value --> Variable to return data into +// 3. fastRead --> defaults to false - executes _beginFastRead() if set to true +template bool SPIFlash::readAnything(uint32_t _addr, T& data, bool fastRead) { + return _read(_addr, data, sizeof(data), fastRead); +} + +//---------------------------------- Private Templates ----------------------------------// + +template bool SPIFlash::_writeErrorCheck(uint32_t _addr, const T& value, uint32_t _sz, uint8_t _dataType) { + if (_isChipPoweredDown() || !_addressCheck(_addr, _sz) || !_notBusy()) { + return false; + } + const uint8_t* p = (const uint8_t*)(const void*)&value; + /*if (_dataType == _STRUCT_) { + uint8_t _inByte[_sz]; + _beginSPI(READDATA); + _nextBuf(READDATA, &(*_inByte), _sz); + _endSPI(); + for (uint16_t i = 0; i < _sz; i++) { + if (*p++ != _inByte[i]) { + _troubleshoot(0x0A); //0x0A is ERRORCHKFAIL + return false; + } + else { + return true; + } + } + } + else {*/ + CHIP_SELECT + _nextByte(WRITE, READDATA); + _transferAddress(); + for (uint16_t i = 0; i < _sz; i++) { + if (*p++ != _nextByte(READ)) { + _troubleshoot(0x0A); //0x0A is ERRORCHKFAIL + _endSPI(); + return false; + } + } + _endSPI(); + //} + return true; +} + +// Writes any type of data to a specific location in the flash memory. +// Takes four arguments - +// 1. _addr --> Any address from 0 to maxAddress +// 2. T& value --> Variable to write +// 3. _sz --> Size of variable in bytes (1 byte = 8 bits) +// 4. errorCheck --> Turned on by default. Checks for writing errors +// WARNING: You can only write to previously erased memory locations (see datasheet). +// Use the eraseSector()/eraseBlock32K/eraseBlock64K commands to first clear memory (write 0xFFs) + +template bool SPIFlash::_write(uint32_t _addr, const T& value, uint32_t _sz, bool errorCheck, uint8_t _dataType) { + bool _retVal; +#ifdef RUNDIAGNOSTIC + _spifuncruntime = micros(); +#endif + + uint32_t _addrIn = _addr; + if (!_prep(PAGEPROG, _addrIn, _sz)) { + return false; + } + _addrIn = _currentAddress; + //Serial.print("_addrIn: "); + //Serial.println(_addrIn, HEX); + const uint8_t* p = ((const uint8_t*)(const void*)&value); + //Serial.print(F("Address being written to: ")); + //Serial.println(_addr); + uint32_t length = _sz; + uint16_t maxBytes = SPI_PAGESIZE-(_addrIn % SPI_PAGESIZE); // Force the first set of bytes to stay within the first page + + if (!SPIBusState) { + _startSPIBus(); + } + CHIP_SELECT + _nextByte(WRITE, PAGEPROG); + _transferAddress(); + + if (maxBytes > length) { + for (uint16_t i = 0; i < length; ++i) { + _nextByte(WRITE, *p++); + } + CHIP_DESELECT + } + else { + uint32_t writeBufSz; + uint16_t data_offset = 0; + + do { + writeBufSz = (length<=maxBytes) ? length : maxBytes; + + for (uint16_t i = 0; i < writeBufSz; ++i) { + _nextByte(WRITE, *p++); + } + CHIP_DESELECT + if (!_addressOverflow) { + _currentAddress += writeBufSz; + } + else { + if (data_offset >= _addressOverflow) { + _currentAddress = 0x00; + _addressOverflow = false; + } + } + data_offset += writeBufSz; + length -= writeBufSz; + maxBytes = SPI_PAGESIZE; // Now we can do up to 256 bytes per loop + if(!_notBusy() || !_writeEnable()) { + return false; + } + } while (length > 0); + } + + if (!errorCheck) { + _endSPI(); + return true; + } + else { + //Serial.print(F("Address sent to error check: ")); + //Serial.println(_addr); + _retVal = _writeErrorCheck(_addr, value, _sz, _dataType); + } +#ifdef RUNDIAGNOSTIC + _spifuncruntime = micros() - _spifuncruntime; +#endif + return _retVal; +} + +// Reads any type of data from a specific location in the flash memory. +// Takes four arguments - +// 1. _addr --> Any address from 0 to maxAddress +// 2. T& value --> Variable to return data into +// 3. _sz --> Size of the variable in bytes (1 byte = 8 bits) +// 4. fastRead --> defaults to false - executes _beginFastRead() if set to true +template bool SPIFlash::_read(uint32_t _addr, T& value, uint32_t _sz, bool fastRead, uint8_t _dataType) { + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros(); + #endif + if (!_prep(READDATA, _addr, _sz)) { + return false; + } + else { + uint8_t* p = (uint8_t*)(void*)&value; + + if (_dataType == _STRING_) { + char _inChar[_sz]; + _beginSPI(READDATA); + _nextBuf(READDATA, (uint8_t*) &(*_inChar), _sz); + _endSPI(); + for (uint16_t i = 0; i < _sz; i++) { + *p++ = _inChar[i]; + } + } + else { + CHIP_SELECT + if (fastRead) { + _nextByte(WRITE, FASTREAD); + } + else { + _nextByte(WRITE, READDATA); + } + _transferAddress(); + for (uint16_t i = 0; i < _sz; i++) { + *p++ =_nextByte(READ); + } + _endSPI(); + } + } + #ifdef RUNDIAGNOSTIC + _spifuncruntime = micros() - _spifuncruntime; + #endif + return true; +} + +#endif // _SPIFLASH_H_ diff --git a/speeduino/src/SPIAsEEPROM/SPIFlashIO.cpp b/speeduino/src/SPIAsEEPROM/SPIFlashIO.cpp new file mode 100755 index 00000000..7611c209 --- /dev/null +++ b/speeduino/src/SPIAsEEPROM/SPIFlashIO.cpp @@ -0,0 +1,604 @@ +/* Arduino SPIMemory Library v.3.2.1 + * Copyright (C) 2017 by Prajwal Bhattaram + * Created by Prajwal Bhattaram - 19/05/2015 + * Modified by @boseji - 02/03/2017 + * Modified by Prajwal Bhattaram - 21/05/2018 + * + * This file is part of the Arduino SPIMemory Library. This library is for + * Winbond NOR flash memory modules. In its current form it enables reading + * and writing individual data variables, structs and arrays from and to various locations; + * reading and writing pages; continuous read functions; sector, block and chip erase; + * suspending and resuming programming/erase and powering down for low power operation. + * + * This Library 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. + * + * This Library 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 v3.0 + * along with the Arduino SPIMemory Library. If not, see + * . + */ + + #include "SPIFlash.h" + + //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// + // Private functions used by read, write and erase operations // + //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// + // Creates bit mask from bit x to bit y + unsigned SPIFlash::_createMask(unsigned x, unsigned y) { + unsigned r = 0; + for (unsigned i=x; i<=y; i++) { + r |= 1 << i; + } + return r; + } + + //Checks to see if page overflow is permitted and assists with determining next address to read/write. + //Sets the global address variable + bool SPIFlash::_addressCheck(uint32_t _addr, uint32_t size) { + uint32_t _submittedAddress = _addr; + uint8_t _errorcode = error(); + if (_errorcode == UNKNOWNCAP || _errorcode == NORESPONSE) { + return false; + } + if (!_chip.capacity) { + _troubleshoot(CALLBEGIN); + return false; + } + + //Serial.print("_chip.capacity: "); + //Serial.println(_chip.capacity, HEX); + + if (_submittedAddress + size >= _chip.capacity) { + //Serial.print("_submittedAddress + size: "); + //Serial.println(_submittedAddress + size, HEX); + #ifdef DISABLEOVERFLOW + _troubleshoot(OUTOFBOUNDS); + return false; // At end of memory - (!pageOverflow) + #else + _addressOverflow = ((_submittedAddress + size) - _chip.capacity); + _currentAddress = _addr; + //Serial.print("_addressOverflow: "); + //Serial.println(_addressOverflow, HEX); + return true; // At end of memory - (pageOverflow) + #endif + } + else { + _addressOverflow = false; + _currentAddress = _addr; + return true; // Not at end of memory if (address < _chip.capacity) + } + //Serial.print("_currentAddress: "); + //Serial.println(_currentAddress, HEX); + } + + // Checks to see if the block of memory has been previously written to + bool SPIFlash::_notPrevWritten(uint32_t _addr, uint32_t size) { + uint8_t _dat; + _beginSPI(READDATA); + for (uint32_t i = 0; i < size; i++) { + if (_nextByte(READ) != 0xFF) { + CHIP_DESELECT; + _troubleshoot(PREVWRITTEN); + return false; + } + } + CHIP_DESELECT + return true; + } + + //Double checks all parameters before calling a read or write. Comes in two variants + //Takes address and returns the address if true, else returns false. Throws an error if there is a problem. + bool SPIFlash::_prep(uint8_t opcode, uint32_t _addr, uint32_t size) { + // If the flash memory is >= 256 MB enable 4-byte addressing + if (_chip.manufacturerID == WINBOND_MANID && _addr >= MB(16)) { + if (!_enable4ByteAddressing()) { // If unable to enable 4-byte addressing + return false; + } // TODO: Add SFDP compatibility here + } + switch (opcode) { + case PAGEPROG: + //Serial.print(F("Address being prepped: ")); + //Serial.println(_addr); + #ifndef HIGHSPEED + if(_isChipPoweredDown() || !_addressCheck(_addr, size) || !_notPrevWritten(_addr, size) || !_notBusy() || !_writeEnable()) { + return false; + } + #else + if (_isChipPoweredDown() || !_addressCheck(_addr, size) || !_notBusy() || !_writeEnable()) { + return false; + } + #endif + return true; + break; + + case ERASEFUNC: + if(_isChipPoweredDown() || !_addressCheck(_addr, size) || !_notBusy() || !_writeEnable()) { + return false; + } + return true; + break; + + default: + if (_isChipPoweredDown() || !_addressCheck(_addr, size) || !_notBusy()) { + return false; + } + #ifdef ENABLEZERODMA + _delay_us(3500L); + #endif + return true; + break; + } + } + + // Transfer Address. + bool SPIFlash::_transferAddress(void) { + if (address4ByteEnabled) { + _nextByte(WRITE, Highest(_currentAddress)); + } + _nextByte(WRITE, Higher(_currentAddress)); + _nextByte(WRITE, Hi(_currentAddress)); + _nextByte(WRITE, Lo(_currentAddress)); + return true; + } + + bool SPIFlash::_startSPIBus(void) { + #ifndef SPI_HAS_TRANSACTION + noInterrupts(); + #endif + + #if defined (ARDUINO_ARCH_SAM) + due.SPIInit(DUE_SPI_CLK); + #elif defined (ARDUINO_ARCH_SAMD) + #ifdef SPI_HAS_TRANSACTION + _spi->beginTransaction(_settings); + #else + _spi->setClockDivider(SPI_CLOCK_DIV_4); + _spi->setDataMode(SPI_MODE0); + _spi->setBitOrder(MSBFIRST); + #endif + #if defined ENABLEZERODMA + dma_init(); + #endif + #else + #if defined (ARDUINO_ARCH_AVR) + //save current SPI settings + _SPCR = SPCR; + _SPSR = SPSR; + #endif + #ifdef SPI_HAS_TRANSACTION + SPI.beginTransaction(_settings); + #else + SPI.setClockDivider(SPI_CLOCK_DIV4); + SPI.setDataMode(SPI_MODE0); + SPI.setBitOrder(MSBFIRST); + #endif + #endif + SPIBusState = true; + return true; + } + + //Initiates SPI operation - but data is not transferred yet. Always call _prep() before this function (especially when it involves writing or reading to/from an address) + bool SPIFlash::_beginSPI(uint8_t opcode) { + if (!SPIBusState) { + _startSPIBus(); + } + CHIP_SELECT + switch (opcode) { + case READDATA: + _nextByte(WRITE, opcode); + _transferAddress(); + break; + + case PAGEPROG: + _nextByte(WRITE, opcode); + _transferAddress(); + break; + + case FASTREAD: + _nextByte(WRITE, opcode); + _nextByte(WRITE, DUMMYBYTE); + _transferAddress(); + break; + + case SECTORERASE: + _nextByte(WRITE, opcode); + _transferAddress(); + break; + + case BLOCK32ERASE: + _nextByte(WRITE, opcode); + _transferAddress(); + break; + + case BLOCK64ERASE: + _nextByte(WRITE, opcode); + _transferAddress(); + break; + + default: + _nextByte(WRITE, opcode); + break; + } + return true; + } + //SPI data lines are left open until _endSPI() is called + + //Reads/Writes next byte. Call 'n' times to read/write 'n' number of bytes. Should be called after _beginSPI() + uint8_t SPIFlash::_nextByte(char IOType, uint8_t data) { + #if defined (ARDUINO_ARCH_SAMD) + #ifdef ENABLEZERODMA + union { + uint8_t dataBuf[1]; + uint8_t val; + } rxData, txData; + txData.val = data; + spi_transfer(txData.dataBuf, rxData.dataBuf, 1); + return rxData.val; + #else + return xfer(data); + #endif + #else + return xfer(data); + #endif + } + + //Reads/Writes next int. Call 'n' times to read/write 'n' number of integers. Should be called after _beginSPI() + uint16_t SPIFlash::_nextInt(uint16_t data) { + #if defined (ARDUINO_ARCH_SAMD) + return _spi->transfer16(data); + #else + return SPI.transfer16(data); + #endif + } + + //Reads/Writes next data buffer. Should be called after _beginSPI() + void SPIFlash::_nextBuf(uint8_t opcode, uint8_t *data_buffer, uint32_t size) { + uint8_t *_dataAddr = &(*data_buffer); + switch (opcode) { + case READDATA: + #if defined (ARDUINO_ARCH_SAM) + due.SPIRecByte(&(*data_buffer), size); + #elif defined (ARDUINO_ARCH_SAMD) + #ifdef ENABLEZERODMA + spi_read(&(*data_buffer), size); + #else + _spi->transfer(&data_buffer[0], size); + #endif + #elif defined (ARDUINO_ARCH_AVR) + SPI.transfer(&(*data_buffer), size); + #else + for (uint16_t i = 0; i < size; i++) { + *_dataAddr = xfer(NULLBYTE); + _dataAddr++; + } + #endif + break; + + case PAGEPROG: + #if defined (ARDUINO_ARCH_SAM) + due.SPISendByte(&(*data_buffer), size); + #elif defined (ARDUINO_ARCH_SAMD) + #ifdef ENABLEZERODMA + spi_write(&(*data_buffer), size); + #else + _spi->transfer(&data_buffer[0], size); + #endif + #elif defined (ARDUINO_ARCH_AVR) + SPI.transfer(&(*data_buffer), size); + #else + for (uint16_t i = 0; i < size; i++) { + xfer(*_dataAddr); + _dataAddr++; + } + #endif + break; + } + } + + //Stops all operations. Should be called after all the required data is read/written from repeated _nextByte() calls + void SPIFlash::_endSPI(void) { + CHIP_DESELECT + + if (address4ByteEnabled) { // If the previous operation enabled 4-byte addressing, disable it + _disable4ByteAddressing(); + } + + #ifdef SPI_HAS_TRANSACTION + #if defined (ARDUINO_ARCH_SAMD) + _spi->endTransaction(); + #else + SPI.endTransaction(); + #endif + #else + interrupts(); + #endif + #if defined (ARDUINO_ARCH_AVR) + SPCR = _SPCR; + SPSR = _SPSR; + #endif + SPIBusState = false; + } + + // Checks if status register 1 can be accessed - used to check chip status, during powerdown and power up and for debugging + uint8_t SPIFlash::_readStat1(void) { + _beginSPI(READSTAT1); + stat1 = _nextByte(READ); + CHIP_DESELECT + return stat1; + } + + // Checks if status register 2 can be accessed, if yes, reads and returns it + uint8_t SPIFlash::_readStat2(void) { + _beginSPI(READSTAT2); + stat2 = _nextByte(READ); + //stat2 = _nextByte(READ); + CHIP_DESELECT + return stat2; + } + + // Checks if status register 3 can be accessed, if yes, reads and returns it + uint8_t SPIFlash::_readStat3(void) { + _beginSPI(READSTAT3); + stat3 = _nextByte(READ); + //stat2 = _nextByte(READ); + CHIP_DESELECT + return stat3; + } + + // Checks to see if 4-byte addressing is already enabled and if not, enables it + bool SPIFlash::_enable4ByteAddressing(void) { + if (_readStat3() & ADS) { + return true; + } + _beginSPI(ADDR4BYTE_EN); + CHIP_DESELECT + if (_readStat3() & ADS) { + address4ByteEnabled = true; + return true; + } + else { + _troubleshoot(UNABLETO4BYTE); + return false; + } + } + + // Checks to see if 4-byte addressing is already disabled and if not, disables it + bool SPIFlash::_disable4ByteAddressing(void) { + if (!(_readStat3() & ADS)) { // If 4 byte addressing is disabled (default state) + return true; + } + _beginSPI(ADDR4BYTE_DIS); + CHIP_DESELECT + if (_readStat3() & ADS) { + _troubleshoot(UNABLETO3BYTE); + return false; + } + address4ByteEnabled = false; + return true; + } + + // Checks the erase/program suspend flag before enabling/disabling a program/erase suspend operation + bool SPIFlash::_noSuspend(void) { + switch (_chip.manufacturerID) { + case WINBOND_MANID: + if(_readStat2() & SUS) { + _troubleshoot(SYSSUSPEND); + return false; + } + return true; + break; + + case MICROCHIP_MANID: + _readStat1(); + if(stat1 & WSE || stat1 & WSP) { + _troubleshoot(SYSSUSPEND); + return false; + } + } + return true; + } + + // Checks to see if chip is powered down. If it is, retrns true. If not, returns false. + bool SPIFlash::_isChipPoweredDown(void) { + if (chipPoweredDown) { + _troubleshoot(CHIPISPOWEREDDOWN); + return true; + } + else { + return false; + } + } + + // Polls the status register 1 until busy flag is cleared or timeout + bool SPIFlash::_notBusy(uint32_t timeout) { + _delay_us(WINBOND_WRITE_DELAY); + uint32_t _time = micros(); + + do { + _readStat1(); + if (!(stat1 & BUSY)) + { + return true; + } + + } while ((micros() - _time) < timeout); + if (timeout <= (micros() - _time)) { + _troubleshoot(CHIPBUSY); + return false; + } + return true; + } + + //Enables writing to chip by setting the WRITEENABLE bit + bool SPIFlash::_writeEnable(bool _troubleshootEnable) { + _beginSPI(WRITEENABLE); + CHIP_DESELECT + if (!(_readStat1() & WRTEN)) { + if (_troubleshootEnable) { + _troubleshoot(CANTENWRITE); + } + return false; + } + return true; + } + + //Disables writing to chip by setting the Write Enable Latch (WEL) bit in the Status Register to 0 + //_writeDisable() is not required under the following conditions because the Write Enable Latch (WEL) flag is cleared to 0 + // i.e. to write disable state: + // Power-up, Write Disable, Page Program, Quad Page Program, Sector Erase, Block Erase, Chip Erase, Write Status Register, + // Erase Security Register and Program Security register + bool SPIFlash::_writeDisable(void) { + _beginSPI(WRITEDISABLE); + CHIP_DESELECT + return true; + } + + //Checks the device ID to establish storage parameters + bool SPIFlash::_getManId(uint8_t *b1, uint8_t *b2) { + if(!_notBusy()) { + return false; + } + _beginSPI(MANID); + _nextByte(READ); + _nextByte(READ); + _nextByte(READ); + *b1 = _nextByte(READ); + *b2 = _nextByte(READ); + CHIP_DESELECT + return true; + } + + //Checks for presence of chip by requesting JEDEC ID + bool SPIFlash::_getJedecId(void) { + if(!_notBusy()) { + return false; + } + _beginSPI(JEDECID); + _chip.manufacturerID = _nextByte(READ); // manufacturer id + _chip.memoryTypeID = _nextByte(READ); // memory type + _chip.capacityID = _nextByte(READ); // capacity + CHIP_DESELECT + if (!_chip.manufacturerID) { + _troubleshoot(NORESPONSE); + return false; + } + else { + return true; + } + } + + bool SPIFlash::_disableGlobalBlockProtect(void) { + if (_chip.memoryTypeID == SST25) { + _readStat1(); + uint8_t _tempStat1 = stat1 & 0xC3; + _beginSPI(WRITESTATEN); + CHIP_DESELECT + _beginSPI(WRITESTAT1); + _nextByte(WRITE, _tempStat1); + CHIP_DESELECT + } + else if (_chip.memoryTypeID == SST26) { + if(!_notBusy()) { + return false; + } + _writeEnable(); + _delay_us(10); + _beginSPI(ULBPR); + CHIP_DESELECT + _delay_us(50); + _writeDisable(); + } + return true; + } + + //Identifies the chip + bool SPIFlash::_chipID(uint32_t flashChipSize) { + //set some default values + kb4Erase.supported = kb32Erase.supported = kb64Erase.supported = chipErase.supported = true; + kb4Erase.opcode = SECTORERASE; + kb32Erase.opcode = BLOCK32ERASE; + kb64Erase.opcode = BLOCK64ERASE; + kb4Erase.time = BUSY_TIMEOUT; + kb32Erase.time = kb4Erase.time * 8; + kb64Erase.time = kb32Erase.time * 4; + kb256Erase.supported = false; + chipErase.opcode = CHIPERASE; + chipErase.time = kb64Erase.time * 100L; + + _getJedecId(); + + for (uint8_t i = 0; i < sizeof(_supportedManID); i++) { + if (_chip.manufacturerID == _supportedManID[i]) { + _chip.supportedMan = true; + break; + } + } + + for (uint8_t i = 0; i < sizeof(_altChipEraseReq); i++) { + if (_chip.memoryTypeID == _altChipEraseReq[i]) { + chipErase.opcode = ALT_CHIPERASE; + break; + } + } + + + //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Begin SFDP ID section ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// + #ifdef USES_SFDP + if (_checkForSFDP()) { + _getSFDPFlashParam(); + } + #endif + //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ End SFDP ID section ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// + + if (_chip.supportedMan) { + #ifdef RUNDIAGNOSTIC + Serial.println("No Chip size defined by user. Automated identification initiated."); + #endif + //Identify capacity + for (uint8_t j = 0; j < sizeof(_capID); j++) { + if (_chip.capacityID == _capID[j]) { + _chip.capacity = (_memSize[j]); + _chip.supported = true; + #ifdef RUNDIAGNOSTIC + Serial.println("Chip identified. This chip is fully supported by the library."); + #endif + return true; + } + } + } + else { + _troubleshoot(UNKNOWNCHIP); //Error code for unidentified capacity + return false; + } + + if (!_chip.capacity) { + + if (flashChipSize) { + // If a custom chip size is defined + #ifdef RUNDIAGNOSTIC + Serial.println("Custom Chipsize defined"); + #endif + _chip.capacity = flashChipSize; + _chip.supported = false; + return true; + } + + else { + _troubleshoot(UNKNOWNCAP); + return false; + } + + } + } + + //Troubleshooting function. Called when #ifdef RUNDIAGNOSTIC is uncommented at the top of this file. + void SPIFlash::_troubleshoot(uint8_t _code, bool printoverride) { + diagnostics.troubleshoot(_code, printoverride); + } diff --git a/speeduino/src/SPIAsEEPROM/SPIFlashSFDP.cpp b/speeduino/src/SPIAsEEPROM/SPIFlashSFDP.cpp new file mode 100755 index 00000000..4fde3fd6 --- /dev/null +++ b/speeduino/src/SPIAsEEPROM/SPIFlashSFDP.cpp @@ -0,0 +1,356 @@ +/* Arduino SPIMemory Library v.3.1.0 + * Copyright (C) 2017 by Prajwal Bhattaram + * Created by Prajwal Bhattaram - 19/05/2015 + * Modified by @boseji - 02/03/2017 + * Modified by Prajwal Bhattaram - 24/02/2018 + * + * This file is part of the Arduino SPIMemory Library. This library is for + * Winbond NOR flash memory modules. In its current form it enables reading + * and writing individual data variables, structs and arrays from and to various locations; + * reading and writing pages; continuous read functions; sector, block and chip erase; + * suspending and resuming programming/erase and powering down for low power operation. + * + * This Library 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. + * + * This Library 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 v3.0 + * along with the Arduino SPIMemory Library. If not, see + * . + */ + + #include "SPIFlash.h" +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// +// Private Functions that retrieve date from the SFDP tables // +// - if the flash chip supports SFDP // +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// + +// This function returns the SFDP table requested as an array of 32 bit integers +bool SPIFlash::_getSFDPTable(uint32_t _address, uint8_t *data_buffer, uint8_t numberOfDWords) { + if(!_notBusy()) { + return false; + } + _beginSPI(READSFDP); + _nextByte(WRITE, Higher(_address)); + _nextByte(WRITE, Hi(_address)); + _nextByte(WRITE, Lo(_address)); + _nextByte(WRITE, DUMMYBYTE); + _nextBuf(READDATA, &(*data_buffer), numberOfDWords*4); //*4 to convert from dWords to bytes + CHIP_DESELECT + return true; +} + +// This function returns a custom length of data from the SFDP table requested as an array of 8 bit integers (bytes) +bool SPIFlash::_getSFDPData(uint32_t _address, uint8_t *data_buffer, uint8_t numberOfBytes) { + if(!_notBusy()) { + return false; + } + _beginSPI(READSFDP); + _nextByte(WRITE, Higher(_address)); + _nextByte(WRITE, Hi(_address)); + _nextByte(WRITE, Lo(_address)); + _nextByte(WRITE, DUMMYBYTE); + _nextBuf(READDATA, &(*data_buffer), numberOfBytes); //*4 to convert from dWords to bytes + CHIP_DESELECT + return true; +} + +//dWordNumber can be between 1 to 256 +uint32_t SPIFlash::_getSFDPdword(uint32_t _tableAddress, uint8_t dWordNumber) { + if(!_notBusy()) { + return false; + } + union { + uint32_t dWord; + uint8_t byteArray[4]; + } SFDPdata; + uint32_t _address = ADDRESSOFSFDPDWORD(_tableAddress, dWordNumber); + _getSFDPData(_address, &(*SFDPdata.byteArray), sizeof(uint32_t)); + return SFDPdata.dWord; +} + +//startByte is the byte from which the 16-bit integer starts and can be between 1 to 256 +uint16_t SPIFlash::_getSFDPint(uint32_t _tableAddress, uint8_t dWordNumber, uint8_t startByte) { + if(!_notBusy()) { + return false; + } + union { + uint16_t word; + uint8_t byteArray[2]; + } SFDPdata; + uint32_t _address = ADDRESSOFSFDPBYTE(_tableAddress, dWordNumber, startByte); + _getSFDPData(_address, &(*SFDPdata.byteArray), sizeof(uint16_t)); + return SFDPdata.word; +} + +//byteNumber can be between 1 to 256 +uint8_t SPIFlash::_getSFDPbyte(uint32_t _tableAddress, uint8_t dWordNumber, uint8_t byteNumber) { + if(!_notBusy()) { + return false; + } + uint8_t SFDPdataByte; + uint32_t _address = ADDRESSOFSFDPBYTE(_tableAddress, dWordNumber, byteNumber); + _getSFDPData(_address, &SFDPdataByte, sizeof(uint8_t)); + return SFDPdataByte; +} + +//bitNumber can be between 0 to 31 +bool SPIFlash::_getSFDPbit(uint32_t _tableAddress, uint8_t dWordNumber, uint8_t bitNumber) { + return(_getSFDPdword(_tableAddress, dWordNumber) & (0x01 << bitNumber)); +} + +uint32_t SPIFlash::_getSFDPTableAddr(uint32_t paramHeaderNum) { + uint32_t _tableAddr = _getSFDPdword(paramHeaderNum * 8, 0x02); // Each parameter header table is 8 bytes long + Highest(_tableAddr) = 0x00; // Top byte in the dWord containing the table address is always 0xFF. + return _tableAddr; +} + +bool SPIFlash::_checkForSFDP(void) { + if (_getSFDPdword(SFDP_HEADER_ADDR, SFDP_SIGNATURE_DWORD) == SFDPSIGNATURE) { + _chip.sfdpAvailable = true; + #ifdef RUNDIAGNOSTIC + Serial.println("SFDP available"); + #endif + } + else { + _troubleshoot(NOSFDP); + _chip.sfdpAvailable = false; + } + return _chip.sfdpAvailable; +} +uint32_t SPIFlash::_calcSFDPEraseTimeUnits(uint8_t _unitBits) { + switch (_unitBits) { + case MS1: + return 1000L; + break; + + case MS16: + return (16L*1000L); + break; + + case MS128: + return (128L*1000L); + break; + + case S1: + return (1000L*1000L); + } + return false; +} + +void SPIFlash::_getSFDPEraseParam(void) { + // Get sector erase details if available on SFDP Tables + if (_noOfBasicParamDwords >= SFDP_ERASE1_INSTRUCTION_DWORD) { + uint32_t _eraseInfoAddress; + uint8_t _eraseInfo[8]; + uint8_t _eraseExists = 0; + uint8_t _count; + uint32_t _units; + union { + uint32_t dword; + uint8_t byte[4]; + } _eraseTime; + _eraseInfoAddress = ADDRESSOFSFDPDWORD(_BasicParamTableAddr, SFDP_ERASE1_INSTRUCTION_DWORD); + _getSFDPData(_eraseInfoAddress, &(*_eraseInfo), 8); + + for (uint8_t i = 0; i < 8; i++) { + _eraseExists += _eraseInfo[i]; + if (!_eraseExists) { // If faulty SFDP read, then revert to defaults + kb4Erase.supported = kb32Erase.supported = kb64Erase.supported = chipErase.supported = true; + kb4Erase.opcode = SECTORERASE; + kb32Erase.opcode = BLOCK32ERASE; + kb64Erase.opcode = BLOCK64ERASE; + kb4Erase.time = BUSY_TIMEOUT; + kb32Erase.time = kb4Erase.time * 8; + kb64Erase.time = kb32Erase.time * 4; + kb256Erase.supported = false; + chipErase.opcode = CHIPERASE; + chipErase.time = kb64Erase.time * 100L; + _troubleshoot(NOSFDPERASEPARAM); + } + } + for (uint8_t i = 0; i < 8; i++) { + if ((i % 2) == 0) { + switch ((_eraseInfo[i])) { + case KB4ERASE_TYPE: + kb4Erase.supported = true; + kb4Erase.opcode = _eraseInfo[i+1]; + break; + + case KB32ERASE_TYPE: + kb32Erase.supported = true; + kb32Erase.opcode = _eraseInfo[i+1]; + break; + + case KB64ERASE_TYPE: + kb64Erase.supported = true; + kb64Erase.opcode = _eraseInfo[i+1]; + break; + + case KB256ERASE_TYPE: + kb256Erase.supported = true; + kb256Erase.opcode = _eraseInfo[i+1]; + break; + } + } + } + // Some flash memory chips have information about sector erase times in DWORD 10 of SFDP Basic param table. + if (_noOfBasicParamDwords >= SFDP_SECTOR_ERASE_TIME_DWORD) { + _eraseTime.dword = _getSFDPdword(_BasicParamTableAddr, SFDP_SECTOR_ERASE_TIME_DWORD); + _eraseTimeMultiplier = _eraseTime.byte[0]; + setUpperNibble(_eraseTimeMultiplier, 0b0000); + _eraseTimeMultiplier = 2 * (_eraseTimeMultiplier + 1); // Refer JESD216B Page 21 + + for (uint8_t i = 0; i < 8; i++) { + if ((i % 2) == 0) { + switch ((_eraseInfo[i])) { + case KB4ERASE_TYPE: + _count = ( ( ( (_eraseTime.byte[1] & _createMask(0, 0)) << 5) | ( (_eraseTime.byte[0] & _createMask(4, 7)) ) >> 4) + 1); + _units = _calcSFDPEraseTimeUnits((_eraseTime.byte[1] & _createMask(1, 2)) >> 1); + kb4Erase.time = (_count * _units * _eraseTimeMultiplier); + break; + + case KB32ERASE_TYPE: + _count = (((_eraseTime.byte[1] & _createMask(3, 7)) >> 3) + 1); + _units = _calcSFDPEraseTimeUnits(_eraseTime.byte[2] & _createMask(0, 1)); + kb32Erase.time = (_count * _units * _eraseTimeMultiplier); + break; + + case KB64ERASE_TYPE: + _count = (((_eraseTime.byte[2] & _createMask(2, 6)) >> 2) + 1); + _units = _calcSFDPEraseTimeUnits(((_eraseTime.byte[2] & _createMask(7, 7)) >> 7) | (_eraseTime.byte[3] & _createMask(0,0)) << 1); + kb64Erase.time = (_count * _units * _eraseTimeMultiplier); + break; + + case KB256ERASE_TYPE: + _count = (((_eraseTime.byte[3] & _createMask(1, 5)) >> 1) + 1); + _units = _calcSFDPEraseTimeUnits((_eraseTime.byte[3] & _createMask(6, 7)) >> 6); + kb64Erase.time = (_count * _units) * _eraseTimeMultiplier; + break; + } + } + } + + // Some flash memory chips have information about chip erase times in DWORD 11 of SFDP Basic param table. + if (_noOfBasicParamDwords >= SFDP_CHIP_ERASE_TIME_DWORD) { + // Get chip erase details + _eraseInfoAddress = ADDRESSOFSFDPDWORD(_BasicParamTableAddr, DWORD(11)); + _getSFDPData(_eraseInfoAddress, &(*_eraseInfo), 8); + chipErase.supported = true; // chipErase.opcode is set in _chipID(). + _count = (((_eraseTime.byte[3] & _createMask(0, 4))) + 1); + _units = _calcSFDPEraseTimeUnits((_eraseTime.byte[3] & _createMask(5, 6)) >> 5); + chipErase.time = (_count * _units) * _eraseTimeMultiplier; + } + + } + else { //If flash memory does not have any sfdp information about sector erase times + _troubleshoot(NOSFDPERASETIME); + kb4Erase.time = BUSY_TIMEOUT; + kb32Erase.time = kb4Erase.time * 8; + kb64Erase.time = kb32Erase.time * 4; + kb256Erase.supported = false; + chipErase.opcode = CHIPERASE; + chipErase.time = kb64Erase.time * 100L; + } + + } + else { + _troubleshoot(NOSFDPERASEPARAM); + } +} + +// Gets IO timing information from SFDP tables - if available. +void SPIFlash::_getSFDPProgramTimeParam(void) { + if (_noOfBasicParamDwords >= SFDP_PROGRAM_TIME_DWORD) { + union { + uint32_t dword; + uint8_t byte[4]; + } _sfdp; + uint8_t _count; + uint32_t _units; + + _sfdp.dword= _getSFDPdword(_BasicParamTableAddr, SFDP_PROGRAM_TIME_DWORD); + + //Calculate Program time multiplier + _prgmTimeMultiplier = (2 * ((_sfdp.byte[1] >> 4) + 1)); + //Serial.print("_prgmTimeMultiplier: "); + //Serial.println(_prgmTimeMultiplier); + + // Get pageSize + //setUpperNibble(_eraseTimeMultiplier, 0b0000); + _pageSize = setUpperNibble(_sfdp.byte[1], 0b0000); + _pageSize *= 2; + //Serial.print("_pageSize: "); + //Serial.println(_pageSize); + + //Calculate Page Program time + _count = (((_sfdp.byte[1] & _createMask(0, 4))) + 1); + ((_sfdp.byte[1] & _createMask(7, 7)) >> 7) ? (_units = 64) : (_units = 8); + _pagePrgmTime = (_count * _units) * _prgmTimeMultiplier; + //Serial.print("_pagePrgmTime: "); + //Serial.println(_pagePrgmTime); + + //Calculate First Byte Program time + _count = ( (((_sfdp.byte[1] & _createMask(6, 7)) >> 4) | (((_sfdp.byte[2] & _createMask(6, 7))) >> 6)) + 1); + ((_sfdp.byte[2] & _createMask(5, 5)) >> 5) ? (_units = 8) : (_units = 1); + _byteFirstPrgmTime = (_count * _units) * _prgmTimeMultiplier; + //Serial.print("_byteFirstPrgmTime :"); + //Serial.println(_byteFirstPrgmTime); + + //Calculate Additional Byte Program time + _count = ( ((_sfdp.byte[2] & _createMask(4, 1)) >> 1) + 1); + (_sfdp.byte[2] & _createMask(0, 0)) ? (_units = 8) : (_units = 1); + _byteAddnlPrgmTime = (_count * _units) * _prgmTimeMultiplier; + //Serial.print("_byteAddnlPrgmTime :"); + //Serial.println(_byteAddnlPrgmTime); + } + else { + _pageSize = SPI_PAGESIZE; + _pagePrgmTime = BUSY_TIMEOUT; + _byteFirstPrgmTime = BUSY_TIMEOUT; + _byteAddnlPrgmTime = BUSY_TIMEOUT; + _troubleshoot(NOSFDPPROGRAMTIMEPARAM); + } +} + +// Reads and stores any required values from the Basic Flash Parameter table +bool SPIFlash::_getSFDPFlashParam(void) { + _noOfParamHeaders = _getSFDPbyte(SFDP_HEADER_ADDR, SFDP_NPH_DWORD, SFDP_NPH_BYTE) + 1; // Number of parameter headers is 0 based - i.e. 0x00 means there is 1 header. + if (_noOfParamHeaders > 1) { + _SectorMapParamTableAddr = _getSFDPTableAddr(SFDP_SECTOR_MAP_PARAM_TABLE_NO); + } + _noOfBasicParamDwords = _getSFDPbyte(SFDP_BASIC_PARAM_TABLE_HDR_ADDR, SFDP_PARAM_TABLE_LENGTH_DWORD, SFDP_PARAM_TABLE_LENGTH_BYTE); + _BasicParamTableAddr = _getSFDPTableAddr(SFDP_BASIC_PARAM_TABLE_NO); + // Calculate chip capacity + _chip.capacity = _getSFDPdword(_BasicParamTableAddr, SFDP_MEMORY_DENSITY_DWORD); + uint8_t _multiplier = Highest(_chip.capacity); //---- + Highest(_chip.capacity) = 0x00; // | + if (_multiplier <= 0x0F) { // | + _chip.capacity = (_chip.capacity + 1) * (_multiplier + 1); // |---> This section calculates the chip capacity as + } // |---> detailed in JESD216B + else { // | + _chip.capacity = ((_chip.capacity + 1) * 2); // | + } //---- + #ifdef RUNDIAGNOSTIC + Serial.println("Chip identified using sfdp. Most of this chip's functions are supported by the library."); + #endif + + // Get Erase Parameters if available + _getSFDPEraseParam(); + + //Get Program time Parameters + _getSFDPProgramTimeParam(); +// TODO Update the use of Program time parameters across the library + + //Serial.print("dWord 9: 0x"); + //Serial.println(_getSFDPdword(_BasicParamTableAddr, DWORD(9)), HEX); + return true; +} + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ End SFDP ID section ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// diff --git a/speeduino/src/SPIAsEEPROM/SPIMemory.cpp b/speeduino/src/SPIAsEEPROM/SPIMemory.cpp new file mode 100755 index 00000000..3cab6e92 --- /dev/null +++ b/speeduino/src/SPIAsEEPROM/SPIMemory.cpp @@ -0,0 +1,30 @@ +/* Arduino SPIMemory Library v.3.2.0 + * Copyright (C) 2017 by Prajwal Bhattaram + * Created by Prajwal Bhattaram - 19/05/2015 + * Modified by @boseji - 02/03/2017 + * Modified by Prajwal Bhattaram - 24/02/2018 + * + * This file is part of the Arduino SPIMemory Library. This library is for + * Winbond NOR flash memory modules. In its current form it enables reading + * and writing individual data variables, structs and arrays from and to various locations; + * reading and writing pages; continuous read functions; sector, block and chip erase; + * suspending and resuming programming/erase and powering down for low power operation. + * + * This Library 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. + * + * This Library 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 v3.0 + * along with the Arduino SPIMemory Library. If not, see + * . + */ + +#include "SPIMemory.h" + +SPIMemory SPIMemory; // default instantiation of SPIMemory object diff --git a/speeduino/src/SPIAsEEPROM/SPIMemory.h b/speeduino/src/SPIAsEEPROM/SPIMemory.h new file mode 100755 index 00000000..67d71602 --- /dev/null +++ b/speeduino/src/SPIAsEEPROM/SPIMemory.h @@ -0,0 +1,134 @@ +/* Arduino SPIMemory Library v.3.2.1 + * Copyright (C) 2017 by Prajwal Bhattaram + * Created by Prajwal Bhattaram - 18/04/2018 + * Modified by Prajwal Bhattaram - 21/05/2018 + * + * This file is part of the Arduino SPIMemory Library. This library is for + * Winbond NOR flash memory modules. In its current form it enables reading + * and writing individual data variables, structs and arrays from and to various locations; + * reading and writing pages; continuous read functions; sector, block and chip erase; + * suspending and resuming programming/erase and powering down for low power operation. + * + * This Library 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. + * + * This Library 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 v3.0 + * along with the Arduino SPIMemory Library. If not, see + * . + */ + +#ifndef SPIMEMORY_H +#define SPIMEMORY_H +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// +// Uncomment the code below to enable SFDP discovery - especially // +// if using an unsupported chip // +// // +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// +//#define USES_SFDP // +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// +// Uncomment the code below to run a diagnostic if your flash // +// does not respond // +// // +// Error codes will be generated and returned on functions // +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// +//#define RUNDIAGNOSTIC // +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// +// Uncomment the code below to increase the speed of the library // +// by disabling _notPrevWritten() // +// // +// Make sure the sectors being written to have been erased beforehand // +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// +//#define HIGHSPEED // +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// +// Uncomment the code below to disable overflow and force data // +// to only be written to the last address of the flash memory // +// and not rollover to address 0x00 when the end is reached // +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// +//#define DISABLEOVERFLOW // +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// +// Comment out the code below to disable DMA mode on SAMD based // +// platforms (In ALPHA) // +// // +// Change the ZERO_SPISERCOM define below to use other SPI ports // +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// +//#define ENABLEZERODMA // +//#define ZERO_SPISERCOM SERCOM4 // +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// + + #include + #include + #include "defines.h" + #include "SPIFlash.h" + #include "diagnostics.h" + +#if defined (ARDUINO_ARCH_SAM) + #include + #include + #include + #include "DMASAM.h" +#endif + +#if defined (ARDUINO_ARCH_SAMD) + #if defined (ENABLEZERODMA) + #include "DMASAMD.h" + #endif +#endif + +#if defined (BOARD_RTL8195A) + #ifdef __cplusplus + extern "C" { + #endif + + #include "gpio_api.h" + #include "PinNames.h" + + #ifdef __cplusplus + } + #endif +#endif + +#ifndef ARCH_STM32 + #if defined(ARDUINO_ARCH_STM32) || defined(__STM32F1__) || defined(STM32F1) || defined(STM32F3) || defined(STM32F4) || defined(STM32F0xx) + #define ARCH_STM32 + #endif +#endif +#if defined (ARDUINO_ARCH_SAM) || defined (ARDUINO_ARCH_SAMD) || defined (ARDUINO_ARCH_ESP8266) || defined (SIMBLEE) || defined (ARDUINO_ARCH_ESP32) || defined (BOARD_RTL8195A) || defined(ARCH_STM32) || defined(ESP32) || defined(NRF5) +// RTL8195A included - @boseji 02.03.17 + #define _delay_us(us) delayMicroseconds(us) +#else + #include +#endif + +#define LIBVER 3 +#define LIBSUBVER 2 +#define BUGFIXVER 1 + +class SPIMemory { +public: + //------------------------------------ Constructor ------------------------------------// + SPIMemory(void) {}; + ~SPIMemory(void) {}; + //------------------------------- Public functions -----------------------------------// + //------------------------------- Public variables -----------------------------------// + + +}; + +extern SPIMemory SPIMem; //default SPIMemory instance; + +#endif // _SPIMEMORY_H_ diff --git a/speeduino/src/SPIAsEEPROM/defines.h b/speeduino/src/SPIAsEEPROM/defines.h new file mode 100755 index 00000000..0be893e3 --- /dev/null +++ b/speeduino/src/SPIAsEEPROM/defines.h @@ -0,0 +1,290 @@ +/* Arduino SPIMemory Library v.3.2.1 + * Copyright (C) 2017 by Prajwal Bhattaram + * Created by Prajwal Bhattaram - 19/05/2015 + * Modified by Prajwal Bhattaram - 21/05/2018 + * + * This file is part of the Arduino SPIMemory Library. This library is for + * Winbond NOR flash memory modules. In its current form it enables reading + * and writing individual data variables, structs and arrays from and to various locations; + * reading and writing pages; continuous read functions; sector, block and chip erase; + * suspending and resuming programming/erase and powering down for low power operation. + * + * This Library 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. + * + * This Library 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 v3.0 + * along with the Arduino SPIMemory Library. If not, see + * . + */ + + // Defines and variables specific to SAM architecture + #if defined (ARDUINO_ARCH_SAM) + #define CHIP_SELECT digitalWrite(csPin, LOW); + #define CHIP_DESELECT digitalWrite(csPin, HIGH); + #define xfer due.SPITransfer + #define BEGIN_SPI due.SPIBegin(); + extern char _end; + extern "C" char *sbrk(int i); + //char *ramstart=(char *)0x20070000; + //char *ramend=(char *)0x20088000; + + // Specific access configuration for Chip select pin. Includes specific to RTL8195A to access GPIO HAL - @boseji 02.03.17 + #elif defined (BOARD_RTL8195A) + #define CHIP_SELECT gpio_write(&csPin, 0); + #define CHIP_DESELECT gpio_write(&csPin, 1); + #define xfer(n) SPI.transfer(n) + #define BEGIN_SPI SPI.begin(); + + // Defines and variables specific to SAMD architecture + #elif defined (ARDUINO_ARCH_SAMD) || defined(ARCH_STM32) + #define CHIP_SELECT digitalWrite(csPin, LOW); + #define CHIP_DESELECT digitalWrite(csPin, HIGH); + #define xfer(n) _spi->transfer(n) + #define BEGIN_SPI _spi->begin(); + #else + #define CHIP_SELECT digitalWrite(csPin, LOW); + #define CHIP_DESELECT digitalWrite(csPin, HIGH); + #define xfer(n) SPI.transfer(n) + #define BEGIN_SPI SPI.begin(); + #endif + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// +// Common Instructions // +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// + +#define MANID 0x90 +#define PAGEPROG 0x02 +#define READDATA 0x03 +#define FASTREAD 0x0B +#define WRITEDISABLE 0x04 +#define READSTAT1 0x05 +#define READSTAT2 0x35 +#define READSTAT3 0x15 +#define WRITESTATEN 0x50 +#define WRITESTAT1 0x01 +#define WRITESTAT2 0x31 +#define WRITESTAT3 0x11 +#define WRITEENABLE 0x06 +#define ADDR4BYTE_EN 0xB7 +#define ADDR4BYTE_DIS 0xE9 +#define SECTORERASE 0x20 +#define BLOCK32ERASE 0x52 +#define BLOCK64ERASE 0xD8 +#define CHIPERASE 0x60 +#define ALT_CHIPERASE 0xC7 // Some flash chips use a different chip erase command +#define SUSPEND 0x75 +#define ID 0x90 +#define RESUME 0x7A +#define JEDECID 0x9F +#define POWERDOWN 0xB9 +#define RELEASE 0xAB +#define READSFDP 0x5A +#define UNIQUEID 0x4B + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// +// General size definitions // +// B = Bytes; KiB = Kilo Bytes; MiB = Mega Bytes // +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// +#define B(x) uint32_t(x*BYTE) +#define KB(x) uint32_t(x*KiB) +#define MB(x) uint32_t(x*MiB) + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// +// SFDP related defines // +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// +#define DWORD(x) x +#define FIRSTBYTE 0x01 +#define SFDPSIGNATURE 0x50444653 +#define ADDRESSOFSFDPDWORD(x,y) x+((y - 1) * 4) +#define ADDRESSOFSFDPBYTE(x,y,z) x+((y - 1) * 4)+(z - 1) +#define KB4ERASE_TYPE 0x0C +#define KB32ERASE_TYPE 0x0F +#define KB64ERASE_TYPE 0x10 +#define KB256ERASE_TYPE 0x12 +#define MS1 0b00000000 +#define MS16 0b00000001 +#define MS128 0b00000010 +#define S1 0b00000011 + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// +// Fixed SFDP addresses // +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// +#define SFDP_HEADER_ADDR 0x00 +#define SFDP_SIGNATURE_DWORD 0x01 +#define SFDP_NPH_DWORD 0x02 +#define SFDP_NPH_BYTE 0x03 +#define SFDP_PARAM_TABLE_LENGTH_DWORD 0x01 +#define SFDP_PARAM_TABLE_LENGTH_BYTE 0x04 +#define SFDP_BASIC_PARAM_TABLE_HDR_ADDR 0x08 +#define SFDP_BASIC_PARAM_TABLE_NO 0x01 +#define SFDP_MEMORY_DENSITY_DWORD 0x02 +#define SFDP_SECTOR_MAP_PARAM_TABLE_NO 0x02 +#define SFDP_ERASE1_BYTE 0x01 +#define SFDP_ERASE1_INSTRUCTION_DWORD 0x08 +#define SFDP_ERASE2_INSTRUCTION_DWORD 0x09 +#define SFDP_SECTOR_ERASE_TIME_DWORD 0x0A +#define SFDP_CHIP_ERASE_TIME_DWORD 0x0B +#define SFDP_PROGRAM_TIME_DWORD 0x0B + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// +// Chip specific instructions // +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// + +//~~~~~~~~~~~~~~~~~~~~~~~~~ Winbond ~~~~~~~~~~~~~~~~~~~~~~~~~// + #define WINBOND_MANID 0xEF + #define SPI_PAGESIZE 0x100 + #define WINBOND_WRITE_DELAY 0x02 + #define WINBOND_WREN_TIMEOUT 10L + +//~~~~~~~~~~~~~~~~~~~~~~~~ Microchip ~~~~~~~~~~~~~~~~~~~~~~~~// + #define MICROCHIP_MANID 0xBF + #define SST25 0x25 + #define SST26 0x26 + #define ULBPR 0x98 //Global Block Protection Unlock (Ref sections 4.1.1 & 5.37 of datasheet) + +//~~~~~~~~~~~~~~~~~~~~~~~~ Cypress ~~~~~~~~~~~~~~~~~~~~~~~~// + #define CYPRESS_MANID 0x01 + +//~~~~~~~~~~~~~~~~~~~~~~~~ Adesto ~~~~~~~~~~~~~~~~~~~~~~~~// + #define ADESTO_MANID 0x1F + +//~~~~~~~~~~~~~~~~~~~~~~~~ Micron ~~~~~~~~~~~~~~~~~~~~~~~~// + #define MICRON_MANID 0x20 + #define M25P40 0x20 + +//~~~~~~~~~~~~~~~~~~~~~~~~ ON ~~~~~~~~~~~~~~~~~~~~~~~~// + #define ON_MANID 0x62 + +//~~~~~~~~~~~~~~~~~~~~~~~~ AMIC ~~~~~~~~~~~~~~~~~~~~~~~~// + #define AMIC_MANID 0x37 + #define A25L512 0x30 +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// +// Definitions // +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// + +#define BUSY 0x01 +#if defined (ARDUINO_ARCH_ESP32) +#define SPI_CLK 20000000 //Hz equivalent of 20MHz +#else +#define SPI_CLK 104000000 //Hz equivalent of 104MHz +#endif +#define WRTEN 0x02 +#define SUS 0x80 +#define WSE 0x04 +#define WSP 0x08 +#define ADS 0x01 // Current Address mode in Status register 3 +#define DUMMYBYTE 0xEE +#define NULLBYTE 0x00 +#define NULLINT 0x0000 +#define NO_CONTINUE 0x00 +#define PASS 0x01 +#define FAIL 0x00 +#define NOOVERFLOW false +#define NOERRCHK false +#define VERBOSE true +#define PRINTOVERRIDE true +#define ERASEFUNC 0xEF +#define BUSY_TIMEOUT 1000000000L +#define arrayLen(x) (sizeof(x) / sizeof(*x)) +#define lengthOf(x) (sizeof(x))/sizeof(byte) +#define BYTE 1L +#define KiB 1024L +#define MiB KiB * KiB +#define S 1000L +#define TIME_TO_PROGRAM(x) (_byteFirstPrgmTime + (_byteAddnlPrgmTime * (x - 1)) ) + +#if defined (ARDUINO_ARCH_ESP8266) +#define CS 15 +#elif defined (ARDUINO_ARCH_SAMD) +#define CS 10 +/********************************************************************************************* +// Declaration of the Default Chip select pin name for RTL8195A +// Note: This has been shifted due to a bug identified in the HAL layer SPI driver +// @ref http://www.amebaiot.com/en/questions/forum/facing-issues-with-spi-interface-to-w25q32/ +// Note: Please use any pin other than GPIOC_0 which is the D10 marked in the kit +// Original edit by @boseji 02.03.17 +// Modified by Prajwal Bhattaram 14.4.17 +**********************************************************************************************/ +#elif defined (BOARD_RTL8195A) +#define CS PC_4 +#else +#define CS SS +#endif + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// +// Arduino Due DMA definitions // +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// +// Use SAM3X DMAC if nonzero +#define USE_SAM3X_DMAC 1 +// Use extra Bus Matrix arbitration fix if nonzero +#define USE_SAM3X_BUS_MATRIX_FIX 0 +// Time in ms for DMA receive timeout +#define SAM3X_DMA_TIMEOUT 100 +// chip select register number +#define SPI_CHIP_SEL 3 +// DMAC receive channel +#define SPI_DMAC_RX_CH 1 +// DMAC transmit channel +#define SPI_DMAC_TX_CH 0 +// DMAC Channel HW Interface Number for SPI TX. +#define SPI_TX_IDX 1 +// DMAC Channel HW Interface Number for SPI RX. +#define SPI_RX_IDX 2 +// Set DUE SPI clock div (any integer from 2 - 255) +#define DUE_SPI_CLK 2 + + //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// + // List of Supported data types // + //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// + + #define _BYTE_ 0x01 + #define _CHAR_ 0x02 + #define _WORD_ 0x03 + #define _SHORT_ 0x04 + #define _ULONG_ 0x05 + #define _LONG_ 0x06 + #define _FLOAT_ 0x07 + #define _STRING_ 0x08 + #define _BYTEARRAY_ 0x09 + #define _CHARARRAY_ 0x0A + #define _STRUCT_ 0x0B + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// +// Bit shift macros // +// Thanks to @VitorBoss // +// https://github.com/Marzogh/SPIMemory/issues/76 // +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// +#define Lo(param) ((char *)¶m)[0] //0x000y +#define Hi(param) ((char *)¶m)[1] //0x00y0 +#define Higher(param) ((char *)¶m)[2] //0x0y00 +#define Highest(param) ((char *)¶m)[3] //0xy000 +#define Low(param) ((int *)¶m)[0] //0x00yy +#define Top(param) ((int *)¶m)[1] //0xyy00 + +// Set bit and clear bit +// x -> byte, y -> bit +#define setBit(x, y) x |= (1 << y) +#define clearBit(x, y) x &= ~(1 << y) +#define toggleBit(x, y) x ^= (1 << y) + +// Query to see if bit is set or cleared. +// x -> byte, y -> bit +#define bitIsSet(x, y) x & (1 << y) +#define bitIsClear(x, y) !(x & (1 << y)) + +//Set nibbles +// x -> byte, y -> value to set +#define setLowerNibble(x, y) x &= 0xF0; x |= (y & 0x0F) // Clear out the lower nibble // OR in the desired mask +#define setUpperNibble(x, y) x &= 0x0F; x |= (y & 0xF0) // Clear out the lower nibble // OR in the desired mask +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// + +#ifndef LED_BUILTIN //fix for boards without that definition + #define LED_BUILTIN 13 +#endif diff --git a/speeduino/src/SPIAsEEPROM/diagnostics.cpp b/speeduino/src/SPIAsEEPROM/diagnostics.cpp new file mode 100755 index 00000000..a6c57bad --- /dev/null +++ b/speeduino/src/SPIAsEEPROM/diagnostics.cpp @@ -0,0 +1,158 @@ +/* Arduino SPIMemory Library v.3.2.0 + * Copyright (C) 2017 by Prajwal Bhattaram + * Created by Prajwal Bhattaram - 14/11/2016 + * Modified by Prajwal Bhattaram - 20/04/2018 + * + * This file is part of the Arduino SPIMemory Library. This library is for + * Winbond NOR flash memory modules. In its current form it enables reading + * and writing individual data variables, structs and arrays from and to various locations; + * reading and writing pages; continuous read functions; sector, block and chip erase; + * suspending and resuming programming/erase and powering down for low power operation. + * + * This Library 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. + * + * This Library 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 v3.0 + * along with the Arduino SPIMemory Library. If not, see + * . + */ + +#include "diagnostics.h" + +//Subfunctions for troubleshooting function +void Diagnostics::_printErrorCode(void) { + Serial.print("Error code: 0x"); + if (errorcode < 0x10) { + Serial.print("0"); + } + Serial.println(errorcode, HEX); +} + +void Diagnostics::_printSupportLink(void) { + Serial.print("If this does not help resolve/clarify this issue, "); + Serial.println("please raise an issue at http://www.github.com/Marzogh/SPIMemory/issues with the details of what your were doing when this error occurred"); +} +//Troubleshooting function. Called when #ifdef RUNDIAGNOSTIC is uncommented at the top of SPIMemory.h. +void Diagnostics::troubleshoot(uint8_t _code, bool printoverride) { + bool _printoverride; + errorcode = _code; +#if defined (RUNDIAGNOSTIC) && !defined (ARDUINO_ARCH_AVR) + _printoverride = true; +#elif defined (RUNDIAGNOSTIC) && defined (ARDUINO_ARCH_AVR) + _printErrorCode(); +#endif +#if !defined (RUNDIAGNOSTIC) + _printoverride = printoverride; +#endif + if (_printoverride) { + #if defined (ARDUINO_ARCH_AVR) + _printErrorCode(); + #else + switch (_code) { + case SUCCESS: + Serial.println("Function executed successfully"); + break; + + case NORESPONSE: + Serial.println("Check your wiring. Flash chip is non-responsive."); + break; + + case CALLBEGIN: + Serial.println("*constructor_of_choice*.begin() was not called in void setup()"); + break; + + case UNKNOWNCHIP: + Serial.println("Unable to identify chip. Are you sure this chip is supported?"); + Serial.println("Chip details:"); + break; + + case UNKNOWNCAP: + Serial.println("Unable to identify capacity. Is this chip officially supported? If not, please define a `CAPACITY` constant and include it in flash.begin(CAPACITY)."); + break; + + case CHIPBUSY: + Serial.println("Chip is busy."); + Serial.println("Make sure all pins have been connected properly"); + break; + + case OUTOFBOUNDS: + Serial.println("Page overflow has been disabled and the address called exceeds the memory"); + break; + + case CANTENWRITE: + Serial.println("Unable to Enable Writing to chip."); + Serial.println("Please make sure the HOLD & WRITEPROTECT pins are pulled up to VCC"); + break; + + case PREVWRITTEN: + Serial.println("This sector already contains data."); + Serial.println("Please make sure the sectors being written to are erased."); + break; + + case LOWRAM: + Serial.println("You are running low on SRAM. Please optimise your program for better RAM usage"); + /*#if defined (ARDUINO_ARCH_SAM) + Serial.print("Current Free SRAM: "); + Serial.println(freeRAM()); + #endif*/ + break; + + case UNSUPPORTEDFUNC: + Serial.println("This function is not supported by the flash memory hardware."); + break; + + case SYSSUSPEND: + Serial.println("Unable to suspend/resume operation."); + break; + + case ERRORCHKFAIL: + Serial.println("Write Function has failed errorcheck."); + break; + + case UNABLETO4BYTE: + Serial.println("Unable to enable 4-byte addressing."); + break; + + case UNABLETO3BYTE: + Serial.println("Unable to disable 4-byte addressing."); + break; + + case CHIPISPOWEREDDOWN: + Serial.println("The Flash chip is currently powered down."); + break; + + case NOSFDP: + Serial.println("The Flash chip does not support SFDP."); + break; + + case NOSFDPERASEPARAM: + Serial.println("Unable to read Erase Parameters from chip. Reverting to library defaults."); + break; + + case NOSFDPERASETIME: + Serial.println("Unable to read erase times from flash memory. Reverting to library defaults."); + break; + + case NOSFDPPROGRAMTIMEPARAM: + Serial.println("Unable to read program times from flash memory. Reverting to library defaults."); + break; + + default: + Serial.println("Unknown error"); + break; + } + if (_code == ERRORCHKFAIL || _code == CANTENWRITE || _code == UNKNOWNCHIP || _code == NORESPONSE) { + _printSupportLink(); + } + #endif + } +} + +Diagnostics diagnostics; // default instantiation of Diagnostics object diff --git a/speeduino/src/SPIAsEEPROM/diagnostics.h b/speeduino/src/SPIAsEEPROM/diagnostics.h new file mode 100755 index 00000000..173d0892 --- /dev/null +++ b/speeduino/src/SPIAsEEPROM/diagnostics.h @@ -0,0 +1,77 @@ +/* Arduino SPIMemory Library v.3.1.0 + * Copyright (C) 2017 by Prajwal Bhattaram + * Created by Prajwal Bhattaram - 19/05/2015 + * Modified by @boseji - 02/03/2017 + * Modified by Prajwal Bhattaram - 24/02/2018 + * + * This file is part of the Arduino SPIMemory Library. This library is for + * Winbond NOR flash memory modules. In its current form it enables reading + * and writing individual data variables, structs and arrays from and to various locations; + * reading and writing pages; continuous read functions; sector, block and chip erase; + * suspending and resuming programming/erase and powering down for low power operation. + * + * This Library 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. + * + * This Library 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 v3.0 + * along with the Arduino SPIMemory Library. If not, see + * . + */ + + #ifndef DIAGNOSTICS_H + #define DIAGNOSTICS_H + + #include "SPIMemory.h" + //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// + // List of Error codes // + //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// + + #define SUCCESS 0x00 + #define CALLBEGIN 0x01 + #define UNKNOWNCHIP 0x02 + #define UNKNOWNCAP 0x03 + #define CHIPBUSY 0x04 + #define OUTOFBOUNDS 0x05 + #define CANTENWRITE 0x06 + #define PREVWRITTEN 0x07 + #define LOWRAM 0x08 + #define SYSSUSPEND 0x09 + #define ERRORCHKFAIL 0x0A + #define NORESPONSE 0x0B + #define UNSUPPORTEDFUNC 0x0C + #define UNABLETO4BYTE 0x0D + #define UNABLETO3BYTE 0x0E + #define CHIPISPOWEREDDOWN 0x0F + #define NOSFDP 0x10 + #define NOSFDPERASEPARAM 0x11 + #define NOSFDPERASETIME 0x12 + #define NOSFDPPROGRAMTIMEPARAM 0x13 + #define UNKNOWNERROR 0xFE + //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// + + class Diagnostics { + public: + //------------------------------------ Constructor ------------------------------------// + + Diagnostics(void){}; + ~Diagnostics(void){}; + //------------------------------- Public functions -----------------------------------// + void troubleshoot(uint8_t _code, bool printoverride = false); + + uint8_t errorcode; + private: + void _printErrorCode(void); + void _printSupportLink(void); + + }; + + extern Diagnostics diagnostics; ///< default Diagnostics instance + + #endif From 5d3705d9ef5ba05cac8a5bf3eb238cd6002526c1 Mon Sep 17 00:00:00 2001 From: Josh Stewart Date: Thu, 7 Mar 2019 22:48:42 +1100 Subject: [PATCH 37/51] Remove old unused digitalWriteFast --- .../src/DigitalWriteFast/digitalWriteFast.h | 217 ------------------ 1 file changed, 217 deletions(-) delete mode 100644 speeduino/src/DigitalWriteFast/digitalWriteFast.h diff --git a/speeduino/src/DigitalWriteFast/digitalWriteFast.h b/speeduino/src/DigitalWriteFast/digitalWriteFast.h deleted file mode 100644 index b2676a7d..00000000 --- a/speeduino/src/DigitalWriteFast/digitalWriteFast.h +++ /dev/null @@ -1,217 +0,0 @@ -/* - Optimized digital functions for AVR microcontrollers - by Watterott electronic (www.watterott.com) - based on http://code.google.com/p/digitalwritefast - */ - -#ifndef __digitalWriteFast_h_ -#define __digitalWriteFast_h_ 1 - -#define ERROR_SEQUENCE 0b10101010 //digitalReadFast will return this value if pin number is not constant -// general macros/defines -#ifndef BIT_READ -# define BIT_READ(value, bit) ((value) & (1UL << (bit))) -#endif -#ifndef BIT_SET -# define BIT_SET(value, bit) ((value) |= (1UL << (bit))) -#endif -#ifndef BIT_CLEAR -# define BIT_CLEAR(value, bit) ((value) &= ~(1UL << (bit))) -#endif -#ifndef BIT_WRITE -# define BIT_WRITE(value, bit, bitvalue) (bitvalue ? BIT_SET(value, bit) : BIT_CLEAR(value, bit)) -#endif - -#ifndef SWAP -#define SWAP(x,y) do{ (x)=(x)^(y); (y)=(x)^(y); (x)=(x)^(y); }while(0) -#endif - -// workarounds for ARM microcontrollers -#if (!defined(__AVR__) || defined(ARDUINO_ARCH_SAM)) -#ifndef PROGMEM -# define PROGMEM -#endif -#ifndef PGM_P -# define PGM_P const char * -#endif -#ifndef PSTR -# define PSTR(str) (str) -#endif - -#ifndef memcpy_P -# define memcpy_P(dest, src, num) memcpy((dest), (src), (num)) -#endif -#ifndef strcpy_P -# define strcpy_P(dst, src) strcpy((dst), (src)) -#endif -#ifndef strcat_P -# define strcat_P(dst, src) strcat((dst), (src)) -#endif -#ifndef strcmp_P -# define strcmp_P(a, b) strcmp((a), (b)) -#endif -#ifndef strcasecmp_P -# define strcasecmp_P(a, b) strcasecmp((a), (b)) -#endif -#ifndef strncmp_P -# define strncmp_P(a, b, n) strncmp((a), (b), (n)) -#endif -#ifndef strncasecmp_P -# define strncasecmp_P(a, b, n) strncasecmp((a), (b), (n)) -#endif -#ifndef strstr_P -# define strstr_P(a, b) strstr((a), (b)) -#endif -#ifndef strlen_P -# define strlen_P(a) strlen((a)) -#endif -#ifndef sprintf_P -# define sprintf_P(s, f, ...) sprintf((s), (f), __VA_ARGS__) -#endif - -#ifndef pgm_read_byte -# define pgm_read_byte(addr) (*(const unsigned char *)(addr)) -#endif -#ifndef pgm_read_word -# define pgm_read_word(addr) (*(const unsigned short *)(addr)) -#endif -#ifndef pgm_read_dword -# define pgm_read_dword(addr) (*(const unsigned long *)(addr)) -#endif - -#endif - - -// digital functions -// --- Arduino Mega --- -#if (defined(ARDUINO_AVR_MEGA) || \ - defined(ARDUINO_AVR_MEGA1280) || \ - defined(ARDUINO_AVR_MEGA2560) || \ - defined(__AVR_ATmega1280__) || \ - defined(__AVR_ATmega1281__) || \ - defined(__AVR_ATmega2560__) || \ - defined(__AVR_ATmega2561__)) - -#define UART_RX_PIN (0) //PE0 -#define UART_TX_PIN (1) //PE1 - -#define I2C_SDA_PIN (20) -#define I2C_SCL_PIN (21) - -#define SPI_HW_SS_PIN (53) //PB0 -#define SPI_HW_MOSI_PIN (51) //PB2 -#define SPI_HW_MISO_PIN (50) //PB3 -#define SPI_HW_SCK_PIN (52) //PB1 - -#define __digitalPinToPortReg(P) \ -(((P) >= 22 && (P) <= 29) ? &PORTA : \ -((((P) >= 10 && (P) <= 13) || ((P) >= 50 && (P) <= 53)) ? &PORTB : \ -(((P) >= 30 && (P) <= 37) ? &PORTC : \ -((((P) >= 18 && (P) <= 21) || (P) == 38) ? &PORTD : \ -((((P) >= 0 && (P) <= 3) || (P) == 5) ? &PORTE : \ -(((P) >= 54 && (P) <= 61) ? &PORTF : \ -((((P) >= 39 && (P) <= 41) || (P) == 4) ? &PORTG : \ -((((P) >= 6 && (P) <= 9) || (P) == 16 || (P) == 17) ? &PORTH : \ -(((P) == 14 || (P) == 15) ? &PORTJ : \ -(((P) >= 62 && (P) <= 69) ? &PORTK : &PORTL)))))))))) - -#define __digitalPinToDDRReg(P) \ -(((P) >= 22 && (P) <= 29) ? &DDRA : \ -((((P) >= 10 && (P) <= 13) || ((P) >= 50 && (P) <= 53)) ? &DDRB : \ -(((P) >= 30 && (P) <= 37) ? &DDRC : \ -((((P) >= 18 && (P) <= 21) || (P) == 38) ? &DDRD : \ -((((P) >= 0 && (P) <= 3) || (P) == 5) ? &DDRE : \ -(((P) >= 54 && (P) <= 61) ? &DDRF : \ -((((P) >= 39 && (P) <= 41) || (P) == 4) ? &DDRG : \ -((((P) >= 6 && (P) <= 9) || (P) == 16 || (P) == 17) ? &DDRH : \ -(((P) == 14 || (P) == 15) ? &DDRJ : \ -(((P) >= 62 && (P) <= 69) ? &DDRK : &DDRL)))))))))) - -#define __digitalPinToPINReg(P) \ -(((P) >= 22 && (P) <= 29) ? &PINA : \ -((((P) >= 10 && (P) <= 13) || ((P) >= 50 && (P) <= 53)) ? &PINB : \ -(((P) >= 30 && (P) <= 37) ? &PINC : \ -((((P) >= 18 && (P) <= 21) || (P) == 38) ? &PIND : \ -((((P) >= 0 && (P) <= 3) || (P) == 5) ? &PINE : \ -(((P) >= 54 && (P) <= 61) ? &PINF : \ -((((P) >= 39 && (P) <= 41) || (P) == 4) ? &PING : \ -((((P) >= 6 && (P) <= 9) || (P) == 16 || (P) == 17) ? &PINH : \ -(((P) == 14 || (P) == 15) ? &PINJ : \ -(((P) >= 62 && (P) <= 69) ? &PINK : &PINL)))))))))) - -#define __digitalPinToBit(P) \ -(((P) >= 7 && (P) <= 9) ? (P) - 3 : \ -(((P) >= 10 && (P) <= 13) ? (P) - 6 : \ -(((P) >= 22 && (P) <= 29) ? (P) - 22 : \ -(((P) >= 30 && (P) <= 37) ? 37 - (P) : \ -(((P) >= 39 && (P) <= 41) ? 41 - (P) : \ -(((P) >= 42 && (P) <= 49) ? 49 - (P) : \ -(((P) >= 50 && (P) <= 53) ? 53 - (P) : \ -(((P) >= 54 && (P) <= 61) ? (P) - 54 : \ -(((P) >= 62 && (P) <= 69) ? (P) - 62 : \ -(((P) == 0 || (P) == 15 || (P) == 17 || (P) == 21) ? 0 : \ -(((P) == 1 || (P) == 14 || (P) == 16 || (P) == 20) ? 1 : \ -(((P) == 19) ? 2 : \ -(((P) == 5 || (P) == 6 || (P) == 18) ? 3 : \ -(((P) == 2) ? 4 : \ -(((P) == 3 || (P) == 4) ? 5 : 7))))))))))))))) - -// --- Other --- -#else - -#define SPI_HW_SS_PIN SS -#define SPI_HW_MOSI_PIN MOSI -#define SPI_HW_MISO_PIN MISO -#define SPI_HW_SCK_PIN SCK - -#endif -//#endif //#ifndef digitalPinToPortReg - - -//ref: http://forum.arduino.cc/index.php?topic=140409.msg1054868#msg1054868 -//void OutputsErrorIfCalled( void ) __attribute__ (( error( "Line: "__line__ "Variable used for digitalWriteFast") )); -void NonConstantUsed( void ) __attribute__ (( error("") )); - - -#ifndef digitalWriteFast -#if (defined(__AVR__) || defined(ARDUINO_ARCH_AVR)) -#define digitalWriteFast(P, V) \ -if (__builtin_constant_p(P) && __builtin_constant_p(V)) { \ - BIT_WRITE(*__digitalPinToPortReg(P), __digitalPinToBit(P), (V)); \ -} else { \ - NonConstantUsed(); \ -} -#else -#define digitalWriteFast digitalWrite -#endif -#endif - - -#ifndef pinModeFast -#if (defined(__AVR__) || defined(ARDUINO_ARCH_AVR)) -#define pinModeFast(P, V) \ -if (__builtin_constant_p(P) && __builtin_constant_p(V)) { \ - BIT_WRITE(*__digitalPinToDDRReg(P), __digitalPinToBit(P), (V)); \ -} else { \ - NonConstantUsed(); \ -} -#else -#define pinModeFast pinMode -#endif -#endif - - -#ifndef digitalReadFast -#if (defined(__AVR__) || defined(ARDUINO_ARCH_AVR)) -#define digitalReadFast(P) ( (byte) __digitalReadFast((P)) ) -#define __digitalReadFast(P ) \ - (__builtin_constant_p(P) ) ? ( \ - ( BIT_READ(*__digitalPinToPINReg(P), __digitalPinToBit(P))) ) : \ - ERROR_SEQUENCE -#else -#define digitalReadFast digitalRead -#endif -#endif - -#endif //__digitalWriteFast_h_ - From bb9ade465732c99197d9033daa38a8ab1ec0b59f Mon Sep 17 00:00:00 2001 From: Josh Stewart Date: Thu, 7 Mar 2019 22:59:36 +1100 Subject: [PATCH 38/51] Fix for Teensy not compiling when number of channels was set to 8/8 --- speeduino/scheduler.ino | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/speeduino/scheduler.ino b/speeduino/scheduler.ino index 35afa1cd..c22d48d0 100644 --- a/speeduino/scheduler.ino +++ b/speeduino/scheduler.ino @@ -1274,15 +1274,15 @@ void ftm3_isr(void) #endif #if (INJ_CHANNELS >= 6) bool interrupt2 = (FTM3_C1SC & FTM_CSC_CHF); - else if(interrupt2) { FTM3_C1SC &= ~FTM_CSC_CHF; fuelSchedule6Interrupt(); } + if(interrupt2) { FTM3_C1SC &= ~FTM_CSC_CHF; fuelSchedule6Interrupt(); } #endif #if (INJ_CHANNELS >= 7) bool interrupt3 = (FTM3_C2SC & FTM_CSC_CHF); - else if(interrupt3) { FTM3_C2SC &= ~FTM_CSC_CHF; fuelSchedule7Interrupt(); } + if(interrupt3) { FTM3_C2SC &= ~FTM_CSC_CHF; fuelSchedule7Interrupt(); } #endif #if (INJ_CHANNELS >= 8) bool interrupt4 = (FTM3_C3SC & FTM_CSC_CHF); - else if(interrupt4) { FTM3_C3SC &= ~FTM_CSC_CHF; fuelSchedule8Interrupt(); } + if(interrupt4) { FTM3_C3SC &= ~FTM_CSC_CHF; fuelSchedule8Interrupt(); } #endif #if (IGN_CHANNELS >= 5) bool interrupt5 = (FTM3_C4SC & FTM_CSC_CHF); @@ -1290,15 +1290,15 @@ void ftm3_isr(void) #endif #if (IGN_CHANNELS >= 6) bool interrupt6 = (FTM3_C5SC & FTM_CSC_CHF); - else if(interrupt6) { FTM3_C5SC &= ~FTM_CSC_CHF; ignitionSchedule6Interrupt(); } + if(interrupt6) { FTM3_C5SC &= ~FTM_CSC_CHF; ignitionSchedule6Interrupt(); } #endif #if (IGN_CHANNELS >= 7) bool interrupt7 = (FTM3_C6SC & FTM_CSC_CHF); - else if(interrupt7) { FTM3_C6SC &= ~FTM_CSC_CHF; ignitionSchedule7Interrupt(); } + if(interrupt7) { FTM3_C6SC &= ~FTM_CSC_CHF; ignitionSchedule7Interrupt(); } #endif #if (IGN_CHANNELS >= 8) bool interrupt8 = (FTM3_C7SC & FTM_CSC_CHF); - else if(interrupt8) { FTM3_C7SC &= ~FTM_CSC_CHF; ignitionSchedule8Interrupt(); } + if(interrupt8) { FTM3_C7SC &= ~FTM_CSC_CHF; ignitionSchedule8Interrupt(); } #endif } From 2391cb40733ce631ab63c65019a5dbc3d457118d Mon Sep 17 00:00:00 2001 From: Josh Stewart Date: Thu, 7 Mar 2019 23:07:20 +1100 Subject: [PATCH 39/51] Remove verbose flag from cURL in Travis --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index f1066be7..dc0b2f0a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -62,8 +62,8 @@ script: - platformio update # - platformio run -e megaatmega2560 -e teensy35 -e bluepill_f103c8 -e genericSTM32F103RB - platformio run -e megaatmega2560 -e teensy35 -e genericSTM32F103RB - - curl -v --user "speeduino_firmware@speeduino.com:$WEB_PWD" --basic -T "./.pioenvs/megaatmega2560/firmware.hex" "https://speeduino.com:2078/bin/master.hex" - - curl -v --user "speeduino_firmware@speeduino.com:$WEB_PWD" --basic -T "./reference/speeduino.ini" "https://speeduino.com:2078/master.ini" + - curl --user "speeduino_firmware@speeduino.com:$WEB_PWD" --basic -T "./.pioenvs/megaatmega2560/firmware.hex" "https://speeduino.com:2078/bin/master.hex" + - curl --user "speeduino_firmware@speeduino.com:$WEB_PWD" --basic -T "./reference/speeduino.ini" "https://speeduino.com:2078/master.ini" - cd .. - chmod +x speeduino/misra/check_misra.sh - speeduino/misra/check_misra.sh From c392cb8f5d58c07cf8e116d3f95c6b56cf3ce04f Mon Sep 17 00:00:00 2001 From: Josh Stewart Date: Thu, 7 Mar 2019 23:13:38 +1100 Subject: [PATCH 40/51] Minor MISRA cleanup --- speeduino/board_avr2560.ino | 7 +------ speeduino/board_stm32_official.ino | 12 ++++++++---- speeduino/decoders.ino | 6 +++--- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/speeduino/board_avr2560.ino b/speeduino/board_avr2560.ino index 31af70da..2762f630 100644 --- a/speeduino/board_avr2560.ino +++ b/speeduino/board_avr2560.ino @@ -60,14 +60,9 @@ void initBoard() //Ignition Schedules, which uses timer 5. This is also used by the fast version of micros(). If the speed of this timer is changed from 4uS ticks, that MUST be changed as well. See globals.h and timers.ino TCCR5B = 0x00; //Disable Timer5 while we set it up TCNT5 = 0; //Reset Timer Count - //TIFR5 = 0x00; //Timer5 INT Flag Reg: Clear Timer Overflow Flag - //TIFR5 = 0xFF; TCCR5A = 0x00; //Timer5 Control Reg A: Wave Gen Mode normal - //TCCR5B = (1 << CS12); //Timer5 Control Reg B: Timer Prescaler set to 256. Refer to http://www.instructables.com/files/orig/F3T/TIKL/H3WSA4V7/F3TTIKLH3WSA4V7.jpg - //TCCR5B = 0x03; //aka Divisor = 64 = 490.1Hz TCCR5B = (1 << CS11) | (1 << CS10); //Timer5 Control Reg B: Timer Prescaler set to 64. Refer to http://www.instructables.com/files/orig/F3T/TIKL/H3WSA4V7/F3TTIKLH3WSA4V7.jpg - TIFR5 |= (1 << OCF5A) | (1< 0) { attachIntHandleOC(&HardwareTimers_1, idleInterrupt, 4, 0);} //on first flash the configPage4.iacAlgorithm is invalid //Timer1.setMode(4, TIMER_OUTPUT_COMPARE); //timer_set_mode(TIMER1, 4, TIMER_OUTPUT_COMPARE; - //if(idle_pwm_max_count > 0) { Timer1.attachInterrupt(4, idleInterrupt);} //on first flash the configPage4.iacAlgorithm is invalid + //on first flash the configPage4.iacAlgorithm is invalid: + //if(idle_pwm_max_count > 0) { Timer1.attachInterrupt(4, idleInterrupt);} //Timer1.resume(); @@ -77,9 +78,12 @@ *********************************************************************************************************** * Timers */ - //#if defined(ARDUINO_BLACK_F407VE) || defined(STM32F4) || defined(_STM32F4_) - TimerHandleInit(&HardwareTimers_8, 1000, 168); - attachIntHandle(&HardwareTimers_8, oneMSIntervalIRQ); + #if defined(ARDUINO_BLACK_F407VE) || defined(STM32F4) || defined(_STM32F4_) + TimerHandleInit(&HardwareTimers_8, 1000, 168); + attachIntHandle(&HardwareTimers_8, oneMSIntervalIRQ); + #else + //Should do something here for other boards + #endif pinMode(LED_BUILTIN, OUTPUT); //Visual WDT /* diff --git a/speeduino/decoders.ino b/speeduino/decoders.ino index 37c078d2..a78f82ab 100644 --- a/speeduino/decoders.ino +++ b/speeduino/decoders.ino @@ -211,7 +211,7 @@ If it's the correct tooth, but the schedule is not yet started, calculate and an #define MIN_CYCLES_FOR_ENDCOMPARE 6 #define checkPerToothTiming(crankAngle, currentTooth) \ { \ - if (fixedCrankingOverride == 0 && currentStatus.RPM > 0) \ + if ( (fixedCrankingOverride == 0) && (currentStatus.RPM > 0) ) \ { \ if ( (currentTooth == ignition1EndTooth) ) \ { \ @@ -372,7 +372,7 @@ void triggerSec_missingTooth() { targetGap2 = (3 * (toothLastSecToothTime - toothLastMinusOneSecToothTime)) >> 1; //If the time between the current tooth and the last is greater than 1.5x the time between the last tooth and the tooth before that, we make the assertion that we must be at the first tooth after the gap toothLastMinusOneSecToothTime = toothLastSecToothTime; - if ( ( curGap2 >= targetGap2 ) || ( secondaryToothCount > 3 ) ) + if ( (curGap2 >= targetGap2) || (secondaryToothCount > 3) ) { secondaryToothCount = 1; revolutionOne = 1; //Sequential revolution reset @@ -397,7 +397,7 @@ void triggerSec_missingTooth() uint16_t getRPM_missingTooth() { uint16_t tempRPM = 0; - if( (currentStatus.RPM < currentStatus.crankRPM) ) + if( currentStatus.RPM < currentStatus.crankRPM ) { if(toothCurrentCount != 1) { From c671a4102f2f5818bbd3973ba9edb749d06d75cd Mon Sep 17 00:00:00 2001 From: Josh Stewart Date: Mon, 11 Mar 2019 20:41:50 +1100 Subject: [PATCH 41/51] Initial work on settable tacho pulse duration (See #210) --- reference/speeduino.ini | 5 +++- speeduino/globals.h | 3 ++- speeduino/scheduledIO.ino | 53 ++++++++++++++++++--------------------- speeduino/timers.h | 7 ++++++ speeduino/timers.ino | 18 +++++++++++++ 5 files changed, 55 insertions(+), 31 deletions(-) diff --git a/reference/speeduino.ini b/reference/speeduino.ini index 7dbefc6b..12ecf7a1 100644 --- a/reference/speeduino.ini +++ b/reference/speeduino.ini @@ -213,7 +213,8 @@ page = 1 pinLayout = bits, U08, 15, [0:7], "Speeduino v0.1", "Speeduino v0.2", "Speeduino v0.3", "Speeduino v0.4", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "NA6 MX5 PNP", "Turtana PCB", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "Plazomat I/O 0.1", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "Daz V6 Shield 0.1", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "NO2C", "UA4C", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "dvjcodec Teensy RevA", "dvjcodec Teensy RevB", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID" tachoPin = bits, U08, 16, [0:5], "Board Default", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID" tachoDiv = bits, U08, 16, [6:7], "Normal", "Half", "INVALID", "INVALID" - unused2-17 = scalar, U08, 17, "ms", 0.1, 0.0, 0.0, 25.5, 1 + tachoDuration = bits, U08, 17, [0:2], "ms", 1.0, 0.0, 1.0, 6.0, 0 + unused2-17d = bits, U08, 17, [3:7], "ms", 0.1, 0.0, 0.0, 25.5, 1 unused2-18 = scalar, U08, 18, "ms", 0.1, 0.0, 0.0, 25.5, 1 tpsThresh = scalar, U08, 19, "%/s", 1.0, 0.0, 0.0, 255, 0 taeTime = scalar, U08, 20, "ms", 10, 0.0, 0.0, 2550, 0 @@ -1130,6 +1131,7 @@ page = 10 defaultValue = boostPin, 0 defaultValue = fuelPumpPin, 0 defaultValue = tachoPin, 0 + defaultValue = tachoDuration, 2 defaultValue = perToothIgn, 0 defaultValue = resetControlPin, 0 @@ -1641,6 +1643,7 @@ menuDialog = main dialog = tacho, "Tacho" field = "Output pin", tachoPin field = "Output speed", tachoDiv + field = "Pulse duration", tachoDuration dialog = accelEnrichments_center, "" field = "TPSdot Threshold", tpsThresh diff --git a/speeduino/globals.h b/speeduino/globals.h index 4e92b2f5..a4121533 100644 --- a/speeduino/globals.h +++ b/speeduino/globals.h @@ -460,7 +460,8 @@ struct config2 { byte pinMapping; // The board / ping mapping to be used byte tachoPin : 6; //Custom pin setting for tacho output byte tachoDiv : 2; //Whether to change the tacho speed - byte unused2_17; + byte tachoDuration : 3; //The duration of the tacho pulse in mS + byte unused2_17d : 5; byte unused2_18; byte tpsThresh; byte taeTime; diff --git a/speeduino/scheduledIO.ino b/speeduino/scheduledIO.ino index 935cc9c0..146ee5d3 100644 --- a/speeduino/scheduledIO.ino +++ b/speeduino/scheduledIO.ino @@ -1,45 +1,40 @@ #include "scheduledIO.h" #include "scheduler.h" #include "globals.h" +#include "timers.h" -volatile bool tachoAlt = true; -#define TACH_PULSE_HIGH() *tach_pin_port |= (tach_pin_mask) -#define TACH_PULSE_LOW() if( (configPage2.tachoDiv == 0) || tachoAlt ) { *tach_pin_port &= ~(tach_pin_mask); tachoAlt = !tachoAlt; } +inline void beginCoil1Charge() { digitalWrite(pinCoil1, coilHIGH); tachoOutputFlag = READY; } +inline void endCoil1Charge() { digitalWrite(pinCoil1, coilLOW); } +inline void beginCoil2Charge() { digitalWrite(pinCoil2, coilHIGH); tachoOutputFlag = READY; } +inline void endCoil2Charge() { digitalWrite(pinCoil2, coilLOW); } +inline void beginCoil3Charge() { digitalWrite(pinCoil3, coilHIGH); tachoOutputFlag = READY; } +inline void endCoil3Charge() { digitalWrite(pinCoil3, coilLOW); } - inline void beginCoil1Charge() { digitalWrite(pinCoil1, coilHIGH); TACH_PULSE_LOW(); } - inline void endCoil1Charge() { digitalWrite(pinCoil1, coilLOW); TACH_PULSE_HIGH(); } +inline void beginCoil4Charge() { digitalWrite(pinCoil4, coilHIGH); tachoOutputFlag = READY; } +inline void endCoil4Charge() { digitalWrite(pinCoil4, coilLOW); } - inline void beginCoil2Charge() { digitalWrite(pinCoil2, coilHIGH); TACH_PULSE_LOW(); } - inline void endCoil2Charge() { digitalWrite(pinCoil2, coilLOW); TACH_PULSE_HIGH(); } +inline void beginCoil5Charge() { digitalWrite(pinCoil5, coilHIGH); tachoOutputFlag = READY; } +inline void endCoil5Charge() { digitalWrite(pinCoil5, coilLOW); } - inline void beginCoil3Charge() { digitalWrite(pinCoil3, coilHIGH); TACH_PULSE_LOW(); } - inline void endCoil3Charge() { digitalWrite(pinCoil3, coilLOW); TACH_PULSE_HIGH(); } +inline void beginCoil6Charge() { digitalWrite(pinCoil6, coilHIGH); tachoOutputFlag = READY; } +inline void endCoil6Charge() { digitalWrite(pinCoil6, coilLOW); } - inline void beginCoil4Charge() { digitalWrite(pinCoil4, coilHIGH); TACH_PULSE_LOW(); } - inline void endCoil4Charge() { digitalWrite(pinCoil4, coilLOW); TACH_PULSE_HIGH(); } +inline void beginCoil7Charge() { digitalWrite(pinCoil7, coilHIGH); tachoOutputFlag = READY; } +inline void endCoil7Charge() { digitalWrite(pinCoil7, coilLOW); } - inline void beginCoil5Charge() { digitalWrite(pinCoil5, coilHIGH); TACH_PULSE_LOW(); } - inline void endCoil5Charge() { digitalWrite(pinCoil5, coilLOW); TACH_PULSE_HIGH(); } +inline void beginCoil8Charge() { digitalWrite(pinCoil8, coilHIGH); tachoOutputFlag = READY; } +inline void endCoil8Charge() { digitalWrite(pinCoil8, coilLOW); } - inline void beginCoil6Charge() { digitalWrite(pinCoil6, coilHIGH); TACH_PULSE_LOW(); } - inline void endCoil6Charge() { digitalWrite(pinCoil6, coilLOW); TACH_PULSE_HIGH(); } - - inline void beginCoil7Charge() { digitalWrite(pinCoil7, coilHIGH); TACH_PULSE_LOW(); } - inline void endCoil7Charge() { digitalWrite(pinCoil7, coilLOW); TACH_PULSE_HIGH(); } - - inline void beginCoil8Charge() { digitalWrite(pinCoil8, coilHIGH); TACH_PULSE_LOW(); } - inline void endCoil8Charge() { digitalWrite(pinCoil8, coilLOW); TACH_PULSE_HIGH(); } - - inline void beginTrailingCoilCharge() { digitalWrite(pinCoil2, coilHIGH); } - inline void endTrailingCoilCharge1() { digitalWrite(pinCoil2, coilLOW); *ign3_pin_port |= ign3_pin_mask; } //Sets ign3 (Trailing select) high - inline void endTrailingCoilCharge2() { digitalWrite(pinCoil2, coilLOW); *ign3_pin_port &= ~(ign3_pin_mask); } //sets ign3 (Trailing select) low +inline void beginTrailingCoilCharge() { digitalWrite(pinCoil2, coilHIGH); } +inline void endTrailingCoilCharge1() { digitalWrite(pinCoil2, coilLOW); *ign3_pin_port |= ign3_pin_mask; } //Sets ign3 (Trailing select) high +inline void endTrailingCoilCharge2() { digitalWrite(pinCoil2, coilLOW); *ign3_pin_port &= ~(ign3_pin_mask); } //sets ign3 (Trailing select) low //As above but for ignition (Wasted COP mode) -void beginCoil1and3Charge() { digitalWrite(pinCoil1, coilHIGH); digitalWrite(pinCoil3, coilHIGH); TACH_PULSE_LOW(); } -void endCoil1and3Charge() { digitalWrite(pinCoil1, coilLOW); digitalWrite(pinCoil3, coilLOW); TACH_PULSE_HIGH(); } -void beginCoil2and4Charge() { digitalWrite(pinCoil2, coilHIGH); digitalWrite(pinCoil4, coilHIGH); TACH_PULSE_LOW(); } -void endCoil2and4Charge() { digitalWrite(pinCoil2, coilLOW); digitalWrite(pinCoil4, coilLOW); TACH_PULSE_HIGH(); } +void beginCoil1and3Charge() { digitalWrite(pinCoil1, coilHIGH); digitalWrite(pinCoil3, coilHIGH); tachoOutputFlag = READY; } +void endCoil1and3Charge() { digitalWrite(pinCoil1, coilLOW); digitalWrite(pinCoil3, coilLOW); } +void beginCoil2and4Charge() { digitalWrite(pinCoil2, coilHIGH); digitalWrite(pinCoil4, coilHIGH); tachoOutputFlag = READY; } +void endCoil2and4Charge() { digitalWrite(pinCoil2, coilLOW); digitalWrite(pinCoil4, coilLOW); } void nullCallback() { return; } diff --git a/speeduino/timers.h b/speeduino/timers.h index 1deeff84..70c5f74f 100644 --- a/speeduino/timers.h +++ b/speeduino/timers.h @@ -19,6 +19,13 @@ Hence we will preload the timer with 131 cycles to leave 125 until overflow (1ms #ifndef TIMERS_H #define TIMERS_H +volatile bool tachoAlt = true; +#define TACHO_PULSE_HIGH() *tach_pin_port |= (tach_pin_mask) +#define TACHO_PULSE_LOW() if( (configPage2.tachoDiv == 0) || tachoAlt ) { *tach_pin_port &= ~(tach_pin_mask); tachoAlt = !tachoAlt; } +enum TachoOutputStatus {DEACTIVE, READY, ACTIVE}; //The 3 statuses that the tacho output pulse can have +volatile uint8_t tachoEndTime; //The time (in ms) that the tacho pulse needs to end at +volatile TachoOutputStatus tachoOutputFlag; + volatile byte loop33ms; volatile byte loop66ms; volatile byte loop100ms; diff --git a/speeduino/timers.ino b/speeduino/timers.ino index 7634b740..3e6743f2 100644 --- a/speeduino/timers.ino +++ b/speeduino/timers.ino @@ -62,6 +62,24 @@ void oneMSInterval() //Most ARM chips can simply call a function if(ignitionSchedule4.Status == RUNNING) { if( (ignitionSchedule4.startTime < targetOverdwellTime) && (configPage4.useDwellLim) && (isCrankLocked != true) ) { endCoil4Charge(); ignitionSchedule4.Status = OFF; } } if(ignitionSchedule5.Status == RUNNING) { if( (ignitionSchedule5.startTime < targetOverdwellTime) && (configPage4.useDwellLim) && (isCrankLocked != true) ) { endCoil5Charge(); ignitionSchedule5.Status = OFF; } } + //Tacho output check + if(tachoOutputFlag == READY) + { + TACHO_PULSE_LOW(); + //ms_counter is cast down to a byte as the tacho duration can only be in the range of 0-5, so no extra + tachoEndTime = (uint8_t)ms_counter + configPage2.tachoDuration; + tachoOutputFlag = ACTIVE; + } + else if(tachoOutputFlag == ACTIVE) + { + // + if((uint8_t)ms_counter > tachoEndTime) + { + TACHO_PULSE_HIGH(); + tachoOutputFlag = DEACTIVE; + } + } + //30Hz loop From 7ed645b5745c3c25e963b97acb9cede7ac579284 Mon Sep 17 00:00:00 2001 From: Josh Stewart Date: Tue, 12 Mar 2019 21:49:09 +1100 Subject: [PATCH 42/51] stm32 SPIAsEEPROM compatibility work --- platformio.ini | 1 + speeduino/board_stm32_official.h | 1 + speeduino/decoders.ino | 2 +- speeduino/globals.h | 4 ++-- speeduino/init.ino | 2 +- speeduino/src/SPIAsEEPROM/SPIAsEEPROM.cpp | 5 +++-- speeduino/src/SPIAsEEPROM/SPIFlash.h | 2 +- speeduino/src/SPIAsEEPROM/SPIFlashIO.cpp | 1 + speeduino/timers.ino | 5 +++-- 9 files changed, 14 insertions(+), 9 deletions(-) diff --git a/platformio.ini b/platformio.ini index 432f8aad..c587dfac 100644 --- a/platformio.ini +++ b/platformio.ini @@ -54,6 +54,7 @@ framework = arduino board = black_f407ve lib_deps = EEPROM board_build.core = stm32 +;build_flags = -fpermissive -std=gnu++11 -UBOARD_NR_GPIO_PINS -DCORE_STM32_OFFICIAL -DSRAM_AS_EEPROM build_flags = -fpermissive -std=gnu++11 -UBOARD_NR_GPIO_PINS -DCORE_STM32_OFFICIAL -DSPI_AS_EEPROM diff --git a/speeduino/board_stm32_official.h b/speeduino/board_stm32_official.h index 78bf8233..4b317556 100644 --- a/speeduino/board_stm32_official.h +++ b/speeduino/board_stm32_official.h @@ -28,6 +28,7 @@ void initBoard(); uint16_t freeRam(); extern void oneMSIntervalIRQ(stimer_t *Timer); extern void EmptyIRQCallback(stimer_t *Timer, uint32_t channel); +extern "C" char* sbrk(int incr); /* *********************************************************************************************************** diff --git a/speeduino/decoders.ino b/speeduino/decoders.ino index a78f82ab..ff585f9e 100644 --- a/speeduino/decoders.ino +++ b/speeduino/decoders.ino @@ -678,7 +678,7 @@ void triggerPri_BasicDistributor() if( currentStatus.hasSync == true ) { currentStatus.syncLossCounter++; - currentStatus.hasSync == false; + currentStatus.hasSync = false; } } diff --git a/speeduino/globals.h b/speeduino/globals.h index a4121533..40826b92 100644 --- a/speeduino/globals.h +++ b/speeduino/globals.h @@ -410,8 +410,8 @@ struct statuses { volatile byte runSecs; //Counter of seconds since cranking commenced (overflows at 255 obviously) volatile byte secl; //Continous volatile unsigned int loopsPerSecond; - boolean launchingSoft; //True when in launch control soft limit mode - boolean launchingHard; //True when in launch control hard limit mode + bool launchingSoft; //True when in launch control soft limit mode + bool launchingHard; //True when in launch control hard limit mode uint16_t freeRAM; unsigned int clutchEngagedRPM; bool flatShiftingHard; diff --git a/speeduino/init.ino b/speeduino/init.ino index 3d5d2836..aff90193 100644 --- a/speeduino/init.ino +++ b/speeduino/init.ino @@ -1107,7 +1107,7 @@ void setPinMapping(byte boardID) break; case 20: - #ifndef SMALL_FLASH_MODE //No support for bluepill here anyway + #if defined(CORE_AVR) && !defined(SMALL_FLASH_MODE) //No support for bluepill here anyway //Pin mappings as per the Plazomat In/Out shields Rev 0.1 pinInjector1 = 8; //Output pin injector 1 is on pinInjector2 = 9; //Output pin injector 2 is on diff --git a/speeduino/src/SPIAsEEPROM/SPIAsEEPROM.cpp b/speeduino/src/SPIAsEEPROM/SPIAsEEPROM.cpp index f2492adb..0142a80a 100644 --- a/speeduino/src/SPIAsEEPROM/SPIAsEEPROM.cpp +++ b/speeduino/src/SPIAsEEPROM/SPIAsEEPROM.cpp @@ -6,9 +6,10 @@ #include "SPIAsEEPROM.h" #include "SPIMemory.h" +#include -SPIFlash flash; -//SPIFlash flash(SS1, &SPI1); //Use this constructor if using an SPI bus other than the default SPI. Only works with chips with more than one hardware SPI bus +//SPIFlash flash; +SPIFlash flash(SS1, &SPI); //Use this constructor if using an SPI bus other than the default SPI. Only works with chips with more than one hardware SPI bus SPIAsEEPROM::SPIAsEEPROM() { diff --git a/speeduino/src/SPIAsEEPROM/SPIFlash.h b/speeduino/src/SPIAsEEPROM/SPIFlash.h index bff1393f..718b1206 100755 --- a/speeduino/src/SPIAsEEPROM/SPIFlash.h +++ b/speeduino/src/SPIAsEEPROM/SPIFlash.h @@ -34,7 +34,7 @@ class SPIFlash { public: //------------------------------------ Constructor ------------------------------------// //New Constructor to Accept the PinNames as a Chip select Parameter - @boseji 02.03.17 - #if defined (ARDUINO_ARCH_SAMD) || defined(ARCH_STM32) + #if defined (ARDUINO_ARCH_SAMD) || defined(ARCH_STM32) || defined(CORE_STM32_OFFICIAL) SPIFlash(uint8_t cs = CS, SPIClass *spiinterface=&SPI); #elif defined (BOARD_RTL8195A) SPIFlash(PinName cs = CS); diff --git a/speeduino/src/SPIAsEEPROM/SPIFlashIO.cpp b/speeduino/src/SPIAsEEPROM/SPIFlashIO.cpp index 7611c209..e0c21104 100755 --- a/speeduino/src/SPIAsEEPROM/SPIFlashIO.cpp +++ b/speeduino/src/SPIAsEEPROM/SPIFlashIO.cpp @@ -596,6 +596,7 @@ } } + return false; //Failsafe } //Troubleshooting function. Called when #ifdef RUNDIAGNOSTIC is uncommented at the top of this file. diff --git a/speeduino/timers.ino b/speeduino/timers.ino index 3e6743f2..30bead14 100644 --- a/speeduino/timers.ino +++ b/speeduino/timers.ino @@ -63,16 +63,17 @@ void oneMSInterval() //Most ARM chips can simply call a function if(ignitionSchedule5.Status == RUNNING) { if( (ignitionSchedule5.startTime < targetOverdwellTime) && (configPage4.useDwellLim) && (isCrankLocked != true) ) { endCoil5Charge(); ignitionSchedule5.Status = OFF; } } //Tacho output check + //Tacho is flagged as being ready for a pulse by the ignition outputs. if(tachoOutputFlag == READY) { TACHO_PULSE_LOW(); - //ms_counter is cast down to a byte as the tacho duration can only be in the range of 0-5, so no extra + //ms_counter is cast down to a byte as the tacho duration can only be in the range of 1-6, so no extra resolution above that is required tachoEndTime = (uint8_t)ms_counter + configPage2.tachoDuration; tachoOutputFlag = ACTIVE; } else if(tachoOutputFlag == ACTIVE) { - // + //If the tacho output is already active, check whether it's reached it's end time if((uint8_t)ms_counter > tachoEndTime) { TACHO_PULSE_HIGH(); From 8c89ff1c1a08757b0b2431ead6d762cfbd07281f Mon Sep 17 00:00:00 2001 From: Josh Stewart Date: Wed, 13 Mar 2019 14:24:05 +1100 Subject: [PATCH 43/51] Complete new tacho setup (fixes #210) --- reference/speeduino.ini | 3 +-- speeduino/globals.h | 3 +-- speeduino/scheduledIO.ino | 1 + speeduino/timers.h | 4 ++-- speeduino/timers.ino | 20 +++++++++++++++----- 5 files changed, 20 insertions(+), 11 deletions(-) diff --git a/reference/speeduino.ini b/reference/speeduino.ini index 12ecf7a1..4f81be1f 100644 --- a/reference/speeduino.ini +++ b/reference/speeduino.ini @@ -213,8 +213,7 @@ page = 1 pinLayout = bits, U08, 15, [0:7], "Speeduino v0.1", "Speeduino v0.2", "Speeduino v0.3", "Speeduino v0.4", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "NA6 MX5 PNP", "Turtana PCB", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "Plazomat I/O 0.1", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "Daz V6 Shield 0.1", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "NO2C", "UA4C", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "dvjcodec Teensy RevA", "dvjcodec Teensy RevB", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID" tachoPin = bits, U08, 16, [0:5], "Board Default", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID" tachoDiv = bits, U08, 16, [6:7], "Normal", "Half", "INVALID", "INVALID" - tachoDuration = bits, U08, 17, [0:2], "ms", 1.0, 0.0, 1.0, 6.0, 0 - unused2-17d = bits, U08, 17, [3:7], "ms", 0.1, 0.0, 0.0, 25.5, 1 + tachoDuration = scalar, U08, 17, "ms", 1.0, 0.0, 1.0, 6.0, 0 unused2-18 = scalar, U08, 18, "ms", 0.1, 0.0, 0.0, 25.5, 1 tpsThresh = scalar, U08, 19, "%/s", 1.0, 0.0, 0.0, 255, 0 taeTime = scalar, U08, 20, "ms", 10, 0.0, 0.0, 2550, 0 diff --git a/speeduino/globals.h b/speeduino/globals.h index 40826b92..f0586a86 100644 --- a/speeduino/globals.h +++ b/speeduino/globals.h @@ -460,8 +460,7 @@ struct config2 { byte pinMapping; // The board / ping mapping to be used byte tachoPin : 6; //Custom pin setting for tacho output byte tachoDiv : 2; //Whether to change the tacho speed - byte tachoDuration : 3; //The duration of the tacho pulse in mS - byte unused2_17d : 5; + byte tachoDuration; //The duration of the tacho pulse in mS byte unused2_18; byte tpsThresh; byte taeTime; diff --git a/speeduino/scheduledIO.ino b/speeduino/scheduledIO.ino index 146ee5d3..c92f2d25 100644 --- a/speeduino/scheduledIO.ino +++ b/speeduino/scheduledIO.ino @@ -27,6 +27,7 @@ inline void endCoil7Charge() { digitalWrite(pinCoil7, coilLOW); } inline void beginCoil8Charge() { digitalWrite(pinCoil8, coilHIGH); tachoOutputFlag = READY; } inline void endCoil8Charge() { digitalWrite(pinCoil8, coilLOW); } +//The below 3 calls are all part of the rotary ignition mode inline void beginTrailingCoilCharge() { digitalWrite(pinCoil2, coilHIGH); } inline void endTrailingCoilCharge1() { digitalWrite(pinCoil2, coilLOW); *ign3_pin_port |= ign3_pin_mask; } //Sets ign3 (Trailing select) high inline void endTrailingCoilCharge2() { digitalWrite(pinCoil2, coilLOW); *ign3_pin_port &= ~(ign3_pin_mask); } //sets ign3 (Trailing select) low diff --git a/speeduino/timers.h b/speeduino/timers.h index 70c5f74f..73162db3 100644 --- a/speeduino/timers.h +++ b/speeduino/timers.h @@ -19,9 +19,9 @@ Hence we will preload the timer with 131 cycles to leave 125 until overflow (1ms #ifndef TIMERS_H #define TIMERS_H -volatile bool tachoAlt = true; +volatile bool tachoAlt = false; #define TACHO_PULSE_HIGH() *tach_pin_port |= (tach_pin_mask) -#define TACHO_PULSE_LOW() if( (configPage2.tachoDiv == 0) || tachoAlt ) { *tach_pin_port &= ~(tach_pin_mask); tachoAlt = !tachoAlt; } +#define TACHO_PULSE_LOW() *tach_pin_port &= ~(tach_pin_mask) enum TachoOutputStatus {DEACTIVE, READY, ACTIVE}; //The 3 statuses that the tacho output pulse can have volatile uint8_t tachoEndTime; //The time (in ms) that the tacho pulse needs to end at volatile TachoOutputStatus tachoOutputFlag; diff --git a/speeduino/timers.ino b/speeduino/timers.ino index 30bead14..30bf76d7 100644 --- a/speeduino/timers.ino +++ b/speeduino/timers.ino @@ -66,15 +66,25 @@ void oneMSInterval() //Most ARM chips can simply call a function //Tacho is flagged as being ready for a pulse by the ignition outputs. if(tachoOutputFlag == READY) { - TACHO_PULSE_LOW(); - //ms_counter is cast down to a byte as the tacho duration can only be in the range of 1-6, so no extra resolution above that is required - tachoEndTime = (uint8_t)ms_counter + configPage2.tachoDuration; - tachoOutputFlag = ACTIVE; + //Check for half speed tacho + if( (configPage2.tachoDiv == 0) || (tachoAlt == true) ) + { + TACHO_PULSE_LOW(); + //ms_counter is cast down to a byte as the tacho duration can only be in the range of 1-6, so no extra resolution above that is required + tachoEndTime = (uint8_t)ms_counter + configPage2.tachoDuration; + tachoOutputFlag = ACTIVE; + } + else + { + //Don't run on this pulse (Half speed tacho) + tachoOutputFlag = DEACTIVE; + } + tachoAlt = !tachoAlt; //Flip the alternating value incase half speed tacho is in use. } else if(tachoOutputFlag == ACTIVE) { //If the tacho output is already active, check whether it's reached it's end time - if((uint8_t)ms_counter > tachoEndTime) + if((uint8_t)ms_counter >= tachoEndTime) { TACHO_PULSE_HIGH(); tachoOutputFlag = DEACTIVE; From 4f4781a2341bd7d628c2ee60fad5fac2af227201 Mon Sep 17 00:00:00 2001 From: Josh Stewart Date: Fri, 15 Mar 2019 17:35:18 +1100 Subject: [PATCH 44/51] Send dwell value as 16 rather than 8 bit to TS. Fixes #203 --- reference/speeduino.ini | 11 ++++++----- speeduino/comms.h | 2 +- speeduino/comms.ino | 5 +++-- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/reference/speeduino.ini b/reference/speeduino.ini index 092f69e0..bbf3d756 100644 --- a/reference/speeduino.ini +++ b/reference/speeduino.ini @@ -3137,7 +3137,7 @@ cmdtestspk450dc = "E\x03\x0C" ; you change it. ochGetCommand = "r\$tsCanId\x30%2o%2c" - ochBlockSize = 90 + ochBlockSize = 91 secl = scalar, U08, 0, "sec", 1.000, 0.000 status1 = scalar, U08, 1, "bits", 1.000, 0.000 @@ -3158,10 +3158,10 @@ cmdtestspk450dc = "E\x03\x0C" tpsaccden = bits, U08, 2, [5:5] mapaccaen = bits, U08, 2, [6:6] mapaccden = bits, U08, 2, [7:7] - dwell = scalar, U08, 3, "ms", 0.100, 0.000 + syncLossCounter = scalar, U08, 3, "", 1.000, 0.000 map = scalar, U16, 4, "kpa", 1.000, 0.000 - iatRaw = scalar, U08, 6, "°C", 1.000, 0.000 - coolantRaw = scalar, U08, 7, "°C", 1.000, 0.000 + iatRaw = scalar, U08, 6, "°C", 1.000, 0.000 + coolantRaw = scalar, U08, 7, "°C", 1.000, 0.000 batCorrection = scalar, U08, 8, "%", 1.000, 0.000 batteryVoltage = scalar, U08, 9, "V", 0.100, 0.000 afr = scalar, U08, 10, "O2", 0.100, 0.000 @@ -3235,7 +3235,8 @@ cmdtestspk450dc = "E\x03\x0C" nFuelChannels = bits, U08, 84, [4:7] fuelLoad = scalar, S16, 85, { bitStringValue( algorithmUnits , algorithm ) }, 1.000, 0.000 ignLoad = scalar, S16, 87, { bitStringValue( algorithmUnits , ignAlgorithm ) }, 1.000, 0.000 - syncLossCounter = scalar, U08, 89, "", 1.000, 0.000 + dwell = scalar, U16, 89, "ms", 0.001, 0.000 + #if CELSIUS diff --git a/speeduino/comms.h b/speeduino/comms.h index 5fbcbc29..72f5a545 100644 --- a/speeduino/comms.h +++ b/speeduino/comms.h @@ -12,7 +12,7 @@ #define canbusPage 9//Config Page 9 #define warmupPage 10 //Config Page 10 -#define SERIAL_PACKET_SIZE 90 //Must match ochBlockSize in ini file +#define SERIAL_PACKET_SIZE 91 //Must match ochBlockSize in ini file byte currentPage = 1;//Not the same as the speeduino config page numbers bool isMap = true; diff --git a/speeduino/comms.ino b/speeduino/comms.ino index 2ff4d364..42e319c6 100644 --- a/speeduino/comms.ino +++ b/speeduino/comms.ino @@ -460,7 +460,7 @@ void sendValues(uint16_t offset, uint16_t packetLength, byte cmd, byte portNum) fullStatus[0] = currentStatus.secl; //secl is simply a counter that increments each second. Used to track unexpected resets (Which will reset this count to 0) fullStatus[1] = currentStatus.status1; //status1 Bitfield fullStatus[2] = currentStatus.engine; //Engine Status Bitfield - fullStatus[3] = (byte)(divu100(currentStatus.dwell)); //Dwell in ms * 10 + fullStatus[3] = currentStatus.syncLossCounter; fullStatus[4] = lowByte(currentStatus.MAP); //2 bytes for MAP fullStatus[5] = highByte(currentStatus.MAP); fullStatus[6] = (byte)(currentStatus.IAT + CALIBRATION_TEMPERATURE_OFFSET); //mat @@ -561,7 +561,8 @@ void sendValues(uint16_t offset, uint16_t packetLength, byte cmd, byte portNum) fullStatus[86] = highByte(currentStatus.fuelLoad); fullStatus[87] = lowByte(currentStatus.ignLoad); fullStatus[88] = highByte(currentStatus.ignLoad); - fullStatus[89] = currentStatus.syncLossCounter; + fullStatus[89] = lowByte(currentStatus.dwell); + fullStatus[90] = highByte(currentStatus.dwell); for(byte x=0; x Date: Sun, 17 Mar 2019 22:14:29 +1100 Subject: [PATCH 45/51] Initial work on CRC32 calcs for pages --- speeduino/globals.h | 3 +- speeduino/storage.h | 5 ++++ speeduino/storage.ino | 40 +++++++++++++++++++++++++ speeduino/utils.h | 2 +- speeduino/utils.ino | 70 +++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 118 insertions(+), 2 deletions(-) diff --git a/speeduino/globals.h b/speeduino/globals.h index 956af0f4..0534b2b8 100644 --- a/speeduino/globals.h +++ b/speeduino/globals.h @@ -228,7 +228,8 @@ const char TSfirmwareVersion[] PROGMEM = "Speeduino"; const byte data_structure_version = 2; //This identifies the data structure when reading / writing. //const byte page_size = 64; //const int16_t npage_size[11] PROGMEM = {0,288,128,288,128,288,128,240,192,192,192}; -const int16_t npage_size[11] PROGMEM = {0,128,288,288,128,288,128,240,192,192,192}; +#define NUM_PAGES 11 +const int16_t npage_size[NUM_PAGES] PROGMEM = {0,128,288,288,128,288,128,240,192,192,192}; //const byte page11_size = 128; #define MAP_PAGE_SIZE 288 diff --git a/speeduino/storage.h b/speeduino/storage.h index f9888f88..5c6a9f78 100644 --- a/speeduino/storage.h +++ b/speeduino/storage.h @@ -15,6 +15,8 @@ void storeLastBaro(byte); void storeCalibrationValue(uint16_t, byte); byte readEEPROMVersion(); void storeEEPROMVersion(byte); +void storePageCRC32(byte, uint32_t); +uint32_t readPageCRC32(byte); #if defined(CORE_STM32) || defined(CORE_TEENSY) #define EEPROM_MAX_WRITE_BLOCK 64 //The maximum number of write operations that will be performed in one go. If we try to write to the EEPROM too fast (Each write takes ~3ms) then the rest of the system can hang) @@ -68,6 +70,8 @@ Current layout of EEPROM data (Version 3) is as follows (All sizes are in bytes) | 1500 |192 | CANBUS config and data (Table 10_) | | 1692 |192 | Table 11 - General settings | | | +| 2514 |44 | Table CRC32 values. Last table first| +| 2558 |1 | Last recorded Baro value | | 2559 |512 | Calibration data (O2) | | 3071 |512 | Calibration data (IAT) | | 3583 |512 | Calibration data (CLT) | @@ -141,6 +145,7 @@ Current layout of EEPROM data (Version 3) is as follows (All sizes are in bytes) #define EEPROM_CONFIG10_END 2094 //Calibration data is stored at the end of the EEPROM (This is in case any further calibration tables are needed as they are large blocks) +#define EEPROM_PAGE_CRC32 2514 //Size of this is 4 * (CRC32 = 32 bits) #define EEPROM_LAST_BARO 2558 #define EEPROM_CALIBRATION_O2 2559 #define EEPROM_CALIBRATION_IAT 3071 diff --git a/speeduino/storage.ino b/speeduino/storage.ino index 254f6b72..c51fce36 100644 --- a/speeduino/storage.ino +++ b/speeduino/storage.ino @@ -645,6 +645,46 @@ void writeCalibration() } +/* +Takes a page number and CRC32 value then stores it in the relevant place in EEPROM +Note: Each pages requires 4 bytes for its CRC32. These are stored in reverse page order (ie the last page is store first in EEPROM) +*/ +void storePageCRC32(byte pageNo, uint32_t crc32_val) +{ + uint16_t address; //Start address for the relevant page + address = EEPROM_PAGE_CRC32 + ((NUM_PAGES - pageNo) * 4); + + //One = Most significant -> Four = Least significant byte + byte four = (crc32_val & 0xFF); + byte three = ((crc32_val >> 8) & 0xFF); + byte two = ((crc32_val >> 16) & 0xFF); + byte one = ((crc32_val >> 24) & 0xFF); + + //Write the 4 bytes into the eeprom memory. + EEPROM.update(address, four); + EEPROM.update(address + 1, three); + EEPROM.update(address + 2, two); + EEPROM.update(address + 3, one); +} + +/* +Retrieves and returns the 4 byte CRC32 for a given page from EEPROM +*/ +uint32_t readPageCRC32(byte pageNo) +{ + uint16_t address; //Start address for the relevant page + address = EEPROM_PAGE_CRC32 + ((NUM_PAGES - pageNo) * 4); + + //Read the 4 bytes from the eeprom memory. + uint32_t four = EEPROM.read(address); + uint32_t three = EEPROM.read(address + 1); + uint32_t two = EEPROM.read(address + 2); + uint32_t one = EEPROM.read(address + 3); + + //Return the recomposed long by using bitshift. + return ((four << 0) & 0xFF) + ((three << 8) & 0xFFFF) + ((two << 16) & 0xFFFFFF) + ((one << 24) & 0xFFFFFFFF); +} + // Utility functions. // By having these in this file, it prevents other files from calling EEPROM functions directly. This is useful due to differences in the EEPROM libraries on different devces byte readLastBaro() { return EEPROM.read(EEPROM_LAST_BARO); } diff --git a/speeduino/utils.h b/speeduino/utils.h index 0a26e8c1..34cde4a6 100644 --- a/speeduino/utils.h +++ b/speeduino/utils.h @@ -8,6 +8,6 @@ These are some utility functions and variables used through the main code void setResetControlPinState(); byte pinTranslate(byte); - +uint32_t calculateCRC32(byte); #endif // UTILS_H diff --git a/speeduino/utils.ino b/speeduino/utils.ino index cfe5f3ff..ed9ec41b 100644 --- a/speeduino/utils.ino +++ b/speeduino/utils.ino @@ -13,6 +13,10 @@ #include "globals.h" #include "utils.h" #include "decoders.h" +#include "comms.h" +#include "src/FastCRC/FastCRC.h" + +FastCRC32 CRC32; //This function performs a translation between the pin list that appears in TS and the actual pin numbers //For the digital IO, this will simply return the same number as the rawPin value as those are mapped directly. @@ -51,3 +55,69 @@ void setResetControlPinState() break; } } + +/* +Calculates and returns the CRC32 value of a given page of memory +*/ +uint32_t calculateCRC32(byte pageNo) +{ + uint32_t CRC32_val; + byte raw_value; + void* pnt_configPage; + + //This sucks (again) for thall the 3D map pages that have to have a translation performed + switch(pageNo) + { + case veMapPage: + raw_value = getPageValue(veMapPage, 0); + CRC32_val = CRC32.crc32(&raw_value, 1); + for(uint16_t x=1; x< sizeof(fuelTable); x++) + { + raw_value = getPageValue(veMapPage, x); + CRC32_val = CRC32.crc32_upd(&raw_value, 1); + } + break; + + case veSetPage: + pnt_configPage = &configPage1; //Create a pointer to Page 1 in memory + CRC32_val = CRC32.crc32((byte *)pnt_configPage, sizeof(configPage1) ); + break; + + case ignMapPage: + break; + + case ignSetPage: + pnt_configPage = &configPage2; //Create a pointer to Page 4 in memory + CRC32_val = CRC32.crc32((byte *)pnt_configPage, sizeof(configPage2) ); + break; + + case afrMapPage: + break; + + case afrSetPage: + pnt_configPage = &configPage3; //Create a pointer to Page 4 in memory + CRC32_val = CRC32.crc32((byte *)pnt_configPage, sizeof(configPage3) ); + break; + + case boostvvtPage: + break; + + case seqFuelPage: + break; + + case canbusPage: + pnt_configPage = &configPage9; //Create a pointer to Page 9 in memory + CRC32_val = CRC32.crc32((byte *)pnt_configPage, sizeof(configPage9) ); + break; + + case warmupPage: + pnt_configPage = &configPage10; //Create a pointer to Page 10 in memory + CRC32_val = CRC32.crc32((byte *)pnt_configPage, sizeof(configPage10) ); + break; + + default: + break; + } + + return CRC32_val; +} From fe11bbde1ea51ddf305a49a734304978120d6174 Mon Sep 17 00:00:00 2001 From: Josh Stewart Date: Mon, 18 Mar 2019 00:40:35 +1100 Subject: [PATCH 46/51] Working CRC32 checks on all non-map pages --- reference/speeduino.ini | 3 ++- speeduino/comms.h | 2 +- speeduino/comms.ino | 20 +++++++++++++- speeduino/globals.h | 4 +-- speeduino/utils.ino | 59 ++++++++++++++++++++++++++++++++--------- 5 files changed, 70 insertions(+), 18 deletions(-) diff --git a/reference/speeduino.ini b/reference/speeduino.ini index bbf3d756..e3d896d4 100644 --- a/reference/speeduino.ini +++ b/reference/speeduino.ini @@ -166,6 +166,7 @@ pageReadCommand = "p%2i%2o%2c", "p%2i%2o%2c", "p%2i%2o%2c", "p%2i%2o%2c", "p%2i%2o%2c", "p%2i%2o%2c", "p%2i%2o%2c", "p%2i%2o%2c", "p%2i%2o%2c", "p%2i%2o%2c" pageValueWrite = "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v" pageChunkWrite = "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v" + crc32CheckCommand = "d%2i", "d%2i", "d%2i", "d%2i", "d%2i", "d%2i", "d%2i", "d%2i", "d%2i", "d%2i" blockingFactor = 2048 tableBlockingFactor = 2048 @@ -988,7 +989,7 @@ page = 10 knock_recoveryStepTime = scalar, U08, 120, "Sec", 0.1, 0.0, 0.0, 2.5, 1 knock_recoveryStep = scalar, U08, 121, "Deg", 1.0, 0.0, 0.0, 50, 0 - unused11_122_191 = array, U08, 122,[69],"RPM", 100.0, 0.0, 100, 25500, 0 + unused11_122_191 = array, U08, 122,[70],"RPM", 100.0, 0.0, 100, 25500, 0 ;------------------------------------------------------------------------------- diff --git a/speeduino/comms.h b/speeduino/comms.h index 72f5a545..3d4a47db 100644 --- a/speeduino/comms.h +++ b/speeduino/comms.h @@ -44,7 +44,7 @@ const char pageTitles[] PROGMEM //This is being stored in the avr flash instead void command();//This is the heart of the Command Line Interpeter. All that needed to be done was to make it human readable. void sendValues(uint16_t, uint16_t,byte, byte); -void receiveValue(int, byte); +void receiveValue(uint16_t, byte); void saveConfig(); void sendPage(bool); void receiveCalibration(byte); diff --git a/speeduino/comms.ino b/speeduino/comms.ino index 42e319c6..2eed93f2 100644 --- a/speeduino/comms.ino +++ b/speeduino/comms.ino @@ -56,6 +56,24 @@ void command() Serial.write(highByte(currentStatus.loopsPerSecond)); break; + case 'd': // Send a CRC32 value of a given page + cmdPending = true; + + if (Serial.available() >= 2) + { + Serial.read(); //Ignore the first table value, it's always 0 + uint32_t CRC32_val = calculateCRC32( Serial.read() ); + + //Split the 4 bytes of the CRC32 value into individual bytes and send + Serial.write( ((CRC32_val >> 24) & 255) ); + Serial.write( ((CRC32_val >> 16) & 255) ); + Serial.write( ((CRC32_val >> 8) & 255) ); + Serial.write( (CRC32_val & 255) ); + + cmdPending = false; + } + break; + //The following can be used to show the amount of free memory case 'E': // receive command button commands @@ -572,7 +590,7 @@ void sendValues(uint16_t offset, uint16_t packetLength, byte cmd, byte portNum) } -void receiveValue(int valueOffset, byte newValue) +void receiveValue(uint16_t valueOffset, byte newValue) { void* pnt_configPage;//This only stores the address of the value that it's pointing to and not the max size diff --git a/speeduino/globals.h b/speeduino/globals.h index 0534b2b8..086532b4 100644 --- a/speeduino/globals.h +++ b/speeduino/globals.h @@ -229,7 +229,7 @@ const byte data_structure_version = 2; //This identifies the data structure when //const byte page_size = 64; //const int16_t npage_size[11] PROGMEM = {0,288,128,288,128,288,128,240,192,192,192}; #define NUM_PAGES 11 -const int16_t npage_size[NUM_PAGES] PROGMEM = {0,128,288,288,128,288,128,240,192,192,192}; +const uint16_t npage_size[NUM_PAGES] PROGMEM = {0,128,288,288,128,288,128,240,192,192,192}; //const byte page11_size = 128; #define MAP_PAGE_SIZE 288 @@ -884,7 +884,7 @@ struct config10 { byte knock_recoveryStepTime; byte knock_recoveryStep; - byte unused11_122_191[69]; + byte unused11_122_191[70]; #if defined(CORE_AVR) }; diff --git a/speeduino/utils.ino b/speeduino/utils.ino index ed9ec41b..cad9d4ce 100644 --- a/speeduino/utils.ino +++ b/speeduino/utils.ino @@ -65,13 +65,13 @@ uint32_t calculateCRC32(byte pageNo) byte raw_value; void* pnt_configPage; - //This sucks (again) for thall the 3D map pages that have to have a translation performed + //This sucks (again) for all the 3D map pages that have to have a translation performed switch(pageNo) { case veMapPage: raw_value = getPageValue(veMapPage, 0); CRC32_val = CRC32.crc32(&raw_value, 1); - for(uint16_t x=1; x< sizeof(fuelTable); x++) + for(uint16_t x=1; x< npage_size[veMapPage]; x++) { raw_value = getPageValue(veMapPage, x); CRC32_val = CRC32.crc32_upd(&raw_value, 1); @@ -79,38 +79,71 @@ uint32_t calculateCRC32(byte pageNo) break; case veSetPage: - pnt_configPage = &configPage1; //Create a pointer to Page 1 in memory - CRC32_val = CRC32.crc32((byte *)pnt_configPage, sizeof(configPage1) ); - break; - - case ignMapPage: - break; - - case ignSetPage: - pnt_configPage = &configPage2; //Create a pointer to Page 4 in memory + //Confirmed working + pnt_configPage = &configPage2; //Create a pointer to Page 1 in memory CRC32_val = CRC32.crc32((byte *)pnt_configPage, sizeof(configPage2) ); break; + case ignMapPage: + raw_value = getPageValue(ignMapPage, 0); + CRC32_val = CRC32.crc32(&raw_value, 1); + for(uint16_t x=1; x< sizeof(ignitionTable); x++) + { + raw_value = getPageValue(ignMapPage, x); + CRC32_val = CRC32.crc32_upd(&raw_value, 1); + } + break; + + case ignSetPage: + //Confirmed working + pnt_configPage = &configPage4; //Create a pointer to Page 4 in memory + CRC32_val = CRC32.crc32((byte *)pnt_configPage, sizeof(configPage4) ); + break; + case afrMapPage: + raw_value = getPageValue(afrMapPage, 0); + CRC32_val = CRC32.crc32(&raw_value, 1); + for(uint16_t x=1; x< sizeof(afrTable); x++) + { + raw_value = getPageValue(afrMapPage, x); + CRC32_val = CRC32.crc32_upd(&raw_value, 1); + } break; case afrSetPage: - pnt_configPage = &configPage3; //Create a pointer to Page 4 in memory - CRC32_val = CRC32.crc32((byte *)pnt_configPage, sizeof(configPage3) ); + //Confirmed working + pnt_configPage = &configPage6; //Create a pointer to Page 4 in memory + CRC32_val = CRC32.crc32((byte *)pnt_configPage, sizeof(configPage6) ); break; case boostvvtPage: + raw_value = getPageValue(afrMapPage, 0); + CRC32_val = CRC32.crc32(&raw_value, 1); + for(uint16_t x=1; x< npage_size[boostvvtPage]; x++) + { + raw_value = getPageValue(afrMapPage, x); + CRC32_val = CRC32.crc32_upd(&raw_value, 1); + } break; case seqFuelPage: + raw_value = getPageValue(seqFuelPage, 0); + CRC32_val = CRC32.crc32(&raw_value, 1); + for(uint16_t x=1; x< npage_size[seqFuelPage]; x++) + { + raw_value = getPageValue(seqFuelPage, x); + CRC32_val = CRC32.crc32_upd(&raw_value, 1); + } break; case canbusPage: + //Confirmed working pnt_configPage = &configPage9; //Create a pointer to Page 9 in memory CRC32_val = CRC32.crc32((byte *)pnt_configPage, sizeof(configPage9) ); break; case warmupPage: + //Confirmed working pnt_configPage = &configPage10; //Create a pointer to Page 10 in memory CRC32_val = CRC32.crc32((byte *)pnt_configPage, sizeof(configPage10) ); break; From 49a6744e36c74d2c9ba29159e9b862a16b80a748 Mon Sep 17 00:00:00 2001 From: Josh Stewart Date: Mon, 18 Mar 2019 16:44:29 +1100 Subject: [PATCH 47/51] Complete and tested CRC32 calcs for pages --- speeduino/comms.h | 1 + speeduino/src/FastCRC/FastCRC.h | 4 +-- speeduino/src/FastCRC/FastCRCsw.cpp | 9 +++--- speeduino/utils.ino | 44 ++++++++++++++++++++--------- 4 files changed, 38 insertions(+), 20 deletions(-) diff --git a/speeduino/comms.h b/speeduino/comms.h index 3d4a47db..11011f0d 100644 --- a/speeduino/comms.h +++ b/speeduino/comms.h @@ -51,5 +51,6 @@ void receiveCalibration(byte); void sendToothLog(bool); void testComm(); void commandButtons(); +byte getPageValue(byte, uint16_t); #endif // COMMS_H diff --git a/speeduino/src/FastCRC/FastCRC.h b/speeduino/src/FastCRC/FastCRC.h index 9ec9926f..ef8cff58 100755 --- a/speeduino/src/FastCRC/FastCRC.h +++ b/speeduino/src/FastCRC/FastCRC.h @@ -136,10 +136,10 @@ class FastCRC32 { public: FastCRC32(); - uint32_t crc32(const uint8_t *data, const uint16_t datalen); // Alias CRC-32/ADCCP, PKZIP, Ethernet, 802.3 + uint32_t crc32(const uint8_t *data, const uint16_t datalen, bool reflect=true); // Alias CRC-32/ADCCP, PKZIP, Ethernet, 802.3 uint32_t cksum(const uint8_t *data, const uint16_t datalen); // Alias CRC-32/POSIX - uint32_t crc32_upd(const uint8_t *data, uint16_t len); // Call for subsequent calculations with previous seed + uint32_t crc32_upd(const uint8_t *data, uint16_t len, bool reflect=true); // Call for subsequent calculations with previous seed uint32_t cksum_upd(const uint8_t *data, uint16_t len); // Call for subsequent calculations with previous seed #if !CRC_SW uint32_t generic(const uint32_t polyom, const uint32_t seed, const uint32_t flags, const uint8_t *data, const uint16_t datalen); //Not available in non-hw-variant (not T3.x) diff --git a/speeduino/src/FastCRC/FastCRCsw.cpp b/speeduino/src/FastCRC/FastCRCsw.cpp index 1ff29f5f..1478cfaf 100755 --- a/speeduino/src/FastCRC/FastCRCsw.cpp +++ b/speeduino/src/FastCRC/FastCRCsw.cpp @@ -410,7 +410,7 @@ FastCRC32::FastCRC32(){} #define CRC_TABLE_CRC32 crc_table_crc32 #endif -uint32_t FastCRC32::crc32_upd(const uint8_t *data, uint16_t len) +uint32_t FastCRC32::crc32_upd(const uint8_t *data, uint16_t len, bool reflect) { uint32_t crc = seed; @@ -440,17 +440,18 @@ uint32_t FastCRC32::crc32_upd(const uint8_t *data, uint16_t len) crc = (crc >> 8) ^ pgm_read_dword(&CRC_TABLE_CRC32[(crc & 0xff) ^ *data++]); } - crc = ~crc; + if(reflect) { crc = ~crc; } + seed = crc; return crc; } -uint32_t FastCRC32::crc32(const uint8_t *data, const uint16_t datalen) +uint32_t FastCRC32::crc32(const uint8_t *data, const uint16_t datalen, bool reflect) { // poly=0x04c11db7 init=0xffffffff refin=true refout=true xorout=0xffffffff check=0xcbf43926 seed = 0xffffffff; - return crc32_upd(data, datalen); + return crc32_upd(data, datalen, reflect); } /** CKSUM diff --git a/speeduino/utils.ino b/speeduino/utils.ino index cad9d4ce..14a2fef1 100644 --- a/speeduino/utils.ino +++ b/speeduino/utils.ino @@ -69,13 +69,17 @@ uint32_t calculateCRC32(byte pageNo) switch(pageNo) { case veMapPage: + //Confirmed working raw_value = getPageValue(veMapPage, 0); - CRC32_val = CRC32.crc32(&raw_value, 1); + CRC32_val = CRC32.crc32(&raw_value, 1, false); for(uint16_t x=1; x< npage_size[veMapPage]; x++) + //for(uint16_t x=1; x< 288; x++) { raw_value = getPageValue(veMapPage, x); - CRC32_val = CRC32.crc32_upd(&raw_value, 1); + CRC32_val = CRC32.crc32_upd(&raw_value, 1, false); } + //Do a manual reflection of the CRC32 value + CRC32_val = ~CRC32_val; break; case veSetPage: @@ -85,13 +89,16 @@ uint32_t calculateCRC32(byte pageNo) break; case ignMapPage: + //Confirmed working raw_value = getPageValue(ignMapPage, 0); - CRC32_val = CRC32.crc32(&raw_value, 1); - for(uint16_t x=1; x< sizeof(ignitionTable); x++) + CRC32_val = CRC32.crc32(&raw_value, 1, false); + for(uint16_t x=1; x< npage_size[ignMapPage]; x++) { raw_value = getPageValue(ignMapPage, x); - CRC32_val = CRC32.crc32_upd(&raw_value, 1); + CRC32_val = CRC32.crc32_upd(&raw_value, 1, false); } + //Do a manual reflection of the CRC32 value + CRC32_val = ~CRC32_val; break; case ignSetPage: @@ -101,13 +108,16 @@ uint32_t calculateCRC32(byte pageNo) break; case afrMapPage: + //Confirmed working raw_value = getPageValue(afrMapPage, 0); - CRC32_val = CRC32.crc32(&raw_value, 1); - for(uint16_t x=1; x< sizeof(afrTable); x++) + CRC32_val = CRC32.crc32(&raw_value, 1, false); + for(uint16_t x=1; x< npage_size[afrMapPage]; x++) { raw_value = getPageValue(afrMapPage, x); - CRC32_val = CRC32.crc32_upd(&raw_value, 1); + CRC32_val = CRC32.crc32_upd(&raw_value, 1, false); } + //Do a manual reflection of the CRC32 value + CRC32_val = ~CRC32_val; break; case afrSetPage: @@ -117,23 +127,29 @@ uint32_t calculateCRC32(byte pageNo) break; case boostvvtPage: - raw_value = getPageValue(afrMapPage, 0); - CRC32_val = CRC32.crc32(&raw_value, 1); + //Confirmed working + raw_value = getPageValue(boostvvtPage, 0); + CRC32_val = CRC32.crc32(&raw_value, 1, false); for(uint16_t x=1; x< npage_size[boostvvtPage]; x++) { - raw_value = getPageValue(afrMapPage, x); - CRC32_val = CRC32.crc32_upd(&raw_value, 1); + raw_value = getPageValue(boostvvtPage, x); + CRC32_val = CRC32.crc32_upd(&raw_value, 1, false); } + //Do a manual reflection of the CRC32 value + CRC32_val = ~CRC32_val; break; case seqFuelPage: + //Confirmed working raw_value = getPageValue(seqFuelPage, 0); - CRC32_val = CRC32.crc32(&raw_value, 1); + CRC32_val = CRC32.crc32(&raw_value, 1, false); for(uint16_t x=1; x< npage_size[seqFuelPage]; x++) { raw_value = getPageValue(seqFuelPage, x); - CRC32_val = CRC32.crc32_upd(&raw_value, 1); + CRC32_val = CRC32.crc32_upd(&raw_value, 1, false); } + //Do a manual reflection of the CRC32 value + CRC32_val = ~CRC32_val; break; case canbusPage: From 90f6bec46e7a64893b46c0e5848685d0df72ef5f Mon Sep 17 00:00:00 2001 From: Josh Stewart Date: Mon, 25 Mar 2019 14:38:14 +1100 Subject: [PATCH 48/51] Initial FD and RX8 ignition mode work --- speeduino/init.ino | 36 ++++++++++++++++++++++++++++++++++++ speeduino/speeduino.ino | 27 ++++++++++++--------------- 2 files changed, 48 insertions(+), 15 deletions(-) diff --git a/speeduino/init.ino b/speeduino/init.ino index aff90193..a97b382d 100644 --- a/speeduino/init.ino +++ b/speeduino/init.ino @@ -720,6 +720,7 @@ void initialiseAll() case IGN_MODE_ROTARY: if(configPage10.rotaryType == ROTARY_IGN_FC) { + //Ignition channel 1 is a wasted spark signal for leading signal on both rotors ign1StartFunction = beginCoil1Charge; ign1EndFunction = endCoil1Charge; ign2StartFunction = beginCoil1Charge; @@ -730,6 +731,41 @@ void initialiseAll() ign4StartFunction = beginTrailingCoilCharge; ign4EndFunction = endTrailingCoilCharge2; } + else if(configPage10.rotaryType == ROTARY_IGN_FD) + { + //Ignition channel 1 is a wasted spark signal for leading signal on both rotors + ign1StartFunction = beginCoil1Charge; + ign1EndFunction = endCoil1Charge; + ign2StartFunction = beginCoil1Charge; + ign2EndFunction = endCoil1Charge; + + //Trailing coils have their own channel each + //IGN2 = front rotor trailing spark + ign3StartFunction = beginCoil2Charge; + ign3EndFunction = endCoil2Charge; + //IGN3 = rear rotor trailing spark + ign4StartFunction = beginCoil3Charge; + ign4EndFunction = endCoil3Charge; + + //IGN4 not used + } + else if(configPage10.rotaryType == ROTARY_IGN_RX8) + { + //RX8 outputs are simply 1 coil and 1 output per plug + + //IGN1 is front rotor, leading spark + ign1StartFunction = beginCoil1Charge; + ign1EndFunction = endCoil1Charge; + //IGN2 is rear rotor, leading spark + ign2StartFunction = beginCoil2Charge; + ign2EndFunction = endCoil2Charge; + //IGN3 = front rotor trailing spark + ign3StartFunction = beginCoil3Charge; + ign3EndFunction = endCoil3Charge; + //IGN4 = rear rotor trailing spark + ign4StartFunction = beginCoil4Charge; + ign4EndFunction = endCoil4Charge; + } break; diff --git a/speeduino/speeduino.ino b/speeduino/speeduino.ino index b7371503..f64b0166 100644 --- a/speeduino/speeduino.ino +++ b/speeduino/speeduino.ino @@ -600,23 +600,20 @@ void loop() } else if(configPage4.sparkMode == IGN_MODE_ROTARY) { - if(configPage10.rotaryType == ROTARY_IGN_FC) - { - byte splitDegrees = 0; - if (configPage2.fuelAlgorithm == LOAD_SOURCE_MAP) { splitDegrees = table2D_getValue(&rotarySplitTable, currentStatus.MAP/2); } - else { splitDegrees = table2D_getValue(&rotarySplitTable, currentStatus.TPS/2); } + byte splitDegrees = 0; + if (configPage2.fuelAlgorithm == LOAD_SOURCE_MAP) { splitDegrees = table2D_getValue(&rotarySplitTable, currentStatus.MAP/2); } + else { splitDegrees = table2D_getValue(&rotarySplitTable, currentStatus.TPS/2); } - //The trailing angles are set relative to the leading ones - ignition3EndAngle = ignition1EndAngle + splitDegrees; - ignition3StartAngle = ignition3EndAngle - dwellAngle; - if(ignition3StartAngle > CRANK_ANGLE_MAX_IGN) {ignition3StartAngle -= CRANK_ANGLE_MAX_IGN;} - if(ignition3StartAngle < 0) {ignition3StartAngle += CRANK_ANGLE_MAX_IGN;} + //The trailing angles are set relative to the leading ones + ignition3EndAngle = ignition1EndAngle + splitDegrees; + ignition3StartAngle = ignition3EndAngle - dwellAngle; + if(ignition3StartAngle > CRANK_ANGLE_MAX_IGN) {ignition3StartAngle -= CRANK_ANGLE_MAX_IGN;} + if(ignition3StartAngle < 0) {ignition3StartAngle += CRANK_ANGLE_MAX_IGN;} - ignition4EndAngle = ignition2EndAngle + splitDegrees; - ignition4StartAngle = ignition4EndAngle - dwellAngle; - if(ignition4StartAngle > CRANK_ANGLE_MAX_IGN) {ignition4StartAngle -= CRANK_ANGLE_MAX_IGN;} - if(ignition4StartAngle < 0) {ignition4StartAngle += CRANK_ANGLE_MAX_IGN;} - } + ignition4EndAngle = ignition2EndAngle + splitDegrees; + ignition4StartAngle = ignition4EndAngle - dwellAngle; + if(ignition4StartAngle > CRANK_ANGLE_MAX_IGN) {ignition4StartAngle -= CRANK_ANGLE_MAX_IGN;} + if(ignition4StartAngle < 0) {ignition4StartAngle += CRANK_ANGLE_MAX_IGN;} } break; //5 cylinders From f89ec20b0528c1fe2476d5be161e16f91f1ae1fa Mon Sep 17 00:00:00 2001 From: Josh Stewart Date: Mon, 25 Mar 2019 14:47:41 +1100 Subject: [PATCH 49/51] Cleanup some warnings --- speeduino/speeduino.ino | 52 +++++++++++++----------- speeduino/src/SPIAsEEPROM/SPIFlashIO.cpp | 4 +- 2 files changed, 30 insertions(+), 26 deletions(-) diff --git a/speeduino/speeduino.ino b/speeduino/speeduino.ino index f64b0166..5a4f53ad 100644 --- a/speeduino/speeduino.ino +++ b/speeduino/speeduino.ino @@ -338,30 +338,32 @@ void loop() uint16_t injector2StartAngle = 0; uint16_t injector3StartAngle = 0; uint16_t injector4StartAngle = 0; + #if INJ_CHANNELS >= 5 uint16_t injector5StartAngle = 0; //For 5 cylinder testing -#if INJ_CHANNELS >= 6 + #endif + #if INJ_CHANNELS >= 6 int injector6StartAngle = 0; -#endif -#if INJ_CHANNELS >= 7 + #endif + #if INJ_CHANNELS >= 7 int injector7StartAngle = 0; -#endif -#if INJ_CHANNELS >= 8 + #endif + #if INJ_CHANNELS >= 8 int injector8StartAngle = 0; -#endif + #endif int ignition1StartAngle = 0; int ignition2StartAngle = 0; int ignition3StartAngle = 0; int ignition4StartAngle = 0; int ignition5StartAngle = 0; -#if IGN_CHANNELS >= 6 + #if IGN_CHANNELS >= 6 int ignition6StartAngle = 0; -#endif -#if IGN_CHANNELS >= 7 + #endif + #if IGN_CHANNELS >= 7 int ignition7StartAngle = 0; -#endif -#if IGN_CHANNELS >= 8 + #endif + #if IGN_CHANNELS >= 8 int ignition8StartAngle = 0; -#endif + #endif //These are used for comparisons on channels above 1 where the starting angle (for injectors or ignition) can be less than a single loop time //(Don't ask why this is needed, it's just there) int tempCrankAngle; @@ -506,23 +508,25 @@ void loop() injector2StartAngle = calculateInjector2StartAngle(PWdivTimerPerDegree); //Note the shared timing with INJ2 injector3StartAngle = calculateInjector3StartAngle(PWdivTimerPerDegree); injector4StartAngle = calculateInjector4StartAngle(PWdivTimerPerDegree); - injector5StartAngle = calculateInjector5StartAngle(PWdivTimerPerDegree); + #if INJ_CHANNELS >= 5 + injector5StartAngle = calculateInjector5StartAngle(PWdivTimerPerDegree); + #endif break; //6 cylinders case 6: injector2StartAngle = calculateInjector2StartAngle(PWdivTimerPerDegree); injector3StartAngle = calculateInjector3StartAngle(PWdivTimerPerDegree); -#if INJ_CHANNELS >= 6 - if(configPage2.injLayout == INJ_SEQUENTIAL) - { - injector4StartAngle = (configPage2.inj1Ang + channel4InjDegrees - ( PWdivTimerPerDegree )); - if(injector4StartAngle > CRANK_ANGLE_MAX_INJ) {injector4StartAngle -= CRANK_ANGLE_MAX_INJ;} - injector5StartAngle = (configPage2.inj2Ang + channel5InjDegrees - ( PWdivTimerPerDegree )); - if(injector5StartAngle > CRANK_ANGLE_MAX_INJ) {injector5StartAngle -= CRANK_ANGLE_MAX_INJ;} - injector6StartAngle = (configPage2.inj3Ang + channel6InjDegrees - ( PWdivTimerPerDegree )); - if(injector6StartAngle > CRANK_ANGLE_MAX_INJ) {injector6StartAngle -= CRANK_ANGLE_MAX_INJ;} - } -#endif + #if INJ_CHANNELS >= 6 + if(configPage2.injLayout == INJ_SEQUENTIAL) + { + injector4StartAngle = (configPage2.inj1Ang + channel4InjDegrees - ( PWdivTimerPerDegree )); + if(injector4StartAngle > CRANK_ANGLE_MAX_INJ) {injector4StartAngle -= CRANK_ANGLE_MAX_INJ;} + injector5StartAngle = (configPage2.inj2Ang + channel5InjDegrees - ( PWdivTimerPerDegree )); + if(injector5StartAngle > CRANK_ANGLE_MAX_INJ) {injector5StartAngle -= CRANK_ANGLE_MAX_INJ;} + injector6StartAngle = (configPage2.inj3Ang + channel6InjDegrees - ( PWdivTimerPerDegree )); + if(injector6StartAngle > CRANK_ANGLE_MAX_INJ) {injector6StartAngle -= CRANK_ANGLE_MAX_INJ;} + } + #endif break; //8 cylinders case 8: diff --git a/speeduino/src/SPIAsEEPROM/SPIFlashIO.cpp b/speeduino/src/SPIAsEEPROM/SPIFlashIO.cpp index e0c21104..7ac56720 100755 --- a/speeduino/src/SPIAsEEPROM/SPIFlashIO.cpp +++ b/speeduino/src/SPIAsEEPROM/SPIFlashIO.cpp @@ -80,7 +80,7 @@ // Checks to see if the block of memory has been previously written to bool SPIFlash::_notPrevWritten(uint32_t _addr, uint32_t size) { - uint8_t _dat; + //uint8_t _dat; _beginSPI(READDATA); for (uint32_t i = 0; i < size; i++) { if (_nextByte(READ) != 0xFF) { @@ -260,7 +260,6 @@ //Reads/Writes next data buffer. Should be called after _beginSPI() void SPIFlash::_nextBuf(uint8_t opcode, uint8_t *data_buffer, uint32_t size) { - uint8_t *_dataAddr = &(*data_buffer); switch (opcode) { case READDATA: #if defined (ARDUINO_ARCH_SAM) @@ -274,6 +273,7 @@ #elif defined (ARDUINO_ARCH_AVR) SPI.transfer(&(*data_buffer), size); #else + uint8_t *_dataAddr = &(*data_buffer); for (uint16_t i = 0; i < size; i++) { *_dataAddr = xfer(NULLBYTE); _dataAddr++; From 465dda0c7aa97ea0dc91f792ec1a3359f8a949a1 Mon Sep 17 00:00:00 2001 From: Josh Stewart Date: Mon, 1 Apr 2019 16:01:01 +1100 Subject: [PATCH 50/51] Add new ignition mode support for GM7X --- reference/speeduino.ini | 2 +- speeduino/decoders.ino | 96 ++++++++++++++++++++++++++++------------- 2 files changed, 67 insertions(+), 31 deletions(-) diff --git a/reference/speeduino.ini b/reference/speeduino.ini index e3d896d4..51eb9a78 100644 --- a/reference/speeduino.ini +++ b/reference/speeduino.ini @@ -1822,7 +1822,7 @@ menuDialog = main field = "#Note: During cranking the fixed/locked timing angle is overriden by the Cranking advance angle value above" field = "" field = "#The below option is currently in testing! If unsure what this is, please set to No" - field = "Use new ignition mode", perToothIgn, {TrigPattern == 0 || TrigPattern == 1 || TrigPattern == 2 || TrigPattern == 4 || TrigPattern == 12 || TrigPattern == 13 } ;Only works for missing tooth, distributor, dual wheel, 4g63, nissan 360, Subaru 6/7 + field = "Use new ignition mode", perToothIgn, {TrigPattern == 0 || TrigPattern == 1 || TrigPattern == 2 || TrigPattern == 3 || TrigPattern == 4 || TrigPattern == 12 || TrigPattern == 13 } ;Only works for missing tooth, distributor, dual wheel, GM 7X, 4g63, nissan 360, Subaru 6/7 dialog = dwellSettings, "Dwell Settings", 4 topicHelp = "http://speeduino.com/wiki/index.php/Dwell" diff --git a/speeduino/decoders.ino b/speeduino/decoders.ino index ff585f9e..4182e8b8 100644 --- a/speeduino/decoders.ino +++ b/speeduino/decoders.ino @@ -779,6 +779,7 @@ void triggerSetEndTeeth_BasicDistributor() Name: GM7X Desc: GM 7X trigger wheel. It has six equally spaced teeth and a seventh tooth for cylinder identification. Note: Within the code below, the sync tooth is referred to as tooth #3 rather than tooth #7. This makes for simpler angle calculations +https://speeduino.com/forum/download/file.php?id=4743 */ void triggerSetup_GM7X() { @@ -790,40 +791,62 @@ void triggerSetup_GM7X() void triggerPri_GM7X() { - lastGap = curGap; - curTime = micros(); - curGap = curTime - toothLastToothTime; - toothCurrentCount++; //Increment the tooth counter - validTrigger = true; //Flag this pulse as being a valid trigger (ie that it passed filters) + lastGap = curGap; + curTime = micros(); + curGap = curTime - toothLastToothTime; + toothCurrentCount++; //Increment the tooth counter + validTrigger = true; //Flag this pulse as being a valid trigger (ie that it passed filters) - // - if( toothCurrentCount > 7 ) - { - toothCurrentCount = 1; - toothOneMinusOneTime = toothOneTime; - toothOneTime = curTime; + if( (toothLastToothTime > 0) && (toothLastMinusOneToothTime > 0) ) + { + if( toothCurrentCount > 7 ) + { + toothCurrentCount = 1; + toothOneMinusOneTime = toothOneTime; + toothOneTime = curTime; - toothLastMinusOneToothTime = toothLastToothTime; - toothLastToothTime = curTime; - triggerToothAngleIsCorrect = true; - } - else - { - targetGap = (lastGap) >> 1; //The target gap is set at half the last tooth gap - if ( curGap < targetGap) //If the gap between this tooth and the last one is less than half of the previous gap, then we are very likely at the magical 3rd tooth + triggerToothAngleIsCorrect = true; + } + else + { + targetGap = (lastGap) >> 1; //The target gap is set at half the last tooth gap + if ( curGap < targetGap ) //If the gap between this tooth and the last one is less than half of the previous gap, then we are very likely at the magical 3rd tooth + { + toothCurrentCount = 3; + currentStatus.hasSync = true; + triggerToothAngleIsCorrect = false; + currentStatus.startRevolutions++; //Counter + } + else + { + triggerToothAngleIsCorrect = true; + } + } + } + + //New ignition mode! + if(configPage2.perToothIgn == true) { - toothCurrentCount = 3; - currentStatus.hasSync = true; - triggerToothAngleIsCorrect = false; - currentStatus.startRevolutions++; //Counter + if(toothCurrentCount != 3) //Never do the check on the extra tooth. It's not needed anyway + { + uint16_t crankAngle; + if( toothCurrentCount < 3 ) + { + crankAngle = ((toothCurrentCount - 1) * triggerToothAngle) + 42; //Number of teeth that have passed since tooth 1, multiplied by the angle each tooth represents, plus the angle that tooth 1 is ATDC. This gives accuracy only to the nearest tooth. + } + else + { + crankAngle = ((toothCurrentCount - 2) * triggerToothAngle) + 42; //Number of teeth that have passed since tooth 1, multiplied by the angle each tooth represents, plus the angle that tooth 1 is ATDC. This gives accuracy only to the nearest tooth. + } + checkPerToothTiming(crankAngle, toothCurrentCount); + } + } - else - { - toothLastMinusOneToothTime = toothLastToothTime; - toothLastToothTime = curTime; - triggerToothAngleIsCorrect = true; - } - } + + toothLastMinusOneToothTime = toothLastToothTime; + toothLastToothTime = curTime; + + } void triggerSec_GM7X() { return; } //Not required uint16_t getRPM_GM7X() @@ -872,6 +895,19 @@ void triggerSetEndTeeth_GM7X() { lastToothCalcAdvance = currentStatus.advance; + + if(currentStatus.advance < 18 ) + { + ignition1EndTooth = 7; + ignition2EndTooth = 2; + ignition3EndTooth = 5; + } + else + { + ignition1EndTooth = 6; + ignition2EndTooth = 1; + ignition3EndTooth = 4; + } } From f02fd2c26a2094c5b461a3f7d56563d134d809f4 Mon Sep 17 00:00:00 2001 From: Josh Stewart Date: Mon, 1 Apr 2019 16:10:10 +1100 Subject: [PATCH 51/51] Change the way some of the avr2560 timers are initialised --- speeduino/board_avr2560.ino | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/speeduino/board_avr2560.ino b/speeduino/board_avr2560.ino index 2762f630..d4df8657 100644 --- a/speeduino/board_avr2560.ino +++ b/speeduino/board_avr2560.ino @@ -16,12 +16,12 @@ void initBoard() *********************************************************************************************************** * Auxilliaries */ - //PWM used by the Boost and VVT outputs + //PWM used by the Boost and VVT outputs. C Channel is used by ign5 TCCR1B = 0x00; //Disbale Timer1 while we set it up TCNT1 = 0; //Reset Timer Count - TIFR1 = 0x00; //Timer1 INT Flag Reg: Clear Timer Overflow Flag TCCR1A = 0x00; //Timer1 Control Reg A: Wave Gen Mode normal (Simply counts up from 0 to 65535 (16-bit int) TCCR1B = (1 << CS12); //Timer1 Control Reg B: Timer Prescaler set to 256. 1 tick = 16uS. Refer to http://www.instructables.com/files/orig/F3T/TIKL/H3WSA4V7/F3TTIKLH3WSA4V7.jpg + TIFR1 = (1 << OCF1A) | (1<

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