AVR32119 - Atmel Corporation

AVR32119: Getting Started with
32-bit AVR UC3 A0/A1/A3/A4 series Flash
Microcontroller
Features
32-bit AVR UC3
Microcontrollers
• Time Counter, Interrupt Controller and General Purpose Input/Output management on
32-bit AVR UC3 A0/A1/A3/A4 series
• Flash controller and Clock initialization
• Project Compiling and loading
• Associated peripherals on evaluation kits (LEDs and buttons)
Application Note
1. Introduction
This application note is aimed at helping the reader become familiar with the Atmel®
32-bit AVR® UC3 A0/A1/A3/A4 series Flash Microcontroller.
It describes in detail a simple project that uses several important features present on
the UC3 A0/A1/A3/A4 series. This includes how to setup the microcontroller prior to
executing the application, as well as how to add the functionalities themselves. After
going through this guide, the reader should be able to successfully start a new project
from scratch.
This document also explains how to setup and use a AVR32 GNU toolchain in order
to compile and run a software project.
For more information about the AVR UC3 architecture, please refer to the appropriate
documents available from http://www.atmel.com/.
32078C–AVR32–03/10
2. Requirements
The software provided with this application note requires several components:
• AVR32Studio Development Tools: AVR32 Studio is a free Integrated Development Environment (IDE) for 32-bit AVR
that enables you to write, build, deploy and debug your C/C++ and assembler code. AVR32 Studio integrates with the
AVR32 GNU Toolchain including GCC for building applications for 32-bit AVR.
http://www.atmel.com/dyn/products/tools_card_mcu.asp?tool_id=4116
• GNU Toolchain: AVR32 GNU Toolchain is a set of standalone command line programs used to create applications for
32-bit AVR microcontrollers (compiler, assembler, linker).
http://www.atmel.com/dyn/products/tools_card_mcu.asp?tool_id=4118
• EVK1100: The EVK1100 is an evaluation kit and development system for the AT32UC3A0512 microcontroller.
http://www.atmel.com/dyn/products/tools_card_mcu.asp?tool_id=4114
• EVK1104: The EVK1104 is an evaluation kit and development system for the AT32UC3A3256 microcontroller.
http://www.atmel.com/dyn/products/tools_card_mcu.asp?tool_id=4427
• EVK1105: The EVK1105 is an evaluation kit and development system for the AT32UC3A0512 microcontroller.
http://www.atmel.com/dyn/products/tools_card_mcu.asp?tool_id=4428
• AT32UC3A0512 and AT32UC3A3256 Datasheet:
http://www.atmel.com/dyn/products/datasheets_mcu.asp?family_id=607
• AVR32 UC3 Software Framework: This framework provides software drivers, libraries and application examples to
build any application for 32-bit AVR UC3 Flash Microcontroller familly.
http://www.atmel.com/dyn/products/datasheets_mcu.asp?family_id=607
• AVR UC3 Architecture Manual: http://www.atmel.com/dyn/resources/prod_documents/doc32000.pdf
• AVR32 Introduction to Header Files Application Note: introduction to header files, I/O register, bit-names and
module type definitions http://www.atmel.com/dyn/resources/prod_documents/doc32005.pdf
3. Getting Started with a Software Example
This section describes how to program a basic application that helps you to become familiar with
UC3 A0/A1/A3/A4 microcontroller series. It is divided into two main sections: the first one covers
the specification of the example (what it does, which peripherals are used); the second one
details the implementation aspect.
3.1
3.1.1
Specification
Features
The demonstration program makes two LEDs on the board blink at a fixed rate. This rate is generated by using a timer for the first LED; the second one uses a Wait function based on a 1 ms
tick. The blinking can be stopped using one button.
While this software may look simple, it uses several peripherals which make up the basis of an
operating system. As such, it makes a good starting point for someone wanting to become familiar with the UC3 A0/A1/A3/A4 microcontroller series before looking deeper in the 32-bit AVR
UC3 Software Framework.
3.1.2
Peripherals
In order to perform the operations described in the previous section, the software example uses
the following set of peripherals:
• General Purpose Input/Output (GPIO) controller
2
AVR32119
32078C–AVR32–03/10
• Timer Counter (TC)
• Interrupt Controller (INTC)
LEDs and buttons on the board are connected to standard input/output pins of the chip; those
are managed by a GPIO controller. In addition, it is possible to have the controller generating an
interrupt when the status of one of its pin changes; buttons are configured to have this behavior.
The TC is used to generate a time base, in order to obtain the LED blinking rate. It is used in
interrupt mode: the TC triggers an interrupt every millisecond, incrementing a variable by one
tick; the main function monitors this variable to provide an accurate delay for toggling the second
LED state.
Using the INTC is required to manage interrupts. It allows the configuration of a separate vector
for each source; two different functions are used to handle GPIO and TC interrupts.
3.1.3
Evaluation Kits
3.1.3.1
EVK1100
3.1.3.1.1
Booting
The AT32UC3A0512 found on EVK1100 evaluation boards features two internal memories: a
512 KB Flash and a 64KB SRAM. The Getting Started example software is to be compiled and
loaded in flash.
3.1.3.1.2
Buttons
The EVK1100 evaluation kit features 3 push buttons, connected to pins PX16 (GPIO88), PX19
(GPIO85), PX22 (GPIO82). When pressed, they force a logical low level on the corresponding
GPIO line.
The Getting Started example uses the push button 0 (GPIO88 - PX16).
3.1.3.1.3
LEDs
There are four general-purpose green LEDs on the EVK1100; they are wired to pins PB27,
PB28, PB29 and PB30. Setting a logical low level on one of these GPIO lines turns the corresponding LED on. There are also two bi-colors LEDs, one connected on PB19 (GPIO51), PB20
(GPIO52), the other connected to PB21 (GPIO53), PB22 (GPIO54).
The example application uses the two bi-color LEDs: PB19 (GPIO51)and PB22 (GPIO54).
3.1.3.2
EVK1104
3.1.3.2.4
Booting
The AT32UC3A3256 found on EVK1104 evaluation boards features two internal memories: a
256 KB Flash and a 128KB SRAM. The Getting Started example software is to be compiled and
loaded in flash.
3.1.3.2.5
Buttons
The EVK1104 Evaluation Kit features 1 push button, connected to pin PB10 (GPIO42). When
pressed, they force a logical low level on the corresponding GPIO line.
The Getting Started example uses the push button SW2 (GPIO42 - PB10).
3
AVR32119
32078C–AVR32–03/10
3.1.3.2.6
LEDs
There are four general-purpose green LEDs on the EVK1104; they are wired to pins PX16,
PX50, PX54 and PX57. Setting a logical low level on one of these GPIO lines turns the corresponding LED on.
The example application uses LEDs: PX16 (GPIO67)and PX50 (GPIO101).
3.1.3.3
EVK1105
3.1.3.3.7
Booting
The AT32UC3A0512 found on EVK1105 evaluation boards features two internal memories: a
512 KB Flash and a 64KB SRAM. The Getting Started example software is to be compiled and
loaded in flash.
3.1.3.3.8
Buttons
The EVK1105 Evaluation Kit has been developped around Qtouch features, therefore no push
button has been implemented. Nevertheless, some GPIOs are free and can be manualy forced
to a low level (wired to ground).
The Getting Started example uses the PA13 (GPIO13) available on the J16 free connections
area.
3.1.3.3.9
LEDs
There are four general-purpose green LEDs on the EVK1105; they are wired to pins PB27,
PB28, PA5 and PA6. Setting a logical low level on one of these GPIO lines turns the corresponding LED on.
The example application uses the two LEDs: PB27 (GPI59)and PB28 (GPIO60).
3.2
Implementation
As stated previously, the example defined above requires the use of several peripherals. It must
also provide the necessary code for starting up the microcontroller. Both aspects are described
in detail in this section, with commented source code when appropriate.
3.2.1
C-Startup
Most of the code of an embedded application is written in C. This makes the program easier to
understand, more portable and modular. However, using the C language requires the initialization of several components. These initialization procedures must be performed using assembly
language, and are grouped into a file referred to as C-startup. The C-startup code must:
• Initialize the exception vector base address and the exception vectors
• Initialize critical peripherals
• Initialize stacks
• Initialize memory segments
These steps are described in the following paragraphs.
The C-startup code will be used from the Newlib C-library. Newlib is a C standard library implementation intended for use on embedded systems. It is a conglomeration of several library parts,
all under free software licenses that make them easily usable on embedded products.
The Newlib is bundled with the AVR32 GNU toolchain.
4
AVR32119
32078C–AVR32–03/10
3.2.1.1
Exception
All exceptions routines starts at the address EVBA (Exception Vector Base Address). EVBA is a
register that contains a pointer to the exceptions routines table.
If the program does not need to handle an exception, then the corresponding instruction can
simply be set to an infinite loop, i.e. a branch to the same address. For vectors which are to be
handled, a branch instruction to a function must be provided.
In this example, the only relevant vector is the one for interrupts. It must simply branch to the
interrupt handler, which is described in Section 3.2.1.2 on page 5.
Note:
3.2.1.2
3.2.2
Refer also to the AVR UC3 Architecture Manual, section Event Processing.
Exception: Interrupt Handler
The main purpose of the interrupt handler is to fetch the correct jump address for the pending
interrupt. This information is held in the Interrupt Vector Register (IPRn) of the INTC (see Section 3.2.5 on page 6 for more information about the INTC). Once the address is loaded, the
handler just branches to it.
Low-Level Initialization: Flash Controller (FLASHC)
Whenever the microcontroller core runs too fast for the internal Flash, it uses one wait state, i.e.
cycles during which it does nothing but wait for the memory. The number of wait states can be
configured in the FLASHC.
After reset, the chip uses its internal slow clock (cadenced at 115 kHz), so there is no need for
any wait state. However, before switching to the main oscillator or to the PLL, the correct number of wait states must be set if the frequency is above 33MHz on UC3 A0/A1/A3/A4 series. If
not, the core may no longer be able to read the code from the Flash and code execution may be
unpredictable.
Configuring the number of wait states is done in the Flash Control Register (FCR) of the
FLASHC. For example, a 48 MHz operation requires the use of one wait state:
AVR32_FLASHC.fcr |= 1<<AVR32_FLASHC_FCR_FWS_OFFSET;
Note:
Refer to the AVR UC3 Introduction to Header Files Application Note for more details about the I/O
register, bit-names and module type definitions.
For more information about the required number of wait states depending on the operating frequency of a microcontroller, please refer to the AC Electrical Characteristics section of the
corresponding datasheet.
In this example, the device will run at 12MHz so the flash controller does not require to use the
wait state feature.
3.2.3
Low-Level Initialization: Main Oscillator
After reset, the chip runs using a slow clock (internal RC oscillator), which is cadenced at 115.2
kHz. The main oscillator must be configured in order to run at 12MHz. It can be configured in the
Power Manager controller (PM).
The first step is to enable the main oscillator and wait for it to stabilize. The following piece of
code performs these two operations:
• To configure the oscillator 0 in crystal mode:
AVR32_PM.oscctrl0=AVR32_PM_OSCCTRL0_MODE_CRYSTAL_G3<<AVR32_PM_OSCCTRL0_MODE
_OFFSET | 3<<AVR32_PM_OSCCTRL0_STARTUP_OFFSET;
5
AVR32119
32078C–AVR32–03/10
• Then enable the oscillator 0:
AVR32_PM.mcctrl |= AVR32_PM_MCCTRL_OSC0EN_MASK;
• Wait for oscillator 0 to be ready:
while (!(AVR32_PM.poscsr & AVR32_PM_POSCSR_OSC0RDY_MASK));
• Switch main clock from internal RC oscillator to oscillator 0. On the EVK1100, EVK1104 and
EVK1105, a 12MHz crystal is connected to OSC0:
AVR32_PM.mcctrl |=
AVR32_PM_MCCTRL_MCSEL_OSC0;
At this point, the chip is configured to run on the main clock with the oscillator, at the desired frequency 12MHz.
Note:
3.2.3.1
3.2.4
3.2.4.1
For more details refer to the UC3 A0/A1 and UC3 A3/A4 series datasheet, section Power
Manager.
Low-Level Initialization: Interrupt Controller
How to set up the INTC properly is described in Section 3.2.5 on page 6.
Generic Peripheral Usage
Initialization
Most peripherals are initialized by performing three actions
• Enabling the peripheral clock in the PM: this is already the default PM configuration.
• Enabling the control of the peripheral on GPIO pins
• Configuring the interrupt handler of the peripheral in the INTC if required
• Enabling the interrupt source at the peripheral level
Finally, if an interrupt is to be generated by the peripheral, then the source must be configured
properly in the Interrupt Controller. Please refer to Section 3.2.5 on page 6 for more information.
3.2.5
3.2.5.1
Using the Interrupt Controller (INTC)
Purpose
The INTC manages all internal and external interrupts of the system. It enables the definition of
one handler for each interrupt source, i.e., a function which is called whenever the corresponding event occurs. Interrupts can also be individually enabled or masked, and have several
different priority levels.
3.2.5.2
Initialization
The only mandatory action to perform. This is done using the INTC library (int.c, intc.h files) with
the instructions:
• Setup the interrupt vectors
INTC_init_interrupts();
• Register the interrupt handlers for TimerCounter (AVR32_TC_IRQ0 is the IRQ of the
interrupt handler to register, INT0 is the interrupt priority level to assign to the group of this
IRQ) and GPIO (In every port there are four interrupt lines connected to the interrupt
controller. Every eight interrupts in the port are stored together to form an interrupt line. That
is why we use the formula "AVR32_GPIO_IRQ_0 + (GPIO to be registered/8)".
6
AVR32119
32078C–AVR32–03/10
EVK1100: AVR32_GPIO_IRQ_0 is used as the base interrupt line and we add '(88/8)' to
register the corresponding interrupt line.
INTC_register_interrupt(&tc_irq, AVR32_TC_IRQ0, INT0);
INTC_register_interrupt(&gpio_irq, (AVR32_GPIO_IRQ_0+88/8), INT1);
EVK1104: AVR32_GPIO_IRQ_0 is used as the base interrupt line and we add '(42/8)' to
register the corresponding interrupt line.
INTC_register_interrupt(&tc_irq, AVR32_TC_IRQ0, INT0);
INTC_register_interrupt(&gpio_irq, (AVR32_GPIO_IRQ_0+42/8), INT1);
EVK1105: AVR32_GPIO_IRQ_0 is used as the base interrupt line and we add '(13/8)' to
register the corresponding interrupt line.
INTC_register_interrupt(&tc_irq, AVR32_TC_IRQ0, INT0);
INTC_register_interrupt(&gpio_irq, (AVR32_GPIO_IRQ_0+13/8), INT1);
3.2.6
3.2.6.1
Using the Timer Counter
Purpose
Timer Counters on 32-bit AVR UC3 series can perform several functions, e.g., frequency measurement, pulse generation, delay timing, Pulse Width Modulation (PWM), etc.
In this example, the primary goal of the Timer Counter (TC) is to generate periodic interrupts.
This is most often used to provide the base tick of an operating system. The TC uses PBA
divided by x as its input clock (x=2, 8, 32 or 128 on revision G and higher, x=4, 8, 1 6, 32 on revision E).
The getting started example uses the TC to provide a 1 ms time base. Each time the TC interrupt is triggered, a 32-bit counter is incremented.
3.2.6.2
Initialization
The first step is to configure the Channel Mode Register (CMR). TC channels can operate in two
different modes. The first one, which is referred to as the Capture mode, is normally used for
performing measurements on input signals. The second one, the Waveform mode, enables the
generation of pulses. In the example, the purpose of the TC is to generate an interrupt at a fixed
rate. Actually, such an operation is possible in both the Capture and Waveform mode. Since no
signal is being sampled or generated, there is no reason to choose one mode over the other.
However, setting the TC in Waveform mode and outputting the tick on TIOA or TIOB can be
helpful for debugging purpose.
Setting the CPCTRG bit of the CMR resets the timer and restarts its clock every time the counter
reaches the value programmed in the TC Register C. Generating a specific delay is thus done
by choosing the correct value for RC. It is also possible to choose between several different
input clocks for the channel, which in practice makes it possible to prescale MCK. Since the
timer resolution is 16 bits, using a high prescale factor may be necessary for bigger delays.
Consider the following example: the timer must generate a 1 ms trigger with a 12 MHz main
clock frequency. RC must be equal to the number of clock cycles generated during the delay.
The last initialization step is to configure the interrupt whenever the counter reaches the value
programmed in RC. At the TC level, is easily done by setting the CPCS bit of the Interrupt
Enable Register.
7
AVR32119
32078C–AVR32–03/10
3.2.6.3
Interrupt Handler
The first action to do in the handler is to acknowledge the pending interrupt from the peripheral.
Otherwise, the latter continues to assert the IRQ line. In the case of a Timer Counter channel,
acknowledging is done by reading the corresponding Status Register (SR).
Special care must be taken to avoid having the compiler optimize away a dummy read to this
register. In C, this is done by declaring a volatile local variable and setting it to the register content. The volatile keyword tells the compiler to never optimize accesses (read/write) to a
variable.
The rest of the interrupt handler is straightforward. A global variable is incremented with the
number of ticks read.
__attribute__((__interrupt__)) static void tc_irq( void )
{
// Increment the ms seconds counter
tc_tick++;
// clear the interrupt flag of TC channel 0
AVR32_TC.channel[0].sr;
// specify that an interrupt has been raised
print_sec = 1;
}
3.2.7
3.2.7.1
Using the General Purpose Input/Output (GPIO) controller
Purpose
Most pins on 32-bit AVR UC3 microcontroller series can either be used by a peripheral function
(e.g. USART, SPI, etc.) or used as generic input/outputs. All these pins are managed by the
General Purpose Input/Output (GPIO) controller.
A GPIO controller enables the programmer to configure each pin as used by the associated
peripheral or as a generic IO. In the second case, the level of the pin can be read/written using
several registers of the GPIO controller. Each pin can also have an internal pull-up activated
individually.
In addition, the GPIO controller can detect a status change on one or more pins, optionally triggering an interrupt whenever this event occurs.
In the EVK1100 and EVK1104 examples, the GPIO controller manages two LEDs and one button. The buttons are configured to trigger an interrupt when pressed (as defined in Section 3.1.1
on page 2).
In the EVK1105 example, the GPIO controller manages two LEDs and a free J16 slot. The PA13
free slot is configured to trigger an interrupt when manually forced to low level.
3.2.7.2
Configuring LEDs
The two GPIOs connected to the LEDs must be configured as outputs, in order to turn them on
or off. First, the GPIO control must be enabled in GPIO Enable Register (GPER) by writing the
value corresponding the two LED IDs.
GPIO output direction is controlled using the registers Output Driver Enable Register (ODER).
EVK1100:
• Init GPIO51 (PB19)
8
AVR32119
32078C–AVR32–03/10
AVR32_GPIO.port[1].oders = 1 << (19 & 0x1F); // The GPIO output driver is
enabled for that pin.
AVR32_GPIO.port[1].gpers = 1 << (19 & 0x1F); // The GPIO module controls
that pin.
• Init GPIO54 (PB22)
AVR32_GPIO.port[1].oders = 1 << (22 & 0x1F); // The GPIO output driver is
enabled for that pin.
AVR32_GPIO.port[1].gpers = 1 << (22 & 0x1F); // The GPIO module controls
that pin.
• Initialize GPIO88 (PX16) as interrupt (pin level change). GPIO88 bit control can be found in
gpio port 2 (88/32=>2), bit 24 (88%32=24). First enable the glitch filter on GPIO88.
AVR32_GPIO.port[2].gfers = 1 << (24 & 0x1F);
• Configure the edge detector on pin change on GPIO88
AVR32_GPIO.port[2].imr0c = 1 << (24 & 0x1F);
AVR32_GPIO.port[2].imr1c = 1 << (24 & 0x1F);
• Enable interrupt on GPIO88
AVR32_GPIO.port[2].iers = 1 << (24 & 0x1F);
EVK1104:
• Init GPIO67 (PX16)
AVR32_GPIO.port[2].oders = 1 << (3 & 0x1F); // The GPIO output driver is
enabled for that pin.
AVR32_GPIO.port[2].gpers = 1 << (3 & 0x1F); // The GPIO module controls
that pin.
• Init GPIO101 (PX50)
AVR32_GPIO.port[3].oders = 1 << (5 & 0x1F); // The GPIO output driver is
enabled for that pin.
AVR32_GPIO.port[3].gpers = 1 << (5 & 0x1F); // The GPIO module controls
that pin.
• Initialize GPIO42 (PB10) as interrupt (pin level change). GPIO42 bit control can be found in
gpio port 1 (42/32=>1), bit 10 (42%32=10). First enable the glitch filter on GPIO42.
AVR32_GPIO.port[1].gfers = 1 << (10 & 0x1F);
• Configure the edge detector on pin change on GPIO42
AVR32_GPIO.port[1].imr0c = 1 << (10 & 0x1F);
AVR32_GPIO.port[1].imr1c = 1 << (10 & 0x1F);
• Enable interrupt on GPIO42
AVR32_GPIO.port[1].iers = 1 << (10 & 0x1F);
EVK1105:
• Init GPIO59 (PB27)
AVR32_GPIO.port[1].oders = 1 << (27 & 0x1F); // The GPIO output driver is
enabled for that pin.
AVR32_GPIO.port[1].gpers = 1 << (27 & 0x1F); // The GPIO module controls
that pin.
• Init GPIO60 (PB28)
9
AVR32119
32078C–AVR32–03/10
AVR32_GPIO.port[1].oders = 1 << (28 & 0x1F); // The GPIO output driver is
enabled for that pin.
AVR32_GPIO.port[1].gpers = 1 << (28 & 0x1F); // The GPIO module controls
that pin.
• Initialize GPIO13 (PA13) as interrupt (pin level change). GPIO13 bit control can be found in
gpio port 0 (13/32=>0), bit 13 (13%32=13). First enable the glitch filter and pull up on
GPIO13.
AVR32_GPIO.port[0].gfers = 1 << (13 & 0x1F);
AVR32_GPIO.port[0].puers = 1 << (13 & 0x1F);
• Configure the edge detector on pin change on GPIO13
AVR32_GPIO.port[0].imr0c = 1 << (13 & 0x1F);
AVR32_GPIO.port[0].imr1c = 1 << (13 & 0x1F);
• Enable interrupt on GPIO13
AVR32_GPIO.port[0].iers = 1 << (13 & 0x1F);
3.2.7.3
Controlling LEDs
LEDs are turned on or off by changing the level on the GPIOs to which they are connected. After
those GPIOs have been configured, their output values can be changed by writing the pin IDs in
the Output Value Register Toggle (OVRT) of the GPIO controller.
EVK1100:
Toggle the GPIO51 (PB19);
AVR32_GPIO.port[1].ovrt
= 1 << (19 & 0x1F);
EVK1104:
Toggle the GPIO67 (PX16);
AVR32_GPIO.port[2].ovrt
= 1 << (3 & 0x1F);
EVK1105:
Toggle the GPIO59 (PB27);
AVR32_GPIO.port[1].ovrt
3.2.7.4
= 1 << (27 & 0x1F);
Configuring Buttons
As stated previously, the GPIO connected to the push button on the board shall be input. Also, a
“state change” interrupt is configured. This triggers an interrupt when a button is pressed or
released.
After the GPIO control has been enabled on the GPIOs (by writing GPER), it is configured as
inputs by writing its IDs in ODER.
Enabling interrupts on the pins is simply done in the Interrupt Enable Register (IER). However,
the GPIO controller interrupt must be configured as described in Section 3.2.6.3 on page 8.
3.2.7.5
10
Interrupt Handler
The interrupt handler for the GPIO controller detect a state change level on the pin. This corresponds to either the press or the release action on the button or in case of the EVK1105
example to wire manually GPIO13 to the ground.
AVR32119
32078C–AVR32–03/10
Note that the interrupt must be acknowledged in the GPIO controller. This is done implicitly when
IFR is read by the software.
EVK1100:
__attribute__((__interrupt__)) static void gpio_irq( void )
{
// GPIO88 (PX16) is connected to push button 0.
// GPIO88 bit control can be found in gpio port 2 (88/32=>2), bit 24
(88%32=24).
AVR32_GPIO.port[2].ifrc = 1<<24;
// Toggle the I/O line GPIO54 (PB22)
// GPIO54 bit control can be found in gpio port 1 (54/32=>1), bit 22
(54%32=22).
AVR32_GPIO.port[1].ovrt
= 1 << (22 & 0x1F);
}
EVK1104:
__attribute__((__interrupt__)) static void gpio_irq( void )
{
// GPIO42 (PB10) is connected to push button SW2.
// GPIO42 bit control can be found in gpio port 1 (42/32=>1), bit 10
(42%32=10).
AVR32_GPIO.port[1].ifrc = 1<<10;
// Toggle the I/O line GPIO101 (PX50)
// GPIO101 bit control can be found in gpio port 3 (101/32=>3), bit 5
(101%32=5).
AVR32_GPIO.port[3].ovrt
= 1 << (5 & 0x1F);
}
EVK1105:
__attribute__((__interrupt__)) static void gpio_irq( void )
{
// GPIO13 (PA13) J16 right hole.
// GPIO13 bit control can be found in gpio port 0 (13/32=>0), bit 13
(13%32=13).
AVR32_GPIO.port[0].ifrc = 1<<13;
// Toggle the I/O line GPIO60 (PB28)
// GPIO60 bit control can be found in gpio port 1 (60/32=>1), bit 28
(60%32=28).
AVR32_GPIO.port[1].ovrt
= 1 << (28 & 0x1F);
}
11
AVR32119
32078C–AVR32–03/10
4. Loading the Project
The development environment for this getting started is a PC running Microsoft Windows OS or
Linux.
The required software tools for building the project and loading the binary file is the AVR32 GNU
toolchain (available at www.atmel.com).
The connection between the PC and the board is achieved with a USB cable and a JTAGICE
mkII debugger.
4.1
Building the Project
The AVR32 GNU toolchain provides assembler, compiler, linker and flash programing tools.
Useful programs for debug are also included. AVR32Studio is a free Integrated Development
Environment (IDE) for 32-bit AVR UC3 series that enables you to write, build, deploy and debug
your C/C++ and assembler code.
4.1.1
AVR32Studio
Refer to the application note AVR32105: AVR32Studio Getting Started, and in particular the
section Creating a new AVR32 project, then Adding files to the project
4.1.2
Standalone Makefile
The Makefile contains rules indicating how to assemble, compile and link the project source files
to create a binary file ready to be downloaded on the target.
A config.mk file contains the variables settings, the other for rules implementation are contained
in the Makefile.
4.1.2.1
Variables
The config.mk file contains variables (uppercase), used to set up some environment parameters, such as the compiler toolchain prefix and program names, and options to be used with the
compiler.
EVK1100 & EVK1105:
• GCC Architecture and parts: the AVR UC3 architecture and part number.
– ARCH = ucr2
– PART = uc3a0512
• Flash memories: [{cfi|internal}@address,size]...
– FLASH = internal@0x80000000,512Kb
• Clock source to use when programming: [{xtal|extclk|int}]
– PROG_CLOCK = xtal
• Target name: {*.a|*.elf}
– TARGET = $(PART)-getting_started.elf
• C and Assembler source files
– ./main.c \
– ./intc.c
• Optimizations:
– OPTIMIZATION = -O0 -ffunction-sections -fdata-sections
12
AVR32119
32078C–AVR32–03/10
AVR32119
• Extra flags to use when linking
– LD_EXTRA_FLAGS = -Wl,--gc-sections
EVK1104:
• GCC Architecture and parts: the AVR UC3 architecture and part number.
– ARCH = ucr2
– PART = uc3a0256
• Flash memories: [{cfi|internal}@address,size]...
– FLASH = internal@0x80000000,256Kb
• Clock source to use when programming: [{xtal|extclk|int}]
– PROG_CLOCK = xtal
• Target name: {*.a|*.elf}
– TARGET = $(PART)-getting_started.elf
• C and Assembler source files
– ./main.c \
– ./intc.c
• Optimizations:
– OPTIMIZATION = -O0 -ffunction-sections -fdata-sections
• Extra flags to use when linking
– LD_EXTRA_FLAGS = -Wl,--gc-sections
For more detailed information about gcc options, please refer to gcc documentation
(gcc.gnu.org).
4.1.2.2
Rules
The Makefile contains rules. Each rule is composed on the same line by a target name, and the
files needed to create this target.
The first rule, ‘all’, is the default rule used by the make command if none is specified in command
line.
Table 4-1.
Make Goal List
Make Goal
Description
[all]
Default goal: build the project
clean
Clean up the project
rebuild
Rebuild the project
ccversion
Display CC version information
cppfiles file.i
Generate preprocessed files from C source files.
asfiles file.x
Generate preprocessed assembler files from C and assembler source files.
objfiles file.o
Generate object files from C and assembler source files.
a
file.a
Archive: create A output file from object files
elf
file.elf
Link: create ELF output file from object files
13
32078C–AVR32–03/10
Table 4-1.
Make Goal
Description
lss
Create extended listing from target output file
file.lss
sym
14
Make Goal List (Continued)
file.sym
Create symbol table from target output file
sizes
Display target size information
isp
Use ISP instead of JTAGICE mkII when programming.
cpuinfo
Get CPU information.
halt
Stop CPU execution.
chiperase
Perform a JTAG Chip Erase command
erase
Perform a flash chip erase.
program
Program MCU memory from ELF output file
secureflash
Protect chip by setting security bit
reset
Reset MCU.
debug
Open a debug connection with the MCU
run
Start CPU execution
readregs
Read CPU registers
doc
Build the documentation
cleandoc
Clean up the documentation
rebuilddoc
Rebuild the documentation
verbose
Display main executed commands
AVR32119
32078C–AVR32–03/10
AVR32119
To build the project, type:
make all
It compiles source files and links object files together to generate one binary file (program running in Flash). It describes how to compile source files and link object files together. This
generates an elf format file, which is converted to a binary file without any debug information by
using the objcopy program.
4.2
Loading the Code
Once the build step is completed, one .elf file is available and ready to be loaded into the board.
The AVR UC3 ISP solution offers an easy way to download files into 32-bit AVR products on
Atmel Evaluation Kits through a USB or the JTAG link. Target programming is done here via the
JTAGICE mkII debugger tools.
EVK1100:
Follow the steps below to load and run the code:
• Shut down the board
• Plug the USB cable between the PC and the EVK1100
• Plug the JTAGICE mkII between the PC and the EVK1100
• Power on the board
• To load with the standalone Makefile, open a shell and type:
make program run
• To load from AVR32Studio, refer to application note AVR32015.
Note:
The AT32UC3A0512 is pre programmed with a USB bootloader protected with the BOOTPROT
fuse. The only to program again the flash through JTAG is to send a chiperase command. To do
this, type in a shell: “avr32program chiperase”.
The code then starts running, LED5 blinks in red every 1sec and the LED6 green is controlled by
the push button 0.
EVK1104:
Follow the steps below to load and run the code:
• Shut down the board
• Plug the USB cable between the PC and the EVK1104
• Plug the JTAGICE mkII between the PC and the EVK1104
• Power on the board
• To load with the standalone Makefile, open a shell and type:
make program run
• To load from AVR32Studio, refer to application note AVR32015.
Note:
The AT32UC3A3256 is pre programmed with a USB bootloader protected with the BOOTPROT
fuse. The only to program again the flash through JTAG is to send a chiperase command. To do
this, type in a shell: “avr32program chiperase”.
The code then starts running, LED0 blinks every 1sec and the LED1 is controlled by the push
button SW2.
15
32078C–AVR32–03/10
EVK1105:
Follow the steps below to load and run the code:
• Shut down the board
• Plug the USB cable between the PC and the EVK1105
• Plug the JTAGICE mkII between the PC and the EVK1105
• Power on the board
• To load with the standalone Makefile, open a shell and type:
make program run
• To load from AVR32Studio, refer to application note AVR32015.
Note:
The AT32UC3A0512 is pre programmed with a USB bootloader protected with the BOOTPROT
fuse. The only to program again the flash through JTAG is to send a chiperase command. To do
this, type in a shell: “avr32program chiperase”.
The code then starts running, LED0 blinks every 1sec and the LED1 is controlled by wiring to
ground the PA13 (J16).
4.3
Debug Support
When debugging the Getting Started example with GDB, it is best to disable compiler optimizations. Otherwise, the source code will not correctly match the actual execution of the program.
To do that, simply comment out (with a ‘#’) the “OPTIM = ” line of the makefile and rebuild the
project.
For more information on debugging with GDB, please refer to the “GNU-Based Software Development” application note and to the GDB manual available on gcc.gnu.org.
16
AVR32119
32078C–AVR32–03/10
AVR32119
5. Revision History
Table 5-1.
Document Ref.
Comments
32078A
First issue.
32078B
Fixed GPIO LED Control.
32078C
Updated and extended to EVK1104 and EVK1105.
Change Request Ref.
17
32078C–AVR32–03/10
Headquarters
International
Atmel Corporation
2325 Orchard Parkway
San Jose, CA 95131
USA
Tel: 1(408) 441-0311
Fax: 1(408) 487-2600
Atmel Asia
Unit 1-5 & 16, 19/F
BEA Tower, Millennium City 5
418 Kwun Tong Road
Kwun Tong, Kowloon
Hong Kong
Tel: (852) 2245-6100
Fax: (852) 2722-1369
Atmel Europe
Le Krebs
8, Rue Jean-Pierre Timbaud
BP 309
78054 Saint-Quentin-enYvelines Cedex
France
Tel: (33) 1-30-60-70-00
Fax: (33) 1-30-60-71-11
Atmel Japan
9F, Tonetsu Shinkawa Bldg.
1-24-8 Shinkawa
Chuo-ku, Tokyo 104-0033
Japan
Tel: (81) 3-3523-3551
Fax: (81) 3-3523-7581
Technical Support
Enter Product Line E-mail
Sales Contact
www.atmel.com/contacts
Product Contact
Web Site
www.atmel.com
Literature Requests
www.atmel.com/literature
Disclaimer: The information in this document is provided in connection with Atmel products. No license, express or implied, by estoppel or otherwise, to any
intellectual property right is granted by this document or in connection with the sale of Atmel products. EXCEPT AS SET FORTH IN ATMEL’S TERMS AND CONDITIONS OF SALE LOCATED ON ATMEL’S WEB SITE, ATMEL ASSUMES NO LIABILITY WHATSOEVER AND DISCLAIMS ANY EXPRESS, IMPLIED OR STATUTORY
WARRANTY RELATING TO ITS PRODUCTS INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE, OR NON-INFRINGEMENT. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT, CONSEQUENTIAL, PUNITIVE, SPECIAL OR INCIDENTAL DAMAGES (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF PROFITS, BUSINESS INTERRUPTION, OR LOSS OF INFORMATION) ARISING OUT OF
THE USE OR INABILITY TO USE THIS DOCUMENT, EVEN IF ATMEL HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. Atmel makes no
representations or warranties with respect to the accuracy or completeness of the contents of this document and reserves the right to make changes to specifications
and product descriptions at any time without notice. Atmel does not make any commitment to update the information contained herein. Unless specifically provided
otherwise, Atmel products are not suitable for, and shall not be used in, automotive applications. Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life.
© 2010 Atmel Corporation. All rights reserved. Atmel ®, Atmel® logo and combinations thereof, AVR ®, AVR ® logo and others are registered trademarks or trademarks of Atmel Corporation or its subsidiaries. Windows ® and others are registered trademarks or trademarks of Microsoft Corporation US and/or other subsidiaries. Other terms and product names may be trademarks of others.
32078C–AVR32–03/10