cpu.h File Reference

Common implementations and headers for ATmega family based micro-controllers. More...

Detailed Description

Common implementations and headers for ATmega family based micro-controllers.

Basic definitions for the ATmega common module

When ever you want to do something hardware related, that is accessing MCUs registers directly, just include this file. It will then make sure that the MCU specific headers are included.

Author
Stefan Pfeiffer stefa.nosp@m.n.pf.nosp@m.eiffe.nosp@m.r@fu.nosp@m.-berl.nosp@m.in.d.nosp@m.e
Hauke Petersen hauke.nosp@m..pet.nosp@m.ersen.nosp@m.@fu-.nosp@m.berli.nosp@m.n.de
Hinnerk van Bruinehsen h.v.b.nosp@m.ruin.nosp@m.ehsen.nosp@m.@fu-.nosp@m.berli.nosp@m.n.de
Kaspar Schleiser kaspa.nosp@m.r@sc.nosp@m.hleis.nosp@m.er.d.nosp@m.e
Josua Arndt jarnd.nosp@m.t@ia.nosp@m.s.rwt.nosp@m.h-aa.nosp@m.chen..nosp@m.de

Definition in file cpu.h.

#include <stdio.h>
#include <stdint.h>
#include <avr/interrupt.h>
#include "cpu_conf.h"
#include "sched.h"
#include "thread.h"
+ Include dependency graph for cpu.h:
+ This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Enumerations

enum  {
  CPU_ATMEGA_CLK_SCALE_DIV1 = 0, CPU_ATMEGA_CLK_SCALE_DIV2 = 1, CPU_ATMEGA_CLK_SCALE_DIV4 = 2, CPU_ATMEGA_CLK_SCALE_DIV8 = 3,
  CPU_ATMEGA_CLK_SCALE_DIV16 = 4, CPU_ATMEGA_CLK_SCALE_DIV32 = 5, CPU_ATMEGA_CLK_SCALE_DIV64 = 6, CPU_ATMEGA_CLK_SCALE_DIV128 = 7,
  CPU_ATMEGA_CLK_SCALE_DIV256 = 8, CPU_ATMEGA_CLK_SCALE_DIV512 = 9
}
 ATmega system clock prescaler settings. More...
 

Functions

static uint8_t atmega_get_state (void)
 Atomically read the state (atmega_state) More...
 
static void atmega_enter_isr (void)
 Run this code on entering interrupt routines.
 
static int atmega_is_uart_tx_pending (void)
 Check if TX on any present UART device is still pending. More...
 
void atmega_exit_isr (void)
 Run this code on exiting interrupt routines.
 
void cpu_init (void)
 Initialization of the CPU.
 
static void cpu_print_last_instruction (void)
 Print the last instruction's address.
 
static void atmega_set_prescaler (uint8_t clk_scale)
 Initializes system clock prescaler.
 
void atmega_stdio_init (void)
 Initializes avrlibc stdio.
 

Variables

uint8_t atmega_state
 Global variable containing the current state of the MCU. More...
 

Flags for the current state of the ATmega MCU

#define ATMEGA_STATE_FLAG_ISR   (0x80U)
 In ISR.
 
#define ATMEGA_STATE_FLAG_UART0_TX   (0x01U)
 TX pending for UART 0.
 
#define ATMEGA_STATE_FLAG_UART1_TX   (0x02U)
 TX pending for UART 1.
 
#define ATMEGA_STATE_FLAG_UART_TX(x)   (0x01U << x)
 TX pending for UART x.
 

Enumeration Type Documentation

◆ anonymous enum

anonymous enum

ATmega system clock prescaler settings.

Some CPUs may not support the highest prescaler settings

Definition at line 176 of file cpu.h.

Function Documentation

◆ atmega_get_state()

static uint8_t atmega_get_state ( void  )
inlinestatic

Atomically read the state (atmega_state)

This function guarantees that the read is not optimized out, not reordered and done atomically. This does not mean that by the time return value is processed that it still reflects the value currently stored in atmega_state.

Using ASM rather than C11 atomics has less overhead, as not every access to the state has to be performed atomically: Those done from ISR will not be interrupted (no support for nested interrupts) and barriers at the begin and end of the ISRs make sure the access takes place before IRQ context is left.

Definition at line 103 of file cpu.h.

◆ atmega_is_uart_tx_pending()

static int atmega_is_uart_tx_pending ( void  )
inlinestatic

Check if TX on any present UART device is still pending.

Return values
!=0At least on UART device is still sending data out
0No UART is currently sending data

Definition at line 135 of file cpu.h.

Variable Documentation

◆ atmega_state

uint8_t atmega_state

Global variable containing the current state of the MCU.

Note
This variable is updated from IRQ context; access to it should be wrapped into irq_disable and irq_restore or atmega_get_state should be used.

Contents:

7 6 5 4 3 2 1 0
+---+---+---+---+---+---+---+---+
|IRQ| unused |TX1|TX0|
+---+---+---+---+---+---+---+---+
Label Description
IRQ This bit is set when in IRQ context
unused This bits are currently not used
TX1 This bit is set when on UART1 TX is pending
TX0 This bit is set when on UART0 TX is pending