FastArduino - ATmega328P Support v1.10
C++ library to build fast but small Arduino/AVR projects
Loading...
Searching...
No Matches
uno.h
Go to the documentation of this file.
1// Copyright 2016-2023 Jean-Francois Poilpret
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
16
22#ifndef BOARDS_UNO_HH
23#define BOARDS_UNO_HH
24
25#include "io.h"
26#include "../defines.h"
27#include <avr/sleep.h>
28
30/* This board is based on ATmega328P */
31#define BOARD_ATMEGA328P
33
37namespace board
38{
48 inline static void init() {}
49
53 enum class Port: uint8_t
54 {
56 PORT_B = 0,
58 PORT_C,
60 PORT_D,
61 // FastArduino internal: DO NOT USE
62 NONE = UINT8_MAX
63 };
64
72 enum class DigitalPin: uint8_t
73 {
75 D0_PD0 = 0,
77 D0 = D0_PD0,
79 D1_PD1,
81 D1 = D1_PD1,
83 D2_PD2,
85 D2 = D2_PD2,
87 D3_PD3,
89 D3 = D3_PD3,
91 D4_PD4,
93 D4 = D4_PD4,
95 D5_PD5,
97 D5 = D5_PD5,
99 D6_PD6,
101 D6 = D6_PD6,
103 D7_PD7,
105 D7 = D7_PD7,
107 D8_PB0,
109 D8 = D8_PB0,
111 D9_PB1,
113 D9 = D9_PB1,
115 D10_PB2,
117 D10 = D10_PB2,
119 D11_PB3,
121 D11 = D11_PB3,
123 D12_PB4,
125 D12 = D12_PB4,
127 D13_PB5,
129 D13 = D13_PB5,
131 D14_PC0,
133 A0 = D14_PC0,
135 A0_PC0 = D14_PC0,
137 D15_PC1,
139 A1 = D15_PC1,
141 A1_PC1 = D15_PC1,
143 D16_PC2,
145 A2 = D16_PC2,
147 A2_PC2 = D16_PC2,
149 D17_PC3,
151 A3 = D17_PC3,
153 A3_PC3 = D17_PC3,
155 D18_PC4,
157 A4 = D18_PC4,
159 A4_PC4 = D18_PC4,
161 D19_PC5,
163 A5 = D19_PC5,
165 A5_PC5 = D19_PC5,
167 LED = D13_PB5,
170 // FastArduino internal: DO NOT USE
171 NONE = UINT8_MAX
172 };
173
177 enum class AnalogClock: uint8_t
178 {
179 MAX_FREQ_50KHz = 0,
180 MAX_FREQ_100KHz,
181 MAX_FREQ_200KHz,
182 MAX_FREQ_500KHz,
183 MAX_FREQ_1MHz
184 };
185
189 enum class AnalogReference: uint8_t
190 {
192 AREF = 0,
194 AVCC,
200 };
201
208 enum class AnalogPin: uint8_t
209 {
211 A0 = 0,
213 A1,
215 A2,
217 A3,
219 A4,
221 A5,
222#ifdef HAS_8_ANALOG_INPUTS
224 A6,
226 A7,
227#endif
229 TEMP,
231 BANDGAP,
232 // FastArduino internal: DO NOT USE
233 NONE = UINT8_MAX
234 };
235
244 enum class PWMPin : uint8_t
245 {
246 D6_PD6_OC0A = 0,
247 D5_PD5_OC0B,
248 D9_PB1_OC1A,
249 D10_PB2_OC1B,
250 D11_PB3_OC2A,
251 D3_PD3_OC2B,
252 D6 = D6_PD6_OC0A,
253 D5 = D5_PD5_OC0B,
254 D9 = D9_PB1_OC1A,
255 D10 = D10_PB2_OC1B,
256 D11 = D11_PB3_OC2A,
257 D3 = D3_PD3_OC2B,
258 // FastArduino internal: DO NOT USE
259 NONE = UINT8_MAX
260 };
261
270 enum class ExternalInterruptPin : uint8_t
271 {
272 D2_PD2_EXT0 = 0,
273 D3_PD3_EXT1,
274 D2 = D2_PD2_EXT0,
275 D3 = D3_PD3_EXT1
276 };
277
286 enum class InterruptPin : uint8_t
287 {
288 D0_PD0_PCI2 = uint8_t(DigitalPin::D0_PD0),
289 D1_PD1_PCI2 = uint8_t(DigitalPin::D1_PD1),
290 D2_PD2_PCI2 = uint8_t(DigitalPin::D2_PD2),
291 D3_PD3_PCI2 = uint8_t(DigitalPin::D3_PD3),
292 D4_PD4_PCI2 = uint8_t(DigitalPin::D4_PD4),
293 D5_PD5_PCI2 = uint8_t(DigitalPin::D5_PD5),
294 D6_PD6_PCI2 = uint8_t(DigitalPin::D6_PD6),
295 D7_PD7_PCI2 = uint8_t(DigitalPin::D7_PD7),
296
297 D8_PB0_PCI0 = uint8_t(DigitalPin::D8_PB0),
298 D9_PB1_PCI0 = uint8_t(DigitalPin::D9_PB1),
299 D10_PB2_PCI0 = uint8_t(DigitalPin::D10_PB2),
300 D11_PB3_PCI0 = uint8_t(DigitalPin::D11_PB3),
301 D12_PB4_PCI0 = uint8_t(DigitalPin::D12_PB4),
302 D13_PB5_PCI0 = uint8_t(DigitalPin::D13_PB5),
303
304 D14_PC0_PCI1 = uint8_t(DigitalPin::D14_PC0),
305 D15_PC1_PCI1 = uint8_t(DigitalPin::D15_PC1),
306 D16_PC2_PCI1 = uint8_t(DigitalPin::D16_PC2),
307 D17_PC3_PCI1 = uint8_t(DigitalPin::D17_PC3),
308 D18_PC4_PCI1 = uint8_t(DigitalPin::D18_PC4),
309 D19_PC5_PCI1 = uint8_t(DigitalPin::D19_PC5),
310
311 D0 = D0_PD0_PCI2,
312 D1 = D1_PD1_PCI2,
313 D2 = D2_PD2_PCI2,
314 D3 = D3_PD3_PCI2,
315 D4 = D4_PD4_PCI2,
316 D5 = D5_PD5_PCI2,
317 D6 = D6_PD6_PCI2,
318 D7 = D7_PD7_PCI2,
319
320 D8 = D8_PB0_PCI0,
321 D9 = D9_PB1_PCI0,
322 D10 = D10_PB2_PCI0,
323 D11 = D11_PB3_PCI0,
324 D12 = D12_PB4_PCI0,
325 D13 = D13_PB5_PCI0,
326
327 A0 = D14_PC0_PCI1,
328 A1 = D15_PC1_PCI1,
329 A2 = D16_PC2_PCI1,
330 A3 = D17_PC3_PCI1,
331 A4 = D18_PC4_PCI1,
332 A5 = D19_PC5_PCI1,
333
334 A0_PC0_PCI1 = D14_PC0_PCI1,
335 A1_PC1_PCI1 = D15_PC1_PCI1,
336 A2_PC2_PCI1 = D16_PC2_PCI1,
337 A3_PC3_PCI1 = D17_PC3_PCI1,
338 A4_PC4_PCI1 = D18_PC4_PCI1,
339 A5_PC5_PCI1 = D19_PC5_PCI1
340 };
341
345 enum class USART: uint8_t
346 {
347 USART0 = 0
348 };
349
353 enum class Timer: uint8_t
354 {
356 TIMER0 = 0,
358 TIMER1 = 1,
360 TIMER2 = 2
361 };
362
366 enum class SleepMode: uint8_t
367 {
373 IDLE = SLEEP_MODE_IDLE,
378 ADC_NOISE_REDUCTION = SLEEP_MODE_ADC,
388 POWER_DOWN = SLEEP_MODE_PWR_DOWN,
396 POWER_SAVE = SLEEP_MODE_PWR_SAVE,
401 STANDBY = SLEEP_MODE_STANDBY,
406 EXTENDED_STANDBY = SLEEP_MODE_EXT_STANDBY
407 };
408};
409
411// Forward declare interrupt service routines to allow them as friends
412extern "C" {
413 void ADC_vect(void) SIGNAL_HANDLER;
414 void ANALOG_COMP_vect(void) SIGNAL_HANDLER;
415 void INT0_vect(void) SIGNAL_HANDLER;
416 void INT1_vect(void) SIGNAL_HANDLER;
417 void PCINT0_vect(void) SIGNAL_HANDLER;
418 void PCINT1_vect(void) SIGNAL_HANDLER;
419 void PCINT2_vect(void) SIGNAL_HANDLER;
420 void SPI_STC_vect(void) SIGNAL_HANDLER;
421 void TIMER0_COMPA_vect(void) SIGNAL_HANDLER;
422 void TIMER0_COMPB_vect(void) SIGNAL_HANDLER;
423 void TIMER0_OVF_vect(void) SIGNAL_HANDLER;
424 void TIMER1_CAPT_vect(void) SIGNAL_HANDLER;
425 void TIMER1_COMPA_vect(void) SIGNAL_HANDLER;
426 void TIMER1_COMPB_vect(void) SIGNAL_HANDLER;
427 void TIMER1_OVF_vect(void) SIGNAL_HANDLER;
428 void TIMER2_COMPA_vect(void) SIGNAL_HANDLER;
429 void TIMER2_COMPB_vect(void) SIGNAL_HANDLER;
430 void TIMER2_OVF_vect(void) SIGNAL_HANDLER;
431 void TWI_vect(void) SIGNAL_HANDLER;
432 void WDT_vect(void) SIGNAL_HANDLER;
433 void USART_RX_vect(void) SIGNAL_HANDLER;
434 void USART_TX_vect(void) SIGNAL_HANDLER;
435 void USART_UDRE_vect(void) SIGNAL_HANDLER;
436 void EE_READY_vect(void) SIGNAL_HANDLER;
437}
438
439#define USART0_RX_vect USART_RX_vect
440#define USART0_TX_vect USART_TX_vect
441#define USART0_UDRE_vect USART_UDRE_vect
443
444#endif /* BOARDS_UNO_HH */
Defines all types and constants specific to support ATmega328P MCU target.
Definition: uno.h:38
PWMPin
Defines all digital output pins of ATmega328P, capable of PWM output.
Definition: uno.h:245
Port
Defines all available ports of ATmega328P.
Definition: uno.h:54
@ PORT_D
Port D (8 IO)
@ PORT_C
Port C (6 IO)
@ PORT_B
Port B (7 IO)
static void init()
Performs special initialization for ATmega328P, actually nothing at all.
Definition: uno.h:48
DigitalPin
Defines all available digital input/output pins of ATmega328P, with reference to Arduino UNO pins.
Definition: uno.h:73
@ D17_PC3
Pin PC3 (A3, D17 on Arduino UNO)
@ A4
Pin PC4 (A4, D18 on Arduino UNO)
@ D0
Pin PD0 (D0 on Arduino UNO)
@ D6_PD6
Pin PD6 (D6 on Arduino UNO)
@ D2_PD2
Pin PD2 (D2 on Arduino UNO)
@ D16_PC2
Pin PC2 (A2, D16 on Arduino UNO)
@ D15_PC1
Pin PC1 (A1, D15 on Arduino UNO)
@ D4
Pin PD4 (D4 on Arduino UNO)
@ A1
Pin PC1 (A1, D15 on Arduino UNO)
@ D14_PC0
Pin PC0 (A0, D14 on Arduino UNO)
@ D8_PB0
Pin PB0 (D8 on Arduino UNO)
@ A2_PC2
Pin PC2 (A2, D16 on Arduino UNO)
@ D11_PB3
Pin PB3 (D11 on Arduino UNO)
@ D19_PC5
Pin PC5 (A5, D19 on Arduino UNO)
@ D1
Pin PD1 (D1 on Arduino UNO)
@ LED
Shortcut for LED pin on Arduino.
@ D18_PC4
Pin PC4 (A4, D18 on Arduino UNO)
@ A3
Pin PC3 (A3, D17 on Arduino UNO)
@ D12_PB4
Pin PB4 (D12 on Arduino UNO)
@ D3_PD3
Pin PD3 (D3 on Arduino UNO)
@ D5_PD5
Pin PD5 (D5 on Arduino UNO)
@ D12
Pin PB4 (D12 on Arduino UNO)
@ D10
Pin PB2 (D10 on Arduino UNO)
@ A5_PC5
Pin PC5 (A5, D19 on Arduino UNO)
@ D4_PD4
Pin PD4 (D4 on Arduino UNO)
@ D7_PD7
Pin PD7 (D7 on Arduino UNO)
@ A1_PC1
Pin PC1 (A1, D15 on Arduino UNO)
@ A4_PC4
Pin PC4 (A4, D18 on Arduino UNO)
@ D7
Pin PD7 (D7 on Arduino UNO)
@ D9_PB1
Pin PB1 (D9 on Arduino UNO)
@ D3
Pin PD3 (D3 on Arduino UNO)
@ D0_PD0
Pin PD0 (D0 on Arduino UNO)
@ D9
Pin PB1 (D9 on Arduino UNO)
@ D8
Pin PB0 (D8 on Arduino UNO)
@ D13
Pin PB5 (D13 on Arduino UNO)
@ D11
Pin PB3 (D11 on Arduino UNO)
@ LED_PB5
Shortcut for LED pin on Arduino.
@ D2
Pin PD2 (D2 on Arduino UNO)
@ A0_PC0
Pin PC0 (A0, D14 on Arduino UNO)
@ D10_PB2
Pin PB2 (D10 on Arduino UNO)
@ A2
Pin PC2 (A2, D16 on Arduino UNO)
@ A5
Pin PC5 (A5, D19 on Arduino UNO)
@ A0
Pin PC0 (A0, D14 on Arduino UNO)
@ D1_PD1
Pin PD1 (D1 on Arduino UNO)
@ D6
Pin PD6 (D6 on Arduino UNO)
@ A3_PC3
Pin PC3 (A3, D17 on Arduino UNO)
@ D5
Pin PD5 (D5 on Arduino UNO)
@ D13_PB5
Pin PB5 (D13 on Arduino UNO)
AnalogClock
Defines available clocks of ATmega328P, used for analog input.
Definition: uno.h:178
AnalogPin
Defines all available analog input pins of ATmega328P, with reference to Arduino UNO pins.
Definition: uno.h:209
@ TEMP
Temperature sensor.
@ BANDGAP
Bandgap reference.
InterruptPin
Defines all digital output pins of ATmega328P, usable as pin change interrupt (PCI) pins.
Definition: uno.h:287
USART
Defines all USART modules of ATmega328P, actually only one.
Definition: uno.h:346
Timer
Defines all timers available for ATmega328P.
Definition: uno.h:354
@ TIMER1
Timer1 (16 bits)
@ TIMER0
Timer0 (8 bits)
@ TIMER2
Timer2 (8 bits)
ExternalInterruptPin
Defines all digital output pins of ATmega328P, usable as direct external interrupt pins.
Definition: uno.h:271
SleepMode
Defines all available sleep modes for ATmega328P.
Definition: uno.h:367
@ EXTENDED_STANDBY
This mode is similar to POWER_SAVE, except the oscillator is kept running, hence waking up from this ...
@ ADC_NOISE_REDUCTION
In this mode, CPU is stopped but other peripherals and interrupts work normally, except IO.
@ POWER_DOWN
In this mode, everything is stopped (including oscillator) but external interrupts,...
@ IDLE
In this mode, CPU is stopped but all other peripherals and interrupts work normally.
@ STANDBY
This mode is similar to POWER_DOWN, except the oscillator is kept running, hence waking up from this ...
@ POWER_SAVE
This mode is similar to POWER_DOWN, except Timer2 is still running if enabled.
AnalogReference
Defines available voltage references of ATmega328P, used for analog input.
Definition: uno.h:190
@ INTERNAL_1_1V
Voltage reference is internal 1.1V reference, generated from the internal bandgap reference.
@ AREF
Voltage reference is given by the AREF pin.
@ AVCC
Voltage reference is given by the AVcc pin.