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