blob: e15b288dd0d983cb6fa48d1e98ac3c0dda7fa1ce [file] [log] [blame]
.. _frdm_k64f:
Board Configuration: frdm_k64f
#####################################
Overview
********
The frdm_k64f board configuration is used by Zephyr applications
that run on the Freescale Freedom Development Platform (FRDM-K64F).
It provides support for an ARM Cortex-M4 CPU and the following devices:
* Nested Vectored Interrupt Controller (NVIC)
* System Tick System Clock (SYSTICK)
* Serial Port over USB (K20)
See `Procedures`_ for using third-party tools to load
and debug (in system mode with no OS awareness) a
Zephyr application image on the target. Debugging is
done with GNU Debugger (GDB), using Eclipse plugins.
.. note::
This board configuration may work with similar boards,
but they are not officially supported.
Supported Boards
****************
The frdm_k64f board configuration has been tested to run on the
Freescale Freedom Development Platform. The physical characteristics of
this board (including pin names, jumper settings, memory mappings, ...)
can be found below. No claims are made about its suitability for use with
any other hardware system.
Pin Names
=========
**LED (RGB)**
* LED_RED = PTB22
* LED_GREEN = PTE26
* LED_BLUE = PTB21
* Original LED Naming
* LED1 = LED_RED
* LED2 = LED_GREEN
* LED3 = LED_BLUE
* LED4 = LED_RED
**Push buttons**
* SW2 = PTC6
* SW3 = PTA4
**USB Pins**
* USBTX = PTB17
* USBRX = PTB16
**Arduino Headers**
* D0 = PTC16
* D1 = PTC17
* D2 = PTB9
* D3 = PTA1
* D4 = PTB23
* D5 = PTA2
* D6 = PTC2
* D7 = PTC3
* D8 = PTA0
* D9 = PTC4
* D10 = PTD0
* D11 = PTD2
* D12 = PTD3
* D13 = PTD1
* D14 = PTE25
* D15 = PTE24
* A0 = PTB2
* A1 = PTB3
* A2 = PTB10
* A3 = PTB11
* A4 = PTC10
* A5 = PTC11
**I2C pins**
* I2C_SCL = D15
* I2C_SDA = D14
* DAC0_OUT = 0xFEFE /\* DAC does not have a Pin Name in RM \*/
Jumpers & Switches
==================
The Zephyr kernel uses the FRDM-K64F default switch and jumper settings.
The default switch settings for the Freescale FRDM-K64F are:
+---------------+------------+---------------+
| Switch Number | Switch | ON Switch OFF |
+===============+============+===============+
| J14 | | x |
+---------------+------------+---------------+
| J21 | x | |
+---------------+------------+---------------+
| J25 | SDA + SW1 | MCU |
+---------------+------------+---------------+
Memory Mappings
===============
The frdm_k64f board configuration uses the
following default hardware memory map addresses and sizes:
+--------------------------+---------+------------------+
| Physical Address | Size | Access To |
+==========================+=========+==================+
| 0xFFFFFFFF - 0xE0100000 | - | System |
+--------------------------+---------+------------------+
| 0xE0100000 - 0xE0040000 | - | External Private |
| | | Peripheral Bus |
+--------------------------+---------+------------------+
| 0xE0100000 - 0xE00FF000 | - | ROM Table |
+--------------------------+---------+------------------+
| 0xE00FF000 - 0xE0042000 | - | External PPB |
+--------------------------+---------+------------------+
| 0xE0042000 - 0xE0041000 | - | ETM |
+--------------------------+---------+------------------+
| 0xE0041000 - 0xE0040000 | - | TIPU |
+--------------------------+---------+------------------+
| 0xE0040000 - 0xE0000000 | - | Internal Private |
| | | Peripheral Bus |
+--------------------------+---------+------------------+
| 0xE0040000 - 0xE000F000 | - | Reserved |
+--------------------------+---------+------------------+
| 0xE000F000 - 0xE000E000 | - | SCS |
+--------------------------+---------+------------------+
| 0xE000E000 - 0xE0003000 | - | Reserved |
+--------------------------+---------+------------------+
| 0xE0003000 - 0xE0002000 | - | FPB |
+--------------------------+---------+------------------+
| 0xE0002000 - 0xE0001000 | - | DWT |
+--------------------------+---------+------------------+
| 0xE0001000 - 0xE0000000 | - | ITM |
+--------------------------+---------+------------------+
| 0xE0000000 - 0xA0000000 | 1GB | External device |
+--------------------------+---------+------------------+
| 0xA0000000 - 0x60000000 | 1GB | External RAM |
+--------------------------+---------+------------------+
| 0x60000000 - 0x40000000 | .5GB | Peripheral |
+--------------------------+---------+------------------+
| 0x44000000 - 0x42000000 | 32MB | Bit band alias |
+--------------------------+---------+------------------+
| 0x42000000 - 0x40100000 | 31MB | unnamed |
+--------------------------+---------+------------------+
| 0x40100000 - 0x40000000 | 1MB | Bit band region |
+--------------------------+---------+------------------+
| 0x40000000 - 0x20000000 | .5GB | SRAM |
+--------------------------+---------+------------------+
| 0x24000000 - 0x22000000 | 32MB | Bitband alias |
+--------------------------+---------+------------------+
| 0x22000000 - 0x20100000 | 31MB | unnamed |
+--------------------------+---------+------------------+
| 0x20100000 - 0x20000000 | 1MB | Bitband region |
+--------------------------+---------+------------------+
| 0x20000000 - 0x00000000 | .5GB | Code |
+--------------------------+---------+------------------+
For a diagram, see `Cortex-M3 Revision r2p1 Technical Reference Manual page 3-11`_.
.. _Cortex-M3 Revision r2p1 Technical Reference Manual page 3-11: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0337h/index.
Component Layout
================
Refer to page 2 of the FRDM-K64F Freedom Module User's Guide,
Rev. 0, 04/2014 (Freescale FRDMK64FUG) for a component layout
block diagram. See
http://infocenter.arm.com/help/topic/com.arm.doc.dui0552a/DUI0552A_cortex_m3_dgug.pdf
Supported Features
******************
The frdm_k64f board configuration supports the following
hardware features:
+--------------+------------+----------------------+
| Interface | Controller | Driver/Component |
+==============+============+======================+
| NVIC | on-chip | nested vectored |
| | | interrupt controller |
+--------------+------------+----------------------+
| SYSTICK | on-chip | system clock |
+--------------+------------+----------------------+
| UART 1 | on-chip | serial port |
| (OpenSDA v2) | | |
+--------------+------------+----------------------+
Other hardware features are not currently supported by the Zephyr kernel.
See `vendor documentation`_ for a complete list of
Freescale FRDM-K64F board hardware features.
.. _vendor documentation: http://infocenter.arm.com/help/topic/com.arm.doc.dui0552a/DUI0552A_cortex_m3_dgug.pdf
Interrupt Controller
====================
There are 15 fixed exceptions including exceptions 12 (debug
monitor) and 15 (SYSTICK) that behave more as interrupts
than exceptions. In addition, there can be a variable number
of IRQs. Exceptions 7-10 and 13 are reserved. They don't need
handlers.
A Cortex-M3/4-based board uses vectored exceptions. This
means each exception calls a handler directly from the
vector table.
Handlers are provided for exceptions 1-6, 11-12, and 14-15.
The table here identifies the handlers used for each exception.
+------+------------+----------------+--------------------------+
| Exc# | Name | Remarks | Used by Zephyr Kernel |
+======+============+================+==========================+
| 1 | Reset | | system initialization |
+------+------------+----------------+--------------------------+
| 2 | NMI | | system fatal error |
+------+------------+----------------+--------------------------+
| 3 | Hard fault | | system fatal error |
+------+------------+----------------+--------------------------+
| 4 | MemManage | MPU fault | system fatal error |
+------+------------+----------------+--------------------------+
| 5 | Bus | | system fatal error |
+------+------------+----------------+--------------------------+
| 6 | Usage | undefined | system fatal error |
| | fault | instruction, | |
| | | or switch | |
| | | attempt to ARM | |
| | | mode | |
+------+------------+----------------+--------------------------+
| 11 | SVC | | context switch |
+------+------------+----------------+--------------------------+
| 12 | Debug | | system fatal error |
| | monitor | | |
+------+------------+----------------+--------------------------+
| 14 | PendSV | | context switch |
+------+------------+----------------+--------------------------+
| 15 | SYSTICK | | system clock |
+------+------------+----------------+--------------------------+
.. note::
After a reset, all exceptions have a priority of 0.
Interrupts cannot run at priority 0 for the interrupt
locking mechanism and exception handling to function properly.
Interrupts
----------
Interrupt numbers are virtual and numbered from 0 through N,
regardless of how the interrupt controllers are set up.
However, with the Cortex-M3 which has only one NVIC, interrupts map
directly to physical interrupts 0 through N, and to exceptions
16 through (N + 16).
The Cortex-M4 has an 8-bit priority register. However, some of the
lowest-significant bits are often not implemented. When citing
priorities, a priority of 1 means the first priority lower than 0,
not necessarily the priority whose numerical value is 1.
For example, when only the top three bits are implemented,
priority 1 has a priority numerical value of 0x20h.
When specifying an interrupt priority either to connect
an ISR or to set the priority of an interrupt, use low numbers.
For example, if 3 bits are implemented, use 1, 2, and 3,
not 0x20h, 0x40h, and 0x60h.
Interrupt priority is set using the *prio* parameter of
:c:macro:`IRQ_CONNECT()` or :c:func:`irq_connect_dynamic()`.
The range of available priorities is different if using Zero Latency Interrupts
(ZLI) or not.
When not using ZLI:
* 2 to 2\ :sup:`n`\ -2, where *n* is the number of implemented bits
(e.g. 2 to 14 for 4 implemented bits)
* Interrupt locking is done by setting :envvar:`BASEPRI` to 2, setting
exceptions 4, 5, 6, and 11 to priority 1, and setting all other exceptions,
including interrupts, to a lower priority (2+).
When using ZLI:
* 3 to 2\ :sup:`n`\ -2, where *n* is the number of implemented bits
(e.g. 3 to 6 for 3 implemented bits)
* Interrupt locking is done by setting :envvar:`BASEPRI` to 3, setting
exceptions 4, 5, 6, and 11 to priority 1, setting ZLI interupts to priority 2
and setting all other exceptions, including interrupts, to a lower priority
(3+).
.. note::
The hard fault exception is always kept at priority 0 so that it is
allowed to occur while handling another exception.
.. note::
The PendSV exception is always installed at the lowest priority
available, and that priority level is thus not avaialble to other
exceptions and interrupts.
Interrupt Tables
----------------
There are a number of ways of setting up the interrupt
table depending on the range of flexibility and performance
needed. The two following kconfig options drive the interrupt
table options:
:option:`SW_ISR_TABLE` and :option:`SW_ISR_TABLE_DYNAMIC`
Depending on whether static tables are provided by the platform
configuration or by the application, two other kconfig options
are available:
:option:`SW_ISR_TABLE_STATIC_CUSTOM` and
:option:`IRQ_VECTOR_TABLE_CUSTOM`
The following interrupt table scenarios exist:
:option:`SW_ISR_TABLE=y`, :option:`SW_ISR_TABLE_DYNAMIC=y`
For maximum ease of use, maximum flexibility, a larger
footprint, and weaker performance.
This is the default setup. The vector table is static
and uses the same handler for all entries. The handler
finds out at runtime what interrupt is running and
invokes the correct ISR. An argument is passed to the
ISR when the ISR is connected.
The table, in the data section and therefore in SRAM,
has one entry per interrupt request (IRQ) in the vector
table. An entry in that table consists of two words, one
for the ISR and one for the argument. The table size,
calculated by multiplying the number of interrupts by 8
bytes, can add significant overhead.
In this scenario, some demuxing must take place which
causes a delay before the ISR runs. On the plus side,
the vector table can be automatically generated by the Zephyr kernel.
Also, an argument can be passed to the ISR, allowing
multiple devices of the same type to share the same ISR.
Sharing an ISR can potentially save as much, or even more,
memory than a software table implementation might save.
Another plus is that the vector table is able to take
care of the exception handling epilogue because the
handler is installed directly in the vector table.
:option:`SW_ISR_TABLE=y`, :option:`SW_ISR_TABLE_DYNAMIC=n`
For advanced use, medium flexibility, a medium footprint,
and medium performance.
In this setup, the software table exists, but it is static
and pre-populated. ISRs can have arguments with an automatic
exception handling epilogue. Table pre-population provides
better boot performance because there is no call to
:c:func:`irq_connect` during boot up; however,
the user must provide a file to override the platform's
default ISR table defined in :file:`sw_isr_table.S`.
This file must contain the :makevar:`_sw_isr_table[]`
variable initialized with each interrupt's ISR. The variable
is an array of type struct _IsrTableEntry. When a user
provides their own :file:`sw_isr_table.c`, the type can be found
by including :file:`sw_isr_table.h`.
:option:`SW_ISR_TABLE=n`
For advanced use, no flexibility, the best footprint, and
the best performance.
In this setup, there is no software table. ISRs are installed
directly in the vector table using the **_irq_vector_table** symbol
in the .irq_vector_table section. The symbol resolves to an
array of words containing the addresses of ISRs. The linker
script puts that section directly
after the section containing the first 16 exception vectors
(.exc_vector_table) to form the full vector table in ROM.
An example of this can be found in the platform's
:file:`irq_vector_table.c`. Because ISRs
hook directly into the vector table, this setup gives the best
possible performance regarding latency when handling interrupts.
When the ISR is hooked directly to the vector, the ISR
must manually invoke the :c:func:`_IntExit()` function
as its very last action.
.. note::
This configuration prevents the use of tickless idle.
:option:`SW_ISR_TABLE=y`, :option:`SW_ISR_TABLE_STATIC_CUSTOM=y`
For overriding the static ISR tables defined by the platform:
In this setup, the platform provides the **_irq_vector_table**
symbol and data in :file:`sw_isr_table.s`.
:option:`SW_ISR_TABLE=n`, :option:`IRQ_VECTOR_TABLE_CUSTOM=y`
In this setup, the platform provides the **_irq_vector_table** symbol
and data in `irq_vector_table.c`.
Configuration Options
=====================
:option:`LDREX_STREX_AVAILABLE`
Set to 'n' when the ldrex/strex instructions are not available.
:option:`DATA_ENDIANNESS_LITTLE`
Set to 'n' when the data sections are big endian.
:option:`STACK_ALIGN_DOUBLE_WORD`
Set to 'n' only when there is a good reason to do it.
:option:`NUM_IRQ_PRIO_BITS`
The board configuration sets this to the correct value for the board
("4" for FRDM board, IIRC).
:option:`RUNTIME_NMI`
The kernel provides a simple NMI handler that simply
hangs in a tight loop if triggered. This fills the
requirement that there must be an NMI handler installed
when the CPU boots.If a custom handler is needed,
enable this option and attach it via _NmiHandlerSet().
:option:`NUM_IRQS`
The board configuration sets this value to the correct number of
interrupts available on the board. The default is '34'.
:option:`SW_ISR_TABLE`
Set to 'n' when the board configuration does not provide one.
:option:`SW_ISR_TABLE_DYNAMIC`
Set to 'n' to override the default.
System Clock
============
FRDM-K64F uses an external oscillator/resonator.
It can have a frequency range of 32.768 KHz to 50 MHz.
Serial Port
===========
The FRDM_K64F board has a single out-of-the-box available
serial communication channel that uses the CPU's UART0.
It is connected via a "USB Virtual Serial Port"
over the OpenSDA USB connection.
See the `Procedures`_ in the next section for instruction
on how to direct output from the board to a console.
Procedures
**********
Use the following procedures:
* `Loading a Project Image with FRDM K64F firmware`_
* `Installing Hardware Debug Support on the Host and Target`_
* `Installing the IDE and Eclipse Plug-ins`_
* `Configuring the J-Link Debugger`_
* `Programming Flash with J-link`_
Loading a Project Image with FRDM K64F Firmware
===============================================
Load a project image with FRDM K64F firmware from the mbed project
if you only need to load and run an image without debug tools.
FRDM K64F firmware is available for the board (and may already be
pre-installed).
Prerequisite
------------
Although FRDM K64F firmware may be pre-installed on the
FRDM_K64F, you must replace it with the latest version.
Steps
-----
1. Go to the `FRDM K64F firmware instructions
<http://developer.mbed.org/handbook/Firmware-FRDM-K64F>`_.
2. Download the lastest version of the FRDM K64F firmware from the mbed project.
3. Update the FRDM K64F firmware using the following `online
instructions <http://developer.mbed.org/handbook/Firmware-FRDM-K64F>`_:
a) *Enter Bootloader mode*.
b) *Update Using Windows and Linux*.
c) *Power Down, Power Up*.
3. Follow the online instructions to `Connect the microcontroller to a PC
<https://developer.mbed.org/platforms/frdm-k64f/#pc-configuration>`_.
a) *Connect your microcontroller to a PC*.
b) *Click the MBED.HTM link to log in*.
4. Follow the online instructions to `Configure a terminal application
<http://mbed.org/handbook/Terminals>`_.
a) *Install a Terminal Application*.
b) *Setup the Connection Use COMx at 8-N-1 with 115200 baud*.
The Status light on the FRDM K64F Microcontroller flickers
when you type in the terminal application.
5. Configure the host to run a progam binary using the online instructions
`Downloading a Program
<http://mbed.org/platforms/frdm-k64f/#pc-configuration>`_.
a) *Save a program binary (.bin) to the FRDM Platform*.
b) *Press the Reset button*.
c) *Download a program binary*.
6. Disconnect and re-connect the terminal serial port
connection after copying each :file:`.bin` file.
Installing Hardware Debug Support on the Host and Target
========================================================
.. Caution::
Debug firmware and FRDM K64F firmware cannot be used together.
Debug firmware overwrites FRDM K64F firmware when installed.
Install hardware debug support on the host and target to use debug tools.
Prerequisites
-------------
* You understand that Segger does not warranty or support OpenSDA V2 firmware.
* You comply with all OpenSDA V2 firmware conditions of use, but particularly:
- Use with Freescale target devices only. Use with other devices
is prohibited and illegal.
- Use with evaluation boards only; not with custom hardware.
- Use for development and/or evaluation purposes only.
* You have licensed J-Link firmware.
* You have USB drivers for J-Links with VCOM support.
Steps
-----
1. Go to the `J-Link
<https://www.segger.com/jlink-software.html>`_ site.
2. Locate the section, **J-Link software &
documentation pack for Linux ARM systems** and
click the **Download** button for **Software and
documentation pack for Linux ARM systems V5.00b**.
3. Go to `Segger OpenSDA <https://www.segger.com/opensda.html>`_.
4. Download :file:`JLink_OpenSDA_V2_2015-04-23.zip`.
5. Install the :program:`USB Driver for J-Link with Virtual COM
Port` on the PC.
6. Extract the OpenSDA image from the download.
7. Press and hold the board **Reset** button while
connecting the board to the PC with a USB cable.
The OpenSDA platform starts in MSD mode.
8. From the PC, drag & drop the :file:`.sda/.bin` file to
the board to load the firmware.
9. Disconnect and reconnect the board.
The OpenSDA platform is now available on the PC as a
J-Link appearance.
10. Run the :program:`J-Link Commander` (JLinkExe on Linux)
program on the PC to test if the J-Link connects
to the target.
Installing the IDE and Eclipse Plug-ins
=======================================
Install the GNU ARM Eclipse plug-in to debug with J-Link
in an Eclipse environment.
Prerequisites
-------------
* You already have the GDB Server and J-Link
Commander utility you downloaded with the
`Software and documentation pack for Linux ARM systems V5
<https://www.segger.com/jlink-software.html>`_.
* Review the `GNU Tools for ARM Embedded Processors
<https://launchpad.net/gcc-arm-embedded>`_ documentation.
Steps
-----
1. Download and install a Linux version of `Eclipse IDE for
C/C++ Developers
<https://www.eclipse.org/downloads/packages/eclipse-ide-cc-developers/lunasr2>`_
if you do not have Eclipse installed already.
2. Download and install the
`GNU ARM Eclipse Plug-ins <http://sourceforge.net/projects/gnuarmeclipse/>`_,
and follow the `online instructions
<http://gnuarmeclipse.livius.net/blog/>`_.
3. Follow the online instructions to install the
`GDB Server <https://www.segger.com/jlink-gdb-server.html>`_.
4. Download and install the
`GCC, the GNU Compiler Collection <https://gcc.gnu.org/>`_.
[This step does not apply to Wind River customers.]
5. Download and install `GDB: The GNU Project Debugger
<http://www.gnu.org/software/gdb/download/>`_.
[This step does not apply to Wind River customers.]
6. Download and install the `J-Link hardware debugging
Eclipse plug-in <http://gnuarmeclipse.livius.net/blog/jlink-debugging/>`_.
Configuring the J-Link Debugger
===============================
Configure the J-Link Debugger to work with all the software installed.
Prerequisites
-------------
* The `J-Link hardware debugging Eclipse plug-in
<http://gnuarmeclipse.livius.net/blog/jlink-debugging/>`_ page is open.
Steps
-----
1. Follow the online configuration instructions that
should be open already from the previous procedure,
then optimize the configuration using the remaining
steps in this procedure.
2. Create an empty C project.
3. Create a reference to the project.
a) In the **Eclipse** menu, select **Run ->
Debug Configurations -> C/C++Application -> Main**.
b) Click the Project: **Browse** button and select the
project you created a reference to.
c) Click the C/C++Application: **Browse** button and select
an existing ELF or binary file.
d) Deselect **Enable auto build** and click **Apply**.
4. Select the **Common** tab.
5. In the **Save as:** field, type `Local file` and
click **Apply**.
6. Select the **Debugger** tab.
7. In the **Executable:** field, type the path to the GDB installation.
8. In the **Device name:** field, type `MK64FN1M0xxx12`
and click **Apply**.
9. Select the **Startup** tab.
10. Deselect **SWO Enable**.
11. Deselect **Enable semihosting**.
12. Select :guilabel:`Load symbols`.
13. Click **Use File** and type the name of a Zephyr
.elf file.
14. Click **Apply**.
Programming Flash with J-link
=============================
Program Flash with J-Link to run the an image directly
from the shell.
Prerequisites
-------------
* Have the Zephyr application image file saved as a binary file.
(The build should have created this binary file automatically.)
Steps
-----
1. In a console, change directory to the J-Link installation directory.
2. At the *J-Link>* prompt, enter::
exec device = MK64FN1M0xxx12
3. Enter::
loadbin [filename], [addr]
Example: ``loadbin zephyr.bin, 0x0``
4. Enter::
verifybin [filename],[addr]
Example: ``verifybin zephyr.bin, 0x0``
5. To reset the target, enter::
r
6. To start the image running directly from the shell, enter::
g
7. To stop the image from running, enter::
h
Known Problems and Limitations
******************************
There is no support for the following:
* Memory protection through optional MPU.
However, using a XIP kernel effectively provides
TEXT/RODATA write protection in ROM.
* SRAM at addresses 0x1FFF0000-0x1FFFFFFF
* Writing to the hardware's flash memory
Bibliography
************
1. The Definitive Guide to the ARM Cortex-M3,
Second Edition by Joseph Yiu (ISBN?978-0-12-382090-7)
2. ARMv7-M Architecture Technical Reference Manual
(ARM DDI 0403D ID021310)
3. Procedure Call Standard for the ARM Architecture
(ARM IHI 0042E, current through ABI release 2.09,
2012/11/30)
4. Cortex-M3 Revision r2p1 Technical Reference Manual
(ARM DDI 0337I ID072410)
5. Cortex-M4 Revision r0p1 Technical Reference Manual
(ARM DDI 0439D ID061113)
6. Cortex-M3 Devices Generic User Guide
(ARM DUI 0052A ID121610)
7. K64 Sub-Family Reference Manual, Rev. 2, January 2014
(Freescale K64P144M120SF5RM)
8. FRDM-K64F Freedom Module User's Guide, Rev. 0, 04/2014
(Freescale FRDMK64FUG)