Speeduino
Loading...
Searching...
No Matches
board_teensy41.h
Go to the documentation of this file.
1#pragma once
2
5#include <Arduino.h>
6
7#define CORE_TEENSY41
8
9/*
10***********************************************************************************************************
11* General
12*/
13bool pinIsSerial(uint8_t);
14#define COMPARE_TYPE uint16_t
15#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)
16#define FPU_MAX_SIZE 32 //Size of the FPU buffer. 0 means no FPU.
17#define BOARD_MAX_DIGITAL_PINS 54
18#define BOARD_MAX_IO_PINS 54
19#define BOARD_MAX_ADC_PINS 17 //Number of analog pins
20#define EEPROM_LIB_H <EEPROM.h>
21typedef int eeprom_address_t;
22#define RTC_ENABLED
23#define SD_LOGGING //SD logging enabled by default for Teensy 4.1 as it has the slot built in
24#define RTC_LIB_H "TimeLib.h"
25#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
26constexpr uint16_t BLOCKING_FACTOR = 251;
27constexpr uint16_t TABLE_BLOCKING_FACTOR = 256;
28
29//#define PWM_FAN_AVAILABLE
30static inline bool pinIsReserved(uint8_t pin) {
31 return (pin == 0U)
32 || (pin == 42U)
33 || (pin == 43U)
34 || (pin == 44U)
35 || (pin == 45U)
36 || (pin == 46U)
37 || (pin == 47U)
38 || pinIsSerial(pin)
39 ;
40}
41
42#define INJ_CHANNELS 8
43#define IGN_CHANNELS 8
44
45/*
46***********************************************************************************************************
47* Schedules
48*/
49/*
50https://github.com/luni64/TeensyTimerTool/wiki/Supported-Timers#pit---periodic-timer
51https://github.com/luni64/TeensyTimerTool/wiki/Configuration#clock-setting-for-the-gpt-and-pit-timers
52The Quad timer (TMR) provides 4 timers each with 4 usable compare channels. The down compare and alternating compares are not usable
53FUEL 1-4: TMR1
54IGN 1-4 : TMR2
55FUEL 5-8: TMR3
56IGN 5-8 : TMR4
57*/
58#define FUEL1_COUNTER TMR1_CNTR0
59#define FUEL2_COUNTER TMR1_CNTR1
60#define FUEL3_COUNTER TMR1_CNTR2
61#define FUEL4_COUNTER TMR1_CNTR3
62#define FUEL5_COUNTER TMR3_CNTR0
63#define FUEL6_COUNTER TMR3_CNTR1
64#define FUEL7_COUNTER TMR3_CNTR2
65#define FUEL8_COUNTER TMR3_CNTR3
66
67#define IGN1_COUNTER TMR2_CNTR0
68#define IGN2_COUNTER TMR2_CNTR1
69#define IGN3_COUNTER TMR2_CNTR2
70#define IGN4_COUNTER TMR2_CNTR3
71#define IGN5_COUNTER TMR4_CNTR0
72#define IGN6_COUNTER TMR4_CNTR1
73#define IGN7_COUNTER TMR4_CNTR2
74#define IGN8_COUNTER TMR4_CNTR3
75
76#define FUEL1_COMPARE TMR1_COMP10
77#define FUEL2_COMPARE TMR1_COMP11
78#define FUEL3_COMPARE TMR1_COMP12
79#define FUEL4_COMPARE TMR1_COMP13
80#define FUEL5_COMPARE TMR3_COMP10
81#define FUEL6_COMPARE TMR3_COMP11
82#define FUEL7_COMPARE TMR3_COMP12
83#define FUEL8_COMPARE TMR3_COMP13
84
85#define IGN1_COMPARE TMR2_COMP10
86#define IGN2_COMPARE TMR2_COMP11
87#define IGN3_COMPARE TMR2_COMP12
88#define IGN4_COMPARE TMR2_COMP13
89#define IGN5_COMPARE TMR4_COMP10
90#define IGN6_COMPARE TMR4_COMP11
91#define IGN7_COMPARE TMR4_COMP12
92#define IGN8_COMPARE TMR4_COMP13
93
94static 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
95static inline void FUEL2_TIMER_ENABLE(void) {TMR1_CSCTRL1 &= ~TMR_CSCTRL_TCF1; TMR1_CSCTRL1 |= TMR_CSCTRL_TCF1EN;}
96static inline void FUEL3_TIMER_ENABLE(void) {TMR1_CSCTRL2 &= ~TMR_CSCTRL_TCF1; TMR1_CSCTRL2 |= TMR_CSCTRL_TCF1EN;}
97static inline void FUEL4_TIMER_ENABLE(void) {TMR1_CSCTRL3 &= ~TMR_CSCTRL_TCF1; TMR1_CSCTRL3 |= TMR_CSCTRL_TCF1EN;}
98static inline void FUEL5_TIMER_ENABLE(void) {TMR3_CSCTRL0 &= ~TMR_CSCTRL_TCF1; TMR3_CSCTRL0 |= TMR_CSCTRL_TCF1EN;}
99static inline void FUEL6_TIMER_ENABLE(void) {TMR3_CSCTRL1 &= ~TMR_CSCTRL_TCF1; TMR3_CSCTRL1 |= TMR_CSCTRL_TCF1EN;}
100static inline void FUEL7_TIMER_ENABLE(void) {TMR3_CSCTRL2 &= ~TMR_CSCTRL_TCF1; TMR3_CSCTRL2 |= TMR_CSCTRL_TCF1EN;}
101static inline void FUEL8_TIMER_ENABLE(void) {TMR3_CSCTRL3 &= ~TMR_CSCTRL_TCF1; TMR3_CSCTRL3 |= TMR_CSCTRL_TCF1EN;}
102
103static 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
104static inline void FUEL2_TIMER_DISABLE(void) {TMR1_CSCTRL1 &= ~TMR_CSCTRL_TCF1EN;}
105static inline void FUEL3_TIMER_DISABLE(void) {TMR1_CSCTRL2 &= ~TMR_CSCTRL_TCF1EN;}
106static inline void FUEL4_TIMER_DISABLE(void) {TMR1_CSCTRL3 &= ~TMR_CSCTRL_TCF1EN;}
107static inline void FUEL5_TIMER_DISABLE(void) {TMR3_CSCTRL0 &= ~TMR_CSCTRL_TCF1EN;}
108static inline void FUEL6_TIMER_DISABLE(void) {TMR3_CSCTRL1 &= ~TMR_CSCTRL_TCF1EN;}
109static inline void FUEL7_TIMER_DISABLE(void) {TMR3_CSCTRL2 &= ~TMR_CSCTRL_TCF1EN;}
110static inline void FUEL8_TIMER_DISABLE(void) {TMR3_CSCTRL3 &= ~TMR_CSCTRL_TCF1EN;}
111
112static inline void IGN1_TIMER_ENABLE(void) {TMR2_CSCTRL0 &= ~TMR_CSCTRL_TCF1; TMR2_CSCTRL0 |= TMR_CSCTRL_TCF1EN;}
113static inline void IGN2_TIMER_ENABLE(void) {TMR2_CSCTRL1 &= ~TMR_CSCTRL_TCF1; TMR2_CSCTRL1 |= TMR_CSCTRL_TCF1EN;}
114static inline void IGN3_TIMER_ENABLE(void) {TMR2_CSCTRL2 &= ~TMR_CSCTRL_TCF1; TMR2_CSCTRL2 |= TMR_CSCTRL_TCF1EN;}
115static inline void IGN4_TIMER_ENABLE(void) {TMR2_CSCTRL3 &= ~TMR_CSCTRL_TCF1; TMR2_CSCTRL3 |= TMR_CSCTRL_TCF1EN;}
116static inline void IGN5_TIMER_ENABLE(void) {TMR4_CSCTRL0 &= ~TMR_CSCTRL_TCF1; TMR4_CSCTRL0 |= TMR_CSCTRL_TCF1EN;}
117static inline void IGN6_TIMER_ENABLE(void) {TMR4_CSCTRL1 &= ~TMR_CSCTRL_TCF1; TMR4_CSCTRL1 |= TMR_CSCTRL_TCF1EN;}
118static inline void IGN7_TIMER_ENABLE(void) {TMR4_CSCTRL2 &= ~TMR_CSCTRL_TCF1; TMR4_CSCTRL2 |= TMR_CSCTRL_TCF1EN;}
119static inline void IGN8_TIMER_ENABLE(void) {TMR4_CSCTRL3 &= ~TMR_CSCTRL_TCF1; TMR4_CSCTRL3 |= TMR_CSCTRL_TCF1EN;}
120
121static inline void IGN1_TIMER_DISABLE(void) {TMR2_CSCTRL0 &= ~TMR_CSCTRL_TCF1EN;}
122static inline void IGN2_TIMER_DISABLE(void) {TMR2_CSCTRL1 &= ~TMR_CSCTRL_TCF1EN;}
123static inline void IGN3_TIMER_DISABLE(void) {TMR2_CSCTRL2 &= ~TMR_CSCTRL_TCF1EN;}
124static inline void IGN4_TIMER_DISABLE(void) {TMR2_CSCTRL3 &= ~TMR_CSCTRL_TCF1EN;}
125static inline void IGN5_TIMER_DISABLE(void) {TMR4_CSCTRL0 &= ~TMR_CSCTRL_TCF1EN;}
126static inline void IGN6_TIMER_DISABLE(void) {TMR4_CSCTRL1 &= ~TMR_CSCTRL_TCF1EN;}
127static inline void IGN7_TIMER_DISABLE(void) {TMR4_CSCTRL2 &= ~TMR_CSCTRL_TCF1EN;}
128static inline void IGN8_TIMER_DISABLE(void) {TMR4_CSCTRL3 &= ~TMR_CSCTRL_TCF1EN;}
129
130// Need to handle this dynamically in the future for other frequencies
131//#define TMR_PRESCALE 128
132//#define MAX_TIMER_PERIOD ((65535U * 1000000ULL) / (F_BUS_ACTUAL / TMR_PRESCALE)) //55923 @ 600Mhz.
133#if F_CPU == 600000000
134 //Bus Clock is 150Mhz @ 600 Mhz CPU.
135 #define MAX_TIMER_PERIOD 55923UL //Time per tick = 0.8533333
136 #define uS_TO_TIMER_COMPARE(uS) (COMPARE_TYPE)(((uS) * 75UL) >> 6) //Converts a given number of uS into the required number of timer ticks until that time has passed.
137#elif F_CPU == 528000000
138 //Bus Clock is 132Mhz @ 528 Mhz CPU.
139 #define MAX_TIMER_PERIOD 63549UL //Time per tick = 0.96969696
140 #define uS_TO_TIMER_COMPARE(uS) (COMPARE_TYPE)(((uS) * 66UL) >> 6) //Converts a given number of uS into the required number of timer ticks until that time has passed.
141#elif F_CPU == 450000000
142 //Bus Clock is 150Mhz @ 450 Mhz CPU.
143 #define MAX_TIMER_PERIOD 55923UL //Time per tick = 0.8533333
144 #define uS_TO_TIMER_COMPARE(uS) (COMPARE_TYPE)(((uS) * 75UL) >> 6) //Converts a given number of uS into the required number of timer ticks until that time has passed.
145#elif F_CPU == 396000000
146 //Bus Clock is 132Mhz @ 396 Mhz CPU.
147 #define MAX_TIMER_PERIOD 63549UL //Time per tick = 0.96969696
148 #define uS_TO_TIMER_COMPARE(uS) (COMPARE_TYPE)(((uS) * 66UL) >> 6) //Converts a given number of uS into the required number of timer ticks until that time has passed.
149#elif F_CPU == 150000000
150 //Bus Clock is 75Mhz @ 150 Mhz CPU.
151 #define MAX_TIMER_PERIOD 111846UL //Time per tick = 1.706666
152 #define uS_TO_TIMER_COMPARE(uS) (COMPARE_TYPE)(((uS) * 75UL) >> 7) //Converts a given number of uS into the required number of timer ticks until that time has passed.
153#else
154 #error Unsupported CPU frequency.
155#endif
156/*
157To calculate the above uS_TO_TIMER_COMPARE
158Choose number of bit of precision. Eg: 6
159Divide 2^6 by the time per tick (0.853333) = 75
160Multiply and bitshift back by the precision: (uS * 75) >> 6
161*/
162
163
164/*
165***********************************************************************************************************
166* Auxiliaries
167*/
168#define ENABLE_BOOST_TIMER() PIT_TCTRL1 |= PIT_TCTRL_TEN
169#define DISABLE_BOOST_TIMER() PIT_TCTRL1 &= ~PIT_TCTRL_TEN
170
171#define ENABLE_VVT_TIMER() PIT_TCTRL2 |= PIT_TCTRL_TEN
172#define DISABLE_VVT_TIMER() PIT_TCTRL2 &= ~PIT_TCTRL_TEN
173
174//Ran out of timers, this most likely won't work. This should be possible to implement with the GPT timer.
175#define ENABLE_FAN_TIMER() TMR3_CSCTRL1 |= TMR_CSCTRL_TCF2EN
176#define DISABLE_FAN_TIMER() TMR3_CSCTRL1 &= ~TMR_CSCTRL_TCF2EN
177
178#define BOOST_TIMER_COMPARE PIT_LDVAL1
179#define BOOST_TIMER_COUNTER 0
180#define VVT_TIMER_COMPARE PIT_LDVAL2
181#define VVT_TIMER_COUNTER 0
182
183//these probaply need to be PIT_LDVAL something???
184#define FAN_TIMER_COMPARE TMR3_COMP22
185#define FAN_TIMER_COUNTER TMR3_CNTR1
186
187/*
188***********************************************************************************************************
189* Idle
190*/
191#define IDLE_COUNTER 0
192#define IDLE_COMPARE PIT_LDVAL0
193
194#define IDLE_TIMER_ENABLE() PIT_TCTRL0 |= PIT_TCTRL_TEN
195#define IDLE_TIMER_DISABLE() PIT_TCTRL0 &= ~PIT_TCTRL_TEN
196
197/*
198***********************************************************************************************************
199* CAN / Second serial
200*/
201#define SECONDARY_SERIAL_T HardwareSerial
202
203#include <FlexCAN_T4.h>
204#define NATIVE_CAN_AVAILABLE //Disable for now as it causes lockup
static void IGN1_TIMER_ENABLE(void)
Definition board_teensy41.h:112
static void IGN3_TIMER_DISABLE(void)
Definition board_teensy41.h:123
static void IGN1_TIMER_DISABLE(void)
Definition board_teensy41.h:121
static void FUEL2_TIMER_ENABLE(void)
Definition board_teensy41.h:95
static void FUEL1_TIMER_DISABLE(void)
Definition board_teensy41.h:103
static void FUEL4_TIMER_DISABLE(void)
Definition board_teensy41.h:106
static void IGN3_TIMER_ENABLE(void)
Definition board_teensy41.h:114
static void FUEL4_TIMER_ENABLE(void)
Definition board_teensy41.h:97
int eeprom_address_t
Definition board_teensy41.h:21
bool pinIsSerial(uint8_t)
static void FUEL5_TIMER_DISABLE(void)
Definition board_teensy41.h:107
static void FUEL2_TIMER_DISABLE(void)
Definition board_teensy41.h:104
static void FUEL3_TIMER_DISABLE(void)
Definition board_teensy41.h:105
static void IGN5_TIMER_ENABLE(void)
Definition board_teensy41.h:116
static bool pinIsReserved(uint8_t pin)
Definition board_teensy41.h:30
static void FUEL7_TIMER_DISABLE(void)
Definition board_teensy41.h:109
constexpr uint16_t BLOCKING_FACTOR
Definition board_teensy41.h:26
static void FUEL7_TIMER_ENABLE(void)
Definition board_teensy41.h:100
static void FUEL3_TIMER_ENABLE(void)
Definition board_teensy41.h:96
static void FUEL6_TIMER_ENABLE(void)
Definition board_teensy41.h:99
static void IGN6_TIMER_DISABLE(void)
Definition board_teensy41.h:126
static void FUEL6_TIMER_DISABLE(void)
Definition board_teensy41.h:108
static void IGN7_TIMER_DISABLE(void)
Definition board_teensy41.h:127
static void IGN2_TIMER_DISABLE(void)
Definition board_teensy41.h:122
static void IGN8_TIMER_DISABLE(void)
Definition board_teensy41.h:128
static void IGN6_TIMER_ENABLE(void)
Definition board_teensy41.h:117
static void IGN2_TIMER_ENABLE(void)
Definition board_teensy41.h:113
static void IGN8_TIMER_ENABLE(void)
Definition board_teensy41.h:119
static void FUEL8_TIMER_DISABLE(void)
Definition board_teensy41.h:110
static void IGN4_TIMER_ENABLE(void)
Definition board_teensy41.h:115
static void IGN7_TIMER_ENABLE(void)
Definition board_teensy41.h:118
static void IGN5_TIMER_DISABLE(void)
Definition board_teensy41.h:125
static void IGN4_TIMER_DISABLE(void)
Definition board_teensy41.h:124
static void FUEL1_TIMER_ENABLE(void)
Definition board_teensy41.h:94
static void FUEL8_TIMER_ENABLE(void)
Definition board_teensy41.h:101
static void FUEL5_TIMER_ENABLE(void)
Definition board_teensy41.h:98
constexpr uint16_t TABLE_BLOCKING_FACTOR
Definition board_teensy41.h:27