Speeduino
Loading...
Searching...
No Matches
board_same51.h
Go to the documentation of this file.
1#ifndef SAME51_H
2#define SAME51_H
3#if defined(CORE_SAME51)
4
5#include "sam.h"
6
7/*
8***********************************************************************************************************
9* General
10*/
11 #define BOARD_MAX_DIGITAL_PINS 54 //digital pins +1
12 #define BOARD_MAX_IO_PINS 58 //digital pins + analog channels + 1
13
14 #define COMPARE_TYPE uint16_t
15 #define SERIAL_BUFFER_SIZE 257 //Size of the serial buffer used by new comms protocol. Additional 1 byte is for flag
16 #define FPU_MAX_SIZE 32 //Size of the FPU buffer. 0 means no FPU.
17 #ifdef USE_SPI_EEPROM
18 #define EEPROM_LIB_H "src/SPIAsEEPROM/SPIAsEEPROM.h"
20 #include EEPROM_LIB_H
21 //SPIClass SPI_for_flash(1, 2, 3); //SPI1_MOSI, SPI1_MISO, SPI1_SCK
22 SPIClass SPI_for_flash = SPI; //SPI1_MOSI, SPI1_MISO, SPI1_SCK
23
24 //windbond W25Q16 SPI flash EEPROM emulation
25 EEPROM_Emulation_Config EmulatedEEPROMMconfig{255UL, 4096UL, 31, 0x00100000UL};
26 //Flash_SPI_Config SPIconfig{USE_SPI_EEPROM, SPI_for_flash};
28 #else
29 //#define EEPROM_LIB_H <EEPROM.h>
30 #define EEPROM_LIB_H "src/FlashStorage/FlashAsEEPROM.h"
32 #endif
33 #define RTC_LIB_H "TimeLib.h"
34 void initBoard();
36 void doSystemReset();
37 void jumpToBootloader();
39
40 #define pinIsReserved(pin) ( ((pin) == 0) ) //Forbidden pins like USB on other boards
41
42 //Additional analog pins (These won't work without other changes)
43 #define PIN_A6 (8ul)
44 #define PIN_A7 (9ul)
45 #define PIN_A8 (10ul)
46 #define PIN_A9 (11ul)
47 #define PIN_A13 (9ul)
48 #define PIN_A14 (9ul)
49 #define PIN_A15 (9ul)
50
51 static const uint8_t A7 = PIN_A7;
52 static const uint8_t A8 = PIN_A8;
53 static const uint8_t A9 = PIN_A9;
54 static const uint8_t A13 = PIN_A13;
55 static const uint8_t A14 = PIN_A14;
56 static const uint8_t A15 = PIN_A15;
57
58/*
59***********************************************************************************************************
60* Schedules
61*/
62 //See : https://electronics.stackexchange.com/questions/325159/the-value-of-the-tcc-counter-on-an-atsam-controller-always-reads-as-zero
63 // SAME512 Timer channel list: https://user-images.githubusercontent.com/11770912/62131781-2e150b80-b31f-11e9-9970-9a6c2356a17c.png
64 #define FUEL1_COUNTER TCC0->COUNT.reg
65 #define FUEL2_COUNTER TCC0->COUNT.reg
66 #define FUEL3_COUNTER TCC0->COUNT.reg
67 #define FUEL4_COUNTER TCC0->COUNT.reg
68 //The below are NOT YET RIGHT!
69 #define FUEL5_COUNTER TCC1->COUNT.reg
70 #define FUEL6_COUNTER TCC1->COUNT.reg
71 #define FUEL7_COUNTER TCC1->COUNT.reg
72 #define FUEL8_COUNTER TCC1->COUNT.reg
73
74 #define IGN1_COUNTER TCC1->COUNT.reg
75 #define IGN2_COUNTER TCC1->COUNT.reg
76 #define IGN3_COUNTER TCC2->COUNT.reg
77 #define IGN4_COUNTER TCC2->COUNT.reg
78 //The below are NOT YET RIGHT!
79 #define IGN5_COUNTER TCC1->COUNT.reg
80 #define IGN6_COUNTER TCC1->COUNT.reg
81 #define IGN7_COUNTER TCC2->COUNT.reg
82 #define IGN8_COUNTER TCC2->COUNT.reg
83
84 #define FUEL1_COMPARE TCC0->CC[0].bit.CC
85 #define FUEL2_COMPARE TCC0->CC[1].bit.CC
86 #define FUEL3_COMPARE TCC0->CC[2].bit.CC
87 #define FUEL4_COMPARE TCC0->CC[3].bit.CC
88 //The below are NOT YET RIGHT!
89 #define FUEL5_COMPARE TCC1->CC[0].bit.CC
90 #define FUEL6_COMPARE TCC1->CC[1].bit.CC
91 #define FUEL7_COMPARE TCC1->CC[2].bit.CC
92 #define FUEL8_COMPARE TCC1->CC[3].bit.CC
93
94 #define IGN1_COMPARE TCC1->CC[0].bit.CC
95 #define IGN2_COMPARE TCC1->CC[1].bit.CC
96 #define IGN3_COMPARE TCC2->CC[0].bit.CC
97 #define IGN4_COMPARE TCC2->CC[1].bit.CC
98 //The below are NOT YET RIGHT!
99 #define IGN5_COMPARE TCC1->CC[0].bit.CC
100 #define IGN6_COMPARE TCC1->CC[1].bit.CC
101 #define IGN7_COMPARE TCC2->CC[0].bit.CC
102 #define IGN8_COMPARE TCC2->CC[1].bit.CC
103
104static inline void FUEL1_TIMER_ENABLE(void) { TCC0->INTENSET.bit.MC0 = 0x1; }
105static inline void FUEL2_TIMER_ENABLE(void) { TCC0->INTENSET.bit.MC1 = 0x1; }
106static inline void FUEL3_TIMER_ENABLE(void) { TCC0->INTENSET.bit.MC2 = 0x1; }
107static inline void FUEL4_TIMER_ENABLE(void) { TCC0->INTENSET.bit.MC3 = 0x1; }
108 //The below are NOT YET RIGHT!
109static inline void FUEL5_TIMER_ENABLE(void) { TCC0->INTENSET.bit.MC0 = 0x1; }
110static inline void FUEL6_TIMER_ENABLE(void) { TCC0->INTENSET.bit.MC1 = 0x1; }
111static inline void FUEL7_TIMER_ENABLE(void) { TCC0->INTENSET.bit.MC2 = 0x1; }
112static inline void FUEL8_TIMER_ENABLE(void) { TCC0->INTENSET.bit.MC3 = 0x1; }
113
114static inline void FUEL1_TIMER_DISABLE(void) { TCC0->INTENSET.bit.MC0 = 0x0; }
115static inline void FUEL2_TIMER_DISABLE(void) { TCC0->INTENSET.bit.MC0 = 0x0; }
116static inline void FUEL3_TIMER_DISABLE(void) { TCC0->INTENSET.bit.MC0 = 0x0; }
117static inline void FUEL4_TIMER_DISABLE(void) { TCC0->INTENSET.bit.MC0 = 0x0; }
118 //The below are NOT YET RIGHT!
119static inline void FUEL5_TIMER_DISABLE(void) { TCC0->INTENSET.bit.MC0 = 0x0; }
120static inline void FUEL6_TIMER_DISABLE(void) { TCC0->INTENSET.bit.MC0 = 0x0; }
121static inline void FUEL7_TIMER_DISABLE(void) { TCC0->INTENSET.bit.MC0 = 0x0; }
122static inline void FUEL9_TIMER_DISABLE(void) { TCC0->INTENSET.bit.MC0 = 0x0; }
123
124static inline void IGN1_TIMER_ENABLE(void) { TCC1->INTENSET.bit.MC0 = 0x1; }
125static inline void IGN2_TIMER_ENABLE(void) { TCC1->INTENSET.bit.MC1 = 0x1; }
126static inline void IGN3_TIMER_ENABLE(void) { TCC2->INTENSET.bit.MC0 = 0x1; }
127static inline void IGN4_TIMER_ENABLE(void) { TCC2->INTENSET.bit.MC1 = 0x1; }
128//The below are NOT YET RIGHT!
129static inline void IGN5_TIMER_ENABLE(void) { TCC1->INTENSET.bit.MC0 = 0x1; }
130static inline void IGN6_TIMER_ENABLE(void) { TCC1->INTENSET.bit.MC1 = 0x1; }
131static inline void IGN7_TIMER_ENABLE(void) { TCC2->INTENSET.bit.MC0 = 0x1; }
132static inline void IGN8_TIMER_ENABLE(void) { TCC2->INTENSET.bit.MC1 = 0x1; }
133
134static inline void IGN1_TIMER_DISABLE(void) { TCC1->INTENSET.bit.MC0 = 0x0; }
135static inline void IGN2_TIMER_DISABLE(void) { TCC1->INTENSET.bit.MC1 = 0x0; }
136static inline void IGN3_TIMER_DISABLE(void) { TCC2->INTENSET.bit.MC0 = 0x0; }
137static inline void IGN4_TIMER_DISABLE(void) { TCC2->INTENSET.bit.MC1 = 0x0; }
138//The below are NOT YET RIGHT!
139static inline void IGN5_TIMER_DISABLE(void) { TCC1->INTENSET.bit.MC0 = 0x0; }
140static inline void IGN6_TIMER_DISABLE(void) { TCC1->INTENSET.bit.MC1 = 0x0; }
141static inline void IGN7_TIMER_DISABLE(void) { TCC2->INTENSET.bit.MC0 = 0x0; }
142static inline void IGN8_TIMER_DISABLE(void) { TCC2->INTENSET.bit.MC1 = 0x0; }
143
144 #define MAX_TIMER_PERIOD 139808 // 2.13333333uS * 65535
145 #define MAX_TIMER_PERIOD_SLOW 139808
146 #define uS_TO_TIMER_COMPARE(uS) ((uS * 15) >> 5) //Converts a given number of uS into the required number of timer ticks until that time has passed.
147 //Hack compatibility with AVR timers that run at different speeds
148 #define uS_TO_TIMER_COMPARE_SLOW(uS) ((uS * 15) >> 5)
149
150/*
151***********************************************************************************************************
152* Auxiliaries
153*/
154 //Uses the 2nd TC
155 //The 2nd TC is referred to as TC4
156 #define ENABLE_BOOST_TIMER() TC4->COUNT16.INTENSET.bit.MC0 = 0x1 // Enable match interrupts on compare channel 0
157 #define DISABLE_BOOST_TIMER() TC4->COUNT16.INTENSET.bit.MC0 = 0x0
158
159 #define ENABLE_VVT_TIMER() TC4->COUNT16.INTENSET.bit.MC1 = 0x1
160 #define DISABLE_VVT_TIMER() TC4->COUNT16.INTENSET.bit.MC1 = 0x0
161
162 #define BOOST_TIMER_COMPARE TC4->COUNT16.CC[0].reg
163 #define BOOST_TIMER_COUNTER TC4->COUNT16.COUNT.bit.COUNT
164 #define VVT_TIMER_COMPARE TC4->COUNT16.CC[1].reg
165 #define VVT_TIMER_COUNTER TC4->COUNT16.COUNT.bit.COUNT
166
167/*
168***********************************************************************************************************
169* Idle
170*/
171 //3rd TC is aliased as TC5
172 #define IDLE_COUNTER TC5->COUNT16.COUNT.bit.COUNT
173 #define IDLE_COMPARE TC5->COUNT16.CC[0].reg
174
175 #define IDLE_TIMER_ENABLE() TC5->COUNT16.INTENSET.bit.MC0 = 0x1
176 #define IDLE_TIMER_DISABLE() TC5->COUNT16.INTENSET.bit.MC0 = 0x0
177
178/*
179***********************************************************************************************************
180* CAN / Second serial
181*/
183
184#endif //CORE_SAMD21
185#endif //SAMD21_H
#define secondarySerial
Definition comms_secondary.h:15
static uint32_t rshift(uint32_t a)
Bitwise right shift - generic, unoptimized, case.
Definition bit_shifts.h:348