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