boards: Added standalone ATmega328p

This commit is contained in:
Marian Buschsieweke 2019-02-20 21:29:37 +01:00
parent 01779508d6
commit f9c2f26dd0
No known key found for this signature in database
GPG Key ID: 61F64C6599B1539F
8 changed files with 245 additions and 0 deletions

View File

@ -0,0 +1,5 @@
MODULE = board
DIRS = $(RIOTBOARD)/common/atmega
include $(RIOTBASE)/Makefile.base

View File

@ -0,0 +1 @@
USEMODULE += boards_common_atmega

View File

@ -0,0 +1,9 @@
CPU = atmega328p
FEATURES_PROVIDED += periph_adc
FEATURES_PROVIDED += periph_gpio periph_gpio_irq
FEATURES_PROVIDED += periph_i2c
FEATURES_PROVIDED += periph_pwm
FEATURES_PROVIDED += periph_spi
FEATURES_PROVIDED += periph_timer
FEATURES_PROVIDED += periph_uart

View File

@ -0,0 +1,18 @@
# configure the terminal program
PORT_LINUX ?= /dev/ttyUSB0
PORT_DARWIN ?= $(firstword $(sort $(wildcard /dev/tty.usbmodem*)))
BAUD ?= 9600
ATMEGA328P_CLOCK ?=
include $(RIOTMAKE)/tools/serial.inc.mk
# Allow overwriting programmer via env variables without affecting other boards
PROGRAMMER_BOARD_ATMEGA328P ?= usbtiny
# ICSP programmer to use for avrdude
PROGRAMMER ?= $(PROGRAMMER_BOARD_ATMEGA328P)
ifneq (,$(ATMEGA328P_CLOCK))
CFLAGS += -DCLOCK_CORECLOCK=$(ATMEGA328P_CLOCK)
endif
include $(RIOTMAKE)/tools/avrdude.inc.mk
include $(RIOTBOARD)/common/atmega/Makefile.include

107
boards/atmega328p/doc.txt Normal file
View File

@ -0,0 +1,107 @@
/**
@defgroup boards_atmega328p Standalone ATmega328p
@ingroup boards
@brief Support for using the ATmega328p as standalone board
## Overview
The ATmega328p is most popular in the Arduino UNO. However, the 28 PDIP package
of the ATmega328p can easily be used without any "board": Just place it on a
bread board, and connect a TTL adapter and an ISP and you're ready to go.
The ATmega328p has two internal oscillators, one clocked at 8MHz and one at
128kHz. By default the fuses of the ATmega328p are configured that the internal
8MHz oscillator can be used. This allows the ATmega328p to be operated without
any external components at a supply voltage anywhere between 2.7V and 5.5V.
\htmlonly<style>div.image img[src="https://github.com/maribu/images/raw/master/ATmega328p.jpg"]{width:600px;}</style>\endhtmlonly
@image html "https://github.com/maribu/images/raw/master/ATmega328p.jpg" "ATmega328p DIP package on a breadboard"<br>
### MCU
| MCU | ATmega328p |
|:------------- |:-------------------------------------- |
| Family | AVR/ATmega |
| Vendor | Microchip (previously Atmel) |
| RAM | 2Kb |
| Flash | 32Kb |
| Frequency | 8MHz (up to 20MHz with external clock) |
| Timers | 3 (2x 8bit, 1x 16bit) |
| ADCs | 6 analog input pins |
| UARTs | 1 |
| SPIs | 1 |
| I2Cs | 1 (called TWI) |
| Vcc | 2.7V - 5.5V (when clocked at 8MHz) |
| Datasheet | [Official datasheet](http://ww1.microchip.com/downloads/en/DeviceDoc/ATmega48A-PA-88A-PA-168A-PA-328-P-DS-DS40002061A.pdf) |
### Pinout
\htmlonly<style>div.image img[src="https://camo.githubusercontent.com/c55beef2f138da61fe671a1e4a307ff4ffbc318d/68747470733a2f2f692e696d6775722e636f6d2f715849456368542e6a7067"]{width:100%;}</style>\endhtmlonly
@image html "https://camo.githubusercontent.com/c55beef2f138da61fe671a1e4a307ff4ffbc318d/68747470733a2f2f692e696d6775722e636f6d2f715849456368542e6a7067" "Pinout of the ATmega328p"<br>
All credit for above pinout image goes to https://github.com/MCUdude/MiniCore#pinout
### Clock Frequency
The ATmega328p has two internal oscillators clocked at 8MHz and at 128kHz that
allow it to be operated without any external clock source or crystal. By default
the fuses are configured to use the internal 8MHz oscillator resulting in a
clock speed of 8MHz. By setting the `CKDIV8` fuse the clock divider can be
enabled to operate the ATmega328p at 1MHz.
This "board" is configured to use 8MHz as core clock, so that the ATmega328p
can be used without external circuitry and without any changes in the default
fuse configuration.
By setting the environment variable `ATMEGA328P_CLOCK` to a custom frequency in
Hz (e.g. `1000000` for 1MHz), this core clock can be changed easily. Refer to
the datasheet on how to configure the ATmega328p to use an external crystal,
an external clock source or the clockd divider.
### Relation Between Supply Voltage, Clock Frequency and Power Consumption
A higher supply voltage results in a higher current drawn. Thus, lower power
consumption can be achieved by using a lower supply voltage. However, higher
clock frequencies require higher supply voltages for reliable operation.
The lowest possible supply voltage at 8 MHz is 2.7V (with some safety margin),
which results in an active supply current of less than 3 mA (about 8 mW power
consumption) according to the datasheet. At 1 MHz core clock a supply voltage of
1.8V is possible resulting in an active supply current of less than 0.3 mA
(about 0.5 mW power consumption). For more details, refer to the official
datasheet.
## Flashing the Device
In order to flash the ATmega328P without a bootloader, an ICSP programmer is
needed. Connect the programmer as follows:
| ISCP pin | ATmega328p pin |
|:-------- |:-------------- |
| MISO | 18/PB4/MISO |
| VCC | 7/VCC |
| SCK | 19/PB5/SCK |
| MOSI | 17/PB3/MOSI |
| RESET | 1/RESET |
| Ground | 22/GND |
The tool `avrdude` needs to be installed. When using the `usbtiny` (or one of
the super cheap clones) running
make BOARD=atmega328p flash
will take care of everything. To use the programmer `<FOOBAR>` instead, run
make BOARD=atmega328p PROGRAMMER=<FOOBAR> flash
## Serial Terminal
Connect a TTL adapter with pins 2/RXD and 3/TXD an run
make BOARD=atmega328p term
Please note that the supply voltage should be compatible with the logic level of
the TTL adapter. Usually everything between 3.3 V and 5 V should work.
## Caution
Don't expect having a working network stack due to very limited resources ;-)
*/

