2020-02-17 22:30:44 -08:00
# ifndef STM32OFFICIAL_H
# define STM32OFFICIAL_H
2019-03-07 03:47:22 -08:00
# include <Arduino.h>
2020-12-07 05:43:01 -08:00
# if defined(STM32_CORE_VERSION_MAJOR)
2019-09-30 12:13:09 -07:00
# include <HardwareTimer.h>
# include <HardwareSerial.h>
2021-01-21 21:16:30 -08:00
# include "STM32RTC.h"
2020-02-17 22:30:44 -08:00
# if defined(STM32F1)
# include "stm32f1xx_ll_tim.h"
# elif defined(STM32F3)
# include "stm32f3xx_ll_tim.h"
# elif defined(STM32F4)
# include "stm32f4xx_ll_tim.h"
# else /*Default should be STM32F4*/
2019-09-30 12:29:26 -07:00
# include "stm32f4xx_ll_tim.h"
2020-02-17 22:30:44 -08:00
# endif
2019-02-22 07:39:07 -08:00
/*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* General
*/
2019-03-04 04:45:33 -08:00
# define PORT_TYPE uint32_t
# define PINMASK_TYPE uint32_t
2020-07-01 17:35:27 -07:00
# define COMPARE_TYPE uint16_t
# define COUNTER_TYPE uint16_t
2019-03-04 04:45:33 -08:00
# 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()
2020-07-02 00:25:16 -07:00
# define TIMER_RESOLUTION 4
2019-03-07 03:47:22 -08:00
2021-01-21 21:16:30 -08:00
# define RTC_ENABLED
2019-03-04 04:45:33 -08:00
# define USE_SERIAL3
2020-12-07 05:43:01 -08:00
//When building for Black board Serial1 is instanciated,building generic STM32F4x7 has serial2 and serial 1 must be done here
# if SERIAL_UART_INSTANCE==2
HardwareSerial Serial1 ( PA10 , PA9 ) ;
# endif
2021-01-21 21:16:30 -08:00
extern STM32RTC & rtc ;
2019-03-04 04:45:33 -08:00
void initBoard ( ) ;
uint16_t freeRam ( ) ;
2020-12-02 14:24:15 -08:00
void doSystemReset ( ) ;
void jumpToBootloader ( ) ;
2019-03-12 03:49:09 -07:00
extern " C " char * sbrk ( int incr ) ;
2019-03-04 04:45:33 -08:00
2020-04-06 21:49:25 -07:00
# if defined(ARDUINO_BLUEPILL_F103C8) || defined(ARDUINO_BLUEPILL_F103CB) \
| | defined ( ARDUINO_BLACKPILL_F401CC ) | | defined ( ARDUINO_BLACKPILL_F411CE )
2020-12-01 13:59:44 -08:00
# define pinIsReserved(pin) ( ((pin) == PA11) || ((pin) == PA12) || ((pin) == PC14) || ((pin) == PC15) )
2020-04-06 21:49:25 -07:00
# ifndef PB11 //Hack for F4 BlackPills
# define PB11 PB10
# endif
//Hack to alow compile on small STM boards
# ifndef A10
# define A10 PA0
# define A11 PA1
# define A12 PA2
# define A13 PA3
# define A14 PA4
# define A15 PA5
# endif
2020-12-01 13:59:44 -08:00
# else
# ifdef USE_SPI_EEPROM
# define pinIsReserved(pin) ( ((pin) == PA11) || ((pin) == PA12) || ((pin) == PB3) || ((pin) == PB4) || ((pin) == PB5) || ((pin) == USE_SPI_EEPROM) ) //Forbiden pins like USB
# else
# define pinIsReserved(pin) ( ((pin) == PA11) || ((pin) == PA12) || ((pin) == PB3) || ((pin) == PB4) || ((pin) == PB5) || ((pin) == PB0) ) //Forbiden pins like USB
# endif
2020-02-02 18:53:40 -08:00
# endif
2019-09-30 12:13:09 -07:00
2020-08-09 15:58:00 -07:00
# ifndef LED_BUILTIN
# define LED_BUILTIN PA7
# endif
/*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* EEPROM emulation
*/
# if defined(SRAM_AS_EEPROM)
# define EEPROM_LIB_H "src / BackupSram / BackupSramAsEEPROM.h"
# include EEPROM_LIB_H
2021-04-20 21:36:27 -07:00
extern BackupSramAsEEPROM EEPROM ;
2020-08-09 15:58:00 -07:00
# elif defined(USE_SPI_EEPROM)
# define EEPROM_LIB_H "src / SPIAsEEPROM / SPIAsEEPROM.h"
# include EEPROM_LIB_H
2021-04-20 21:36:27 -07:00
extern SPIClass SPI_for_flash ; //SPI1_MOSI, SPI1_MISO, SPI1_SCK
2020-08-09 15:58:00 -07:00
//windbond W25Q16 SPI flash EEPROM emulation
2021-04-20 21:36:27 -07:00
extern EEPROM_Emulation_Config EmulatedEEPROMMconfig ;
extern Flash_SPI_Config SPIconfig ;
extern SPI_EEPROM_Class EEPROM ;
2020-08-09 15:58:00 -07:00
# elif defined(FRAM_AS_EEPROM) //https://github.com/VitorBoss/FRAM
# define EEPROM_LIB_H <Fram.h>
# include EEPROM_LIB_H
2020-12-07 05:43:01 -08:00
# if defined(STM32F407xx)
2021-04-20 21:36:27 -07:00
extern FramClass EEPROM ; /*(mosi, miso, sclk, ssel, clockspeed) 31/01/2020*/
2020-08-09 15:58:00 -07:00
# else
2021-04-20 21:36:27 -07:00
extern FramClass EEPROM ; //Blue/Black Pills
2020-08-09 15:58:00 -07:00
# endif
# elif defined(STM32F7xx)
# define EEPROM_LIB_H "src / SPIAsEEPROM / SPIAsEEPROM.h"
# include EEPROM_LIB_H
# if defined(DUAL_BANK)
2021-04-20 21:36:27 -07:00
extern EEPROM_Emulation_Config EmulatedEEPROMMconfig ;
2020-08-09 15:58:00 -07:00
# else
2021-04-20 21:36:27 -07:00
extern EEPROM_Emulation_Config EmulatedEEPROMMconfig ;
2020-08-09 15:58:00 -07:00
# endif
2021-04-20 21:36:27 -07:00
extern InternalSTM32F7_EEPROM_Class EEPROM ;
2020-12-01 15:52:13 -08:00
2021-03-22 14:33:03 -07:00
# elif defined(STM32F411xE)
2020-12-01 15:52:13 -08:00
# define EEPROM_LIB_H "src / SPIAsEEPROM / SPIAsEEPROM.h"
# include EEPROM_LIB_H
2021-04-20 21:36:27 -07:00
extern EEPROM_Emulation_Config EmulatedEEPROMMconfig ;
extern InternalSTM32F4_EEPROM_Class EEPROM ;
2020-12-01 15:52:13 -08:00
2021-03-22 14:33:03 -07:00
# elif defined(STM32F401xC)
//when using with internal falsh not enough rom is available so small flash mode is enabled
//be carefull that the only 50% of flash is can be used, the other 50% is used for eeprom emulation
# define SMALL_FLASH_MODE
# define EEPROM_LIB_H "src / SPIAsEEPROM / SPIAsEEPROM.h"
# include EEPROM_LIB_H
EEPROM_Emulation_Config EmulatedEEPROMMconfig { 1UL , 131072UL , 4095UL , 0x08020000UL } ;
InternalSTM32F4_EEPROM_Class EEPROM ( EmulatedEEPROMMconfig ) ;
# else //default case, internal flash as EEPROM for STM32F407
2020-08-09 15:58:00 -07:00
# define EEPROM_LIB_H "src / SPIAsEEPROM / SPIAsEEPROM.h"
# include EEPROM_LIB_H
2021-04-20 21:36:27 -07:00
extern EEPROM_Emulation_Config EmulatedEEPROMMconfig ;
extern InternalSTM32F4_EEPROM_Class EEPROM ;
2020-08-09 15:58:00 -07:00
# endif
2021-01-21 21:16:30 -08:00
# define RTC_LIB_H "STM32RTC.h"
2020-08-09 15:58:00 -07:00
2019-03-04 04:45:33 -08:00
/*
2019-02-22 07:39:07 -08:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Schedules
2021-04-14 17:26:58 -07:00
* Timers Table for STM32F1
* TIMER1 TIMER2 TIMER3 TIMER4
* 1 - free 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 | TIMER11
* 1 - free | 1 - INJ1 | 1 - IGN1 | 1 - IGN5 | 1 - INJ5 | 1 - oneMSInterval
* 2 - BOOST | 2 - INJ2 | 2 - IGN2 | 2 - IGN6 | 2 - INJ6 |
* 3 - VVT | 3 - INJ3 | 3 - IGN3 | 3 - IGN7 | 3 - INJ7 |
* 4 - IDLE | 4 - INJ4 | 4 - IGN4 | 4 - IGN8 | 4 - INJ8 |
2019-02-22 07:39:07 -08:00
*/
2020-04-06 21:49:25 -07:00
# define MAX_TIMER_PERIOD 65535*4 //The longest period of time (in uS) that the timer can permit (IN this case it is 65535 * 4, as each timer tick is 4uS)
2019-02-24 09:28:44 -08:00
# 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.
2019-02-23 06:35:06 -08:00
# 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
2020-07-02 00:25:16 -07:00
# define FUEL1_TIMER_ENABLE() (TIM3)->SR = ~TIM_FLAG_CC1; (TIM3)->DIER |= TIM_DIER_CC1IE
# define FUEL2_TIMER_ENABLE() (TIM3)->SR = ~TIM_FLAG_CC2; (TIM3)->DIER |= TIM_DIER_CC2IE
# define FUEL3_TIMER_ENABLE() (TIM3)->SR = ~TIM_FLAG_CC3; (TIM3)->DIER |= TIM_DIER_CC3IE
# define FUEL4_TIMER_ENABLE() (TIM3)->SR = ~TIM_FLAG_CC4; (TIM3)->DIER |= TIM_DIER_CC4IE
# define FUEL1_TIMER_DISABLE() (TIM3)->DIER &= ~TIM_DIER_CC1IE
# define FUEL2_TIMER_DISABLE() (TIM3)->DIER &= ~TIM_DIER_CC2IE
# define FUEL3_TIMER_DISABLE() (TIM3)->DIER &= ~TIM_DIER_CC3IE
# define FUEL4_TIMER_DISABLE() (TIM3)->DIER &= ~TIM_DIER_CC4IE
# define IGN1_TIMER_ENABLE() (TIM2)->SR = ~TIM_FLAG_CC1; (TIM2)->DIER |= TIM_DIER_CC1IE
# define IGN2_TIMER_ENABLE() (TIM2)->SR = ~TIM_FLAG_CC2; (TIM2)->DIER |= TIM_DIER_CC2IE
# define IGN3_TIMER_ENABLE() (TIM2)->SR = ~TIM_FLAG_CC3; (TIM2)->DIER |= TIM_DIER_CC3IE
# define IGN4_TIMER_ENABLE() (TIM2)->SR = ~TIM_FLAG_CC4; (TIM2)->DIER |= TIM_DIER_CC4IE
# define IGN1_TIMER_DISABLE() (TIM2)->DIER &= ~TIM_DIER_CC1IE
# define IGN2_TIMER_DISABLE() (TIM2)->DIER &= ~TIM_DIER_CC2IE
# define IGN3_TIMER_DISABLE() (TIM2)->DIER &= ~TIM_DIER_CC3IE
# define IGN4_TIMER_DISABLE() (TIM2)->DIER &= ~TIM_DIER_CC4IE
# define FUEL5_TIMER_ENABLE() (TIM5)->SR = ~TIM_FLAG_CC1; (TIM5)->DIER |= TIM_DIER_CC1IE
# define FUEL6_TIMER_ENABLE() (TIM5)->SR = ~TIM_FLAG_CC2; (TIM5)->DIER |= TIM_DIER_CC2IE
# define FUEL7_TIMER_ENABLE() (TIM5)->SR = ~TIM_FLAG_CC3; (TIM5)->DIER |= TIM_DIER_CC3IE
# define FUEL8_TIMER_ENABLE() (TIM5)->SR = ~TIM_FLAG_CC4; (TIM5)->DIER |= TIM_DIER_CC4IE
# define FUEL5_TIMER_DISABLE() (TIM5)->DIER &= ~TIM_DIER_CC1IE
# define FUEL6_TIMER_DISABLE() (TIM5)->DIER &= ~TIM_DIER_CC2IE
# define FUEL7_TIMER_DISABLE() (TIM5)->DIER &= ~TIM_DIER_CC3IE
# define FUEL8_TIMER_DISABLE() (TIM5)->DIER &= ~TIM_DIER_CC4IE
# define IGN5_TIMER_ENABLE() (TIM4)->SR = ~TIM_FLAG_CC1; (TIM4)->DIER |= TIM_DIER_CC1IE
# define IGN6_TIMER_ENABLE() (TIM4)->SR = ~TIM_FLAG_CC2; (TIM4)->DIER |= TIM_DIER_CC2IE
# define IGN7_TIMER_ENABLE() (TIM4)->SR = ~TIM_FLAG_CC3; (TIM4)->DIER |= TIM_DIER_CC3IE
# define IGN8_TIMER_ENABLE() (TIM4)->SR = ~TIM_FLAG_CC4; (TIM4)->DIER |= TIM_DIER_CC4IE
# define IGN5_TIMER_DISABLE() (TIM4)->DIER &= ~TIM_DIER_CC1IE
# define IGN6_TIMER_DISABLE() (TIM4)->DIER &= ~TIM_DIER_CC2IE
# define IGN7_TIMER_DISABLE() (TIM4)->DIER &= ~TIM_DIER_CC3IE
# define IGN8_TIMER_DISABLE() (TIM4)->DIER &= ~TIM_DIER_CC4IE
2019-02-22 07:39:07 -08:00
/*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Auxilliaries
*/
2020-07-02 00:25:16 -07:00
# define ENABLE_BOOST_TIMER() (TIM1)->SR = ~TIM_FLAG_CC2; (TIM1)->DIER |= TIM_DIER_CC2IE
# define DISABLE_BOOST_TIMER() (TIM1)->DIER &= ~TIM_DIER_CC2IE
2019-02-22 07:39:07 -08:00
2020-07-02 00:25:16 -07:00
# define ENABLE_VVT_TIMER() (TIM1)->SR = ~TIM_FLAG_CC3; (TIM1)->DIER |= TIM_DIER_CC3IE
# define DISABLE_VVT_TIMER() (TIM1)->DIER &= ~TIM_DIER_CC3IE
2019-02-22 07:39:07 -08:00
2019-02-23 06:35:06 -08:00
# define BOOST_TIMER_COMPARE (TIM1)->CCR2
# define BOOST_TIMER_COUNTER (TIM1)->CNT
# define VVT_TIMER_COMPARE (TIM1)->CCR3
# define VVT_TIMER_COUNTER (TIM1)->CNT
2019-02-22 07:39:07 -08:00
/*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Idle
*/
2019-02-23 06:35:06 -08:00
# define IDLE_COUNTER (TIM1)->CNT
# define IDLE_COMPARE (TIM1)->CCR4
2019-02-22 07:39:07 -08:00
2020-07-02 00:25:16 -07:00
# define IDLE_TIMER_ENABLE() (TIM1)->SR = ~TIM_FLAG_CC4; (TIM1)->DIER |= TIM_DIER_CC4IE
# define IDLE_TIMER_DISABLE() (TIM1)->DIER &= ~TIM_DIER_CC4IE
2019-02-22 07:39:07 -08:00
/*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Timers
*/
2021-04-20 21:36:27 -07:00
extern HardwareTimer Timer1 ;
extern HardwareTimer Timer2 ;
extern HardwareTimer Timer3 ;
extern HardwareTimer Timer4 ;
2020-01-23 17:32:51 -08:00
# if !defined(ARDUINO_BLUEPILL_F103C8) && !defined(ARDUINO_BLUEPILL_F103CB) //F103 just have 4 timers
2021-04-20 21:36:27 -07:00
extern HardwareTimer Timer5 ;
2020-01-23 17:32:51 -08:00
# if defined(TIM11)
2021-04-20 21:36:27 -07:00
extern HardwareTimer Timer11 ;
2020-01-23 17:32:51 -08:00
# elif defined(TIM7)
2021-04-20 21:36:27 -07:00
extern HardwareTimer Timer11 ;
2020-01-23 17:32:51 -08:00
# endif
# endif
2019-09-30 12:13:09 -07:00
2020-05-21 20:23:05 -07:00
# if ((STM32_CORE_VERSION_MINOR<=8) & (STM32_CORE_VERSION_MAJOR==1))
2019-09-30 12:13:09 -07:00
void oneMSInterval ( HardwareTimer * ) ;
void boostInterrupt ( HardwareTimer * ) ;
void fuelSchedule1Interrupt ( HardwareTimer * ) ;
void fuelSchedule2Interrupt ( HardwareTimer * ) ;
void fuelSchedule3Interrupt ( HardwareTimer * ) ;
void fuelSchedule4Interrupt ( HardwareTimer * ) ;
2020-04-06 21:49:25 -07:00
# if (INJ_CHANNELS >= 5)
void fuelSchedule5Interrupt ( HardwareTimer * ) ;
# endif
# if (INJ_CHANNELS >= 6)
void fuelSchedule6Interrupt ( HardwareTimer * ) ;
# endif
# if (INJ_CHANNELS >= 7)
void fuelSchedule7Interrupt ( HardwareTimer * ) ;
# endif
# if (INJ_CHANNELS >= 8)
void fuelSchedule8Interrupt ( HardwareTimer * ) ;
# endif
2019-09-30 12:13:09 -07:00
void idleInterrupt ( HardwareTimer * ) ;
void vvtInterrupt ( HardwareTimer * ) ;
void ignitionSchedule1Interrupt ( HardwareTimer * ) ;
void ignitionSchedule2Interrupt ( HardwareTimer * ) ;
void ignitionSchedule3Interrupt ( HardwareTimer * ) ;
void ignitionSchedule4Interrupt ( HardwareTimer * ) ;
2020-04-06 21:49:25 -07:00
# if (IGN_CHANNELS >= 5)
2019-09-30 12:13:09 -07:00
void ignitionSchedule5Interrupt ( HardwareTimer * ) ;
2020-04-06 21:49:25 -07:00
# endif
# if (IGN_CHANNELS >= 6)
void ignitionSchedule6Interrupt ( HardwareTimer * ) ;
# endif
# if (IGN_CHANNELS >= 7)
void ignitionSchedule7Interrupt ( HardwareTimer * ) ;
# endif
# if (IGN_CHANNELS >= 8)
void ignitionSchedule8Interrupt ( HardwareTimer * ) ;
# endif
2020-05-21 20:23:05 -07:00
# endif //End core<=1.8
2019-02-22 07:39:07 -08:00
/*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* CAN / Second serial
*/
2020-12-07 05:43:01 -08:00
# if defined(STM32F407xx) || defined(STM32F103xB) || defined(STM32F405xx)
# define NATIVE_CAN_AVAILABLE
2020-02-02 18:53:40 -08:00
//HardwareSerial CANSerial(PD6, PD5);
2020-12-01 13:29:10 -08:00
# include <src/STM32_CAN/STM32_CAN.h>
//This activates CAN1 interface on STM32, but it's named as Can0, because that's how Teensy implementation is done
2021-04-20 21:36:27 -07:00
extern STM32_CAN Can0 ;
2020-12-01 13:29:10 -08:00
/*
Second CAN interface is also available if needed or it can be used also as primary CAN interface .
for STM32F4 the default CAN1 pins are PD0 & PD1 . Alternative ( ALT ) pins are PB8 & PB9 and ALT2 pins are PA11 and PA12 :
for STM32F4 the default CAN2 pins are PB5 & PB6 . Alternative ( ALT ) pins are PB12 & PB13 .
for STM32F1 the default CAN1 pins are PA11 & PA12 . Alternative ( ALT ) pins are PB8 & PB9 .
Example of using CAN2 as secondary CAN bus with alternative pins :
STM32_CAN Can1 ( _CAN2 , ALT ) ;
*/
static CAN_message_t outMsg ;
static CAN_message_t inMsg ;
2020-01-23 17:32:51 -08:00
# endif
2019-02-22 07:39:07 -08:00
# endif //CORE_STM32
# endif //STM32_H