Speeduino
Loading...
Searching...
No Matches
board_stm32_official.h
Go to the documentation of this file.
1#pragma once
2
5#include <Arduino.h>
6#include <HardwareTimer.h>
7#include <HardwareSerial.h>
8#include "STM32RTC.h"
9#include <SPI.h>
10
11#define CORE_STM32
12
13#ifndef PLATFORMIO
14#ifndef USBCON
15 #error "USBCON must be defined in boards.txt"
16#endif
17#ifndef USBD_USE_CDC
18 #error "USBD_USE_CDC must be defined in boards.txt"
19#endif
20#endif
21
22#if defined(STM32F1)
23 #include "stm32f1xx_ll_tim.h"
24#elif defined(STM32F3)
25 #include "stm32f3xx_ll_tim.h"
26#elif defined(STM32F4)
27 #include "stm32f4xx_ll_tim.h"
28 #if defined(STM32F407xx) && !defined(HAL_CAN_MODULE_ENABLED)
29 #warning "CAN module is not enabled. Internal CAN will NOT be available"
30 #endif
31#else /*Default should be STM32F4*/
32 #include "stm32f4xx_ll_tim.h"
33#endif
34
35/*
36***********************************************************************************************************
37* General
38*/
39#define COMPARE_TYPE uint16_t
40#define SERIAL_BUFFER_SIZE 517 //Size of the serial buffer used by new comms protocol. For SD transfers this must be at least 512 + 1 (flag) + 4 (sector)
41#define FPU_MAX_SIZE 32 //Size of the FPU buffer. 0 means no FPU.
42#define TIMER_RESOLUTION 4
43
44//Select one for EEPROM,the default is EEPROM emulation on internal flash.
45//#define SRAM_AS_EEPROM /*Use 4K battery backed SRAM, requires a 3V continuous source (like battery) connected to Vbat pin */
46//#define USE_SPI_EEPROM PB0 /*Use M25Qxx SPI flash on BlackF407VE*/
47//#define FRAM_AS_EEPROM /*Use FRAM like FM25xxx, MB85RSxxx or any SPI compatible */
48
49#ifndef word
50 #define word(h, l) (((h) << 8) | (l)) //word() function not defined for this platform in the main library
51#endif
52
53#if defined(ARDUINO_BLUEPILL_F103C8) || defined(ARDUINO_BLUEPILL_F103CB) \
54 || defined(ARDUINO_BLACKPILL_F401CC) || defined(ARDUINO_BLACKPILL_F411CE)
55 //STM32 Pill boards
56 #ifndef NUM_DIGITAL_PINS
57 #define NUM_DIGITAL_PINS 35
58 #endif
59 #ifndef LED_BUILTIN
60 #define LED_BUILTIN PB1 //Maple Mini
61 #endif
62#elif defined(STM32F407xx)
63 #ifndef NUM_DIGITAL_PINS
64 #define NUM_DIGITAL_PINS 75
65 #endif
66#endif
67
68//Specific mode for Bluepill due to its small flash size. This disables a number of strings from being compiled into the flash
69#if defined(MCU_STM32F103C8) || defined(MCU_STM32F103CB)
70 #define SMALL_FLASH_MODE
71#endif
72
73#define BOARD_MAX_DIGITAL_PINS NUM_DIGITAL_PINS
74#define BOARD_MAX_IO_PINS NUM_DIGITAL_PINS
75#if __GNUC__ < 7 //Already included on GCC 7
76extern "C" char* sbrk(int incr); //Used to freeRam
77#endif
78#ifndef digitalPinToInterrupt
79inline uint32_t digitalPinToInterrupt(uint32_t Interrupt_pin) { return Interrupt_pin; } //This isn't included in the stm32duino libs (yet)
80#endif
81
82#if defined(USER_BTN)
83 #define EEPROM_RESET_PIN USER_BTN //onboard key0 for black STM32F407 boards and blackpills, keep pressed during boot to reset eeprom
84#endif
85
86#if defined(STM32F407xx)
87 //Comment out this to disable SD logging for STM32 if needed. Currently SD logging for STM32 is experimental feature for F407.
88 #define SD_LOGGING
89#endif
90
91#if defined(SD_LOGGING)
92 #define RTC_ENABLED
93 //SD logging with STM32 uses SD card in SPI mode, because used SD library doesn't support SDIO implementation. By default SPI3 is used that uses same pins as SDIO also, but in different order.
94 extern SPIClass SD_SPI; //SPI3_MOSI, SPI3_MISO, SPI3_SCK
95 #define SD_CONFIG SdSpiConfig(SD_CS_PIN, DEDICATED_SPI, SD_SCK_MHZ(50), &SD_SPI)
96 //Alternatively same SPI bus can be used as there is for SPI flash. But this is not recommended due to slower speed and other possible problems.
97 //#define SD_CONFIG SdSpiConfig(SD_CS_PIN, SHARED_SPI, SD_SCK_MHZ(50), &SPI_for_flash)
98#endif
99
100//When building for Black board Serial1 is instantiated,building generic STM32F4x7 has serial2 and serial 1 must be done here
101#if SERIAL_UART_INSTANCE==2
103#endif
104
105extern STM32RTC& rtc;
106
107#if defined(ARDUINO_BLUEPILL_F103C8) || defined(ARDUINO_BLUEPILL_F103CB) \
108 || defined(ARDUINO_BLACKPILL_F401CC) || defined(ARDUINO_BLACKPILL_F411CE)
109 #define pinIsReserved(pin) ( ((pin) == PA11) || ((pin) == PA12) || ((pin) == PC14) || ((pin) == PC15) )
110
111 #ifndef PB11 //Hack for F4 BlackPills
112 #define PB11 PB10
113 #endif
114 //Hack to allow compilation on small STM boards
115 #ifndef A10
116 #define A10 PA0
117 #define A11 PA1
118 #define A12 PA2
119 #define A13 PA3
120 #define A14 PA4
121 #define A15 PA5
122 #endif
123#else
124 #ifdef USE_SPI_EEPROM
125 #define pinIsReserved(pin) ( ((pin) == PA11) || ((pin) == PA12) || ((pin) == PB3) || ((pin) == PB4) || ((pin) == PB5) || ((pin) == USE_SPI_EEPROM) ) //Forbidden pins like USB
126 #else
127 #define pinIsReserved(pin) ( ((pin) == PA11) || ((pin) == PA12) || ((pin) == PB3) || ((pin) == PB4) || ((pin) == PB5) || ((pin) == PB0) ) //Forbidden pins like USB
128 #endif
129#endif
130
131#define PWM_FAN_AVAILABLE
132#define BOARD_MAX_ADC_PINS NUM_ANALOG_INPUTS-1 //Number of analog pins from core.
133
134#ifndef LED_BUILTIN
135 #define LED_BUILTIN PA7
136#endif
137
138/*
139***********************************************************************************************************
140* EEPROM emulation
141*/
142#if defined(SRAM_AS_EEPROM)
143 #define EEPROM_LIB_H "src/BackupSram/BackupSramAsEEPROM.h"
145 #include EEPROM_LIB_H
147
148#elif defined(USE_SPI_EEPROM)
149 #define EEPROM_LIB_H "src/SPIAsEEPROM/SPIAsEEPROM.h"
151 #include EEPROM_LIB_H
152 extern SPIClass SPI_for_flash; //SPI1_MOSI, SPI1_MISO, SPI1_SCK
153
154 //windbond W25Q16 SPI flash EEPROM emulation
158
159#elif defined(FRAM_AS_EEPROM) //https://github.com/VitorBoss/FRAM
160 #define EEPROM_LIB_H "src/FRAM/Fram.h"
162 #include EEPROM_LIB_H
163 #if defined(STM32F407xx)
164 extern FramClass EEPROM; /*(mosi, miso, sclk, ssel, clockspeed) 31/01/2020*/
165 #else
166 extern FramClass EEPROM; //Blue/Black Pills
167 #endif
168
169#else //default case, internal flash as EEPROM
170 #define EEPROM_LIB_H "src/SPIAsEEPROM/SPIAsEEPROM.h"
172 #include EEPROM_LIB_H
174 #if defined(STM32F401xC)
175 #define SMALL_FLASH_MODE
176 #endif
177#endif
178
179#define RTC_LIB_H "STM32RTC.h"
180
181/*
182***********************************************************************************************************
183* Schedules
184* Timers Table for STM32F1
185* TIMER1 TIMER2 TIMER3 TIMER4
186* 1 - FAN 1 - INJ1 1 - IGN1 1 - oneMSInterval
187* 2 - BOOST 2 - INJ2 2 - IGN2 2 -
188* 3 - VVT 3 - INJ3 3 - IGN3 3 -
189* 4 - IDLE 4 - INJ4 4 - IGN4 4 -
190*
191* Timers Table for STM32F4
192* TIMER1 | TIMER2 | TIMER3 | TIMER4 | TIMER5 | TIMER11
193* 1 - FAN |1 - IGN1 |1 - INJ1 |1 - IGN5 |1 - INJ5 |1 - oneMSInterval
194* 2 - BOOST |2 - IGN2 |2 - INJ2 |2 - IGN6 |2 - INJ6 |
195* 3 - VVT |3 - IGN3 |3 - INJ3 |3 - IGN7 |3 - INJ7 |
196* 4 - IDLE |4 - IGN4 |4 - INJ4 |4 - IGN8 |4 - INJ8 |
197*/
198#define MAX_TIMER_PERIOD 262140UL //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)
199#define uS_TO_TIMER_COMPARE(uS1) ((uS1) >> 2) //Converts a given number of uS into the required number of timer ticks until that time has passed
200
201#if defined(STM32F407xx) //F407 can do 8x8 STM32F401/STM32F411 don't
202 #define INJ_CHANNELS 8
203 #define IGN_CHANNELS 8
204#else
205 #define INJ_CHANNELS 4
206 #define IGN_CHANNELS 5
207#endif
208#define FUEL1_COUNTER (TIM3)->CNT
209#define FUEL2_COUNTER (TIM3)->CNT
210#define FUEL3_COUNTER (TIM3)->CNT
211#define FUEL4_COUNTER (TIM3)->CNT
212
213#define FUEL1_COMPARE (TIM3)->CCR1
214#define FUEL2_COMPARE (TIM3)->CCR2
215#define FUEL3_COMPARE (TIM3)->CCR3
216#define FUEL4_COMPARE (TIM3)->CCR4
217
218#define IGN1_COUNTER (TIM2)->CNT
219#define IGN2_COUNTER (TIM2)->CNT
220#define IGN3_COUNTER (TIM2)->CNT
221#define IGN4_COUNTER (TIM2)->CNT
222
223#define IGN1_COMPARE (TIM2)->CCR1
224#define IGN2_COMPARE (TIM2)->CCR2
225#define IGN3_COMPARE (TIM2)->CCR3
226#define IGN4_COMPARE (TIM2)->CCR4
227
228#define FUEL5_COUNTER (TIM5)->CNT
229#define FUEL6_COUNTER (TIM5)->CNT
230#define FUEL7_COUNTER (TIM5)->CNT
231#define FUEL8_COUNTER (TIM5)->CNT
232
233#define FUEL5_COMPARE (TIM5)->CCR1
234#define FUEL6_COMPARE (TIM5)->CCR2
235#define FUEL7_COMPARE (TIM5)->CCR3
236#define FUEL8_COMPARE (TIM5)->CCR4
237
238#define IGN5_COUNTER (TIM4)->CNT
239#define IGN6_COUNTER (TIM4)->CNT
240#define IGN7_COUNTER (TIM4)->CNT
241#define IGN8_COUNTER (TIM4)->CNT
242
243#define IGN5_COMPARE (TIM4)->CCR1
244#define IGN6_COMPARE (TIM4)->CCR2
245#define IGN7_COMPARE (TIM4)->CCR3
246#define IGN8_COMPARE (TIM4)->CCR4
247
248
249static inline void FUEL1_TIMER_ENABLE(void) {(TIM3)->CR1 |= TIM_CR1_CEN; (TIM3)->SR = ~TIM_FLAG_CC1; (TIM3)->DIER |= TIM_DIER_CC1IE;}
250static inline void FUEL2_TIMER_ENABLE(void) {(TIM3)->CR1 |= TIM_CR1_CEN; (TIM3)->SR = ~TIM_FLAG_CC2; (TIM3)->DIER |= TIM_DIER_CC2IE;}
251static inline void FUEL3_TIMER_ENABLE(void) {(TIM3)->CR1 |= TIM_CR1_CEN; (TIM3)->SR = ~TIM_FLAG_CC3; (TIM3)->DIER |= TIM_DIER_CC3IE;}
252static inline void FUEL4_TIMER_ENABLE(void) {(TIM3)->CR1 |= TIM_CR1_CEN; (TIM3)->SR = ~TIM_FLAG_CC4; (TIM3)->DIER |= TIM_DIER_CC4IE;}
253
254static inline void FUEL1_TIMER_DISABLE(void) {(TIM3)->DIER &= ~TIM_DIER_CC1IE;}
255static inline void FUEL2_TIMER_DISABLE(void) {(TIM3)->DIER &= ~TIM_DIER_CC2IE;}
256static inline void FUEL3_TIMER_DISABLE(void) {(TIM3)->DIER &= ~TIM_DIER_CC3IE;}
257static inline void FUEL4_TIMER_DISABLE(void) {(TIM3)->DIER &= ~TIM_DIER_CC4IE;}
258
259static inline void IGN1_TIMER_ENABLE(void) {(TIM2)->CR1 |= TIM_CR1_CEN; (TIM2)->SR = ~TIM_FLAG_CC1; (TIM2)->DIER |= TIM_DIER_CC1IE;}
260static inline void IGN2_TIMER_ENABLE(void) {(TIM2)->CR1 |= TIM_CR1_CEN; (TIM2)->SR = ~TIM_FLAG_CC2; (TIM2)->DIER |= TIM_DIER_CC2IE;}
261static inline void IGN3_TIMER_ENABLE(void) {(TIM2)->CR1 |= TIM_CR1_CEN; (TIM2)->SR = ~TIM_FLAG_CC3; (TIM2)->DIER |= TIM_DIER_CC3IE;}
262static inline void IGN4_TIMER_ENABLE(void) {(TIM2)->CR1 |= TIM_CR1_CEN; (TIM2)->SR = ~TIM_FLAG_CC4; (TIM2)->DIER |= TIM_DIER_CC4IE;}
263
264static inline void IGN1_TIMER_DISABLE(void) {(TIM2)->DIER &= ~TIM_DIER_CC1IE;}
265static inline void IGN2_TIMER_DISABLE(void) {(TIM2)->DIER &= ~TIM_DIER_CC2IE;}
266static inline void IGN3_TIMER_DISABLE(void) {(TIM2)->DIER &= ~TIM_DIER_CC3IE;}
267static inline void IGN4_TIMER_DISABLE(void) {(TIM2)->DIER &= ~TIM_DIER_CC4IE;}
268
269static inline void FUEL5_TIMER_ENABLE(void) {(TIM5)->CR1 |= TIM_CR1_CEN; (TIM5)->CR1 |= TIM_CR1_CEN; (TIM5)->SR = ~TIM_FLAG_CC1; (TIM5)->DIER |= TIM_DIER_CC1IE;}
270static inline void FUEL6_TIMER_ENABLE(void) {(TIM5)->CR1 |= TIM_CR1_CEN; (TIM5)->CR1 |= TIM_CR1_CEN; (TIM5)->SR = ~TIM_FLAG_CC2; (TIM5)->DIER |= TIM_DIER_CC2IE;}
271static inline void FUEL7_TIMER_ENABLE(void) {(TIM5)->CR1 |= TIM_CR1_CEN; (TIM5)->CR1 |= TIM_CR1_CEN; (TIM5)->SR = ~TIM_FLAG_CC3; (TIM5)->DIER |= TIM_DIER_CC3IE;}
272static inline void FUEL8_TIMER_ENABLE(void) {(TIM5)->CR1 |= TIM_CR1_CEN; (TIM5)->CR1 |= TIM_CR1_CEN; (TIM5)->SR = ~TIM_FLAG_CC4; (TIM5)->DIER |= TIM_DIER_CC4IE;}
273
274static inline void FUEL5_TIMER_DISABLE(void) {(TIM5)->DIER &= ~TIM_DIER_CC1IE;}
275static inline void FUEL6_TIMER_DISABLE(void) {(TIM5)->DIER &= ~TIM_DIER_CC2IE;}
276static inline void FUEL7_TIMER_DISABLE(void) {(TIM5)->DIER &= ~TIM_DIER_CC3IE;}
277static inline void FUEL8_TIMER_DISABLE(void) {(TIM5)->DIER &= ~TIM_DIER_CC4IE;}
278
279static inline void IGN5_TIMER_ENABLE(void) {(TIM4)->CR1 |= TIM_CR1_CEN; (TIM4)->SR = ~TIM_FLAG_CC1; (TIM4)->DIER |= TIM_DIER_CC1IE;}
280static inline void IGN6_TIMER_ENABLE(void) {(TIM4)->CR1 |= TIM_CR1_CEN; (TIM4)->SR = ~TIM_FLAG_CC2; (TIM4)->DIER |= TIM_DIER_CC2IE;}
281static inline void IGN7_TIMER_ENABLE(void) {(TIM4)->CR1 |= TIM_CR1_CEN; (TIM4)->SR = ~TIM_FLAG_CC3; (TIM4)->DIER |= TIM_DIER_CC3IE;}
282static inline void IGN8_TIMER_ENABLE(void) {(TIM4)->CR1 |= TIM_CR1_CEN; (TIM4)->SR = ~TIM_FLAG_CC4; (TIM4)->DIER |= TIM_DIER_CC4IE;}
283
284static inline void IGN5_TIMER_DISABLE(void) {(TIM4)->DIER &= ~TIM_DIER_CC1IE;}
285static inline void IGN6_TIMER_DISABLE(void) {(TIM4)->DIER &= ~TIM_DIER_CC2IE;}
286static inline void IGN7_TIMER_DISABLE(void) {(TIM4)->DIER &= ~TIM_DIER_CC3IE;}
287static inline void IGN8_TIMER_DISABLE(void) {(TIM4)->DIER &= ~TIM_DIER_CC4IE;}
288
289
290/*
291***********************************************************************************************************
292* Auxiliaries
293*/
294#define ENABLE_BOOST_TIMER() (TIM1)->SR = ~TIM_FLAG_CC2; (TIM1)->DIER |= TIM_DIER_CC2IE; (TIM1)->CR1 |= TIM_CR1_CEN;
295#define DISABLE_BOOST_TIMER() (TIM1)->DIER &= ~TIM_DIER_CC2IE
296
297#define ENABLE_VVT_TIMER() (TIM1)->SR = ~TIM_FLAG_CC3; (TIM1)->DIER |= TIM_DIER_CC3IE; (TIM1)->CR1 |= TIM_CR1_CEN;
298#define DISABLE_VVT_TIMER() (TIM1)->DIER &= ~TIM_DIER_CC3IE
299
300#define ENABLE_FAN_TIMER() (TIM1)->SR = ~TIM_FLAG_CC1; (TIM1)->DIER |= TIM_DIER_CC1IE; (TIM1)->CR1 |= TIM_CR1_CEN;
301#define DISABLE_FAN_TIMER() (TIM1)->DIER &= ~TIM_DIER_CC1IE
302
303#define BOOST_TIMER_COMPARE (TIM1)->CCR2
304#define BOOST_TIMER_COUNTER (TIM1)->CNT
305#define VVT_TIMER_COMPARE (TIM1)->CCR3
306#define VVT_TIMER_COUNTER (TIM1)->CNT
307#define FAN_TIMER_COMPARE (TIM1)->CCR1
308#define FAN_TIMER_COUNTER (TIM1)->CNT
309
310/*
311***********************************************************************************************************
312* Idle
313*/
314#define IDLE_COUNTER (TIM1)->CNT
315#define IDLE_COMPARE (TIM1)->CCR4
316
317#define IDLE_TIMER_ENABLE() (TIM1)->SR = ~TIM_FLAG_CC4; (TIM1)->DIER |= TIM_DIER_CC4IE; (TIM1)->CR1 |= TIM_CR1_CEN;
318#define IDLE_TIMER_DISABLE() (TIM1)->DIER &= ~TIM_DIER_CC4IE
319
320
321/*
322***********************************************************************************************************
323* CAN / Second serial
324*/
325#if defined(HAL_CAN_MODULE_ENABLED)
326#define NATIVE_CAN_AVAILABLE
327#include <src/STM32_CAN/STM32_CAN.h>
328//This activates CAN1 interface on STM32, but it's named as Can0, because that's how Teensy implementation is done
329extern STM32_CAN Can0;
330#endif
331
332#if defined(STM32GENERIC) // STM32GENERIC core
333 #define SECONDARY_SERIAL_T SerialUART
334#else //libmaple core aka STM32DUINO
335 #define SECONDARY_SERIAL_T HardwareSerial
336#endif
static void IGN1_TIMER_ENABLE(void)
Definition board_stm32_official.h:259
static void IGN3_TIMER_DISABLE(void)
Definition board_stm32_official.h:266
static void IGN1_TIMER_DISABLE(void)
Definition board_stm32_official.h:264
static void FUEL2_TIMER_ENABLE(void)
Definition board_stm32_official.h:250
static void FUEL1_TIMER_DISABLE(void)
Definition board_stm32_official.h:254
static void FUEL4_TIMER_DISABLE(void)
Definition board_stm32_official.h:257
static void IGN3_TIMER_ENABLE(void)
Definition board_stm32_official.h:261
static void FUEL4_TIMER_ENABLE(void)
Definition board_stm32_official.h:252
InternalSTM32F4_EEPROM_Class EEPROM
static void FUEL5_TIMER_DISABLE(void)
Definition board_stm32_official.h:274
static void FUEL2_TIMER_DISABLE(void)
Definition board_stm32_official.h:255
static void FUEL3_TIMER_DISABLE(void)
Definition board_stm32_official.h:256
static void IGN5_TIMER_ENABLE(void)
Definition board_stm32_official.h:279
static void FUEL7_TIMER_DISABLE(void)
Definition board_stm32_official.h:276
uint32_t digitalPinToInterrupt(uint32_t Interrupt_pin)
Definition board_stm32_official.h:79
static void FUEL7_TIMER_ENABLE(void)
Definition board_stm32_official.h:271
static void FUEL3_TIMER_ENABLE(void)
Definition board_stm32_official.h:251
static void FUEL6_TIMER_ENABLE(void)
Definition board_stm32_official.h:270
static void IGN6_TIMER_DISABLE(void)
Definition board_stm32_official.h:285
uint16_t eeprom_address_t
Definition board_stm32_official.h:171
static void FUEL6_TIMER_DISABLE(void)
Definition board_stm32_official.h:275
static void IGN7_TIMER_DISABLE(void)
Definition board_stm32_official.h:286
static void IGN2_TIMER_DISABLE(void)
Definition board_stm32_official.h:265
static void IGN8_TIMER_DISABLE(void)
Definition board_stm32_official.h:287
static void IGN6_TIMER_ENABLE(void)
Definition board_stm32_official.h:280
static void IGN2_TIMER_ENABLE(void)
Definition board_stm32_official.h:260
STM32RTC & rtc
static void IGN8_TIMER_ENABLE(void)
Definition board_stm32_official.h:282
static void FUEL8_TIMER_DISABLE(void)
Definition board_stm32_official.h:277
static void IGN4_TIMER_ENABLE(void)
Definition board_stm32_official.h:262
static void IGN7_TIMER_ENABLE(void)
Definition board_stm32_official.h:281
static void IGN5_TIMER_DISABLE(void)
Definition board_stm32_official.h:284
static void IGN4_TIMER_DISABLE(void)
Definition board_stm32_official.h:267
static void FUEL1_TIMER_ENABLE(void)
Definition board_stm32_official.h:249
char * sbrk(int incr)
static void FUEL8_TIMER_ENABLE(void)
Definition board_stm32_official.h:272
static void FUEL5_TIMER_ENABLE(void)
Definition board_stm32_official.h:269
static uint32_t rshift(uint32_t a)
Bitwise right shift - generic, unoptimized, case.
Definition bit_shifts.h:348