Multiple stm32 and general arch cleanup/fix from last merge

This commit is contained in:
Josh Stewart 2019-03-04 23:45:33 +11:00
parent f3870cd350
commit f96999dd2d
12 changed files with 217 additions and 1453 deletions

View File

@ -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

View File

@ -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

View File

@ -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 <stm32_TIM_variant_11.h>
// #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<char*>(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

View File

@ -1,7 +1,6 @@
#ifndef STM32_H
#define STM32_H
#if defined(CORE_STM32)
#include <Fram.h>
#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 <Fram.h>
FramClass EEPROM(PB0, PB3, PB4, PB5, 15000000);
#endif
//Much of the below is not correct, but included to allow compilation

View File

@ -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"

View File

@ -1,22 +1,23 @@
#ifndef STM32F407VE_H
#define STM32F407VE_H
#if defined(ARDUINO_BLACK_F407VE)
#if defined(CORE_STM32_OFFICIAL)
#include <timer.h>
/*
***********************************************************************************************************
* 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
*/

View File

@ -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 <timer.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 <stm32_TIM_variant_11.h>
// #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<char*>(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

View File

@ -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) ) \

View File

@ -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"

View File

@ -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

View File

@ -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 <Fram.h>
#else
#include <EEPROM.h>

View File

@ -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 <Fram.h>
#else
#include <EEPROM.h>