View File

@ -0,0 +1,61 @@
/*
* Copyright (C) 2014 Freie Universität Berlin, Hinnerk van Bruinehsen
* 2016 Laurent Navet <laurent.navet@gmail.com>
* 2019 Otto-von-Guericke-Universität Magdeburg
*
* This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level
* directory for more details.
*/
/**
* @ingroup boards_atmega328p
* @{
*
* @file
* @brief Board specific definitions for the standalone ATmega328p "board"
*
* @author Marian Buschsieweke <marian.buschsieweke@ovgu.de>
* @author Hinnerk van Bruinehsen <h.v.bruinehsen@fu-berlin.de>
* @author Laurent Navet <laurent.navet@gmail.com>
*/
#ifndef BOARD_H
#define BOARD_H
#include "cpu.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* @name STDIO configuration
*
* As the CPU is too slow to handle 115200 baud, we set the default
* baudrate to 9600 for this board
* @{
*/
#define STDIO_UART_BAUDRATE (9600U)
/** @} */
/**
* @name xtimer configuration values
* @{
*/
#define XTIMER_WIDTH (16)
#define XTIMER_HZ (250000UL)
#define XTIMER_BACKOFF (40)
/** @} */
/**
* @brief Initialize board specific hardware, including clock, LEDs and std-IO
*/
void board_init(void);
#ifdef __cplusplus
}
#endif
#endif /* BOARD_H */
/** @} */

View File

@ -0,0 +1,42 @@
/*
* Copyright (C) 2019 Otto-von-Guericke-Universität Magdeburg
*
* This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level
* directory for more details.
*/
/**
* @ingroup boards_atmega328p
* @{
*
* @file
* @brief Peripheral MCU configuration for the ATmega328p standalone "board"
*
* @author Marian Buschsieweke <marian.buschsieweke@ovgu.de>
*/
#ifndef PERIPH_CONF_H
#define PERIPH_CONF_H
#ifdef __cplusplus
extern "C" {
#endif
/**
* @name Clock configuration
* @{
*/
#ifndef CLOCK_CORECLOCK
/* Using 8MHz internal oscillator as default clock source */
#define CLOCK_CORECLOCK (8000000UL)
#endif
/** @} */
#ifdef __cplusplus
}
#endif
#include "periph_conf_atmega_common.h"
#endif /* PERIPH_CONF_H */

View File

@ -46,6 +46,8 @@ void board_init(void)
atmega_set_prescaler(CPU_ATMEGA_CLK_SCALE_INIT); atmega_set_prescaler(CPU_ATMEGA_CLK_SCALE_INIT);
cpu_init(); cpu_init();
#ifdef LED0_ON
led_init(); led_init();
#endif
irq_enable(); irq_enable();
} }