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