Speeduino
Loading...
Searching...
No Matches
board_teensy41.h
Go to the documentation of this file.
1#pragma once
2
5#include <Arduino.h>
6#include <limits>
7#include "src/pins/inputPin.h"
8#include "src/pins/outputPin.h"
9
10#define CORE_TEENSY41
11
12/*
13***********************************************************************************************************
14* General
15*/
16bool pinIsSerial(uint8_t);
17
22using COMPARE_TYPE = uint16_t;
23
24namespace
25{
27 // Need to handle this dynamically in the future for other frequencies
28#if F_CPU == 600000000
29 //Bus Clock is 150Mhz @ 600 Mhz CPU.
30 constexpr auto BUS_CLOCK = 150U; // MHz
31#elif F_CPU == 528000000
32 //Bus Clock is 132Mhz @ 528 Mhz CPU.
33 constexpr auto BUS_CLOCK = 132U; // MHz
34#elif F_CPU == 450000000
35 //Bus Clock is 150Mhz @ 450 Mhz CPU.
36 constexpr auto BUS_CLOCK = 150U; // MHz
37#elif F_CPU == 396000000
38 //Bus Clock is 132Mhz @ 396 Mhz CPU.
39 constexpr auto BUS_CLOCK = 132U; // MHz
40#elif F_CPU == 150000000
41 //Bus Clock is 75Mhz @ 150 Mhz CPU.
42 constexpr auto BUS_CLOCK = 75U; // MHz
43#else
44 #error Unsupported CPU frequency.
45#endif
46
48 constexpr auto TICK_RESOLUTION = (1U<<7U)/(double)BUS_CLOCK;
49
51 constexpr uint32_t TICK_CONVERTER_PRECISION = 6UL;
52}
53
55static constexpr COMPARE_TYPE uS_TO_TIMER_COMPARE(uint32_t micros)
56{
57 constexpr uint32_t MULTIPLIER = (uint32_t)((1UL<<TICK_CONVERTER_PRECISION)/TICK_RESOLUTION);
58 return (COMPARE_TYPE)((micros * MULTIPLIER) >> TICK_CONVERTER_PRECISION);
59}
60
62static constexpr uint32_t ticksToMicros(COMPARE_TYPE ticks)
63{
64 constexpr uint32_t MULTIPLIER = (uint32_t)((1UL<<TICK_CONVERTER_PRECISION)*TICK_RESOLUTION);
65 return (ticks * MULTIPLIER) >> TICK_CONVERTER_PRECISION;
66}
67
68#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)
69#define FPU_MAX_SIZE 32 //Size of the FPU buffer. 0 means no FPU.
70#define BOARD_MAX_DIGITAL_PINS 54
71#define BOARD_MAX_IO_PINS 54
72#define RTC_ENABLED
73#define SD_LOGGING //SD logging enabled by default for Teensy 4.1 as it has the slot built in
74#define RTC_LIB_H "TimeLib.h"
75#define SD_CONFIG SdioConfig(FIFO_SDIO) //Set Teensy to use SDIO in FIFO mode. This is the fastest SD mode on Teensy as it offloads most of the writes
76constexpr uint16_t BLOCKING_FACTOR = 251;
77constexpr uint16_t TABLE_BLOCKING_FACTOR = 256;
78
79//#define PWM_FAN_AVAILABLE
80static inline bool pinIsReserved(uint8_t pin) {
81 return (pin == 0U)
82 || (pin == 42U)
83 || (pin == 43U)
84 || (pin == 44U)
85 || (pin == 45U)
86 || (pin == 46U)
87 || (pin == 47U)
88 || pinIsSerial(pin)
89 ;
90}
91
92#define INJ_CHANNELS 8
93#define IGN_CHANNELS 8
94
95/*
96***********************************************************************************************************
97* Schedules
98*/
99/*
100https://github.com/luni64/TeensyTimerTool/wiki/Supported-Timers#pit---periodic-timer
101https://github.com/luni64/TeensyTimerTool/wiki/Configuration#clock-setting-for-the-gpt-and-pit-timers
102The Quad timer (TMR) provides 4 timers each with 4 usable compare channels. The down compare and alternating compares are not usable
103FUEL 1-4: TMR1
104IGN 1-4 : TMR2
105FUEL 5-8: TMR3
106IGN 5-8 : TMR4
107*/
108#define FUEL1_COUNTER TMR1_CNTR0
109#define FUEL2_COUNTER TMR1_CNTR1
110#define FUEL3_COUNTER TMR1_CNTR2
111#define FUEL4_COUNTER TMR1_CNTR3
112#define FUEL5_COUNTER TMR3_CNTR0
113#define FUEL6_COUNTER TMR3_CNTR1
114#define FUEL7_COUNTER TMR3_CNTR2
115#define FUEL8_COUNTER TMR3_CNTR3
116
117#define IGN1_COUNTER TMR2_CNTR0
118#define IGN2_COUNTER TMR2_CNTR1
119#define IGN3_COUNTER TMR2_CNTR2
120#define IGN4_COUNTER TMR2_CNTR3
121#define IGN5_COUNTER TMR4_CNTR0
122#define IGN6_COUNTER TMR4_CNTR1
123#define IGN7_COUNTER TMR4_CNTR2
124#define IGN8_COUNTER TMR4_CNTR3
125
126#define FUEL1_COMPARE TMR1_COMP10
127#define FUEL2_COMPARE TMR1_COMP11
128#define FUEL3_COMPARE TMR1_COMP12
129#define FUEL4_COMPARE TMR1_COMP13
130#define FUEL5_COMPARE TMR3_COMP10
131#define FUEL6_COMPARE TMR3_COMP11
132#define FUEL7_COMPARE TMR3_COMP12
133#define FUEL8_COMPARE TMR3_COMP13
134
135#define IGN1_COMPARE TMR2_COMP10
136#define IGN2_COMPARE TMR2_COMP11
137#define IGN3_COMPARE TMR2_COMP12
138#define IGN4_COMPARE TMR2_COMP13
139#define IGN5_COMPARE TMR4_COMP10
140#define IGN6_COMPARE TMR4_COMP11
141#define IGN7_COMPARE TMR4_COMP12
142#define IGN8_COMPARE TMR4_COMP13
143
144static inline void FUEL1_TIMER_ENABLE(void) {TMR1_CSCTRL0 &= ~TMR_CSCTRL_TCF1; TMR1_CSCTRL0 |= TMR_CSCTRL_TCF1EN;} //Write 1 to the TCFIEN (Channel Interrupt Enable) bit of channel 0 Status/Control
145static inline void FUEL2_TIMER_ENABLE(void) {TMR1_CSCTRL1 &= ~TMR_CSCTRL_TCF1; TMR1_CSCTRL1 |= TMR_CSCTRL_TCF1EN;}
146static inline void FUEL3_TIMER_ENABLE(void) {TMR1_CSCTRL2 &= ~TMR_CSCTRL_TCF1; TMR1_CSCTRL2 |= TMR_CSCTRL_TCF1EN;}
147static inline void FUEL4_TIMER_ENABLE(void) {TMR1_CSCTRL3 &= ~TMR_CSCTRL_TCF1; TMR1_CSCTRL3 |= TMR_CSCTRL_TCF1EN;}
148static inline void FUEL5_TIMER_ENABLE(void) {TMR3_CSCTRL0 &= ~TMR_CSCTRL_TCF1; TMR3_CSCTRL0 |= TMR_CSCTRL_TCF1EN;}
149static inline void FUEL6_TIMER_ENABLE(void) {TMR3_CSCTRL1 &= ~TMR_CSCTRL_TCF1; TMR3_CSCTRL1 |= TMR_CSCTRL_TCF1EN;}
150static inline void FUEL7_TIMER_ENABLE(void) {TMR3_CSCTRL2 &= ~TMR_CSCTRL_TCF1; TMR3_CSCTRL2 |= TMR_CSCTRL_TCF1EN;}
151static inline void FUEL8_TIMER_ENABLE(void) {TMR3_CSCTRL3 &= ~TMR_CSCTRL_TCF1; TMR3_CSCTRL3 |= TMR_CSCTRL_TCF1EN;}
152
153static inline void FUEL1_TIMER_DISABLE(void) {TMR1_CSCTRL0 &= ~TMR_CSCTRL_TCF1EN;} //Write 0 to the TCFIEN (Channel Interrupt Enable) bit of channel 0 Status/Control
154static inline void FUEL2_TIMER_DISABLE(void) {TMR1_CSCTRL1 &= ~TMR_CSCTRL_TCF1EN;}
155static inline void FUEL3_TIMER_DISABLE(void) {TMR1_CSCTRL2 &= ~TMR_CSCTRL_TCF1EN;}
156static inline void FUEL4_TIMER_DISABLE(void) {TMR1_CSCTRL3 &= ~TMR_CSCTRL_TCF1EN;}
157static inline void FUEL5_TIMER_DISABLE(void) {TMR3_CSCTRL0 &= ~TMR_CSCTRL_TCF1EN;}
158static inline void FUEL6_TIMER_DISABLE(void) {TMR3_CSCTRL1 &= ~TMR_CSCTRL_TCF1EN;}
159static inline void FUEL7_TIMER_DISABLE(void) {TMR3_CSCTRL2 &= ~TMR_CSCTRL_TCF1EN;}
160static inline void FUEL8_TIMER_DISABLE(void) {TMR3_CSCTRL3 &= ~TMR_CSCTRL_TCF1EN;}
161
162static inline void IGN1_TIMER_ENABLE(void) {TMR2_CSCTRL0 &= ~TMR_CSCTRL_TCF1; TMR2_CSCTRL0 |= TMR_CSCTRL_TCF1EN;}
163static inline void IGN2_TIMER_ENABLE(void) {TMR2_CSCTRL1 &= ~TMR_CSCTRL_TCF1; TMR2_CSCTRL1 |= TMR_CSCTRL_TCF1EN;}
164static inline void IGN3_TIMER_ENABLE(void) {TMR2_CSCTRL2 &= ~TMR_CSCTRL_TCF1; TMR2_CSCTRL2 |= TMR_CSCTRL_TCF1EN;}
165static inline void IGN4_TIMER_ENABLE(void) {TMR2_CSCTRL3 &= ~TMR_CSCTRL_TCF1; TMR2_CSCTRL3 |= TMR_CSCTRL_TCF1EN;}
166static inline void IGN5_TIMER_ENABLE(void) {TMR4_CSCTRL0 &= ~TMR_CSCTRL_TCF1; TMR4_CSCTRL0 |= TMR_CSCTRL_TCF1EN;}
167static inline void IGN6_TIMER_ENABLE(void) {TMR4_CSCTRL1 &= ~TMR_CSCTRL_TCF1; TMR4_CSCTRL1 |= TMR_CSCTRL_TCF1EN;}
168static inline void IGN7_TIMER_ENABLE(void) {TMR4_CSCTRL2 &= ~TMR_CSCTRL_TCF1; TMR4_CSCTRL2 |= TMR_CSCTRL_TCF1EN;}
169static inline void IGN8_TIMER_ENABLE(void) {TMR4_CSCTRL3 &= ~TMR_CSCTRL_TCF1; TMR4_CSCTRL3 |= TMR_CSCTRL_TCF1EN;}
170
171static inline void IGN1_TIMER_DISABLE(void) {TMR2_CSCTRL0 &= ~TMR_CSCTRL_TCF1EN;}
172static inline void IGN2_TIMER_DISABLE(void) {TMR2_CSCTRL1 &= ~TMR_CSCTRL_TCF1EN;}
173static inline void IGN3_TIMER_DISABLE(void) {TMR2_CSCTRL2 &= ~TMR_CSCTRL_TCF1EN;}
174static inline void IGN4_TIMER_DISABLE(void) {TMR2_CSCTRL3 &= ~TMR_CSCTRL_TCF1EN;}
175static inline void IGN5_TIMER_DISABLE(void) {TMR4_CSCTRL0 &= ~TMR_CSCTRL_TCF1EN;}
176static inline void IGN6_TIMER_DISABLE(void) {TMR4_CSCTRL1 &= ~TMR_CSCTRL_TCF1EN;}
177static inline void IGN7_TIMER_DISABLE(void) {TMR4_CSCTRL2 &= ~TMR_CSCTRL_TCF1EN;}
178static inline void IGN8_TIMER_DISABLE(void) {TMR4_CSCTRL3 &= ~TMR_CSCTRL_TCF1EN;}
179
180/*
181***********************************************************************************************************
182* Auxiliaries
183*/
184#define ENABLE_BOOST_TIMER() PIT_TCTRL1 |= PIT_TCTRL_TEN
185#define DISABLE_BOOST_TIMER() PIT_TCTRL1 &= ~PIT_TCTRL_TEN
186
187#define ENABLE_VVT_TIMER() PIT_TCTRL2 |= PIT_TCTRL_TEN
188#define DISABLE_VVT_TIMER() PIT_TCTRL2 &= ~PIT_TCTRL_TEN
189
190//Ran out of timers, this most likely won't work. This should be possible to implement with the GPT timer.
191#define ENABLE_FAN_TIMER() TMR3_CSCTRL1 |= TMR_CSCTRL_TCF2EN
192#define DISABLE_FAN_TIMER() TMR3_CSCTRL1 &= ~TMR_CSCTRL_TCF2EN
193
194#define BOOST_TIMER_COMPARE PIT_LDVAL1
195#define BOOST_TIMER_COUNTER 0
196#define VVT_TIMER_COMPARE PIT_LDVAL2
197#define VVT_TIMER_COUNTER 0
198
199//these probaply need to be PIT_LDVAL something???
200#define FAN_TIMER_COMPARE TMR3_COMP22
201#define FAN_TIMER_COUNTER TMR3_CNTR1
202
203/*
204***********************************************************************************************************
205* Idle
206*/
207#define IDLE_COUNTER 0
208#define IDLE_COMPARE PIT_LDVAL0
209
210#define IDLE_TIMER_ENABLE() PIT_TCTRL0 |= PIT_TCTRL_TEN
211#define IDLE_TIMER_DISABLE() PIT_TCTRL0 &= ~PIT_TCTRL_TEN
212
213/*
214***********************************************************************************************************
215* CAN / Second serial
216*/
217#define SECONDARY_SERIAL_T HardwareSerial
218
219#include <FlexCAN_T4.h>
220#define NATIVE_CAN_AVAILABLE //Disable for now as it causes lockup
221
222using boardInputPin_t = inputPin_t;
223using boardOutputPin_t = outputPin_t;
224
226constexpr uint8_t ANALOG_PINS[] = { _ANALOG_PINS_A0_A14, A15, A16 };
227
232constexpr uint8_t SERIAL_BUFFER_THRESHOLD = 0U;
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_teensy41.h:162
static void IGN3_TIMER_DISABLE(void)
Definition board_teensy41.h:173
static void IGN1_TIMER_DISABLE(void)
Definition board_teensy41.h:171
static void FUEL2_TIMER_ENABLE(void)
Definition board_teensy41.h:145
static void FUEL1_TIMER_DISABLE(void)
Definition board_teensy41.h:153
static void FUEL4_TIMER_DISABLE(void)
Definition board_teensy41.h:156
static void IGN3_TIMER_ENABLE(void)
Definition board_teensy41.h:164
static void FUEL4_TIMER_ENABLE(void)
Definition board_teensy41.h:147
bool pinIsSerial(uint8_t)
static void FUEL5_TIMER_DISABLE(void)
Definition board_teensy41.h:157
static void FUEL2_TIMER_DISABLE(void)
Definition board_teensy41.h:154
static void FUEL3_TIMER_DISABLE(void)
Definition board_teensy41.h:155
static void IGN5_TIMER_ENABLE(void)
Definition board_teensy41.h:166
static bool pinIsReserved(uint8_t pin)
Definition board_teensy41.h:80
static void FUEL7_TIMER_DISABLE(void)
Definition board_teensy41.h:159
constexpr uint16_t BLOCKING_FACTOR
Definition board_teensy41.h:76
static void FUEL7_TIMER_ENABLE(void)
Definition board_teensy41.h:150
static void FUEL3_TIMER_ENABLE(void)
Definition board_teensy41.h:146
static void FUEL6_TIMER_ENABLE(void)
Definition board_teensy41.h:149
static void IGN6_TIMER_DISABLE(void)
Definition board_teensy41.h:176
static constexpr uint32_t ticksToMicros(COMPARE_TYPE ticks)
Convert timer ticks to µS.
Definition board_teensy41.h:62
static void FUEL6_TIMER_DISABLE(void)
Definition board_teensy41.h:158
static void IGN7_TIMER_DISABLE(void)
Definition board_teensy41.h:177
static void IGN2_TIMER_DISABLE(void)
Definition board_teensy41.h:172
static void IGN8_TIMER_DISABLE(void)
Definition board_teensy41.h:178
static void IGN6_TIMER_ENABLE(void)
Definition board_teensy41.h:167
static void IGN2_TIMER_ENABLE(void)
Definition board_teensy41.h:163
static void IGN8_TIMER_ENABLE(void)
Definition board_teensy41.h:169
static void FUEL8_TIMER_DISABLE(void)
Definition board_teensy41.h:160
static void IGN4_TIMER_ENABLE(void)
Definition board_teensy41.h:165
static void IGN7_TIMER_ENABLE(void)
Definition board_teensy41.h:168
static void IGN5_TIMER_DISABLE(void)
Definition board_teensy41.h:175
static void IGN4_TIMER_DISABLE(void)
Definition board_teensy41.h:174
constexpr uint8_t SERIAL_BUFFER_THRESHOLD
When the serial buffer is filled to greater than this threshold value, the serial processing operatio...
Definition board_teensy41.h:232
static void FUEL1_TIMER_ENABLE(void)
Definition board_teensy41.h:144
static void FUEL8_TIMER_ENABLE(void)
Definition board_teensy41.h:151
static void FUEL5_TIMER_ENABLE(void)
Definition board_teensy41.h:148
constexpr uint8_t ANALOG_PINS[]
Analog pin mapping.
Definition board_teensy41.h:226
constexpr uint16_t TABLE_BLOCKING_FACTOR
Definition board_teensy41.h:77
static constexpr COMPARE_TYPE uS_TO_TIMER_COMPARE(uint32_t micros)
Convert µS to timer ticks.
Definition board_teensy41.h:55