C2000 Microcontroller Workshop
C2000 Microcontroller Workshop
F28xMcuMdw
Revision 5.0
May 2014
Technical Training
Organization
Important Notice
Important Notice
Texas Instruments and its subsidiaries (TI) reserve the right to make changes to their products or to
discontinue any product or service without notice, and advise customers to obtain the latest version of
relevant information to verify, before placing orders, that information being relied on is current and
complete. All products are sold subject to the terms and conditions of sale supplied at the time of order
acknowledgment, including those pertaining to warranty, patent infringement, and limitation of liability.
TI warrants performance of its semiconductor products to the specifications applicable at the time of sale in
accordance with TI’s standard warranty. Testing and other quality control techniques are utilized to the
extent TI deems necessary to support this warranty. Specific testing of all parameters of each device is not
necessarily performed, except those mandated by government requirements.
In order to minimize risks associated with the customer’s applications, adequate design and operating
safeguards must be provided by the customer to minimize inherent or procedural hazards.
TI assumes no liability for applications assistance or customer product design. TI does not warrant or
represent that any license, either express or implied, is granted under any patent right, copyright, mask
work right, or other intellectual property right of TI covering or relating to any combination, machine, or
process in which such semiconductor products or services might be or are used. TI’s publication of
information regarding any third party’s products or services does not constitute TI’s approval, warranty or
endorsement thereof.
Revision History
September 2009 – Revision 1.0
May 2010 – Revision 2.0
December 2010 – Revision 2.1
July 2011 – Revision 3.0
September 2011 – Revision 3.1
October 2012 – Revision 4.0
May 2014 – Revision 5.0
Mailing Address
Texas Instruments
Training Technical Organization
6500 Chase Oaks Blvd Building 2
M/S 8437
Plano, Texas 75023
Texas Instruments
Technical Training
C2000 is trademarks of Texas Instruments. Copyright © 2014 Texas Instruments. All rights reserved.
The objective of this workshop is to gain a fully understand and a complete working knowledge
of the C2000 microcontroller. This will be accomplished through detailed presentations and
hands-on lab exercises.
The workshop will start with the basic topics and progress to more advanced topics in a logical
flow such that each topic and lab exercise builds on the previous one presented. At the end of the
workshop, you should be confident in applying the skills learned in your product design.
The materials required for this workshop are available using the links shown at the top of this
slide. An F28069 Experimenter’s Kit and a jumper wire will be needed for the lab exercises. The
lab directions are written based on the version of Code Composer Studio as shown on this slide.
The workshop installer will automatically install the lab files, solution files, workshop manual,
and documentation.
controlCARD
The development tool for this workshop will be the TMS320F28069 Experimenter’s Kit. The kit
consists of a controlCARD and USB Docking Station. It is a self-contained system that plugs
into a free USB port on your computer. The USB port provides power, as well as communicates
to the onboard JTAG emulation controller. LED LD1 on the Docking Station and LED LD1 on
the controlCARD illuminates when the board is powered. LED LD2 on the controlCARD is
connected to GPIO34. We will be using this LED as a visual indicator during the lab exercises.
The GPIO and ADC lines from the F28069 device are pinned out to the Docking Station headers.
We will be using a jumper wire to connect various GPIO and ADC lines on these headers.
When comparing the Delfino and Piccolo product lines, you will notice that the Piccolo F2806x
devices share many features with the Delfino product line. The Delfino product line is shown in
the table by the F2833x column; therefore, the F28069, being the most feature-rich Piccolo
device, was chosen as the platform for this workshop. The knowledge learned from this device
will be applicable to all C2000 product lines.
Module Objectives
When this module is complete, you should have a basic understanding of the F28x architecture
and how all of its components work together to create a high-end, uniprocessor control system.
Module Objectives
Module Topics
Architecture Overview ...............................................................................................................................1-1
Module Topics..........................................................................................................................................1-2
What is the TMS320C2000™?.................................................................................................................1-3
TMS320C2000™ Internal Bussing .....................................................................................................1-4
F28x CPU + FPU + VCU and CLA ........................................................................................................1-5
Special Instructions..............................................................................................................................1-6
Pipeline Advantage ..............................................................................................................................1-7
F28x CPU + FPU + VCU Pipeline ......................................................................................................1-8
Memory ....................................................................................................................................................1-9
Memory Map .......................................................................................................................................1-9
Code Security Module (CSM) ...........................................................................................................1-10
Peripherals .........................................................................................................................................1-10
Fast Interrupt Response .........................................................................................................................1-11
Summary ................................................................................................................................................1-12
McBSP
PIE I2C
R-M-W Interrupt
32x32 bit FPU Manager
Atomic CLA SCI
Multiplier VCU
ALU SPI
3
32-bit CAN 2.0B
Register Bus Watchdog
Timers
CPU USB 2.0
This block diagram represents an overview of all device features and is not specific to any one
device. The F28069 device is designed around a multibus architecture, also known as a modified
Harvard architecture. This can be seen in the block diagram by the separate program bus and data
bus, along with the link between the two buses. This type of architecture greatly enhances the
performance of the device.
In the upper left area of the block diagram, you will find the memory section, which consists of
the boot ROM, sectored flash, and RAM. Also, you will notice that the six-channel DMA has its
own set of buses.
In the lower left area of the block diagram, you will find the execution section, which consists of
a 32-bit by 32-bit hardware multiplier, a read-modify-write atomic ALU, a floating-point unit,
and a Viterbi complex math CRC unit. The control law accelerator coprocessor is an independent
and separate unit that has its own set of buses.
The peripherals are grouped on the right side of the block diagram. The upper set is the control
peripherals, which consists of the ePWM, eCAP, eQEP, and ADC. The lower set is the
communication peripherals and consists of the multichannel buffered serial port, I2C, SCI, SPI,
CAN, and USB.
The PIE block, or Peripheral Interrupt Expansion block, manages the interrupts from the
peripherals. In the bottom right corner is the general-purpose I/O. Also, the CPU has a watchdog
module and three 32-bit general-purpose timers available.
• A program read bus (22-bit address line and 32-bit data line)
• A data read bus (32-bit address line and 32-bit data line)
• A data write bus (32-bit address line and 32-bit data line)
The 32-bit-wide data busses provide single cycle 32-bit operations. This multiple bus
architecture, known as a Harvard Bus Architecture, enables the F28x to fetch an instruction, read
a data value and write a data value in a single cycle. All peripherals and memories are attached to
the memory bus and will prioritize memory accesses.
The F28x design supports an efficient C engine with hardware that allows the C compiler to
generate compact code. Multiple busses and an internal register bus allow an efficient and
flexible way to operate on the data. The architecture is also supported by powerful addressing
modes, which allow the compiler as well as the assembly programmer to generate compact code
that is almost one to one corresponded to the C code.
The F28x is as efficient in DSP math tasks as it is in system control tasks. This efficiency
removes the need for a second processor in many systems. The 32 x 32-bit MAC capabilities of
the F28x and its 64-bit processing capabilities, enable the F28x to efficiently handle higher
numerical resolution problems that would otherwise demand a more expensive solution. Along
with this is the capability to perform two 16 x 16-bit multiply accumulate instructions
simultaneously or Dual MACs (DMAC). Also, some devices feature a floating-point unit.
The, F28x is source code compatible with the 24x/240x devices and previously written code can
be reassembled to run on a F28x device, allowing for migration of existing code onto the F28x.
Special Instructions
Atomics are small common instructions that are non-interuptable. The atomic ALU capability
supports instructions and code that manages tasks and processes. These instructions usually
execute several cycles faster than traditional coding.
Pipeline Advantage
D F 1 F 2 D1 D2 R1 R2 E W
E & G Access
E F 1 F 2 D1 D2 R1 R2 E W same address
F F 1 F 2 D1 D2 R1 R2 E W
G F 1 F 2 D1 D2 R
R11 R2 RE2 W
E W
H F1 F2 D1 D2 R1 R12 RE2 W
E W
The F28x uses a special 8-stage protected pipeline to maximize the throughput. This protected
pipeline prevents a write to and a read from the same location from occurring out of order.
This pipelining also enables the F28x to execute at high speeds without resorting to expensive
high-speed memories. Special branch-look-ahead hardware minimizes the latency for conditional
discontinuities. Special store conditional operations further improve performance.
Floating-point and VCU operations are not pipeline protected. Some instructions require delay
slots for the operation to complete. This can be accomplished by insert NOPs or other non-
conflicting instructions between operations.
In the user’s guide, instructions requiring delay slots have a ‘p’ after their cycle count. The 2p
stands for 2 pipelined cycles. A new instruction can be started on each cycle. The result is valid
only 2 instructions later.
Three general guideslines for the FPU/VCU pipeline are:
Memory
The memory space on the F28x is divided into program memory and data memory. There are
several different types of memory available that can be used as both program memory and data
memory. They include the flash memory, single access RAM (SARAM), OTP, and Boot ROM
which is factory programmed with boot software routines and standard tables used in math related
algorithms.
Memory Map
The F28x CPU contains no memory, but can access memory on chip. The F28x uses 32-bit data
addresses and 22-bit program addresses. This allows for a total address reach of 4G words (1
word = 16-bits) in data memory and 4M words in program memory. Memory blocks on all F28x
designs are uniformly mapped to both program and data space.
This memory map shows the different blocks of memory available to the program and data space.
The F28069 utilizes a contiguous memory map, also known as a von-Neumann architecture. This
type of memory map lends itself well to higher-level languages. This can be seen by the labels
located at the top of the memory map where the memory blocks extend between both the data
space and program space.
At the top of the map, we have two blocks of RAM called M0 and M1. Then we see PF0 through
PF3, which are the peripheral frames. This is the area where you will find the peripheral
registers. Also in this space, you will find the PIE block. Memory blocks L0 through L8 are
grouped together. L0 through L3 are accessible by the CPU and CLA. L5 through L8 are
accessible by the DMA.
The user OTP is a one-time, programmable, memory block. TI reserves a small space in the map
for the ADC and oscillator calibration data. The flash block contains a section for passwords,
which are used by the code security module. The boot ROM and boot ROM vectors are located
at the bottom of the memory map.
Peripherals
The F28x comes with many built in peripherals optimized to support control applications. These
peripherals vary depending on which F28x device you choose.
• ePWM • SPI
• eCAP • SCI
• eQEP • I2C
• CLA • USB
• DMA • GPIO
context save
Auto Context Save
T ST0
AH AL
PH PL
AR1 (L) AR0 (L)
DP ST1
DBSTAT IER
PC(msw) PC(lsw)
The C2000 devices feature a very fast interrupt response manager using the PIE block. This
allows up to 96 possible interrupt vectors to be processed by the CPU. More details about this
will be covered in the reset, interrupts, and system initialization modules.
Summary
Summary
High performance 32-bit CPU
32x32 bit or dual 16x16 bit MAC
IEEE single-precision floating point unit (FPU)
Hardware Control Law Accelerator (CLA)
Viterbi, complex math, CRC unit (VCU)
Atomic read-modify-write instructions
Fast interrupt response manager
128Kw on-chip flash memory
Code security module (CSM)
Control peripherals
12-bit ADC module
Comparators
Direct memory access (DMA)
Up to 54 shared GPIO pins
Communications peripherals
Module Objectives
Module Objectives
Module Topics
Programming Development Environment ...............................................................................................2-1
Module Topics..........................................................................................................................................2-2
Code Composer Studio ............................................................................................................................2-3
Software Development and COFF Concepts .......................................................................................2-3
Code Composer Studio ........................................................................................................................2-4
Edit and Debug Perspective (CCSv6) ..................................................................................................2-5
Target Configuration ...........................................................................................................................2-6
CCSv6 Project .....................................................................................................................................2-7
Creating a New CCSv6 Project ...........................................................................................................2-8
CCSv6 Build Options – Compiler / Linker .........................................................................................2-9
CCSv6 Debug Environment ..............................................................................................................2-10
Creating a Linker Command File ..........................................................................................................2-12
Sections..............................................................................................................................................2-12
Linker Command Files (.cmd) .........................................................................................................2-15
Memory-Map Description .................................................................................................................2-15
Section Placement..............................................................................................................................2-16
Summary: Linker Command File ......................................................................................................2-17
Lab File Directory Structure..................................................................................................................2-18
Lab 2: Linker Command File .................................................................................................................2-19
Build Code
lnk.cmd Simulator
Compile
Development
Tool
Asm Link Debug
External
Editor Libraries Graphs, Emulator
Profiling
MCU
Board
Code Composer Studio includes:
Integrated
Edit/Debug GUI
Code Generation Tools
TI-RTOS
Code Composer Studio includes a built-in editor, compiler, assembler, linker, and an automatic
build process. Additionally, tools to connect file input and output, as well as built-in graph
displays for output are available. Other features can be added using the plug-ins capability
Numerous modules are joined to form a complete program by using the linker. The linker
efficiently allocates the resources available on the device to each module in the system. The
linker uses a command (.CMD) file to identify the memory resources and placement of where the
various sections within each module are to go. Outputs of the linking process includes the linked
object file (.OUT), which runs on the device, and can include a .MAP file which identifies where
each linked section is located.
The high level of modularity and portability resulting from this system simplifies the processes of
verification, debug and maintenance. The process of COFF development is presented in greater
detail in the following paragraphs.
Code Composer Studio™ (CCS) is an integrated development environment (IDE) for Texas
Instruments (TI) embedded processor families. CCS comprises a suite of tools used to develop
and debug embedded applications. It includes compilers for each of TI's device families, source
code editor, project build environment, debugger, profiler, simulators, real-time operating system
and many other features. The intuitive IDE provides a single user interface taking you through
each step of the application development flow. Familiar tools and interfaces allow users to get
started faster than ever before and add functionality to their application thanks to sophisticated
productivity tools.
CCS is based on the Eclipse open source software framework. The Eclipse software framework
was originally developed as an open framework for creating development tools. Eclipse offers an
excellent software framework for building software development environments and it is
becoming a standard framework used by many embedded software vendors. CCS combines the
advantages of the Eclipse software framework with advanced embedded debug capabilities from
TI resulting in a compelling feature-rich development environment for embedded developers.
CCS supports running on both Windows and Linux PCs. Note that not all features or devices are
supported on Linux.
Code Composer Studio has “Edit” and “Debug” perspectives. Each perspective provides a set of
functionality aimed at accomplishing a specific task. In the edit perspective, views used during
code development are displayed. In the debug perspective, views used during debug are
displayed.
Target Configuration
A Target Configuration tells CCS how to connect to the device. It describes the device using
GEL files and device configuration files. The configuration files are XML files and have a
*.ccxlm file extension.
CCSv6 Project
Code Composer works with a project paradigm. Essentially, within CCS you create a project for
each executable program you wish to create. Projects store all the information required to build
the executable. For example, it lists things like: the source files, the header files, the target
system’s memory-map, and program build options.
CCSv6 Project
A project contains files, such as C and assembly source files, libraries, BIOS configuration files,
and linker command files. It also contains project settings, such as build options, which include
the compiler, assembler, linker, and BIOS, as well as build configurations.
To create a new project, you need to select the following menu items:
File New CCS Project
Along with the main Project menu, you can also manage open projects using the right-click
popup menu. Either of these menus allows you to modify a project, such as add files to a project,
or open the properties of a project to set the build options.
2. Advanced Settings
Compiler Linker
20 categories for code 11 categories for linking
generation tools Specify various link
Controls many aspects of options
the build process, such as: ${PROJECT_ROOT}
Optimization level specifies the current
Target device
project directory
Compiler / assembly / link
options
There is a one-to-one relationship between the items in the text box on the main page and the GUI
check and drop-down box selections. Once you have mastered the various options, you can
probably find yourself just typing in the options.
There are many linker options but these four handle all of the basic needs.
• -o <filename> specifies the output (executable) filename.
• -m <filename> creates a map file. This file reports the linker’s results.
• -c tells the compiler to autoinitialize your global and static variables.
• -x tells the compiler to exhaustively read the libraries. Without this option libraries are
searched only once, and therefore backwards references may not be resolved.
To help make sense of the many compiler options, TI provides two default sets of options
(configurations) in each new project you create. The Release (optimized) configuration invokes
the optimizer with –o3 and disables source-level, symbolic debugging by omitting –g (which
disables some optimizations to enable debug).
The common debugging and program execution descriptions are shown below:
Start debugging
New Target Creates a new target configartion file. File New Menu
Configuration Target Menu
Program execution
Assembly The debugger executes the next assembly instruc- TI Explicit Stepping Toolbar
Step Into tion, whether source is available or not. Target Advanced Menu
Sections
Global vars (.ebss) Init values (.cinit)
In the TI code-generation tools (as with any toolset based on the COFF – Common Object File
Format), these various parts of a program are called Sections. Breaking the program code and
data into various sections provides flexibility since it allows you to place code sections in ROM
and variables in RAM. The preceding diagram illustrated four sections:
• Global Variables
• Initial Values for global variables
• Local Variables (i.e. the stack)
• Code (the actual instructions)
Following is a list of the sections that are created by the compiler. Along with their description,
we provide the Section Name defined by the compiler. This is a small list of compiler default
section names. The top group is initialized sections, and they are linked to flash. In our previous
code example, we saw .txt was used for code, and .cinit for initialized values. The bottom group
is uninitialized sections, and they are linked to RAM. Once again, in our previous example, we
saw .ebss used for global variables and .stack for local variables.
Uninitialized Sections
Name Description Link Location
.ebss global and static variables RAM
.stack stack space low 64Kw RAM
.esysmem memory for far malloc functions RAM
Sections of a C program must be located in different memories in your target system. This is the
big advantage of creating the separate sections for code, constants, and variables. In this way,
they can all be linked (located) into their proper memory locations in your target embedded
system. Generally, they’re located as follows:
in volatile memory, such as RAM. These memories can be modified and updated, supporting the
way variables are used in math formulas, high-level languages, etc. Each variable must be
declared with a directive to reserve memory to contain its value. By their nature, no value is
assigned, instead they are loaded at runtime by the program.
Next, we need to place the sections that were created by the compiler into the appropriate
memory spaces. The uninitialized sections, .ebss and .stack, need to be placed into RAM; while
the initialized sections, .cinit, and .txt, need to be placed into flash.
Memory
Sections
0x00 0000 M0SARAM
(0x400)
.ebss
0x00 0400 M1SARAM
(0x400)
.stack
.text
Linking
Memory description
How to place s/w into h/w
Link.cmd
.map
Memory-Map Description
The MEMORY section describes the memory configuration of the target system to the linker.
MEMORY
{
FLASH: origin = 0x3E8000 , length = 0x010000
}
Each memory segment is defined using the above format. If you added M0SARAM and
M1SARAM, it would look like:
MEMORY
{
M0SARAM: origin = 0x000000 , length = 0x0400
M1SARAM: origin = 0x000400 , length = 0x0400
}
Remember that the MCU has two memory maps: Program, and Data. Therefore, the MEMORY
description must describe each of these separately. The loader uses the following syntax to
delineate each of these:
A linker command file consists of two sections, a memory section and a sections section. In the
memory section, page 0 defines the program memory space, and page 1 defines the data memory
space. Each memory block is given a unique name, along with its origin and length. In the
sections section, the section is directed to the appropriate memory block.
Section Placement
The SECTIONS section will specify how you want the sections to be distributed through
memory. The following code is used to link the sections into the memory specified in the
previous example:
SECTIONS
{
.text:> FLASH PAGE 0
.ebss:> M0SARAM PAGE 1
.cinit:> FLASH PAGE 0
.stack:> M1SARAM PAGE 1
}
The linker will gather all the code sections from all the files being linked together. Similarly, it
will combine all ‘like’ sections.
Beginning with the first section listed, the linker will place it into the specified memory segment.
Placement of Sections:
• .text into RAM Block L4SARAM on PAGE 0 (program memory)
• .cinit into RAM Block L4SARAM on PAGE 0 (program memory)
• .ebss into RAM Block M0SARAM on PAGE 1 (data memory)
• .stack into RAM Block M1SARAM on PAGE 1 (data memory)
Procedure
This folder contains all CCS custom settings, which includes project settings and views
when CCS is closed so that the same projects and settings will be available when CCS is
opened again. The workspace is saved automatically when CCS is closed.
2. The first time CCS opens an introduction page appears. Close the page by clicking the X
on the “Getting Started” tab. You should now have an empty workbench. The term
workbench refers to the desktop development environment. Maximize CCS to fill your
screen.
The workbench will open in the “CCS Edit Perspective” view. Notice the CCS Edit
icon in the upper right-hand corner. A perspective defines the initial layout views of the
workbench windows, toolbars, and menus which are appropriate for a specific type of
task (i.e. code development or debugging). This minimizes clutter to the user interface.
The “CCS Edit Perspective” is used to create or build projects. A “CCS Debug
Perspective” view will automatically be enabled when the debug session is started. This
perspective is used for debugging projects.
In the file name field type F28069_ExpKit.ccxml. This is just a descriptive name
since multiple target configuration files can be created. Leave the “Use shared location”
box checked and select Finish.
4. In the next window that appears, select the emulator using the “Connection” pull-down
list and choose “Texas Instruments XDS100v1 USB Emulator”. In the
“Board or Device” box type F28069 to filter the options. In the box below, check the
box to select “Experimenter’s Kit – Piccolo F28069”. Click Save to save
the configuration, then close the “F28069_ExpKit.ccxml” setup window by clicking the
X on the tabs.
5. To view the target configurations, click:
View Target Configurations
and click the plus sign (+) to the left of User Defined. Notice that the
F28069_ExpKit.ccxml file is listed and set as the default. If it is not set as the
default, right-click on the .ccxml file and select “Set as Default”. Close the Target
Configurations window by clicking the X on the tab.
down list immediately to the right, choose the “Experimenter’s Kit – F28069
Piccolo”.
Leave the “Connection” box blank. We have already set up the target configuration.
7. The next section section selects the project settings. In the Project name field type Lab2.
Uncheck the “Use default location” box. Click the Browse… button and navigate to:
C:\C28x\Labs\Lab2\Project
Click OK.
8. Next, open the “Advanced setting” section and set the “Linker command file” to
“<none>”. We will be using our own linker command file rather than the one supplied
by CCS. Leave the “Runtime Support Library” set to “<automatic>”. This will
automatically select the “rts2800_fpu32.lib” runtime support library for floating-point
devices.
9. Then, open the “Project templates and examples” section and select the “Empty
Project” template. Click Finish.
10. A new project has now been created. Notice the Project Explorer window
contains Lab2. The project is set Active and the output files will be located in the
Debug folder. At this point, the project does not include any source files. The next step
is to add the source files to the project.
11. To add the source files to the project, right-click on Lab2 in the Project Explorer
window and select:
Add Files…
or click: Project Add Files…
and make sure you’re looking in C:\C28x\Labs\Lab2\Files. With the “files of
type” set to view all files (*.*) select Lab2.c and Lab2.cmd then click OPEN. A “File
Operation” window will open, choose “Copy files” and click OK. This will add the
files to the project.
12. In the Project Explorer window, click the plus sign (+) to the left of Lab2 and
notice that the files are listed.
15. Under “C2000 Compiler” select the “Processor Options”. Notice the “Use large
memory model” and “Unified memory” boxes are checked. Next, notice the “Specify
CLA support” is set to cla0, the “Specify floating point support” is set to fpu32, and
the “Specify VCU support” is set to vcu0. Select OK to close the Properties window.
19. Click the “Build” button and watch the tools run in the Console window. Check for
errors in the Problems window (we have deliberately put an error in Lab2.c). When
you get an error, you will see the error message in the Problems window. Expand the
error by clicking on the plus sign (+) to the left of the “Errors”. Then simply double-click
the error message. The editor will automatically open to the source file containing the
error, with the code line highlighted with a question mark (?).
20. Fix the error by adding a semicolon at the end of the “z = x + y” statement. For
future knowledge, realize that a single code error can sometimes generate multiple error
messages at build time. This was not the case here.
21. Build the project again. There should be no errors this time.
22. CCS can automatically save modified source files, build the program, open the debug
perspective view, connect and download it to the target, and then run the program to the
beginning of the main function.
Click on the “Debug” button (green bug) or click RUN Debug
Notice the CCS Debug icon in the upper right-hand corner indicating that we are now in
the “CCS Debug Perspective” view. The program ran through the C-environment
initialization routine in the rts2800_fpu32.lib and stopped at main() in Lab2.c.
Type &z into the address field, select “Data” memory page, and then select Go. Note
that you must use the ampersand (meaning “address of”) when using a symbol in a
memory browser address box. Also note that CCS is case sensitive.
Set the properties format to “Hex 16 Bit – TI Style Hex” in the browser. This will give
you more viewable data in the browser. You can change the contents of any address in
the memory browser by double-clicking on its value. This is useful during debug.
24. Notice the “Variables” window automatically opened and the local variables x and y are
present. The variables window will always contain the local variables for the code
function currently being executed.
(Note that local variables actually live on the stack. You can also view local variables in
a memory browser by setting the address to “SP” after the code function has been
entered).
25. We can also add global variables to the “Expressions” window if desired. Let's add the
global variable “z”.
Click the “Expressions” tab at the top of the window. In the empty box in the
“Expression” column (Add new expression), type z and then enter. An ampersand is not
used here. The expressions window knows you are specifying a symbol. (Note that the
expressions window can be manually opened by clicking: View Expressions on
the menu bar).
Check that the expressions window and memory browser both report the same value for
“z”. Try changing the value in one window, and notice that the value also changes in the
other window.
28. Next, close the project by right-clicking on Lab2 in the Project Explorer window
and select Close Project.
End of Exercise
Module Objectives
Module Objectives
Module Topics
Peripherial Registers Header Files ...........................................................................................................3-1
Module Topics..........................................................................................................................................3-2
Traditional and Structure Approach to C Coding ...................................................................................3-3
Naming Conventions ................................................................................................................................3-7
F2806x C-Code Header Files ..................................................................................................................3-9
Peripheral Structure .h File ..................................................................................................................3-9
Global Variable Definitions File .......................................................................................................3-11
Mapping Structures to Memory .........................................................................................................3-12
Linker Command File ........................................................................................................................3-12
Peripheral Specific Routines..............................................................................................................3-13
Summary ................................................................................................................................................3-14
In the traditional approach to C coding, we used a #define to assign the address of the register and
referenced it with a pointer. The first line of code on this slide we are writing to the entire
register with a 16-bit value. The second line, we are ORing a bit field.
Advantages? Simple, fast, and easy to type. The variable names can exactly match the register
names, so it's easy to remember. Disadvantages? Requires individual masks to be generated to
manipulate individual bits, it cannot easily display bit fields in the debugger window, and it will
generate less efficient code in many cases.
The structure approach to C coding uses the peripheral register header files. First, a peripheral is
specified, followed by a control register. Then you can modify the complete register or selected
bits. This is almost self-commented code.
The first line of code on this slide we are writing to the entire register. The second line of code
we are modifying a bit field. Advantages? Easy to manipulate individual bits, it works great with
our tools, and will generate the most efficient code. Disadvantages? Can be difficult to
remember the structure names and more to type; however, the edit auto complete feature of Code
Composer Studio will eliminate these disadvantages.
With the traditional approach to coding using #define, we can only view the complete register
values. As an example, notice the control register ADCCTL1 has a value of 0x40E4. We would
need to refer to the reference guide to know the settings of the individual bit fields.
With the structure approach, we can add the peripheral to an expressions window, allowing us to
view, as well as modify individual bit fields in a register. No need for a reference guide to
identify the bit fields.
You could not have coded this example any more efficiently with hand assembly!
* C28x Compiler v5.0.1 with -g and either -o1, -o2, or -o3 optimization level
* C28x Compiler v5.0.1 with -g and either -o1, -o2, or -o3 optimization level
Naming Conventions
The header files use a familiar set of naming conventions. They are consistent with the Code
Composer Studio configuration tool, and generated file naming conventions.
The header files define all of the peripheral structures, all of the register names, all of the bit field
names, and all of the register addresses. The most common naming conventions used are
PeripheralName.RegisterName.all, which will access the full 16 or 32-bit register; and
PeripheralName.RegisterName.bit.FieldName, which will access the specified bit fields of a
register.
The editor auto complete feature works as follows. First, you type AdcRegs. Then, when you
type a “.” a window opens up, allowing you to select a control register. In this example
ADCCTL1 is selected. Then, when you type the “.” a window opens up, allowing you to select
“all” or “bit”. In this example “bit” is selected. Then, when you type the “.” a window opens up,
allowing you to select a bit field. In this example RESET is selected. And now, the structure is
completed.
\F2806x_headers\include .h files
\F2806x_headers\cmd linker .cmd files
\F2806x_examples CCS examples
\doc documentation
Your C-source file (e.g., Adc.c) Uint16 INTPULSEPOS:1; // 2 INT pulse generation control
Uint16 ADCREFSEL:1; // 3 Internal/external reference select
#include “F2806x_Device.h"
Uint16 rsvd1:1; // 4 reserved
Uint16 ADCREFPWD:1; // 5 Reference buffers powerdown
Void InitAdc(void)
Uint16 ADCBGPWD:1; // 6 ADC bandgap powerdown
{
Uint16 ADCPWDN:1; // 7 ADC powerdown
/* Reset the ADC module */
Uint16 ADCBSYCHN:5; // 12:8 ADC busy on a channel
AdcRegs.ADCCTL1.bit.RESET = 1;
Uint16 ADCBSY:1; // 13 ADC busy signal
Uint16 ADCENABLE:1; // 14 ADC enable
/* configure the ADC register */
Uint16 RESET:1; // 15 ADC master reset
AdcRegs.ADCCTL1.all = 0x00E4;
};
};
// Allow access to the bit fields or entire register:
union ADCCTL1_REG {
Uint16 all;
struct ADCCTL1_BITS bit;
};
// ADC External References & Function Declarations:
extern volatile struct ADC_REGS AdcRegs;
Next, we will discuss the steps needed to use the header files with your project. The .h files
contain the bit field structure definitions for each peripheral register.
F2806x_Device.h
Main include file
Will include all other .h files
Include this file (directly or indirectly)
in each source file:
#include “F2806x_Device.h”
The header file package contains a .h file for each peripheral in the device. The
F2806x_Device.h file is the main include file. It will include all of the other .h files. There are
three steps needed to use the header files. The first step is to include this file directly or indirectly
in each source files.
The global variable definition file declares a global instantiation of the structure for each
peripheral. Each structure is placed in its own section using a DATA_SECTION pragma to allow
linking to the correct memory. The second step for using the header files is to add
F2806x_GlobalVariableDefs.c file to your project.
F2806x_GlobalVariableDefs.c
#include "F2806x_Device.h" Links each structure to
…
the address of the
peripheral using the
#pragma DATA_SECTION(AdcRegs,"AdcRegsFile");
structures named
volatile struct ADC_REGS AdcRegs; section
…
F2806x_Headers_nonBIOS.cmd
non-BIOS and BIOS
versions of the .cmd file
MEMORY
{
PAGE1:
... Add one of these files to
ADC: origin=0x007100, length=0x000080 your CCS project:
...
} F2806x_nonBIOS.cmd
SECTIONS or
{
... F2806x_BIOS.cmd
AdcRegsFile: > ADC PAGE = 1
...
}
The header file package has two linker command file versions; one for non-BIOS projects and
one for BIOS projects. This linker command file is used to link each structure to the address of
the peripheral using the structures named section. The third and final step for using the header
files is to add the appropriate linker command file to your project.
The peripheral register header file package includes example projects for each peripheral. This
can be very helpful to getting you started.
Summary
Peripheral Register Header Files
Summary
Easier code development
Easy to use
Generates most efficient code
Increases effectiveness of CCS watch window
TI has already done all the work!
Use the correct header file package for your device:
In summary, the peripheral register header files allow for easier code development, they are easy
to use, generates the most efficient code, works great with Code Composer Studio, and TI has
already done the work for you. Just make sure to use the correct header file package for your
device.
Module Objectives
Module Objectives
Module Topics
Reset and Interrupts ..................................................................................................................................4-1
Module Topics..........................................................................................................................................4-2
Reset .........................................................................................................................................................4-3
Reset - Bootloader ...............................................................................................................................4-4
Emulation Boot Mode .........................................................................................................................4-5
Stand-Alone Boot Mode ......................................................................................................................4-6
Reset Code Flow – Summary ..............................................................................................................4-6
Emulation Boot Mode using Code Composer Studio GEL .................................................................4-7
Getting to main() .................................................................................................................................4-8
Interrupts .................................................................................................................................................4-9
Interrupt Processing ...........................................................................................................................4-10
Interrupt Flag Register (IFR) .............................................................................................................4-11
Interrupt Enable Register (IER) .........................................................................................................4-11
Interrupt Global Mask Bit (INTM) ....................................................................................................4-12
Peripheral Interrupt Expansion (PIE) ................................................................................................4-12
PIE Block Initialization .....................................................................................................................4-14
Interrupt Signal Flow – Summary .....................................................................................................4-16
Interrupt Response and Latency ........................................................................................................4-17
Reset
Reset Sources
There are various reset sources available for this device: an external reset pin, watchdog timer
reset, power-on reset which generates a device reset during power-up conditions, brownout reset
which generates a device reset if the power supply drops below specifications for the device, as
well as a missing clock detect reset. Additionally, the device incorporates an on-chip voltage
regulator to generate the core voltage.
Reset - Bootloader
Reset – Bootloader
Reset vector
Reset fetched from
ENPIE = 0 boot ROM
INTM = 1 0x3F FFC0
YES Emulator NO
TRST = JTAG Test Reset EMU_KEY & EMU_BMODE located in PIE at 0x0D00 & 0x0D01, respectively
OTP_KEY & OTP_BMODE located in OTP at 0x3D7BFB & 0x3D7BFE, respectively
After reset, the PIE block is disabled and the global interrupt line is disabled. The reset vector is
fetched from the boot ROM and the bootloader process begins.
Then the bootloader determines if the emulator is connected by checking the JTAG test reset line.
If the emulator is connected, we are in emulation boot mode. The boot is then determined by two
RAM locations named EMU_Key and EMU_BMODE, which are located in the PIE block. If the
emulator is not connected, we are in stand-alone boot mode. The boot is then determined by two
GPIO pins and two OTP locations named OTP_KEY and OTP_BMODE, which are located in
the OTP.
NO Boot Mode
EMU_KEY = 0x55AA ?
Wait
YES
In emulation boot mode, first the EMU_KEY register is checked to see if it has a value of
0x55AA. If either EMU_KEY or EMU_BMODE are invalid, the wait boot mode is used. These
values can then be modified using the debugger and a reset issued to restart the boot process.
This can be considered the default on power-up. At this point, you would like the device to wait
until given a boot mode.
If EMU_KEY register has a value of 0x55AA, then the hex value in the EMU_BMODE register
determines the boot mode. The boot modes are parallel I/O, SCI, SPI, I2C, OTP, CAN,
M0SARAM, FLASH, and Wait. In addition, there is a GetMode, which emulates the stand-alone
boot mode.
NO Boot Mode
OTP_KEY = 0x005A ?
FLASH
GPIO GPIO YES
37 34 Boot Mode OTP_BMODE = Boot Mode
0 0 Parallel I/O 0x0001 SCI
0 1 SCI 0x0004 SPI
1 0 Wait 0x0005 I2C
1 1 GetMode 0x0006 OTP
0x0007 CAN
other FLASH
In stand-alone boot mode, GPIO pins 37 and 34 determine if the boot mode is parallel I/O, SCI,
or wait. The default unconnected pins would set the boot mode to GetMode. In GetMode, first
the OTP_KEY register is checked to see if it has a value of 0x005A. An unprogrammed OTP is
set to the FLASH boot mode, as expected.
If the OTP_KEY register has a value of 0x005A, then the hex value in the OTP_BMODE register
determines the boot mode. The boot modes are SCI, SPI, I2C, OTP, CAN, and FLASH.
0x3D7800 0x3D7800
OTP (1Kw)
0x3D8000
FLASH (128Kw)
0x3F7FF6
The GEL file also provides a function to set the device to “Boot to Flash”:
/********************************************************************/
/* EMU Boot Mode - Set Boot Mode During Debug */
/********************************************************************/
menuitem "EMU Boot Mode Select"
hotmenu EMU_BOOT_SARAM()
{
*0xD00 = 0x55AA; /* EMU_KEY = 0x 55AA */
*0xD01 = 0x000A; /* Boot to SARAM */
}
hotmenu EMU_BOOT_FLASH()
{
*0xD00 = 0x55AA; /* EMU_KEY = 0x 55AA */
*0xD01 = 0x000B; /* Boot to FLASH */
}
To access the GEL file use: Tools Debugger Options Generic Debugger Options
Getting to main()
.sect “codestart”
CodeStartBranch.asm
LB _c_int00
MEMORY
{
PAGE 0:
BEGIN_M0 : origin = 0x000000, length = 0x000002
Linker .cmd }
SECTIONS
{
codestart : > BEGIN_M0, PAGE = 0
}
Note: the above example is for boot mode set to M0 SARAM; to run out of Flash, the
“codestart” section would be linked to the entry point of the Flash memory block
After reset how do we get to main? When the bootloader process is completed, a branch to the
compiler runtime support library is located at the code entry point. This branch to _c_int00 is
executed, then the compiler environment is set up, and finally main is called.
Interrupts
Interrupt Sources
Internal Sources
TINT2
TINT1 F28x CORE
TINT0 XRS
NMI
ePWM, eCAP, eQEP,
PIE INT1
ADC, SCI, SPI, I2C,
(Peripheral
eCAN, McBSP, INT2
Interrupt
DMA, CLA, WD
Expansion) INT3
•
•
•
External Sources
INT12
INT13
XINT1 – XINT3
INT14
TZx
XRS
The internal interrupt sources include the general purpose timers 0, 1, and 2, and all of the
peripherals on the device. External interrupt sources include the three external interrupt lines, the
trip zones, and the external reset pin. The core has 14 interrupt lines. As you can see, the number
of interrupt sources exceeds the number of interrupt lines on the core. The PIE, or Peripheral
Interrupt Expansion block, is connected to the core interrupt lines 1 through 12. This block
manages and expands the 12 core interrupt lines, allowing up to 96 possible interrupt sources.
Interrupt Processing
INT1 1
INT2 0 F28x
Core
INT14 1
It is easier to explain the interrupt processing flow from the core back out to the interrupt sources.
The INTM is the master interrupt switch. This switch must be closed for any interrupts to
propagate into the core. The next layer out is the interrupt enable register. The appropriate
interrupt line switch must be closed to allow an interrupt through. The interrupt flag register gets
set when an interrupt occurs. Once the core starts processing an interrupt, the INTM switch
opens to avoid nested interrupts and the flag is cleared.
The core interrupt registers consists of the interrupt flag register, interrupt enable register, and
interrupt global mask bit. Notice that the interrupt global mask bit is zero when enabled and one
when disabled. The interrupt enable register is managed by ORing and ANDing mask values.
The interrupt global mask bit is managed using inline assembly.
7 6 5 4 3 2 1 0
INT8 INT7 INT6 INT5 INT4 INT3 INT2 INT1
7 6 5 4 3 2 1 0
INT8 INT7 INT6 INT5 INT4 INT3 INT2 INT1
INT1.1 1
INT2.y interrupt group
INT1.2 0
INT3.y interrupt group INT1
• •
INT4.y interrupt group • •
INT5.y interrupt group
• •
INT1.8 1
Peripheral Interrupts
12 Interrupts
INT11.y interrupt group Core
INT13 (TINT1)
INT14 (TINT2)
NMI
We have already discussed the interrupt process in the core. Now we need to look at the
peripheral interrupt expansion block. This block is connected to the core interrupt lines 1 through
12. The PIE block consists of 12 groups. Within each group, there are eight interrupt sources.
Each group has a PIE interrupt enable register and a PIE interrupt flag register.
As you can see, the interrupts are numbered from 1.1 through 12.8, giving us a maximum of 96
interrupt sources. Interrupt lines 13, 14, and NMI bypass the PIE block.
The interrupt assignment table tells us the location for each interrupt source within the PIE block.
Notice the table is numbered from 1.1 through 12.8, perfectly matching the PIE block.
The PIE registers consist of 12 PIE interrupt flag registers, 12 PIE interrupt enable registers, a
PIE interrupt acknowledge register, and a PIE control register. The enable PIE bit in the PIE
control register must be set during initialization for the PIE block to be enabled.
PIE Registers
PIEIFRx register (x = 1 to 12)
15 - 8 7 6 5 4 3 2 1 0
reserved INTx.8 INTx.7 INTx.6 INTx.5 INTx.4 INTx.3 INTx.2 INTx.1
PIECTRL register 15 - 1 0
PIEVECT ENPIE
#include “F2806x_Device.h”
PieCtrlRegs.PIEIFR1.bit.INTx4 = 1; //manually set IFR for XINT1 in PIE group 1
PieCtrlRegs.PIEIER3.bit.INTx2 = 1; //enable EPWM2_INT in PIE group 3
PieCtrlRegs.PIEACK.all = 0x0004; //acknowledge the PIE group 3
PieCtrlRegs.PIECTRL.bit.ENPIE = 1; //enable the PIE
• •
• • Boot ROM
// Core INT1 re-map •
• // Enable PIE Block Reset Vector
• PieCtrlRegs.
•
// Core INT12 re-map PIECTRL.bit.
ENPIE=1;
3
The interrupt vector table, as mapped in the PIE interrupt assignment table, is located in the
PieVect.c file. During initialization in main, we have a function call to PieCtrl.c. In this file, a
memory copy function copies the interrupt vector table to the PIE RAM and then sets ENPIE to
1, enabling the PIE block. This process is done to set up the vectors for interrupts.
CodeStartBranch.asm
.sect “codestart”
_c_int00: rts2800_fpu32.lib
• Interrupt
•
•
CALL main()
PIE Vector Table
In summary, the PIE initialization code flow is as follows. After the device is reset and executes
the boot code, the selected boot option determines the code entry point. This figure shows two
different entry points. The one on the left is for memory block M0, and the one on the right is for
flash.
In either case, CodeStartBranch.asm has a “Long Branch” to the entry point of the runtime
support library. After the runtime support library completes execution, it calls main. In main, we
have a function call to initialize the interrupt process and enable the PIE block. When an
interrupt occurs, the PIE block contains a vector to the interrupt service routine located in
DefaultIsr.c.
In summary, the following steps occur during an interrupt process. First, a peripheral interrupt is
generated and the PIE interrupt flag register is set. If the PIE interrupt enable register is enabled,
then the core interrupt flag register will be set. Next, if the core interrupt enable register and
global interrupt mask is enabled, the PIE vector table will redirect the code to the interrupt service
routine.
Interrupt Latency
Latency
ext. Internal
interrupt interrupt Assumes ISR in
occurs occurs internal RAM
here here
cycles
2 4 3 3 1 3
Recognition Get vector ISR
Sync ext. F1/F2/D1 of Save D2/R1/R2 of instruction
signal delay (3), SP and place ISR return ISR executed
alignment (1), in PC instruction address instruction
(ext. interrupt (3 reg. on next
(3 reg. pairs cycle
interrupt placed in pairs saved)
only) pipeline saved)
Module Objectives
Module Objectives
Module Topics
System Initialization ...................................................................................................................................5-1
Module Topics..........................................................................................................................................5-2
Oscillator/PLL Clock Module ..................................................................................................................5-3
Watchdog Timer .......................................................................................................................................5-7
General-Purpose Digital I/O .................................................................................................................5-12
External Interrupts .................................................................................................................................5-16
Low Power Modes..................................................................................................................................5-17
Register Protection ................................................................................................................................5-19
Lab 5: System Initialization ...................................................................................................................5-21
Internal OSC1CLK
OSC 1 0* WDCLK Watchdog
(10 MHz) 1 Module
OSCCLKSRCSEL
OSCCLKSRC2
MUX
0* CLKIN
1/n C28x
VCOCLK Core
PLL
XCLKINOFF SYSCLKOUT
XCLKIN DIV
0*
EXTCLK LOSPCP
0 1 TMR2CLKSRCSEL
X1
10
XTAL OSC
LSPCLK
11 CPUTMR2CLK SCI, SPI
XTAL
* = default
The oscillator/PLL clock module has two internal, 10 MHz oscillators, and the availability of an
external oscillator or crystal. This provides redundancy in case an oscillator fails, as well as the
ability to use multiple oscillators. The asterisks in the multiplexers show the default settings.
This module has the capability to clock the watchdog, core, and CPU timer 2 from independent
clock sources, if needed.
The on-chip oscillator and phase-locked loop (PLL) block provide all the necessary clocking
signals for the F2806x devices. The two internal oscillators (INTOSC1 and INTOSC2) need no
external components.
MUX
(PLL bypass) CLKIN
1/n Core
VCOCLK LSPCLK
PLL LOSPCP
SysCtrlRegs.PLLCR.bit.DIV
DIV CLKIN SysCtrlRegs.LOSPCP.bit.LSPCLK
00000 OSCCLK / n * (PLL bypass)
00001 OSCCLK x 1 / n DIVSEL n LSPCLK Peripheral Clk Freq
00010 OSCCLK x 2 / n
0x /4 * 000 SYSCLKOUT / 1
00011 OSCCLK x 3 / n
10 /2 001 SYSCLKOUT / 2
00100 OSCCLK x 4 / n
010 SYSCLKOUT / 4 *
00101 OSCCLK x 5 / n 11 /1
011 SYSCLKOUT / 6
00110 OSCCLK x 6 / n * default 100 SYSCLKOUT / 8
00111 OSCCLK x 7 / n
101 SYSCLKOUT / 10
01000 OSCCLK x 8 / n
110 SYSCLKOUT / 12
01001 OSCCLK x 9 / n
111 SYSCLKOUT / 14
01010 OSCCLK x 10 / n
01011 OSCCLK x 11 / n LSBs in reg. – others reserved
01100 OSCCLK x 12 / n
01101 OSCCLK x 13 / n
Input Clock Fail Detect Circuitry
01110 OSCCLK x 14 / n
01111 OSCCLK x 15 / n PLL will issue a “limp mode” clock (1-4 MHz) if input
10000 OSCCLK x 16 / n clock is removed after PLL has locked.
10001 OSCCLK x 17 / n An internal device reset will also be issued (XRSn
10010 OSCCLK x 18 / n pin not driven).
1xx11 reserved
A clock source can be fed directly into the core or multiplied using the PLL. The PLL gives us
the capability to use the internal 10 MHz oscillator multiplied by 18/2, and run the device at the
full 90 MHz clock frequency. If the input clock is removed after the PLL is locked, the input
clock failed detect circuitry will issue a limp mode clock of 1 to 4 MHz. Additionally, an internal
device reset will be issued. The low-speed peripheral clock prescaler is used to clock some of the
communication peripherals.
The PLL has a 4-bit ratio control to select different CPU clock rates. In addition to the on-chip
oscillators, two external modes of operation are supported – crystal operation, and external clock
source operation. Crystal operation allows the use of an external crystal/resonator to provide the
time base to the device. External clock source operation allows the internal (crystal) oscillator to
be bypassed, and the device clocks are generated from an external clock source input on the
XCLKIN pin. The C28x core provides a SYSCLKOUT clock signal. This signal is prescaled to
provide a clock source for some of the on-chip communication peripherals through the low-speed
peripheral clock prescaler. Other peripherals are clocked by SYSCLKOUT and use their own
clock prescalers for operation.
Upper Register:
15 14 13 12 11 10 9 8
NMIRESET XTAL XCLKIN WDHALTI INTOSC2 INTOSC2 INTOSC1 INTOSC1
SEL OSCOFF OFF HALTI OFF HALTI OFF
0 = default
Lower Register:
Watchdog Oscillator
Clock Source Clock Source
0 = internal OSC1 0 = internal OSC1
1 = external or 1 = external or
internal OSC2 internal OSC2
7-5 4-3 2 1 0
The peripheral clock control register allows individual peripheral clock signals to be enabled or
disabled. If a peripheral is not being used, its clock signal could be disabled, thus reducing power
consumption.
Watchdog Timer
The watchdog timer is a safety feature, which resets the device if the program runs away or gets
trapped in an unintended infinite loop. The watchdog counter runs independent of the CPU. If
the counter overflows, a reset or interrupt is triggered. The CPU must write the correct data key
sequence to reset the counter before it overflows.
Watchdog Timer
Resets the C28x if the CPU crashes
Watchdog counter runs independent of CPU
If counter overflows, a reset or interrupt is
triggered (user selectable)
CPU must write correct data key sequence
to reset the counter before overflow
Watchdog must be serviced or disabled
within 131,072 WDCLK cycles after reset
This translates to 13.11 ms with a 10 MHz
WDCLK
The watchdog timer provides a safeguard against CPU crashes by automatically initiating a reset
if it is not serviced by the CPU at regular intervals. In motor control applications, this helps
protect the motor and drive electronics when control is lost due to a CPU lockup. Any CPU reset
will revert the PWM outputs to a high-impedance state, which should turn off the power
converters in a properly designed system.
The watchdog timer is running immediately after system power-up/reset, and must be dealt with
by software soon after. Specifically, you have 13.11 ms (with a 10 MHz watchdog clock) after
any reset before a watchdog initiated reset will occur. This translates into 131,072 WDCLK
cycles, which is a seemingly tremendous amount! Indeed, this is plenty of time to get the
watchdog configured as desired and serviced. A failure of your software to properly handle the
watchdog after reset could cause an endless cycle of watchdog initiated resets to occur.
WDPS WDOVERRIDE
WDCLK /512
Watchdog
Prescaler WDDIS
8-bit Watchdog
Counter
CLR
WDRST
System Output
Reset Pulse
WDCHK WDINT
55 + AA
Detector Good Key 3
/
/ Bad WDCHK Key
3
Watchdog 1 0 1
Reset Key
Register
The watchdog clock is divided by 512 and prescaled, if desired. The watchdog disable switch
allows the watchdog to be enabled and disabled. The watchdog override switch is a safety
mechanism, and once closed, it can only be open by resetting the device.
During initialization, “101” is written into the watchdog check bit fields. Any other values will
cause a reset or interrupt. During run time, the correct keys must be written into the watchdog
key register before the watchdog counter overflows and issues a reset or interrupt. Issuing a reset
or interrupt is user-selectable.
WD Flag Bit
Gets set when the WD causes a reset
• Writing a 1 clears this bit
• Writing a 0 has no effect
15 - 8 7 6 5-3 2-0
15 - 8 7-0
reserved WDKEY
1 AAh No action
2 AAh No action
3 55h WD counter enabled for reset on next AAh write
4 55h WD counter enabled for reset on next AAh write
5 55h WD counter enabled for reset on next AAh write
6 AAh WD counter is reset
7 AAh No action
8 55h WD counter enabled for reset on next AAh write
9 AAh WD counter is reset
10 55h WD counter enabled for reset on next AAh write
11 23h No effect; WD counter not reset on next AAh write
12 AAh No action due to previous invalid value
13 55h WD counter enabled for reset on next AAh write
14 AAh WD counter is reset
15 - 3 2 1 0
GPIO Port A
Register (GPAMUX1)
[GPIO 0 to 15] GPIO Port A
Direction Register Qual
(GPADIR)
GPIO Port A Mux2 [GPIO 0 to 31]
Register (GPAMUX2)
[GPIO 16 to 31]
Register (GPBMUX1)
GPIO Port B
[GPIO 32 to 47] GPIO Port B
Direction Register Qual
(GPBDIR)
GPIO Port B Mux2 [GPIO 32 to 63]
Register (GPBMUX2)
[GPIO 48 to 63]
ANALOG Port
ANALOG Port
ANALOG I/O Mux1 Direction Register
Register (AIOMUX1) (AIODIR)
[AIO 0 to 15] [AIO 0 to 15]
Each general-purpose I/O pin has a maximum of four options, either general-purpose I/O or up to
three possible peripheral pin assignments. This is selected using the GPIO port multiplexer. If
the pin is set to GPIO, the direction register sets it as an input or an output. The input
qualification will be explained shortly.
The GPIO pin block diagram shows a single GPIO pin. If the pin is set as a GPIO by the GPIO
multiplexer, the direction will be set by the GPIO direction register. The GPIO data register will
have the value of the pin if set as an input or write the value of the data register to the pin if set as
an output.
The data register can be quickly and easily modified using set, clear, or toggle registers. As you
can see, the GPIO multiplexer can be set to select up to three other possible peripheral pin
assignments. Also, the pin has an option for an internal pull-up.
SYSCLKOUT
The GPIO input qualification feature allows filtering out noise on a pin. The user would select
the number of samples and qualification period. Qualification is available on ports A and B only
and is individually selectable per pin.
GPACTRL / GPBCTRL
31 24 16 8 0
QUALPRD3 QUALPRD2 QUALPRD1 QUALPRD0
B: GPIO56-63 GPIO48-55 GPIO47-40 GPIO39-32
A: GPIO31-24 GPIO23-16 GPIO15-8 GPIO7-0
Register Description
GPACTRL GPIO A Control Register [GPIO 0 – 31]
GPAQSEL1 GPIO A Qualifier Select 1 Register [GPIO 0 – 15]
GPAQSEL2 GPIO A Qualifier Select 2 Register [GPIO 16 – 31]
GPAMUX1 GPIO A Mux1 Register [GPIO 0 – 15]
GPAMUX2 GPIO A Mux2 Register [GPIO 16 – 31]
GPADIR GPIO A Direction Register [GPIO 0 – 31]
GPAPUD GPIO A Pull-Up Disable Register [GPIO 0 – 31]
GPBCTRL GPIO B Control Register [GPIO 32 – 63]
GPBQSEL1 GPIO B Qualifier Select 1 Register [GPIO 32 – 47]
GPBQSEL2 GPIO B Qualifier Select 2 Register [GPIO 48 – 63]
GPBMUX1 GPIO B Mux1 Register [GPIO 32 – 47]
GPBMUX2 GPIO B Mux2 Register [GPIO 48 – 63]
GPBDIR GPIO B Direction Register [GPIO 32 – 63]
GPBPUD GPIO B Pull-Up Disable Register [GPIO 32 – 63]
AIOMUX1 ANALOG I/O Mux1 Register [AIO 0 – 15]
AIODIR ANALOG I/O Direction Register [AIO 0 – 15]
Register Description
GPADAT GPIO A Data Register [GPIO 0 – 31]
GPASET GPIO A Data Set Register [GPIO 0 – 31]
GPACLEAR GPIO A Data Clear Register [GPIO 0 – 31]
GPATOGGLE GPIO A Data Toggle [GPIO 0 – 31]
GPBDAT GPIO B Data Register [GPIO 32 – 63]
GPBSET GPIO B Data Set Register [GPIO 32 – 63]
GPBCLEAR GPIO B Data Clear Register [GPIO 32 – 63]
GPBTOGGLE GPIO B Data Toggle [GPIO 32 – 63]
AIODAT ANALOG I/O Data Register [AIO 0 – 15]
AIOSET ANALOG I/O Data Set Register [AIO 0 – 15]
AIOCLEAR ANALOG I/O Data Clear Register [AIO 0 – 15]
AIOTOGGLE ANALOG I/O Data Toggle [AIO 0 – 15]
External Interrupts
External Interrupts
Pin Selection Register chooses which pin the signal comes out on
Only one pin can be assigned to each interrupt signal
IDLE off on on on
15 14 - 8 7-2 1-0
WDINTE reserved QUALSTDBY LPM0
* QUALSTDBY will qualify the GPIO wakeup signal in series with the GPIO port qualification.
This is useful when GPIO port qualification is not available or insufficient for wake-up purposes.
Exit
Interrupt GPIO Any
Watchdog
RESET Port A Enabled
Interrupt
Low Power Signal Interrupt
Mode
31 30 29 28 27 26 25 24
23 22 21 20 19 18 17 16
GPIO23 GPIO22 GPIO21 GPIO20 GPIO19 GPIO18 GPIO17 GPIO16
15 14 13 12 11 10 9 8
7 6 5 4 3 2 1 0
GPIO7 GPIO6 GPIO5 GPIO4 GPIO3 GPIO2 GPIO1 GPIO0
Register Protection
Write-Read Protection
DevEmuRegs.DEVICECNF.bit.ENPROT
EALLOW Protection (1 of 2)
EALLOW Protection (2 of 2)
The following registers are protected:
Device Emulation
Flash
Code Security Module
PIE Vector Table
LIN (some registers)
eCANA/B (control registers only; mailbox RAM not protected)
ePWM1-7 and COMP1-3 (some registers)
GPIO (control registers only)
System Control
See device datasheet and peripheral users guides for detailed listings
• Setup the clock module – PLL, LOSPCP = /4, low-power modes to default values, enable all
module clocks
• Disable the watchdog – clear WD flag, disable watchdog, WD prescale = 1
• Setup the watchdog and system control registers – DO NOT clear WD OVERRIDE bit,
configure WD to generate a CPU reset
• Setup the shared I/O pins – set all GPIO pins to GPIO function (e.g. a "00" setting for GPIO
function, and a “01”, “10”, or “11” setting for a peripheral function)
The first part of the lab exercise will setup the system initialization and test the watchdog
operation by having the watchdog cause a reset. In the second part of the lab exercise the PIE
vectors will be added and tested by using the watchdog to generate an interrupt. This lab will
make use of the F2806x C-code header files to simplify the programming of the device, as well as
take care of the register definitions and addresses. Please review these files, and make use of
them in the future, as needed.
Procedure
2. Right-click on Lab5 in the Project Explorer window and add (copy) the
following files to the project (Add Files…) from C:\C28x\Labs\Lab5\Files:
CodeStartBranch.asm Lab.h
DelayUs.asm Lab_5_6_7.cmd
F2806x_DefaultIsr.h Main_5.c
F2806x_GlobalVariableDefs.c SysCtrl.c
F2806x_Headers_nonBIOS.cmd Watchdog.c
Gpio.c
Modify the linker command file Lab_5_6_7.cmd to create a new memory block
named BEGIN_M0: origin = 0x000000, length = 0x0002, in program memory. You will
also need to modify the existing memory block M0SARAM in data memory to avoid any
overlaps with this new memory block.
5. In the linker command file, notice that RESET in the MEMORY section has been defined
using the “(R)” qualifier. This qualifier indicates read-only memory, and is optional. It
will cause the linker to flag a warning if any uninitialized sections are linked to this
memory. The (R) qualifier can be used with all non-volatile memories (e.g., flash, ROM,
OTP), as you will see in later lab exercises.
9. Click the “Debug” button (green bug). The “CCS Debug Perspective” view should
open, the program will load automatically, and you should now be at the start of
main().
10. After CCS loaded the program in the previous step, it set the program counter (PC) to
point to _c_int00. It then ran through the C-environment initialization routine in the
rts2800_fpu32.lib and stopped at the start of main(). CCS did not do a device
reset, and as a result the bootloader was bypassed.
In the remaining parts of this lab exercise, the device will be undergoing a reset due to the
watchdog timer. Therefore, we must configure the device by loading values into
EMU_KEY and EMU BMODE so the bootloader will jump to “M0 SARAM” at address
0x000000. Set the bootloader mode using the menu bar by clicking:
Scripts EMU Boot Mode Select EMU_BOOT_SARAM
If the device is power cycled between lab exercises, or within a lab exercise, be sure to
re-configure the boot mode to EMU_BOOT_SARAM.
12. Place the cursor on the first line of code in main() and set a breakpoint by double
clicking in the line number field to the left of the code line. Notice that line is
highlighted with a blue dot indicating that the breakpoint has been set. (Alternately, you
can set a breakpoint on the line by right-clicking the mouse and selecting Breakpoint
(Code Composer Studio) Breakpoint). The breakpoint is set to prove
that the watchdog is disabled. If the watchdog causes a reset, code execution will stop at
this breakpoint.
13. Run your code for a few seconds by using the “Resume” button on the toolbar, or by
using Run Resume on the menu bar (or F8 key). After a few seconds halt your
code by using the “Suspend” button on the toolbar, or by using Run Suspend on
the menu bar (or Alt-F8 key). Where did your code stop? Are the results as expected? If
things went as expected, your code should be in the “main loop”.
14. Switch to the “CCS Edit Perspective” view by clicking the CCS Edit icon in the upper
right-hand corner. Modify the InitWatchdog() function to enable the watchdog
(WDCR). This will enable the watchdog to function and cause a reset. Save the file.
15. Click the “Build” button. Select Yes to “Reload the program automatically”. Switch
back to the “CCS Debug Perspective” view by clicking the CCS Debug icon in the
upper right-hand corner.
16. Like before, place the cursor in the “main loop” section (on the asm(“ NOP”);
instruction line) and right click the mouse key and select Run To Line.
17. Run your code. Where did your code stop? Are the results as expected? If things went
as expected, your code should have stopped at the breakpoint. What happened is as
follows. While the code was running, the watchdog timed out and reset the processor.
The reset vector was then fetched and the ROM bootloader began execution. Since the
device is in emulation boot mode (i.e. the emulator is connected) the bootloader read the
EMU_KEY and EMU_BMODE values from the PIE RAM. These values were
previously set for boot to M0 SARAM boot mode by CCS. Since these values did not
change and are not affected by reset, the bootloader transferred execution to the
beginning of our code at address 0x000000 in the M0SARAM, and execution continued
until the breakpoint was hit in main( ).
DefaultIsr_5.c
PieCtrl.c
PieVect.c
Check your files list to make sure the files are there.
19. In Main_5.c, add code to call the InitPieCtrl() function. There are no passed
parameters or return values, so the call code is simply:
InitPieCtrl();
20. Using the “PIE Interrupt Assignment Table” shown in the previous module find the
location for the watchdog interrupt, “WAKEINT”. This will be used in the next step.
PIE group #: # within group:
22. In Watchdog.c modify the system control and status register (SCSR) to cause the
watchdog to generate a WAKEINT rather than a reset. Save all changes to the files.
23. Open and inspect DefaultIsr_5.c. This file contains interrupt service routines. The
ISR for WAKEINT has been trapped by an emulation breakpoint contained in an inline
assembly statement using “ESTOP0”. This gives the same results as placing a breakpoint
in the ISR. We will run the lab exercise as before, except this time the watchdog will
generate an interrupt. If the registers have been configured properly, the code will be
trapped in the ISR.
24. Open and inspect PieCtrl.c. This file is used to initialize the PIE RAM and enable
the PIE. The interrupt vector table located in PieVect.c is copied to the PIE RAM to
setup the vectors for the interrupts. Close the modified and inspected files.
29. Next, close the project by right-clicking on Lab5 in the Project Explorer window
and select Close Project.
End of Exercise
Note: By default, the watchdog timer is enabled out of reset. Code in the file
CodeStartBranch.asm has been configured to disable the watchdog. This can be
important for large C code projects (ask your instructor if this has not already been
explained). During this lab exercise, the watchdog was actually re-enabled (or disabled
again) in the file Watchdog.c.
Module Objectives
Module Objectives
Module Topics
Analog-to-Digital Converter and Comparator ........................................................................................6-1
Module Topics..........................................................................................................................................6-2
Analog-to-Digital Converter ....................................................................................................................6-3
ADC Block and Functional Diagrams .................................................................................................6-3
ADC Triggering ...................................................................................................................................6-4
ADC Conversion Priority ....................................................................................................................6-6
ADC Clock and Timing .......................................................................................................................6-8
ADC Converter Registers ....................................................................................................................6-9
Signed Input Voltages .......................................................................................................................6-14
ADC Calibration and Reference ........................................................................................................6-15
Comparator ............................................................................................................................................6-17
Comparator Block Diagram...............................................................................................................6-17
Comparator Registers ........................................................................................................................6-18
Lab 6: Analog-to-Digital Converter ......................................................................................................6-19
Analog-to-Digital Converter
ADC Block and Functional Diagrams
MUX
RESULT2
Converter MUX
ADCINB0
ADCINB1 MUX S/H SOCx RESULT15
B B
ADCINB7
ADC EOCx ADC ADCINT1-9
ADC full-scale CHSEL Generation Interrupt
input range is Logic Logic
0 to 3.3V
SOCx Signal ADCINT1
ADCINT2
SOC0 TRIGSEL CHSEL ACQPS
SOCx Triggers
The ADC module is based around a 12-bit converter. There are 16 input channels and 16 result
registers. The SOC configuration registers select the trigger source, channel to convert, and the
acquisition prescale window size. The triggers include software by selecting a bit, CPU timers 0,
1 and 2, EPWMA and EPWMB 1 through 8, and an external pin. Additionally, ADCINT 1 and 2
can be fed back for continuous conversions.
The ADC module can operate in sequential sampling mode or simultaneous sampling mode. In
simultaneous sampling mode, the channel selected on the A multiplexer will be the same channel
on the B multiplexer. The ADC interrupt logic can generate up to nine interrupts. The results for
SOC 0 through 15 will appear in result registers 0 through 15.
Software Trigger
ADCSOCxCTL
TINT0 (CPU Timer 0)
ADCINT1
TINT1 (CPU Timer 1) T
ADCRESULTx ADCINT2
TINT2 (CPU Timer 2) r
i ADCINT3
XINT2_ADCSOC (GPIO)
g ADCINT4
SOCA (ePWM1) Channel Sample Result
g ADCINT5
SOCB (ePWM1) S Select Window Register E
e O ADCINT6
O
r C C ADCINT7
SOCA (ePWM8) x x
ADCINT8
SOCB (ePWM8)
ADCINT9
ADCINTSOCSEL1
ADCINTSOCSEL2
ADCINT1
INTSELxNy
ADCINT2
Re-Trigger
ADC Triggering
SOCB (ETPWM1)
SOC0 Channel Sample Result0 no interrupt
A2 7 cycles
SOC1 Channel Sample
B3 10 cycles Result1 no interrupt
Software Trigger
The top example on this slide shows channels A2, B3, and A7 being converted with a trigger
from EPWM1SOCB. After A7 is converted, ADCINT1 is generated.
The bottom examples extends this with channels A0, B0, and A5 being converted initially with a
software trigger. After A5 is converted, ADCINT2 is generated, which is fed back as a trigger to
start the process again.
The example on this slide shows channels A/B 0 through 7 being converted in simultaneous
sampling mode, triggered initially by software. After channel A/B three is converted, ADCINT1
is generated. After channel A/B seven is converted, ADCINT2 is generated and fed back to start
the process again. ADCINT1 and ADCINT2 are being used as ping-pong interrupts.
High Priority
High priority SOC will interrupt the round robin
wheel after current conversion completes and
insert itself as the next conversion
After its conversion completes, the round robin
wheel will continue where it was interrupted
SOC0
SOC1 SOC Priority
SOC2 Determines cutoff point
SOC3 for high priority and
round robin mode
SOC4
SOCPRIORITY
SOC5
SOC6 AdcRegs.SOCPRICTL
SOC7
Round Robin
SOC8 RRPOINTER
SOC9
SOC10 Round Robin Pointer
SOC11 Points to the last converted
SOC12 round robin SOCx and
SOC13 determines order
of conversions
SOC14
SOC15
SOCPRIORITY configured as 0;
RRPOINTER configured as 15;
SOC0 is highest RR priority SOC
SOC
SOC 0
15 1
SOC7 trigger received SOC SOC
14 2
SOC SOC
SOC12 is converted; 10 6
RRPOINTER points to SOC12; SOC SOC
SOC13 is now highest RR priority 9 SOC 7
8
SOC2 is converted;
RRPOINTER points to SOC2;
SOC3 is now highest RR priority
SOCPRIORITY configured as 4;
RRPOINTER configured as 15;
SOC4 is highest RR priority
SOC
SOC 4
SOC
SOC7 trigger received High Priority 15 5
SOC
0 SOC SOC
SOC7 is converted; 14 6
RRPOINTER points to SOC7;
SOC8 is now highest RR priority SOC
1
SOC SOC
13 RRPOINTER 7
SOC2 & SOC12 triggers received SOC
simultaneously 2
SOC SOC
SOC 12 8
SOC2 is converted; 3
RRPOINTER stays pointing to SOC7
SOC SOC
11 SOC 9
10
SOC12 is converted;
RRPOINTER points to SOC12;
SOC13 is now highest RR priority
ADCCTL2
To ADC
CLKDIV ADCCLK (45 MHz) pipeline
bits
001b (/2)
ADCSOCxCTL
sampling
ACQ_PS window
bits
0110b
sampling window = (ACQ_PS + 1)*(1/ADCCLK)
45 MHz
= 3.46 MSPS
13 cycles / 1 sample
Generate Early
Interrupt “A” Channel Generate Late Generate Late
Interrupt “A” Channel Interrupt “B” Channel
&
Generate Early Start Sampling Next Channel
Interrupt “B” Channel
45 MHz
= 3.46 MSPS
26 cycles / 2 sample
Upper Register:
15 14 13 12 - 8
RESET ADCENABLE ADCBSY ADCBSYCHN
Lower Register:
ADC Reference ADC Reference Temperature
ADC Power Down Power Down Select Sensor Convert
0 = analog circuitry 0 = reference circuitry 0 = internal 0 = not connected
powered down powered down 1 = external 1 = connected (A5)
1 = analog circuitry 1 = reference circuitry (VREFHI/VREFLO)
powered up powered up
7 6 5 4 3 2 1 0
ADCPWN ADCBGPWN ADCREFPWD reserved ADCREF
SEL
INTPULSE VREFLO TEMP
POS CONV CONV
15 - 3 2 1 0
reserved CLKDIV4EN ADCNONOVERLAP CLKDIV2EN
00h = software
01h = CPU Timer 0 Sampling Window
Sequential S/M Simultaneous S/M
02h = CPU Timer 1
(SIMULENx=0) (SIMULENx=1) 00h – 05h = invalid
03h = CPU Timer 2
0h = ADCINA0 0h = ADCINA0/B0 06h = 7 cycles long
04h = XINT2SOC
1h = ADCINA1 1h = ADCINA1/B1 07h = 8 cycles long
05h = ePWM1SOCA
2h = ADCINA2 2h = ADCINA2/B2 08h = 9 cycles long
06h = ePWM1SOCB
3h = ADCINA3 3h = ADCINA3/B3 09h = 10 cycles long
07h = ePWM2SOCA
08h = ePWM2SOCB 4h = ADCINA4 4h = ADCINA4/B4
09h = ePWM3SOCA 5h = ADCINA5 5h = ADCINA5/B5
6h = ADCINA6 6h = ADCINA6/B6 3Fh = 64 cycles long
0Ah = ePWM3SOCB
0Bh = ePWM4SOCA 7h = ADCINA7 7h = ADCINA7/B7
0Ch = ePWM4SOCB 8h = ADCINB0 8h – Fh = invalid
0Dh = ePWM5SOCA 9h = ADCINB1
0Eh = ePWM5SOCB Ah = ADCINB2
0Fh = ePWM6SOCA Bh = ADCINB3
10h = ePWM6SOCB Ch = ADCINB4
11h = ePWM7SOCA Dh = ADCINB5
12h = ePWM7SOCB Eh = ADCINB6
Not available in 13h = ePWM8SOCA Fh = ADCINB7
F2803x 14h = ePWM8SOCB
ADCINTSOCSEL2
15 - 14 13 - 12 11 - 10 9-8 7-6 5-4 3-2 1-0
SOC15 SOC14 SOC13 SOC12 SOC11 SOC10 SOC9 SOC8
ADCINTSOCSEL1
15 - 14 13 - 12 11 - 10 9-8 7-6 5-4 3-2 1-0
SOC7 SOC6 SOC5 SOC4 SOC3 SOC2 SOC1 SOC0
15 - 8
reserved
7 6 5 4 3 2 1 0
SIMULEN14 SIMULEN12 SIMULEN10 SIMULEN8 SIMULEN6 SIMULEN4 SIMULEN2 SIMULEN0
00h = SOC0 last converted, SOC1 highest priority 00h = round robin mode for all channels
01h = SOC1 last converted, SOC2 highest priority 01h = SOC0 high priority, SOC1-15 round robin
02h = SOC2 last converted, SOC3 highest priority 02h = SOC0-1 high priority, SOC2-15 round robin
03h = SOC3 last converted, SOC4 highest priority 03h = SOC0-2 high priority, SOC3-15 round robin
04h = SOC4 last converted, SOC5 highest priority 04h = SOC0-3 high priority, SOC4-15 round robin
05h = SOC5 last converted, SOC6 highest priority 05h = SOC0-4 high priority, SOC5-15 round robin
06h = SOC6 last converted, SOC7 highest priority 06h = SOC0-5 high priority, SOC6-15 round robin
07h = SOC7 last converted, SOC8 highest priority 07h = SOC0-6 high priority, SOC7-15 round robin
08h = SOC8 last converted, SOC9 highest priority 08h = SOC0-7 high priority, SOC8-15 round robin
09h = SOC9 last converted, SOC10 highest priority 09h = SOC0-8 high priority, SOC9-15 round robin
0Ah = SOC10 last converted, SOC11 highest priority 0Ah = SOC0-9 high priority, SOC10-15 round robin
0Bh = SOC11 last converted, SOC12 highest priority 0Bh = SOC0-10 high priority, SOC11-15 round robin
0Ch = SOC12 last converted, SOC13 highest priority 0Ch = SOC0-11 high priority, SOC12-15 round robin
0Dh = SOC13 last converted, SOC14 highest priority 0Dh = SOC0-12 high priority, SOC13-15 round robin
0Eh = SOC14 last converted, SOC15 highest priority 0Eh = SOC0-13 high priority, SOC14-15 round robin
0Fh = SOC15 last converted, SOC0 highest priority 0Fh = SOC0-14 high priority, SOC15 round robin
1xh = invalid selection 10h = all SOCs high priority (arbitrated by SOC #)
20h = reset value (no SOC has been converted) 1xh = invalid selection
ADCLO
GND
2) Subtract “1.65” from the digital result
#include “F2806x_Device.h”
#define offset 0x07FF
void main(void)
{
int16 value; // signed
* +/-15 LSB offset, +/-30 LSB gain. See device datasheet for exact specifications
15 - 5 4 3 2-0
reserved ADCREFSEL
* See device datasheet for exact specifications and ADC reference hardware connections
Comparator
Comparator Block Diagram
Comparator
A0
B0
A1
B1
A2
AIO2 10-bit COMP1OUT
COMP1
AIO10 DAC
B2
A3
B3
A4 ADC
AIO4 10-bit COMP2OUT
COMP2
AIO12 DAC
B4
A5
B5
A6
AIO6 10-bit COMP3OUT
COMP3
AIO14 DAC
B6
A7
B7
This device has three analog comparators that share the input pins with the analog-to-digital
converter module. If neither the ADC or comparator input pins are needed, the input pins can be
used as analog I/O pins. As you can see, one of the inputs to the comparator comes directly from
the input pin, and the other input can be taken from the input pin or the 10-bit digital-to-analog
converter. The output of the comparator is fed into the ePWM digital compare sub-module.
COMPx 0 ePWM
Input Pin B 1 0 Event
- 1 SYSCLKOUT COMPxTRIP Trigger
VDDA 10-bit V
0 &
VSSA DAC Sync/ 1 GPIO
Qual
COMPSOURCE CMPINV MUX
1 0 DACSOURCE RAMPSOURCE QUALSEL COMPSTS
00 PWMSYNC1
DACVAL
Ramp 01 PWMSYNC2
Generator 10 PWMSYNC3
11 PWMSYNC4
Comparator Registers
Comparator Registers
AdcRegs.COMPCTL – Compare Control Register
15 - 9 8 7-3 2 1 0
reserved SYNCSEL QUALSEL CMPINV COMPSOURCE COMPDACE
ADCINA0
...
ePWM2 triggering
ADC on period match
using SOCA trigger every
20 µs (50 kHz) View ADC
buffer PWM
Samples
Code Composer
Studio
ePWM2
Recall that there are three basic ways to initiate an ADC start of conversion (SOC):
1. Using software
a. SOCx bit (where x = 0 to 15) in the ADC SOC Force 1 Register (ADCSOCFRC1) causes a
software initiated conversion
2. Automatically triggered on user selectable conditions
a. CPU Timer 0/1/2 interrupt
b. ePWMxSOCA / ePWMxSOCB (where x = 1 to 7)
- ePWM underflow (CTR = 0)
- ePWM period match (CTR = PRD)
- ePWM underflow or period match (CTR = 0 or PRD)
- ePWM compare match (CTRU/D = CMPA/B)
c. ADC interrupt ADCINT1 or ADCINT2
- triggers SOCx (where x = 0 to 15) selected by the ADC Interrupt Trigger SOC Select1/2
Register (ADCINTSOCSEL1/2)
3. Externally triggered using a pin
a. ADCSOC pin (GPIO/XINT2_ADCSOC)
One or more of these methods may be applicable to a particular application. In this lab, we will
be using the ADC for data acquisition. Therefore, one of the ePWMs (ePWM2) will be
configured to automatically trigger the SOCA signal at the desired sampling rate (ePWM period
match CTR = PRD SOC method 2b above). The ADC end-of-conversion interrupt will be used
to prompt the CPU to copy the results of the ADC conversion into a results buffer in memory.
This buffer pointer will be managed in a circular fashion, such that new conversion results will
continuously overwrite older conversion results in the buffer. In order to generate an interesting
input signal, the code also alternately toggles a GPIO pin (GPIO18) high and low in the ADC
interrupt service routine. The ADC ISR will also toggle LED LD3 on the controlCARD as a
visual indication that the ISR is running. This pin will be connected to the ADC input pin, and
sampled. After taking some data, Code Composer Studio will be used to plot the results. A flow
chart of the code is shown in the following slide.
Notes
• Program performs conversion on ADC channel A0 (ADCINA0 pin)
• ADC conversion is set at a 50 kHz sampling rate
• ePWM2 is triggering the ADC on period match using SOCA trigger
• Data is continuously stored in a circular buffer
• GPIO18 pin is also toggled in the ADC ISR
• ADC ISR will also toggle the controlCARD LED LD3 as a visual indication that it is running
Procedure
Adc.c Gpio.c
CodeStartBranch.asm Lab.h
DefaultIsr_6.c Lab_5_6_7.cmd
DelayUs.asm Main_6.c
EPwm_6.c PieCtrl.c
F2806x_DefaultIsr.h PieVect.c
F2806x_GlobalVariableDefs.c SysCtrl.c
F2806x_Headers_nonBIOS.cmd Watchdog.c
8. Click the “Debug” button (green bug). The “Debug Perspective” view should open, the
program will load automatically, and you should now be at the start of main(). If the
device has been power cycled since the last lab exercise, be sure to configure the boot
mode to EMU_BOOT_SARAM using the Scripts menu.
Note: Exercise care when connecting any wires, as the power to the USB Docking Station is
on, and we do not want to damage the controlCARD!
11. Using a connector wire provided, connect the ADCINA0 (pin # ADC-A0) to “GND” (pin
# GND) on the Docking Station. Then run the code again, and halt it after a few seconds.
Verify that the ADC results buffer contains the expected value of ~0x0000. Note that
you may not get exactly 0x0000 if the device you are using has positive offset error.
12. Adjust the connector wire to connect the ADCINA0 (pin # ADC-A0) to “+3.3V” (pin #
GPIO-20) on the Docking Station. (Note: pin # GPIO-20 has been set to “1” in Gpio.c).
Then run the code again, and halt it after a few seconds. Verify that the ADC results
buffer contains the expected value of ~0x0FFF. Note that you may not get exactly
0x0FFF if the device you are using has negative offset error.
13. Adjust the connector wire to connect the ADCINA0 (pin # ADC-A0) to GPIO18 (pin #
GPIO-18) on the Docking Station. Then run the code again, and halt it after a few
seconds. Examine the contents of the ADC results buffer (the contents should be
alternating ~0x0000 and ~0x0FFF values). Are the contents what you expected?
14. Open and setup a graph to plot a 50-point window of the ADC results buffer.
Click: Tools Graph Single Time and set the following values:
15. Recall that the code toggled the GPIO18 pin alternately high and low. (Also, the ADC
ISR is toggling the LED LD3 on the controlCARD as a visual indication that the ISR is
running). If you had an oscilloscope available to display GPIO18, you would expect to
see a square-wave. Why does Code Composer Studio plot resemble a triangle wave?
What is the signal processing term for what is happening here?
16. Recall that the program toggled the GPIO18 pin at a 50 kHz rate. Therefore, a complete
cycle (toggle high, then toggle low) occurs at half this rate, or 25 kHz. We therefore
expect the period of the waveform to be 40 µs. Confirm this by measuring the period of
the triangle wave using the “measurement marker mode” graph feature. In the graph
window toolbar, left-click on the ruler icon with the red arrow. Note when you hover
your mouse over the icon, it will show “Toggle Measurement Marker Mode”.
Move the mouse to the first measurement position and left-click. Again, left-click on the
Toggle Measurement Marker Mode icon. Move the mouse to the second
measurement position and left-click. The graph will automatically calculate the
difference between the two values taken over a complete waveform period. When done,
clear the measurement points by right-clicking on the graph and select Remove All
Measurement Marks (or Ctrl+Alt+M).
Click OK.
Note: Decreasing the “Continuous refresh interval” causes all enabled continuous refresh
windows to refresh at a faster rate. This can be problematic when a large number of
windows are enabled, as bandwidth over the emulation link is limited. Updating too
many windows can cause the refresh frequency to bog down. In this case you can just
selectively enable continuous refresh for the individual windows of interest.
18. Next we need to enable the graph window for continuous refresh. Select the “Single
Time” graph. In the graph window toolbar, left-click on the yellow icon with the arrows
rotating in a circle over a pause sign. Note when you hover your mouse over the icon, it
will show “Enable Continuous Refresh”. This will allow the graph to
continuously refresh in real-time while the program is running.
19. Enable the Memory Browser for continuous refresh using the same procedure as the
previous step.
20. Code Composer Studio includes Scripts that are functions which automate entering and
exiting real-time mode. Four functions are available:
• Run_Realtime_with_Reset (reset CPU, enter real-time mode, run CPU)
• Run_Realtime_with_Restart (restart CPU, enter real-time mode, run CPU)
• Full_Halt (exit real-time mode, halt CPU)
• Full_Halt_with_Reset (exit real-time mode, halt CPU, reset CPU)
These Script functions are executed by clicking:
Scripts Realtime Emulation Control Function
In the remaining lab exercises we will be using the first and third above Script functions
to run and halt the code in real-time mode.
21. Run the code and watch the windows update in real-time mode. Click:
Scripts Realtime Emulation Control Run_Realtime_with_Reset
22. Carefully remove and replace the connector wire from GPIO18. Are the values updating
in the Memory Browser and Single Time graph as expected?
24. So far, we have seen data flowing from the MCU to the debugger in realtime. In this
step, we will flow data from the debugger to the MCU.
• Open and inspect Main_6.c. Notice that the global variable DEBUG_TOGGLE is
used to control the toggling of the GPIO18 pin. This is the pin being read with the
ADC.
• Highlight DEBUG_TOGGLE with the mouse, right click and select “Add Watch
Expression…” and then select OK. The global variable DEBUG_TOGGLE should
now be in the “Expressions” window with a value of “1”.
• Enable the “Expressions” window for continuous refresh
• Run the code in real-time mode and change the value to “0”. Are the results shown
in the memory and graph window as expected? Change the value back to “1”. As
you can see, we are modifying data memory contents while the processor is running
in real-time (i.e., we are not halting the MCU nor interfering with its operation in any
way)! When done, fully halt the CPU.
26. Next, close the project by right-clicking on Lab6 in the Project Explorer window
and select Close Project.
Optional Exercise
If you finish early, you might want to experiment with the code by observing the effects of
changing the OFFTRIM value. Open a watch window to the AdcRegs.ADCOFFTRIM register
and change the OFFTRIM value. If you did not get 0x0000 in step 11, you can calibrate out the
offset of your device. If you did get 0x0000, you can determine if you actually had zero offset, or
if the offset error of your device was negative. (If you do not have time to work on this optional
exercise, you may want to try this after the class).
End of Exercise
Module Objectives
Module Objectives
Note: Different numbers of ePWM, eCAP, and eQEP modules are available on F2806x
devices. See the device datasheet for more information.
Module Topics
PWM Review
What is Pulse Width Modulation?
PWM is a scheme to represent a
signal as a sequence of pulses
fixed carrier frequency
fixed pulse amplitude
pulse width proportional to
instantaneous signal amplitude
PWM energy ≈ original signal energy
t t
T
Original Signal PWM representation
Pulse width modulation (PWM) is a method for representing an analog signal with a digital
approximation. The PWM signal consists of a sequence of variable width, constant amplitude
pulses which contain the same total energy as the original analog signal. This property is
valuable in digital motor control as sinusoidal current (energy) can be delivered to the motor
using PWM signals applied to the power converter. Although energy is input to the motor in
discrete packets, the mechanical inertia of the rotor acts as a smoothing filter. Dynamic motor
motion is therefore similar to having applied the sinusoidal currents directly.
DC Supply DC Supply
? PWM
Desired PWM approx.
signal to of desired
system signal
Unknown Gate Signal Gate Signal Known with PWM
Power-switching devices are difficult to control in the proportional region but are easy to control
in the saturation and cutoff region. Since PWM is a digital signal and easy for microcontrollers to
generate, it is ideal for use with power-switching devices.
ePWM
ePWM Module Signals and Connections
ePWMx-1
EPWMxSYNCI EPWMxTZINT
GPIO TZ1 – TZ3
EPWMxINT PIE
MUX
EQEP1ERR – TZ4 EPWMxA
eQEP1
GPIO
CLOCKFAIL – TZ5 ePWMx EPWMxB
SYSCTRL MUX
EMUSTOP – TZ6
CPU
EPWMxSOCA
COMPxOUT EPWMxSOCB ADC
COMP
EPWMxSYNCO
ePWMx+1
An ePWM module can be synchronized with adjacent ePWM modules. The generated PWM
waveforms are available as outputs on the GPIO pins. Additionally, the EPWM module can
generate ADC starter conversion signals and generate interrupts to the PIE block. External trip
zone signals can trip the output and generate interrupts, too. The outputs of the comparators are
used as inputs to the digital compare sub-module. Next, we will look at the internal details of the
ePWM module.
16-Bit
Compare Action Dead
Time-Base
TBCLK Logic Qualifier Band
Counter
EPWMxSYNCI EPWMxSYNCO
Period
Register EPWMxA
PWM Trip
Shadowed
Chopper Zone
SYSCLKOUT EPWMxB
TZy
Digital TZ1-TZ3
Compare COMPxOUT
The ePWM, or enhanced PWM block diagram, consists of a series of sub-modules. In this
section, we will learn about the operation and details of each sub-module.
16-Bit
Compare Action Dead
Time-Base
TBCLK Logic Qualifier Band
Counter
EPWMxSYNCI EPWMxSYNCO
Period
Register EPWMxA
PWM Trip
Shadowed
Chopper Zone
SYSCLKOUT EPWMxB
TZy
Digital TZ1-TZ3
Compare COMPxOUT
In the time-base sub-module, the clock prescaler divides down the device core system clock and
clocks the 16-bit time-base counter. The time-base counter is used to generate asymmetrical and
symmetrical waveforms using three different count modes: count-up mode, countdown mode, and
count up and down mode. A period register is used to control the maximum count value.
Additionally, the time-base counter has the capability to be synchronized and phase-shifted with
other ePWM units.
TBPRD
Asymmetrical
Waveform
Count Up Mode
TBCTR
TBPRD
Asymmetrical
Waveform
TBPRD
Symmetrical
Waveform
The upper two figures show the time-base counter in the count-up mode and countdown mode.
These modes are used to generate asymmetrical waveforms. The lower figure shows the time-
base counter in the count up and down mode. This mode is used to generate symmetrical
waveforms.
Phase
φ=0°
En
o o .
SyncIn
EPWM1A
o
CTR=zero o
CTR=CMPB o o EPWM1B
X o
SyncOut
To eCAP1
SyncIn
Phase
φ=120°
En
o o .
SyncIn
EPWM2A φ=120°
o
CTR=zero o
CTR=CMPB o o EPWM2B
X o
SyncOut
Phase
φ=240°
En
o o .
SyncIn
EPWM3A
φ=120°
o
CTR=zero o
CTR=CMPB o o EPWM3B
X o
SyncOut φ=240°
Upper Register:
Phase Direction
0 = count down after sync
1 = count up after sync TBCLK = SYSCLKOUT / (HSPCLKDIV * CLKDIV)
15 - 14 13 12 - 10 9-7
FREE_SOFT PHSDIR CLKDIV HSPCLKDIV
Lower Register:
Counter Mode
00 = count up
Software Force Sync Pulse 01 = count down
0 = no action 10 = count up and down
1 = force one-time sync 11 = stop – freeze (default)
6 5-4 3 2 1-0
SWFSYNC SYNCOSEL PRDLD PHSEN CTRMODE
16-Bit
Compare Action Dead
Time-Base
TBCLK Logic Qualifier Band
Counter
EPWMxSYNCI EPWMxSYNCO
Period
Register EPWMxA
PWM Trip
Shadowed
Chopper Zone
SYSCLKOUT EPWMxB
TZy
Digital TZ1-TZ3
Compare COMPxOUT
The compare sub-module uses two compare registers to detect time-base count matches. These
compare match events are fed into the action qualifier sub-module. Notice that the output of this
block feeds two signals into the action qualifier.
Count Up Mode
TBCTR
TBPRD .. .. ..
. .. .. ..
CMPA Asymmetrical
CMPB Waveform
.. ..
TBCTR
TBPRD
. .
.. ... ..
CMPA Symmetrical
CMPB Waveform
The ePWM Compare Event Waveforms figures shows the compare matches that are fed into the
action qualifier. Notice that with the count up and countdown mode, there are matches on the up-
count and down-count.
15 - 10 9 8 7
reserved SHDWBFULL SHDWAFULL reserved
6 5 4 3-2 1-0
SHDWBMODE reserved SHDWAMODE LOADBMODE LOADAMODE
CMPA and CMPB Operating Mode CMPA and CMPB Shadow Load Mode
0 = shadow mode; 00 = load on CTR = 0
double buffer w/ shadow register 01 = load on CTR = PRD
1 = immediate mode; 10 = load on CTR = 0 or PRD
shadow register not used 11 = freeze (no load possible)
16-Bit
Compare Action Dead
Time-Base
TBCLK Logic Qualifier Band
Counter
EPWMxSYNCI EPWMxSYNCO
Period
Register EPWMxA
PWM Trip
Shadowed
Chopper Zone
SYSCLKOUT EPWMxB
TZy
Digital TZ1-TZ3
Compare COMPxOUT
The action qualifier sub-module uses the inputs from the compare logic and time-base counter to
generate various actions on the output pins. These first few modules are the main components
used to generate a basic PWM waveform.
SW Z CA CB P Do Nothing
X X X X X
SW Z CA CB P Clear Low
↓ ↓ ↓ ↓ ↓
SW Z CA CB P Set High
↑ ↑ ↑ ↑ ↑
SW Z CA CB P
Toggle
T T T T T
This table shows the various action qualifier compare-match options for when the time-base
counter equals zero, compare A match, compare B match, and period match. Based on the
selected match option, the output pins can be configured to do nothing, clear low, set high, or
toggle. Also, the output pins can be forced to any action using software.
TBCTR
. .
TBPRD
. .
. .
CMPA
. . .
CMPB
Z P CB CA Z P CB CA Z P
↑ X X ↓ ↑ X X ↓ ↑ X
EPWMA
Z P CB CA Z P CB CA Z P
↑ X ↓ X ↑ X ↓ X ↑ X
EPWMB
The next few figures show how the action qualifier uses the compare matches to modulate the
output pins. Notice that the output pins for EPWMA and EPWMB are completely independent.
Here, on the EPWMA output, the waveform will be set high on zero match and clear low on
compare A match. On the EPWMB output, the waveform will be set high on zero match and
clear low on compare B match.
TBCTR
. .
TBPRD
. .
. .
CMPB
. . .
CMPA
CA CB CA CB
↑ ↓ ↑ ↓
EPWMA
Z Z Z
T T T
EPWMB
This figure has the EPWMA output set high on compare A match and clear low on compare B
match, while the EPWMB output is configured to toggle on zero match.
TBPRD
... ...
CMPB
. . . .
. .
CMPA
.
CA CA CA CA
↑ ↓ ↑ ↓
EPWMA
CB CB CB CB
↑ ↓ ↑ ↓
EPWMB
Here you can see that we can have different output actions on the up-count and down-count using
a single compare register. So, for the EPWMA and EPWMB outputs, we are setting high on the
compare A and B up-count matches and clearing low on the compare A and B down-down
matches.
TBPRD .. ..
CMPB
. .
. .
CMPA
.
CA CB CA CB
↑ ↓ ↑ ↓
EPWMA
Z P Z P
↓ ↑ ↓ ↑
EPWMB
And finally, again using different output actions on the up-count and down-count, we have the
EPWMA output set high on the compare A up-count match and clear low on the compare B
down-count match. The EPWMB output will clear low on zero match and set high on period
match.
15 - 4 3-2 1-0
reserved CSFB CSFA
switching period
Asymmetric PWM: period register = − 1
timer period
switching period
Symmetric PWM: period register =
2(timer period)
Notice that in the symmetric case, the period value is half that of the asymmetric case. This is
because for up/down counting, the actual timer period is twice that specified in the period register
(i.e. the timer counts up to the period register value, and then counts back down).
PWM resolution:
The PWM compare function resolution can be computed once the period register value is
determined. The largest power of 2 is determined that is less than (or close to) the period value.
As an example, if asymmetric was 1000, and symmetric was 500, then:
Note that for symmetric PWM, the desired duty cycle is only achieved if the compare registers
contain the computed value for both the up-count compare and down-count compare portions of
the time-base period.
. .
Period
Compare
CA CA
Counter ↑ ↓
fTBCLK = 90 MHz
(TTBCLK = 11.1 ns)
PWM Pin
1 . fTBCLK 1 90 MHz
TBPRD = = . = 500
2 fPWM 2 90 kHz
CMPA = (100% - duty cycle)*TBPRD = 0.75*500 = 375
.
fPWM = 90 kHz
(TPWM = 11.1 µs)
Period
Compare .
CA P
Counter ↑ ↓
fTBCLK = 90 MHz
(TTBCLK = 11.1 ns)
PWM Pin
fTBCLK 90 MHz
TBPRD = -1= - 1 = 999
fPWM 90 kHz
CMPA = (100% - duty cycle)*(TBPRD+1) - 1 = 0.75*(999+1) - 1 = 749
16-Bit
Compare Action Dead
Time-Base
TBCLK Logic Qualifier Band
Counter
EPWMxSYNCI EPWMxSYNCO
Period
Register EPWMxA
PWM Trip
Shadowed
Chopper Zone
SYSCLKOUT EPWMxB
TZy
Digital TZ1-TZ3
Compare COMPxOUT
The dead-band sub-module provides a means to delay the switching of a gate signal, thereby
allowing time for gates to turn off and preventing a short circuit.
supply rail
To explain further, power-switching devices turn on faster than they shut off. This issue would
momentarily provide a path from supply rail to ground, giving us a short circuit. The dead-band
sub-module alleviates this issue.
Dead-band control provides a convenient means of combating current shoot-through problems in
a power converter. Shoot-through occurs when both the upper and lower gates in the same phase
of a power converter are open simultaneously. This condition shorts the power supply and results
in a large current draw. Shoot-through problems occur because transistors open faster than they
close, and because high-side and low-side power converter gates are typically switched in a
complimentary fashion. Although the duration of the shoot-through current path is finite during
PWM cycling, (i.e. the closing gate will eventually shut), even brief periods of a short circuit
condition can produce excessive heating and over stress in the power converter and power supply.
Rising
.
0
.
Edge 0
° S1° PWMxA
0 Delay ° ° S2 RED
°1
° ° S4
°1
In Out
(10-bit
° °1
counter)
Falling
.
Edge 0
.
0
° ° S5 Delay ° S3° FED 1
° S0° PWMxB
°1
In Out
(10-bit
° °1 °0
counter)
IN-MODE POLSEL OUT-MODE
HALFCYCLE
PWMxB
Two basic approaches exist for controlling shoot-through: modify the transistors, or modify the
PWM gate signals controlling the transistors. In the first case, the opening time of the transistor
gate must be increased so that it (slightly) exceeds the closing time. One way to accomplish this
is by adding a cluster of passive components such as resistors and diodes in series with the
transistor gate, as shown in the next figure.
by-pass diode
PWM
signal
R
the gate via the by-pass diode and closing time is therefore not affected. While this passive
approach offers an inexpensive solution that is independent of the control microprocessor, it is
imprecise, the component parameters must be individually tailored to the power converter, and it
cannot adapt to changing system conditions.
The second approach to shoot-through control separates transitions on complimentary PWM
signals with a fixed period of time. This is called dead-band. While it is possible to perform
software implementation of dead-band, the C28x offers on-chip hardware for this purpose that
requires no additional CPU overhead. Compared to the passive approach, dead-band offers more
precise control of gate timing requirements. In addition, the dead time is typically specified with
a single program variable that is easily changed for different power converters or adapted on-line.
Polarity Select
00 = active high
Half Cycle Clocking 01 = active low complementary (RED)
0 = full cycle clocking (TBCLK rate) 10 = active high complementary (FED)
1 = half cycle clocking (TBCLK*2 rate) 11 = active low
16-Bit
Compare Action Dead
Time-Base
TBCLK Logic Qualifier Band
Counter
EPWMxSYNCI EPWMxSYNCO
Period
Register EPWMxA
PWM Trip
Shadowed
Chopper Zone
SYSCLKOUT EPWMxB
TZy
Digital TZ1-TZ3
Compare COMPxOUT
The PWM chopper sub-module uses a high-frequency carrier signal to modulate the PWM
waveform. This is used with pulsed transformer-based gate drives to control power-switching
elements.
As you can see in this figure, a high-frequency carrier signal is ANDed with the ePWM outputs.
Also, this circuit provides an option to include a larger, one-shot pulse width before the sustaining
pulses.
EPWMxB
CHPFREQ
EPWMxA
EPWMxB
Programmable
Pulse Width
OSHT (OSHTWTH)
Sustaining
EPWMxA Pulses
15 - 11 10 - 8 7-5 4-1 0
reserved CHPDUTY CHPFREQ OSHTWTH CHPEN
16-Bit
Compare Action Dead
Time-Base
TBCLK Logic Qualifier Band
Counter
EPWMxSYNCI EPWMxSYNCO
Period
Register EPWMxA
PWM Trip
Shadowed
Chopper Zone
SYSCLKOUT EPWMxB
TZy
Digital TZ1-TZ3
Compare COMPxOUT
The trip zone and digital compare sub-modules provide a protection mechanism to protect the
output pins from abnormalities, such as over-voltage, over-current, and excessive temperature
rise.
The inputs to the digital compare sub-module are the trip zone pins and the analog comparator
outputs. This module generates compare events that can generate a PWM sync, generate an ADC
start of conversion, trip a PWM output, and generate a trip interrupt. Optional blinking can be
used to temporarily disable the compare action in alignment with PWM switching to eliminate
noise effects.
The PWM trip zone has a fast, clock-independent logic path to the PWM output pins where the
outputs can be forced to high impedance. Two actions are supported: One-shot trip for major
short circuits or over-current conditions, and cycle-by-cycle trip for current limiting operation.
Trip-Zone Features
♦ Trip-Zone has a fast, clock independent logic path to high-impedance
the EPWMxA/B output pins
♦ Interrupt latency may not protect hardware when responding to over
current conditions or short-circuits through ISR software
♦ Supports: #1) one-shot trip for major short circuits or over
current conditions
#2) cycle-by-cycle trip for current limiting operation
Over
Current
Sensors
CPU
core P
COMPxOUT Digital EPWMxA W
Compare M
EPWMxTZINT
TZ1 Cycle-by-Cycle O
TZ2 U
Mode T
TZ3
P
TZ4 EQEP1ERR EPWMxB U
eQEP1 One-Shot
SYSCTRL
TZ5 CLOCKFAIL T
TZ6 EMUSTOP Mode S
CPU
The power drive protection is a safety feature that is provided for the safe operation of systems
such as power converters and motor drives. It can be used to inform the monitoring program of
motor drive abnormalities such as over-voltage, over-current, and excessive temperature rise. If
the power drive protection interrupt is unmasked, the PWM output pins will be put in the high-
impedance state immediately after the pin is driven low. An interrupt will also be generated.
15 - 12 11 - 8
DCBLCOMPSEL DCBHCOMPSEL
7-4 3-0
DCALCOMPSEL DCAHCOMPSEL
15 - 10 9 8 7-4 3 2 1 0
reserved EVT2FRC EVT2SRC reserved EVT1 EVT1 EVT1FRC EVT1SRC
SYNCSEL SEL SYNCE SOCE SYNCSEL SEL
00 = high impedance
01 = force high
10 = force low
11 = do nothing (disable)
15 14 13 12 11 10 9 8
DCBEVT1 DCAEVT1 OSHT6 OSHT5 OSHT4 OSHT3 OSHT2 OSHT1
7 6 5 4 3 2 1 0
DCBEVT2 DCAEVT2 CBC6 CBC5 CBC4 CBC3 CBC2 CBC1
15 - 7 6 5 4 3 2 1 0
reserved DCBEVT2 DCBEVT1 DCAEVT2 DCAEVT1 OST CBC reserved
16-Bit
Compare Action Dead
Time-Base
TBCLK Logic Qualifier Band
Counter
EPWMxSYNCI EPWMxSYNCO
Period
Register EPWMxA
PWM Trip
Shadowed
Chopper Zone
SYSCLKOUT EPWMxB
TZy
Digital TZ1-TZ3
Compare COMPxOUT
The event-trigger sub-module is used to provide a triggering signal for interrupts and the start of
conversion for the ADC.
.. . ...
TBCTR
TBPRD
CMPB
. . . .
. . .
CMPA
EPWMA
EPWMB
CTR = 0
CTR = PRD
CTR = 0 or PRD
CTRU = CMPA
CTRD = CMPA
CTRU = CMPB
CTRD = CMPB
Event-trigger interrupts and start of conversions can be generated on counter equals zero, counter
equal period, counter equal zero or period, counter up equal compare A, counter down equal
compare A, counter up equal compare B, counter down equal compare B. Notice counter up and
down are independent and separate.
15 14 - 12 11 10 - 8 7-4 3 2-0
SOCBEN SOCBSEL SOCAEN SOCASEL reserved INTEN INTSEL
Regular
Device Clock PWM Step
(i.e. 90 MHz) (i.e. 11.1 ns)
HRPWM
Micro Step (~150 ps)
eCAP
Capture Module (eCAP)
Timer
Trigger
pin
Timestamp
Values
The capture units allow time-based logging of external TTL signal transitions on the capture input
pins. The C28x has up to six capture units.
Capture units can be configured to trigger an A/D conversion that is synchronized with an
external event. There are several potential advantages to using the capture for this function over
the ADCSOC pin associated with the ADC module. First, the ADCSOC pin is level triggered,
and therefore only low to high external signal transitions can start a conversion. The capture unit
does not suffer from this limitation since it is edge triggered and can be configured to start a
conversion on either rising edges or falling edges. Second, if the ADCSOC pin is held high
longer than one conversion period, a second conversion will be immediately initiated upon
completion of the first. This unwanted second conversion could still be in progress when a
desired conversion is needed. In addition, if the end-of-conversion ADC interrupt is enabled, this
second conversion will trigger an unwanted interrupt upon its completion. These two problems
are not a concern with the capture unit. Finally, the capture unit can send an interrupt request to
the CPU while it simultaneously initiates the A/D conversion. This can yield a time savings
when computations are driven by an external event since the interrupt allows preliminary
calculations to begin at the start-of-conversion, rather than at the end-of-conversion using the
ADC end-of-conversion interrupt. The ADCSOC pin does not offer a start-of-conversion
interrupt. Rather, polling of the ADCSOC bit in the control register would need to be performed
to trap the externally initiated start of conversion.
CAP2POL
Capture 2 Polarity
Event Logic
CAP4POL
Capture 4 Polarity
Register Select 4
The capture module features a 32-bit time-stamp counter to minimize rollover. Each module has
four capture registers. Polarity can be set to trigger on rising or falling edge, and trigger events
can be pre-scaled. The capture module can operate in absolute time-stamp mode or difference
mode where the counter resets on each capture.
Shadowed
Period
shadow
Period Register mode
immediate Register (CAP3)
mode
(CAP1)
32-Bit PWM
Time-Stamp Compare
Counter Logic ECAP
pin
SYSCLKOUT
Compare
immediate
mode Register Compare
shadow
(CAP2) Register mode
Shadowed (CAP4)
If the capture module is not used, it can be configured as an asynchronous PWM module.
Upper Register:
CAP1 – 4 Load
on Capture Event
0 = disable
1 = enable
15 - 14 13 - 9 8
FREE_SOFT PRESCALE CAPLDEN
11110 = divide by 60
11111 = divide by 62
Lower Register:
Counter Reset on Capture Event
0 = no reset (absolute time stamp mode)
1 = reset after capture (difference mode)
7 6 5 4 3 2 1 0
CTRRST4 CAP4POL CTRRST3 CAP3POL CTRRST2 CAP2POL CTRRST1 CAP1POL
Upper Register:
Capture / APWM mode
0 = capture mode
1 = APWM mode
15 - 11 10 9 8
reserved APWMPOL CAP_APWM SWSYNC
Lower Register:
Re-arm Continuous/One-Shot
Counter Sync-In (capture mode only) (capture mode only)
0 = disable 0 = no effect 0 = continuous mode
1 = enable 1 = arm sequence 1 = one-shot mode
7-6 5 4 3 2-1 0
SYNCO_SEL SYNCI_EN TSCTRSTOP REARM STOP_WRAP CONT_ONESHT
The capture unit interrupts offer immediate CPU notification of externally captured events. In
situations where this is not required, the interrupts can be masked and flag testing/polling can be
used instead. This offers increased flexibility for resource management. For example, consider a
servo application where a capture unit is being used for low-speed velocity estimation via a
pulsing sensor. The velocity estimate is not used until the next control law calculation is made,
which is driven in real-time using a timer interrupt. Upon entering the timer interrupt service
routine, software can test the capture interrupt flag bit. If sufficient servo motion has occurred
since the last control law calculation, the capture interrupt flag will be set and software can
proceed to compute a new velocity estimate. If the flag is not set, then sufficient motion has not
occurred and some alternate action would be taken for updating the velocity estimate. As a
second example, consider the case where two successive captures are needed before a
computation proceeds (e.g. measuring the width of a pulse). If the width of the pulse is needed as
soon as the pulse ends, then the capture interrupt is the best option. However, the capture
interrupt will occur after each of the two captures, the first of which will waste a small number of
cycles while the CPU is interrupted and then determines that it is indeed only the first capture. If
the width of the pulse is not needed as soon as the pulse ends, the CPU can check, as needed, the
capture registers to see if two captures have occurred, and proceed from there.
15 - 8 7 6 5 4 3 2 1 0
reserved CTR=CMP CTR=PRD CTROVF CEVT4 CEVT3 CEVT2 CEVT1 reserved
eQEP
What is an Incremental Quadrature
Encoder?
A digital (angular) position sensor
Ch. A
Ch. B
shaft rotation
The eQEP circuit, when enabled, decodes and counts the quadrature encoded input pulses. The
QEP circuit can be used to interface with an optical encoder to get position and speed information
from a rotating machine.
(00) (11)
increment decrement
(A,B) = counter 10 counter
(10) (01)
Illegal
Ch. A Transitions;
00 generate 11
phase error
interrupt
Ch. B
01
Quadrature Decoder
State Machine
Using a quadrature decoder state machine, we can determine if the counter is incrementing or
decrementing, and therefore know if the disc is moving clockwise or counterclockwise.
The QEP module features a direct interface to encoders. In addition to channels A and B being
used for rotational directional information, the index can be used to determine rotational speed,
and the strobe can be used for position from a homing sensor.
Ch. A
Quadrature Ch. B
Capture
EQEPxA/XCLK
32-Bit Unit EQEPxB/XDIR
Time-Base
Quadrature
QEP Decoder EQEPxI Index
Watchdog
EQEPxS Strobe
from homing sensor
SYSCLKOUT
Position/Counter
Compare
ePWM1
TB Counter CPU copies
data
ADC memory
Compare connector result to
wire buffer during
Action Qualifier RESULT0
ADC ISR
eCAP1
ADC-
Capture 1 Register INA0
...
Capture 2 Register
Capture 3 Register
Capture 4 Register
View ADC
buffer PWM
ePWM2 triggering Samples
ADC on period match
using SOCA trigger every
20 µs (50 kHz) ePWM2 Code Composer
Studio
Procedure
Adc.c Gpio.c
CodeStartBranch.asm Lab.h
DefaultIsr_7.c Lab_5_6_7.cmd
DelayUs.asm Main_7.c
ECap_7_8_9_10_12.c PieCtrl.c
EPwm_7_8_9_10_12.c PieVect.c
F2806x_DefaultIsr.h SysCtrl.c
F2806x_GlobalVariableDefs.c Watchdog.c
F2806x_Headers_nonBIOS.cmd
Note: The ECap_7_8_9_10_12.c file will be added and used with eCAP1 to detect
the rising and falling edges of the waveform in the second part of this lab exercise.
8. Run the code (real-time mode) using the Script function: Scripts Realtime
Emulation Control Run_Realtime_with_Reset. Watch the window
update. Verify that the ADC result buffer contains the updated values.
9. Open and setup a graph to plot a 50-point window of the ADC results buffer.
Click: Tools Graph Single Time and set the following values:
FFT Order 10
19. Using the “PIE Interrupt Assignment Table” find the location for the eCAP1 interrupt
“ECAP1_INT” and fill in the following information:
PIE group #: # within group:
This information will be used in the next step.
20. Modify the end of ECap_7_8_9_10_12.c to do the following:
- Enable the “ECAP1_INT” interrupt in the PIE (Hint: use the PieCtrlRegs structure)
- Enable the appropriate core interrupt in the IER register
25. Run the code (real-time mode) by using the Script function: Scripts Realtime
Emulation Control Run_Realtime_with_Reset. Notice the values for
PwmDuty and PwmPeriod.
26. Fully halt the CPU (real-time mode) by using the Script function: Scripts
Realtime Emulation Control Full_Halt.
Questions:
• How do the captured values for PwmDuty and PwmPeriod relate to the compare register
CMPA and time-base period TBPRD settings for ePWM1A?
• What is the value of PwmDuty in memory?
• What is the value of PwmPeriod in memory?
• How does it compare with the expected value?
28. Next, close the project by right-clicking on Lab7 in the Project Explorer window
and select Close Project.
Optional Exercise
If you finish early, you might want to experiment with the code by observing the effects of
changing the ePWM1 CMPA register using real-time emulation. Be sure that the jumper wire is
connecting PWM1A (pin # GPIO-00) to ADCINA0 (pin # ADC-A0), and the Single Time graph
is displayed. The graph must be enabled for continuous refresh. Run the code in real-time
mode. Open an Expressions window to the EPwm1Regs.CMPA register – in EPwm.c highlight
the “EPwm1Regs” structure and right click, then select Add Watch Expression… and then OK.
In the Expressions window open “EPwm1Regs”, then open “CMPA” and open “half”. Under
“half” change the “CMPA” value. The Expressions window must be enabled for continuous
refresh. Notice the effect on the PWM waveform in the graph.
You have just modulated the PWM waveform by manually changing the CMPA value. Next, we
will modulate the PWM automatically by having the ADC ISR change the CMPA value. In
DefaultIsr.c notice the code in ADCINT1_ADC used to modulate the ePWM1A output between
10% and 90% duty cycle. In Main.c add “PWM_MODULATE” to the Expressions window
using the same procedure above. Then with the code running in real-time mode, change the
“PWM_MODULATE” from 0 to 1 and observe the PWM waveform in the graph. Also, in the
Expressions window notice the CMPA value being updated. (If you do not have time to work on
this optional exercise, you may want to try this after the class).
End of Exercise
The IQmath Library is a collection of highly optimized and high precision mathematical
functions used to seamlessly port floating-point algorithms into fixed-point code. These C/C++
routines are typically used in computationally intensive real-time applications where optimal
execution speed and high accuracy is needed. By using these routines a user can achieve
execution speeds considerable faster than equivalent code written in standard ANSI C language.
In addition, by incorporating the ready-to-use high precision functions, the IQmath library can
shorten significantly a DSP application development time. (The IQmath user's guide is included
in the application zip file, and can be found in the /docs folder once the file is extracted and
installed).
Module Objectives
Module Objectives
Module Topics
Numerical Concepts ...................................................................................................................................8-1
Module Topics..........................................................................................................................................8-2
Numbering System Basics ........................................................................................................................8-3
Binary Numbers ...................................................................................................................................8-3
Two's Complement Numbers ..............................................................................................................8-3
Integer Basics ......................................................................................................................................8-4
Sign Extension Mode...........................................................................................................................8-5
Binary Multiplication ...............................................................................................................................8-6
Binary Fractions ......................................................................................................................................8-8
Representing Fractions in Binary ........................................................................................................8-8
Fraction Basics ....................................................................................................................................8-8
Multiplying Binary Fractions ..............................................................................................................8-9
Fraction Coding .....................................................................................................................................8-11
Fractional vs. Integer Representation....................................................................................................8-12
Floating-Point ........................................................................................................................................8-13
IQmath ...................................................................................................................................................8-16
IQ Fractional Representation .............................................................................................................8-16
Traditional “Q” Math Approach ........................................................................................................8-17
IQmath Approach ..............................................................................................................................8-19
IQmath Library ......................................................................................................................................8-24
Converting ADC Results into IQ Format ...............................................................................................8-26
AC Induction Motor Example ................................................................................................................8-28
IQmath Summary ...................................................................................................................................8-34
Lab 8: IQmath FIR Filter.......................................................................................................................8-35
Binary Numbers
The binary numbering system is the simplest numbering scheme used in computers, and is the
basis for other schemes. Some details about this system are:
• It uses only two values: 1 and 0
• Each binary digit, commonly referred to as a bit, is one “place” in a binary number
and represents an increasing power of 2.
• The least significant bit (LSB) is to the right and has the value of 1.
• Values are represented by setting the appropriate 1's in the binary number.
• The number of bits used determines how large a number may be represented.
Examples:
01102 = (0 * 8) + (1 * 4) + (1 * 2) + (0 * 1) = 610
111102 = (1 * 16) + (1 * 8) + (1 * 4) + (1 * 2) + (0 * 1) = 3010
Examples:
01102 = (0 * -8) + (1 * 4) + (1 * 2) + (0 * 1) = 610
111102 = (1 * -16) + (1 * 8) + (1 * 4) + (1 * 2) + (0 * 1) = -210
The same binary values are used in these examples for two's complement as were used above for
binary. Notice that the decimal value is the same when the MSB is 0, but the decimal value is
quite different when the MSB is 1.
Two operations are useful in working with two's complement numbers:
• The ability to obtain an additive inverse of a value
• The ability to load small numbers into larger registers (by sign extending)
Examples:
Original No. 0 1 1 02 = 610 1 1 1 1 02 = -210
Integer Basics
Integer Basics
±2n-1 23 22 21 20
Binary Multiplication
Now that you understand two's complement numbers, consider the process of multiplying two
two's complement values. As with “long hand” decimal multiplication, we can perform binary
multiplication one “place” at a time, and sum the results together at the end to obtain the total
product.
Note: This is not the method the C28x uses in multiplying numbers — it is merely a way of observing
how binary numbers work in arithmetic processes.
The C28x uses 16-bit operands and a 32-bit accumulator. For the sake of clarity, consider the
example below where we shall investigate the use of 4-bit values and an 8-bit accumulation:
Data Memory ?
Note: With two’s complement multiplication, the leading “1” in the second multiplicand is a
sign bit. If the sign bit is “1”, then take the 2’s complement of the first multiplicand.
Additionally, each partial product must be sign-extended for correct computation.
Note: All of the above questions except the final one are addressed in this module. The last
question may have several answers:
• Store the lower accumulator to memory. What problem is apparent using this
method in this example?
• Store the upper accumulator back to memory. Wouldn't this create a loss of
precision, and a problem in how to interpret the results later?
• Store both the upper and lower accumulator to memory. This solves the above
problems, but creates some new ones:
− Extra code space, memory space, and cycle time are used
− How can the result be used as the input to a subsequent calculation? Is such a
condition likely (consider any “feedback” system)?
From this analysis, it is clear that integers do not behave well when multiplied. Might some other
type of number system behave better? Is there a number system where the results of a
multiplication are bounded?
Binary Fractions
Given the problems associated with integers and multiplication, consider the possibilities of using
fractional values. Fractions do not grow when multiplied, therefore, they remain representable
within a given word size and solve the problem. Given the benefit of fractional multiplication,
consider the issues involved with using fractions:
• How are fractions represented in two's complement?
• What issues are involved when multiplying two fractions?
Fraction Basics
Fraction Basics
Fraction Multiplication
0100
. 1/2
x 1101
. x -3/8
00000100
0000000
000100
11100
11110100 -3/16
Accumulator 11110100
As with integers, the results are loaded low and the MSB is a sign extension of the seventh bit. If
this value were loaded into the accumulator, we could store the results back to memory in a
variety of ways:
• Store both low and high accumulator values back to memory. This offers maximum
detail, but has the same problems as with integer multiply.
• Store only the high (or low) accumulator back to memory. This creates a potential for
a memory littered with varying Q-types.
• Store the upper accumulator shifted to the left by 1. This would store values back to
memory in the same Q format as the input values, and with equal precision to the
inputs. How shall the left shift be performed? Here’s three methods:
− Explicit shift (C or assembly code)
− Shift on store (assembly code)
− Use Product Mode shifter (assembly code)
Fraction Coding
Although COFF tools recognize values in integer, hex, binary, and other forms, they understand
only integer, or non-fractional values. To use fractions within the C28x, it is necessary to describe
them as though they were integers. This turns out to be a very simple trick. Consider the
following number lines:
½ 16384 0x4000
0
⇒ 0 0x0000
∗ 32768
-½ -16384 0xC000
(215)
-1 -32768 0x8000
Fraction Integer
By multiplying a fraction by 32K (32768), a normalized fraction is created, which can be passed
through the COFF tools as an integer. Once in the C28x, the normalized fraction looks and
behaves exactly as a fraction. Thus, when using fractional constants in a C28x program, the coder
first multiplies the fraction by 32768, and uses the resulting integer (rounded to the nearest whole
value) to represent the fraction.
The following is a simple, but effective method for getting fractions past the assembler:
1. Express the fraction as a decimal number (drop the decimal point).
2. Multiply by 32768.
3. Divide by the proper multiple of 10 to restore the decimal position.
Examples:
• To represent 0.62: 32768 x 62 / 100
• To represent 0.1405: 32768 x 1405 / 10000
This method produces a valid number accurate to 16 bits. You will not need to do the math
yourself, and changing values in your code becomes rather simple.
The C28x accumulator, a 32-bit register, adds extra range to integer calculations, but this
becomes a problem in storing the results back to 16-bit memory.
Conversely, when using fractions, the extra accumulator bits increase precision, which helps
minimize accumulative errors. Since any number is accurate (at best) to ± one-half of a LSB,
summing two of these values together would yield a worst case result of 1 LSB error. Four
summations produce two LSBs of error. By 256 summations, eight LSBs are “noisy.” Since the
accumulator holds 32 bits of information, and fractional results are stored from the high
accumulator, the extra range of the accumulator is a major benefit in noise reduction for long
sum-of-products type calculations.
Floating-Point
IEEE-754 Single Precision Floating-Point
31 30 23 22 0
s eeeeeeee fffffffffffffffffffffff
1 bit sign 8 bit exponent 23 bit mantissa (fraction)
Floating-Point:
+∞ 0 -∞
Non-uniform distribution
Precision greatest near zero
Less precision the further you get from zero
Using Floating-Point
Set the “Specify floating point support” project option to ‘fpu32’
When creating a new CCS project, choosing a device variant that
has the FPU will automatically select this option, so normally no
user action is required
Advantages
Easy to write code
No scaling required
Disadvantages
Somewhat higher device cost
May offer insufficient precision for some
calculations due to 23 bit mantissa and
the influence of the exponent
IQmath
Implementing complex digital control algorithms on a Digital Signal Processor (DSP), or any
other DSP capable processor, typically come across the following issues:
• Algorithms are typically developed using floating-point math
• Floating-point devices are more expensive than fixed-point devices
• Converting floating-point algorithms to a fixed-point device is very time consuming
• Conversion process is one way and therefore backward simulation is not always possible
The design may initially start with a simulation (i.e. MatLab) of a control algorithm, which
typically would be written in floating-point math (C or C++). This algorithm can be easily ported
to a floating-point device, however because of cost reasons most likely a 16-bit or 32-bit fixed-
point device would be used in many target systems.
The effort and skill involved in converting a floating-point algorithm to function using a 16-bit or
32-bit fixed-point device is quite significant. A great deal of time (many days or weeks) would
be needed for reformatting, scaling and coding the problem. Additionally, the final
implementation typically has little resemblance to the original algorithm. Debugging is not an
easy task and the code is not easy to maintain or document.
IQ Fractional Representation
A new approach to fixed-point algorithm development, termed “IQmath”, can greatly simplify the
design development task. This approach can also be termed “virtual floating-point” since it looks
like floating-point, but it is implemented using fixed-point techniques.
IQ Fractional Representation
31 0
S IIIIIIII fffffffffffffffffffffff
32 bit mantissa
.
-2I + 2I-1 + … + 21 + 20 2-1 + 2-2 + … + 2-Q
The IQmath approach enables the seamless portability of code between fixed and floating-point
devices. This approach is applicable to many problems that do not require a large dynamic range,
such as motor or digital control applications.
+∞ 0 -∞
+∞ 0 -∞
I8 Q24 M
I16 Q48
I8 Q24 X
ssssssssssssssssssI8 Q24 I8 Q24 B
Align Binary
<< 24 Point for Add
ssssI8 Q48
I16 Q48
Align Binary
>> 24 Point for Store
sssssssssssssssssI16 Q24 I8 Q24 Y
The traditional approach to performing math operations, using fixed-point numerical techniques
can be demonstrated using a simple linear equation example. The floating-point code for a linear
equation would be:
float Y, M, X, B;
Y = M * X + B;
For the fixed-point implementation, assume all data is 32-bits, and that the "Q" value, or location
of the binary point, is set to 24 fractional bits (Q24). The numerical range and resolution for a
32-bit Q24 number is as follows:
Compared to the floating-point representation, it looks quite cumbersome and has little resem-
blance to the floating-point equation. It is obvious why programmers prefer using floating-point
math.
The slide shows the implementation of the equation on a processor containing hardware that can
perform a 32x32 bit multiplication, 64-bit addition and 64-bit shifts (logical and arithmetic) effi-
ciently.
The basic approach in traditional fixed-point "Q" math is to align the binary point of the operands
that get added to or subtracted from the multiplication result. As shown in the slide, the multipli-
cation of M and X (two Q24 numbers) results in a Q48 value that is stored in a 64-bit register.
The value B (Q24) needs to be scaled to a Q48 number before addition to the M*X value (low
order bits zero filled, high order bits sign extended). The final result is then scaled back to a Q24
number (arithmetic shift right) before storing into Y (Q24). Many programmers may be familiar
with 16-bit fixed-point "Q" math that is in common use. The same example using 16-bit numbers
with 15 fractional bits (Q15) would be coded as follows:
In both cases, the principal methodology is the same. The binary point of the operands that get
added to or subtracted from the multiplication result must be aligned.
IQmath Approach
32-bit IQmath Approach
y = mx + b
I8 Q24 M
I16 Q48
I8 Q24 X
Align Binary
Point Of Multiply
>> 24
sssssssssssssssssI16 Q24
I8 Q24 B
I8 Q24 I8 Q24 Y
In the "IQmath" approach, rather then scaling the operands, which get added to or subtracted
from the multiplication result, we do the reverse. The multiplication result binary point is scaled
back such that it aligns to the operands, which are added to or subtracted from it. The C code
implementation of this is given by linear equation below:
int32 Y, M, X, B;
Y = ((int64) M * (int64) X) >> 24 + B;
The slide shows the implementation of the equation on a processor containing hardware that can
perform a 32x32 bit multiply, 32-bit addition/subtraction and 64-bit logical and arithmetic shifts
efficiently.
The key advantage of this approach is shown by what can then be done with the C and C++ com-
piler to simplify the coding of the linear equation example.
Let’s take an additional step and create a multiply function in C that performs the following oper-
ation:
Y = _IQ24mpy(M , X) + B;
Already we can see a marked improvement in the readability of the linear equation.
Using the operator overloading features of C++, we can overload the multiplication operand "*"
such that when a particular data type is encountered, it will automatically implement the scaled
multiply operation. Let’s define a data type called "iq" and assign the linear variables to this data
type:
Y = M * X + B;
This final equation looks identical to the floating-point representation. It looks "natural". The
four approaches are summarized in the table below:
Essentially, the mathematical approach of scaling the multiplier operand enables a cleaner and a
more "natural" approach to coding fixed-point problems. For want of a better term, we call this
approach "IQmath" or can also be described as "virtual floating-point".
IQmath Approach
Multiply Operation
IQmath Approach
It looks like floating-point!
float Y, M, X, B;
Floating-Point
Y = M * X + B;
long Y, M, X, B;
Traditional
Fix-Point Q Y = ((i64) M * (i64) X + (i64) B << Q)) >> Q;
_iq Y, M, X, B;
“IQmath”
In C Y = _IQmpy(M, X) + B;
iq Y, M, X, B;
“IQmath”
In C++ Y = M * X + B;
IQmath Approach
GLOBAL_Q simplification
User selects “Global Q” value for the whole application
GLOBAL_Q
based on the required dynamic range or resolution, for example:
GLOBAL_Q Max Val Min Val Resolution
28 7.999 999 996 -8.000 000 000 0.000 000 004
24 127.999 999 94 -128.000 000 00 0.000 000 06
20 2047.999 999 -2048.000 000 0.000 001
The basic "IQmath" approach was adopted in the creation of a standard math library for the Texas
Instruments TMS320C28x DSP fixed-point processor. This processor contains efficient hardware
for performing 32x32 bit multiply, 64-bit shifts (logical and arithmetic) and 32-bit add/subtract
operations, which are ideally suited for 32 bit "IQmath".
Some enhancements were made to the basic "IQmath" approach to improve flexibility. They are:
Setting of GLOBAL_Q Parameter Value: Depending on the application, the amount of numerical
resolution or dynamic range required may vary. In the linear equation example, we used a Q val-
ue of 24 (Q24). There is no reason why any value of Q can't be used. In the "IQmath" library,
the user can set a GLOBAL_Q parameter, with a range of 1 to 30 (Q1 to Q30). All functions
used in the program will use this GLOBAL_Q value. For example:
#define GLOBAL_Q 18
Y = _IQmpy(M, X) + B; // all values use GLOBAL_Q = 18
If, for some reason a particular function or equation requires a different resolution, then the user
has the option to implicitly specify the Q value for the operation. For example:
The Q value must be consistent for all expressions in the same line of code.
Fixed-Point Floating-Point
Math Code Math Code
* Can also compile floating-point code on any floating-point compiler (e.g., PC, Matlab, fixed-point w/ RTS lib, etc.)
Essentially, the programmer writes the code using the "IQmath" library functions and the code
can be compiled for floating-point or "IQmath" operations.
IQmath Library
IQmath Library: Math & Trig Functions
Operation Floating-Point “IQmath” in C “IQmath” in C++
type float A, B; _iq A, B; iq A, B;
constant A = 1.2345 A = _IQ(1.2345) A = IQ(1.2345)
multiply A*B _IQmpy(A , B) A*B
divide A/B _IQdiv (A , B) A/B
add A+B A+B A+B
substract A-B A-B A–B
boolean >, >=, <, <=, ==, |=, &&, || >, >=, <, <=, ==, |=, &&, || >, >=, <, <=, ==, |=, &&, ||
trig sin(A),cos(A) _IQsin(A), _IQcos(A) IQsin(A),IQcos(A)
and sin(A*2pi),cos(A*2pi) _IQsinPU(A), _IQcosPU(A) IQsinPU(A),IQcosPU(A)
power asin(A),acos(A) _IQasin(A),_IQacos(A) IQasin(A),IQacos(A)
functions atan(A),atan2(A,B) _IQatan(A), _IQatan2(A,B) IQatan(A),IQatan2(A,B)
atan2(A,B)/2pi _IQatan2PU(A,B) IQatan2PU(A,B)
sqrt(A),1/sqrt(A) _IQsqrt(A), _IQisqrt(A) IQsqrt(A),IQisqrt(A)
sqrt(A*A + B*B) _IQmag(A,B) IQmag(A,B)
exp(A) _IQexp(A) IQexp(A)
saturation if(A > Pos) A = Pos _IQsat(A,Pos,Neg) IQsat(A,Pos,Neg)
if(A < Neg) A = Neg
Additionally, the "IQmath" library contains DSP library modules for filters (FIR & IIR) and Fast
Fourier Transforms (FFT & IFFT).
16 vs. 32 Bits
The "IQmath" approach could also be used on 16-bit numbers and for many problems, this is suf-
ficient resolution. However, in many control cases, the user needs to use many different "Q" val-
ues to accommodate the limited resolution of a 16-bit number.
With DSP devices like the TMS320C28x processor, which can perform 16-bit and 32-bit math
with equal efficiency, the choice becomes more of productivity (time to market). Why bother
spending a whole lot of time trying to code using 16-bit numbers when you can simply use 32-bit
numbers, pick one value of "Q" that will accommodate all cases and not worry about spending
too much time optimizing.
Of course there is a concern on data RAM usage if numbers that could be represented in 16 bits
all use 32 bits. This is becoming less of an issue in today's processors because of the finer tech-
nology used and the amount of RAM that can be cheaply integrated. However, in many cases,
this problem can be mitigated by performing intermediate calculations using 32-bit numbers and
converting the input from 16 to 32 bits and converting the output back to 16 bits before storing
the final results. In many problems, it is the intermediate calculations that require additional ac-
curacy to avoid quantization problems.
As you may recall, the converted values of the ADC are placed in the lower 12 bits of the
ADCRESULT0 register. Before these values are filtered using the IQmath library, they need to
to be put into the IQ format as a 32-bit long. For uni-polar ADC inputs (i.e., 0 to 3.3 V inputs), a
conversion to global IQ format can be achieved with:
How can we modify the above to recover bi-polar inputs, for example +-1.65 volts? One could
do the following to offset the +1.65V analog biasing applied to the ADC input:
IQresult_bipolar =
_IQmpy(_IQ(3.3),_IQ12toIQ((_iq) AdcResult.ADCRESULT0)) - _IQ(1.65);
However, one can see that the largest intermediate value the equation above could reach is 3.3.
This means that it cannot be used with an IQ data type of IQ30 (IQ30 range is -2 < x < ~2). Since
the IQmath library supports IQ types from IQ1 to IQ30, this could be an issue in some applica-
tions.
IQresult_bipolar =
_IQmpy(_IQ(1.65),_IQ15toIQ((_iq) ((int16) (AdcResult.ADCRESULT0 ^
0x8000))));
The largest intermediate value that this equation could reach is 1.65. Therefore, IQ30 is easily
supported.
FLOAT_MATH
behavior: * does float
nothing
The "IQmath" approach is ideally suited for applications where a large numerical dynamic range
is not required. Motor control is an example of such an application (audio and communication
algorithms are other applications). As an example, the IQmath approach has been applied to the
sensor-less direct field control of an AC induction motor. This is probably one of the most chal-
lenging motor control problems and as will be shown later, requires numerical accuracy greater
then 16-bits in the control calculations.
The above slide is a block diagram representation of the key control blocks and their interconnec-
tions. Essentially this system implements a "Forward Control" block for controlling the d-q axis
motor current using PID controllers and a "Feedback Control" block using back emf's integration
with compensated voltage from current model for estimating rotor flux based on current and volt-
age measurements. The motor speed is simply estimated from rotor flux differentiation and open-
loop slip computation. The system was initially implemented on a "Simulator Test Bench" which
uses a simulation of an "AC Induction Motor Model" in place of a real motor. Once working, the
system was then tested using a real motor on an appropriate hardware platform.
Each individual block shown in the slide exists as a stand-alone C/C++ module, which can be
interconnected to form the complete control system. This modular approach allows reusability
and portability of the code. The next few slides show the coding of one particular block, PARK
Transform, using floating-point and "IQmath" approaches in C:
#include “math.h”
#include “math.h”
#include “IQmathLib.h”
#define TWO_PI _IQ(6.28318530717959)
6.28318530717959
void park_calc(PARK *v)
{
float
_iq cos_ang , sin_ang;
sin_ang = _IQsin(_IQmpy(TWO_PI
sin(TWO_PI * v->ang);, v->ang));
cos_ang = _IQcos(_IQmpy(TWO_PI
cos(TWO_PI * v->ang);, v->ang));
The complete system was coded using "IQmath". Based on analysis of coefficients in the system,
the largest coefficient had a value of 33.3333. This indicated that a minimum dynamic range of 7
bits (+/-64 range) was required. Therefore, this translated to a GLOBAL_Q value of 32-7 = 25
(Q25). Just to be safe, the initial simulation runs were conducted with GLOBAL_Q = 24 (Q24)
value. The plots start from a step change in reference speed from 0.0 to 0.5 and 1024 samples are
taken.
The speed eventually settles to the desired reference value and the stator current exhibits a clean
and stable oscillation. The block diagram slide shows at which points in the control system the
plots are taken from.
Floating-Point:
+∞ 0 -∞
+∞ 0 -∞
IQmath: speed
IQmath: current
IQmath: speed
IQmath: current
With the ability to select the GLOBAL_Q value for all calculations in the "IQmath", an experi-
ment was conducted to see what maximum and minimum Q value the system could tolerate be-
fore it became unstable. The results are tabulated in the slide below:
Q18 to Q0 Unstable
(not enough resolution, quantization problems)
The above indicates that, the AC induction motor system that we simulated requires a minimum
of 7 bits of dynamic range (+/-64) and requires a minimum of 19 bits of numerical resolution (+/-
0.000002). This confirms our initial analysis that the largest coefficient value being 33.33333
required a minimum dynamic range of 7 bits. As a general guideline, users using IQmath should
examine the largest coefficient used in the equations and this would be a good starting point for
setting the initial GLOBAL_Q value. Then, through simulation or experimentation, the user can
reduce the GLOBAL_Q until the system resolution starts to cause instability or performance deg-
radation. The user then has a maximum and minimum limit and a safe approach is to pick a mid-
point.
What the above analysis also confirms is that this particular problem does require some calcula-
tions to be performed using greater then 16 bit precision. The above example requires a mini-
mum of 7 + 19 = 26 bits of numerical accuracy for some parts of the calculations. Hence, if one
was implementing the AC induction motor control algorithm using a 16 bit fixed-point DSP, it
would require the implementation of higher precision math for certain portions. This would take
more cycles and programming effort.
The great benefit of using GLOBAL_Q is that the user does not necessarily need to go into de-
tails to assign an individual Q for each variable in a whole system, as is typically done in conven-
tional fixed-point programming. This is time consuming work. By using 32-bit resolution and the
"IQmath" approach, the user can easily evaluate the overall resolution and quickly implement a
typical digital motor control application without quantization problems.
Notes: C28x compiled on codegen tools v5.0.0, -g (debug enabled), -o3 (max. optimization)
fast RTS lib v1.0beta1
IQmath lib v1.4d
Using the profiling capabilities of the respective DSP tools, the table above summarizes the num-
ber of cycles and code size of the forward and feedback control blocks.
The MIPS used is based on a system sampling frequency of 20 kHz, which is typical of such sys-
tems.
IQmath Summary
IQmath Approach Summary
“IQmath” + fixed-point processor with 32-bit capabilities =
Seamless portability of code between fixed and floating-point
devices
User selects target math type in “IQmathLib.h” file
#if MATH_TYPE == IQ_MATH
#if MATH_TYPE == FLOAT_MATH
One source code set for simulation vs. target device
Numerical resolution adjustability based on application
requirement
Set in “IQmathLib.h” file
#define GLOBAL_Q 18
Explicitly specify Q value
_iq20 X, Y, Z;
Numerical accuracy without sacrificing time and cycles
Rapid conversion/porting and implementation of algorithms
The IQmath approach, matched to a fixed-point processor with 32x32 bit capabilities enables the
following:
ePWM1 ADC
TB Counter ADCINA0 RESULT0
Compare FIR Filter
Action Qualifier
connector
wire
CPU copies
result to
buffer during
ADC ISR
...
Display
using CCS
Procedure
Adc.c Filter.c
CodeStartBranch.asm Gpio.c
DefaultIsr_8.c Lab.h
DelayUs.asm Lab_8.cmd
ECap_7_8_9_10_12.c Main_8.c
EPwm_7_8_9_10_12.c PieCtrl.c
F2806x_DefaultIsr.h PieVect.c
F2806x_GlobalVariableDefs.c SysCtrl.c
F2806x_Headers_nonBIOS.cmd Watchdog.c
Include IQmathLib.h
4. In the Project Explorer window edit Lab.h and uncomment the line that includes
the IQmathLib.h header file. Next, in the Function Prototypes section, uncomment
the function prototype for IQssfir(), the IQ math single-sample FIR filter function. In the
Global Variable References section uncomment the four _iq references. Save the changes
and close the file.
Inspect Lab_8.cmd
5. Open and inspect Lab_8.cmd. First, notice that a section called “IQmath” is being
linked to L4SARAM. The IQmath section contains the IQmath library functions (code).
Second, notice that a section called “IQmathTables” is being linked to the
IQTABLES with a TYPE = NOLOAD modifier after its allocation. The IQmath tables
are used by the IQmath library functions. The NOLOAD modifier allows the linker to
resolve all addresses in the section, but the section is not actually placed into the .out
file. This is done because the section is already present in the device ROM (you cannot
load data into ROM after the device is manufactured!). The tables were put in the ROM
by TI when the device was manufactured. All we need to do is link the section to the
addresses where it is known to already reside (the tables are the very first thing in the
BOOT ROM, starting at address 0x3F8000). Close the inspected file.
11. Click the “Debug” button (green bug). The “CCS Debug Perspective” view should
open, the program will load automatically, and you should now be at the start of
main(). If the device has been power cycled since the last lab exercise, be sure to
configure the boot mode to EMU_BOOT_SARAM using the Scripts menu.
Note: For the next step, check to be sure that the jumper wire connecting PWM1A (pin #
GPIO-00) to ADCINA0 (pin # ADC-A0) is in place on the Docking Station.
13. Run the code in real-time mode using the Script function: Scripts Realtime
Emulation Control Run_Realtime_with_Reset, and watch the memory
browser update. Verify that the ADC result buffer contains updated values.
14. Open and setup a dual-time graph to plot a 50-point window of the filtered and unfiltered
ADC results buffer. Click: Tools Graph Dual Time and set the following
values:
Q Value 24
16. Open and setup two (2) frequency domain plots – one for the filtered and another for the
unfiltered ADC results buffer. Click: Tools Graph FFT Magnitude and
set the following values:
GRAPH #1 GRAPH #2
Q Value 24 24
FFT Order 10 10
22. Run the code (real-time mode) by using the Script function: Scripts Realtime
Emulation Control Run_Realtime_with_Reset.
23. The graphical display should show the generated FIR filtered 2 kHz, 25% duty cycle
symmetric PWM waveform in the Dual Time A display and the unfiltered waveform in
the Dual Time B display. The FFT Magnitude graphical displays should show the
frequency components of the filtered and unfiltered 2 kHz, 25% duty cycle symmetric
PWM waveforms.
24. Fully halt the CPU (real-time mode) by using the Script function: Scripts
Realtime Emulation Control Full_Halt.
End of Exercise
Module Objectives
Module Objectives
The DMA allows data to be transferred between peripherals and/or memory without intervention
from the CPU. The DMA can read data from the ADC result registers, transfer to or from
memory blocks L5 through L8, transfer to or from the McBSP, and also modify registers in the
ePWM. Triggers are used to initiate the transfers, and when completed the DMA can generate an
interrupt.
Module Topics
Direct Memory Access Controller ............................................................................................................9-1
Module Topics..........................................................................................................................................9-2
Direct Memory Access (DMA) .................................................................................................................9-3
Basic Operation ...................................................................................................................................9-4
DMA Examples ...................................................................................................................................9-6
DMA Priority Modes ...........................................................................................................................9-8
DMA Throughput ................................................................................................................................9-9
DMA Registers ..................................................................................................................................9-10
Lab 9: Servicing the ADC with DMA .....................................................................................................9-14
PIE
DINTCH1-6
ADC
Result 0-15 McBSP-A
DMA
L5 DPSARAM 6-channels
Triggers PWM1
L6 DPSARAM PWM2
ADCINT1 / ADCINT2 PWM3
MXEVTA / MREVTA PWM4
L7 DPSARAM XINT1-3 / TINT0-2 PWM5
ePWM1-6 (SOCA-B)
USB0EP1-3RX/TX PWM6
L8 DPSARAM software
SysCtrlRegs.EPWMCNF.bit.CONCNF
(maps ePWM to DMA bus or CLA bus)
DMA Definitions
Word
16 or 32 bits
Word size is configurable per DMA channel
Burst
Consists of multiple words
Smallest amount of data transferred at one time
Burst Size
Number of words per burst
Specified by BURST_SIZE register
5-bit ‘N-1’ value (maximum of 32 words/burst)
Transfer
Consists of multiple bursts
Transfer Size
Number of bursts per transfer
Specified by TRANSFER_SIZE register
16-bit ‘N-1’ value - exceeds any practical requirements
Basic Operation
Start Transfer
Move Word
Read/Write Data
End Transfer
DMA Interrupts
Mode #1: Start Transfer
Interrupt
at start of Wait for event
transfer to start/continue
transfer
DMA Examples
Simple Example
Objective: Move 4 words from memory location 0xF000 to
memory location 0x4000 and interrupt CPU at end of transfer
BURST_SIZE* 0x0001 2 words/burst
Start Transfer
TRANSFER_SIZE* 0x0001 2 bursts/transfer
0xF001 0x2222
SRC_ADDR_SHADOW 0x0000F000 Moved Add Burst Step
0xF002 0x3333 N
SRC_BURST_STEP 0x0001 “Burst Size” to Address
0xF003 0x4444 Words? Pointer
SRC_TRANSFER_STEP 0x0001
Y
Note: This example could also have been done using 1 word/burst and 4 bursts/transfer, or 4 words/burst
and 1 burst/transfer. This would affect Round-Robin progression, but not interrupts.
0xF000
CH0 0xF001
ADC Results
0xF002
1nd
23rd
st Conversion
Conversion Sequence
Sequence 0xF003
CH1 0xF004
0x0B00 CH0 0xF005
0x0B01 CH1 0xF006
0x0B02 CH2 CH2 0xF007
0x0B03 CH3 0xF008
0x0B04 CH4 0xF009
CH3 0xF00A
0xF00B
0xF00C
CH4 0xF00D
0xF00E
ADC Registers:
SOC0 – SOC4 configured to CH0 – CH4, respectively,
ADC configured to re-trigger (continuous conversion)
L7 SARAM
DMA Registers:
BURST_SIZE* 0x0004 5 words/burst 0xF000 CH0
TRANSFER_SIZE* 0x0002 3 bursts/transfer 0xF001 CH0
0xF002 CH0
SRC_ADDR_SHADOW 0x00000B00 0xF003 CH1
ADC Results
SRC_BURST_STEP 0x0001 CH1
0xF004
SRC_TRANSFER_STEP 0xFFFC (-4) CH0 CH1
0x0B00 0xF005
DST_ADDR_SHADOW 0x0000F000 starting address** 0x0B01 CH1 0xF006 CH2
DST_BURST_STEP 0x0003 0x0B02 CH2 0xF007 CH2
DST_TRANSFER_STEP 0xFFF5 (-11) 0x0B03 CH3 0xF008 CH2
0x0B04 CH4 0xF009 CH3
0xF00A CH3
0xF00B CH3
0xF00C CH4
0xF00D CH4
* Size registers are N-1 0xF00E CH4
** Typically use a relocatable symbol in your code, not a hard value
DMA
Interrupt
50 word
‘Pong’ buffer
DMA
Interrupt
ADC Registers:
Convert ADC Channel ADCINA0 – 1 conversion per trigger (i.e. ePWM2SOCA)
Read/Write Data
Point where
CH1 can
interrupt other
Moved N Add Burst Step
channels in
“Burst Size” to Address
CH1 Priority Mode
Words? Pointer
Y
End Transfer
DMA Throughput
DMA Throughput
4 cycles/word (5 for McBSP reads)
1 cycle delay to start each burst
1 cycle delay returning from CH1
high priority interrupt
32-bit transfer doubles throughput
(except McBSP, which supports 16-bit transfers only)
DMA Registers
DMA Registers
DmaRegs.name (lab file: Dma.c)
Register Description
DMACTRL DMA Control Register
PRIORITYCTRL1 Priority Control Register 1
MODE Mode Register
CONTROL Control Register
BURST_SIZE Burst Size Register
BURST_COUNT Burst Count Register
DMA CHx Registers
For a complete list of registers refer to the DMA Module Reference Guide
Hard Reset
0 = writes ignored (always reads back 0)
1 = reset DMA module
15 - 2 1 0
reserved PRIORITYRESET HARDRESET
Priority Reset
0 = writes ignored (always reads back 0)
1 = reset state-machine after any pending
burst transfer complete
15 - 1 0
reserved CH1PRIORITY
Mode Register
DmaRegs.CHx.MODE
Upper Register:
15 14 13 - 12 11 10
CHINTE DATASIZE reserved CONTINUOUS ONESHOT
Mode Register
DmaRegs.CHx.MODE
9 8 7 6-5 4-0
CHINTMODE PERINTE OVRINTE reserved PERINTSEL
Control Register
DmaRegs.CHx.CONTROL
Upper Register:
Overflow Flag * Burst Status *
0 = no overflow 0 = no activity
1 = overflow 1 = servicing burst
15 14 13 12 11 10 - 9 8
reserved OVRFLG RUNSTS BURSTSTS TRANSFERRST reserved PERINTFLG
* = read-only
Control Register
DmaRegs.CHx.CONTROL
Lower Register:
Error Clear Peripheral Interrupt Force Run
0 = no effect 0 = no effect 0 = no effect
1 = clear SYNCERR 1 = sets event and PERINTFLG 1 = run
7 6-5 4 3 2 1 0
ERRCLR reserved PERINTCLR PERINTFRC SOFTRESET HALT RUN
Objective:
data
Configure the DMA to buffer memory
ADC Channel A0 ping-pong
style with 50 samples per buffer Display
using CCS
Procedure
Adc.c Filter.c
CodeStartBranch.asm Gpio.c
DefaultIsr_9.c Lab.h
DelayUs.asm Lab_9.cmd
Dma.c Main_9.c
ECap_7_8_9_10_12.c PieCtrl.c
EPwm_7_8_9_10_12.c PieVect.c
F2806x_DefaultIsr.h SysCtrl.c
F2806x_GlobalVariableDefs.c Watchdog.c
F2806x_Headers_nonBIOS.cmd
Inspect Lab_9.cmd
2. Open and inspect Lab_9.cmd. Notice that a section called “dmaMemBufs” is being
linked to L5DPSARAM. This section links the destination buffer for the DMA transfer to
a DMA accessible memory space.
3. Edit Dma.c to implement the DMA operation as described in the objective for this lab
exercise. Configure the DMA Channel 1 Mode Register (MODE) so that the ADC
ADCINT1 is the peripheral interrupt source. Enable the peripheral interrupt trigger and
set the channel for interrupt generation at the start of transfer. Configure for 16-bit data
transfers with one burst per trigger and auto re-initialization at the end of the transfer. In
the DMA Channel 1 Control Register (CONTROL) clear the error and peripheral
interrupt bits. Enable the channel to run.
4. Open Main_9.c and add a line of code in main() to call the InitDma() function.
There are no passed parameters or return values. You just type
InitDma();
11. Run the code in real-time mode using the Script function: Scripts Realtime
Emulation Control Run_Realtime_with_Reset, and watch the memory
browser update. Verify that the ADC result buffer contains updated values.
12. Setup a dual-time graph of the filtered and unfiltered ADC results buffer. Click:
Tools Graph Dual Time and set the following values:
13. The graphical display should show the filtered PWM waveform in the Dual Time A
display and the unfiltered waveform in the Dual Time B display. You should see that the
results match the previous lab exercise.
14. Fully halt the CPU (real-time mode) by using the Script function: Scripts
Realtime Emulation Control Full_Halt.
End of Exercise
Module Objectives
Module Objectives
Module Topics
Control Law Accelerator .........................................................................................................................10-1
Module Topics........................................................................................................................................10-2
Control Law Accelerator (CLA) ............................................................................................................10-3
CLA Block Diagram ..........................................................................................................................10-3
CLA Memory and Register Access ...................................................................................................10-4
CLA Tasks .........................................................................................................................................10-4
Control and Execution Registers .......................................................................................................10-5
CLA Registers ...................................................................................................................................10-6
CLA Initialization ..............................................................................................................................10-9
CLA Task Programming .................................................................................................................10-10
CLA C Language Implementation and Restrictions ........................................................................10-10
CLA Assembly Language Implementation .....................................................................................10-13
CLA Code Debugging .....................................................................................................................10-16
controlSUITE™ - CLA Software Support ......................................................................................10-16
Lab 10: CLA Floating-Point FIR Filter ...............................................................................................10-17
ADCINT1 to
ADCINT8
EPWM1_INT to
EPWM8_INT CLA CLA_INT1-8 INT11 C28x
ECAP1_INT to MPERINT1-8 PIE
ECAP3_INT Control & Execution LVF, LUF INT12 CPU
Registers
EQEP1_INT to
EQEP2_INT
CPU Timer 0
CLA Tasks
Task Triggers
CLA Tasks
(Peripheral Interrupts)
ADCINT1 to
ADCINT8
EPWM1_INT to
EPWM8_INT CLA CLA_INT1-8 INT11 C28x
MPERINT1-8 PIE
ECAP1_INT to Control & Execution LVF, LUF INT12 CPU
ECAP3_INT Registers
EQEP1_INT to
EQEP2_INT
CPU Timer 0
EQEP2_INT
•
•
•
• 0
MR0
CPU Timer 0
MIFRC S/W Trigger
MR1
no source MAR0
MR2
MAR1
MPC MVECT1-8 MR3
Program Data
Memory CLA Program Bus CLA Data Bus Memory
MMEMCFG
CLA Registers
CLA Registers
Cla1Regs.register (lab file: Cla.c)
Register Description
MCTL Control Register
MMEMCFG Memory Configuration Register
MPISRCSEL1 Peripheral Interrupt Source Select 1 Register
MIFR Interrupt Flag Register
MIER Interrupt Enable Register
MIFRC Interrupt Force Register
MICLR Interrupt Flag Clear Register
MIOVF Interrupt Overflow Flag Register
MICLROVF Interrupt Overflow Flag Clear Register
MIRUN Interrupt Run Status Register
MVECTx Task x Interrupt Vector (x = 1-8)
MPC CLA 12-bit Program Counter
MARx CLA Auxiliary Register x (x = 0-1)
MRx CLA Floating-Point 32-bit Result Register (x = 0-3)
MSTF CLA Floating-Point Status Register
Hard Reset
IACK Enable
0 = no effect
0 = CPU IACK instruction ignored 1 = CLA reset
1 = CPU IACK instruction triggers a task (registers set
to default state)
15 - 3 2 1 0
reserved IACKE SOFTRESET HARDRESET
Soft Reset
0 = no effect
1 = CLA reset
(stop current task)
15 - 11 10 9 8
reserved RAM2CPUE RAM1CPUE RAM0CPUE
7 6 5 4 3-1 0
reserved RAM2E RAM1E RAM0E reserved PROGE
15 - 8 7 6 5 4 3 2 1 0
reserved INT8 INT7 INT6 INT5 INT4 INT3 INT2 INT1
#include “F2806x_Device.h”
Cla1Regs.MIER.bit.INT2 = 1; //enable Task 2 interrupt
Cla1Regs.MIER.all = 0x0028; //enable Task 6 and 4 interrupts
CLA Initialization
CLA Initialization
CLA initialization is performed by the CPU using C code
(typically done with the Peripheral Register Header Files)
#include "Lab.h"
;-------------------------------------
.cla extension causes
interrupt void Cla1Task1 (void)
the c2000 compiler to
{ invoke the CLA
compiler
__mdebugstop();
All code within this
xDelay[0] = (float32)AdcResult.ADCRESULT0; file is placed in the
Y = coeffs[4] * xDelay[4];
section “Cla1Prog”
xDelay[4] = xDelay[3];
C Peripheral Register
Header File references
xDelay[1] = xDelay[0]; can be used in CLA C
Y = Y + coeffs[0] * xDelay[0]; and assembly code
ClaFilteredOutput = (Uint16)Y;
} Closing braces are
;-------------------------------------
replaced with MSTOP
interrupt void Cla1Task2 (void)
instructions when
compiled
{
}
;-------------------------------------
MSTOP
MVECTx contains the offset address from the start of the CLA Program RAM
CPU copies
result to
buffer during
CLA ISR
...
Display
using CCS
Recall that a task is similar to an interrupt service routine. Once a task is triggered it runs to
completion. In this lab two tasks will be used. Task 1 contains the low-pass filter. Task 8
contains a one-time initialization routine that is used to clear (set to zero) the filter delay chain.
This must be done by the CLA since the CPU does not have access to this array.
Since there are tradeoffs between the conveniences of C programming and the performance
advantages of assembly language programming, three different task scenarios will be explored:
1. Filter and initialization tasks both in C
2. Filter task in assembly, initialization task in C
3. Filter and initialization tasks both in assembly
These three scenarios will highlight the flexibility of programming the CLA tasks, as well as
show the required configuration steps for each. Note that scenarios 1 and 2 are the most likely to
be used in a real application. There is little to be gained by putting the initialization task in
assembly with scenario 3, but it is shown here for completeness as an all-assembly CLA setup.
Procedure
Note: The ClaTasks.asm file will be added during the lab exercise.
Inspect Lab_10.cmd
3. Open and inspect Lab_10.cmd. Notice that a section called “Cla1Prog” is being
linked to L3DPSARAM. This section links the CLA program tasks to the CPU memory
space. This memory space will be remapped to the CLA memory space during
initialization. Additionally, we are defining a symbol (Cla1Prog_Start) with the
run-time start address of this memory block. This symbol will be used to calculate the
CLA task vector addresses. Also, notice the two message RAM sections used to pass
data between the CPU and CLA.
We are linking CLA code directly to the CLA program RAM because we are not yet
using the flash memory. CCS will load the code for us into RAM, and therefore the CPU
will not need to copy the CLA code into the CLA program RAM. In the flash
programming lab later in this workshop, we will modify the linking so that the CLA code
is loaded into flash, and the CPU will do the copy.
4. The CLA C compiler uses a memory section called CLAscratch for storing local and
compiler temporary variables. This scratchpad memory area is allocated using the linker
command file. It is accessed directly using the symbols __cla_scratchpad_start
5. Open ClaTasks_C.cla and notice Task 1 has been configured to run an FIR filter.
Within this code the ADC result integer (i.e. the filter input) is being first converted to
floating-point, and then at the end the floating-point filter output is being converted back
to integer. Also, notice Task 8 is being used to initialize the filter delay line. The .cla
extension is recognized by the compiler as a CLA C file, and the compiler will generate
CLA specific code. At the beginning of the file notice the line that includes the
F2806x_Cla_typedefs.h header file. This file is needed to make the CLA C
compiler work correctly with the peripheral register header files when unsupported data
types are used.
6. Edit Cla_10.c to implement the CLA operation as described in the objective for this
lab exercise. Configure the L3DPSARAM memory block to be mapped to CLA program
memory space. Configure the L2DPSARAM memory block to be mapped to CLA data
memory space for the CLA C compiler scratchpad. Set Task 1 peripheral interrupt
source to ADCINT1 and set the other Task peripheral interrupt source inputs to no
source. Enable CLA Task 1 interrupt. Enable the use of the IACK instruction to trigger
a task, and then enable Task 8 interrupt.
7. Open Main_10.c and add a line of code in main() to call the InitCla() function.
There are no passed parameters or return values. You just type
InitCla();
8. In Main_10.c comment out the line of code in main() that calls the InitDma()
function. The DMA is no longer being used. The CLA will directly access the ADC
RESULT0 register.
interrupt to the CPU, which will store the filtered results to a circular buffer implemented in the
CLA ISR.
9. Remember that in Adc.c we commented out the code used to enable the ADCINT1
interrupt in PIE group 1. This is no longer being used. The CLA interrupt will be used
instead.
10. Using the “PIE Interrupt Assignment Table” find the location for the CLA Task 1
interrupt “CLA1_INT1” and fill in the following information:
15. Run the code in real-time mode using the Script function: Scripts Realtime
Emulation Control Run_Realtime_with_Reset, and watch the memory
window update. Verify that the ADC result buffer contains updated values.
16. Setup a dual-time graph of the filtered and unfiltered ADC results buffer. Click:
Tools Graph Dual Time and set the following values:
17. The graphical display should show the filtered PWM waveform in the Dual Time A
display and the unfiltered waveform in the Dual Time B display. You should see that the
results match the previous lab exercise.
18. Fully halt the CPU (real-time mode) by using the Script function: Scripts
Realtime Emulation Control Full_Halt.
21. Open ClaTasks.asm and notice that the .cdecls directive is being used to include the
C header file in the CLA assembly file. Therefore, we can use the Peripheral Register
Header File references in the CLA assembly code. Next, notice Task 1 has been
configured to run an FIR filter. Within this code special instructions have been used to
convert the ADC result integer (i.e. the filter input) to floating-point and the floating-
point filter output back to integer. Notice at Task 2 the assembly preprocessor .if
directive is set to 0. The assembly preprocessor .endif directive is located at the end of
Task 8. With this setting, Tasks 2 through 8 will not be assembled, again avoiding a
conflict with Task 2 through 8 in the ClaTasks_C.cla file. Save and close all
modified files.
Run the Code – Test the CLA Operation (Tasks in C and ASM)
23. Run the code in real-time mode using the Script function: Scripts Realtime
Emulation Control Run_Realtime_with_Reset, and watch the graph
window update. To confirm these are updated values, carefully remove and replace the
connector wire to ADCINA0. The results should be the same as before.
24. Fully halt the CPU (real-time mode) by using the Script function: Scripts
Realtime Emulation Control Full_Halt.
25. Switch to the “CCS Edit Perspective” view by clicking the CCS Edit icon in the upper
right-hand corner. Open ClaTasks.asm and at the beginning of Task 2 change the
assembly preprocessor .if directive to 1. Recall that the assembly preprocessor .endif
directive is located at the end of Task 8. Now Task 2 through Task 8 will be assembled,
along with Task 1.
26. Exclude ClaTasks_C.cla from the project to avoid conflicts with ClaTasks.asm.
In the Project Explorer window right-click on ClaTasks_C.cla and select:
Resource Configurations Exclude from Build…
click Select All (for Debug and Release) and then OK. This file is no longer needed
since all of the tasks are now in ClaTasks.asm.
27. Open Lab_10.cmd and at the beginning of the file change the preprocessor option
setting to 0 so that the scratchpad will not be used. This needs to be done to avoid linking
errors. Save and close all modified files.
window update. To confirm these are updated values, carefully remove and replace the
connector wire to ADCINA0. The results should be the same as before.
30. Fully halt the CPU (real-time mode) by using the Script function: Scripts
Realtime Emulation Control Full_Halt.
End of Exercise
Module Objectives
Module Objectives
The Viterbi complex math CRC unit extends the C2000 instruction set to support Viterbi
operations used in communications; complex math, which includes complex FFTs and complex
filters, and is used in power line communications and radar applications; and cyclical redundancy
check, which is used in communications and memory robustness checks.
Module Topics
Viterbi, Complex Math, CRC Unit .........................................................................................................11-1
Module Topics........................................................................................................................................11-2
Viterbi, Complex Math, CRC Unit .........................................................................................................11-3
VCU Overview ..................................................................................................................................11-3
CRC Unit ...........................................................................................................................................11-5
Viterbi Unit ........................................................................................................................................11-6
Complex Math Unit ...........................................................................................................................11-8
VCU Summary ................................................................................................................................11-10
VCU Overview
Extends C28x instruction set to support:
Viterbi operations
Decode for communications
Complex math
16-bit fixed-point complex FFT (5 cycle butterfly)
used in spread spectrum communications, and many signal processing
algorithms
Complex filters
used to improve data reliability, transmission distance, and power
efficiency
Power Line Communications (PLC) and radar
applications
Cyclic Redundancy Check (CRC)
Communications and memory robustness checks
VCU Registers
32-Bit
VR1
VR2
VR3
Viterbi and Complex Complex
Math general VR4 Math
Unit
purpose registers VR5
VR6
VR7
VR8 CRC
Unit
Accumulated VCRC
CRC result
VCU Instructions
CRC Unit
CRC Unit
Cyclic Redundancy Check (CRC) is an
error detecting code used to ensure data
integrity
Communication networks
Data storage (memory content check)
Supports 4 different CRC polynomials:
CRC Operation Polynomial Standard
CRC8 0x07 PRIME
CRC16 Poly 1 0x8005
CRC16 Poly 2 0x1021 G3-PLC, Zigbee
CRC32 0x4c11db7 PRIME, Ethernet, memory
CRC Instructions
Polynomial used is determined by instruction
CRC Operation Example Instruction Cycles
Load CRC result register VMOV32 VCRC, mem32 1
Store CRC result register VMOV32 mem32,VCRC 1
Clear CRC result register VCRCCLR 1
VCRC8L_1 mem16 1
CRC8 Poly: 0x07
VCRC8H_1 mem16 1
VCRC16P1L_1 mem16 1
CRC16 Poly 1: 0x8005
VCRC16P1L_1 mem16 1
VCRC16P2L_1 mem16 1
CRC16 Poly 2: 0x1021
VCRC16P2L_1 mem16 1
VCRC32L_1 mem16 1
CRC32 Poly: 0x04C11DB7
VCRC32H_1 mem16 1
Viterbi Unit
Viterbi Unit
Viterbi – an error correcting decoder
Encoder adds redundant data to a message
Viterbi decoder used to detect and correct errors
Transmit
Viterbi F28x
Convolutional Modulation Decoder
Encoder
(VCU)
Noise
Viterbi Decoder
Viterbi F28x
Decoder
(VCU)
Viterbi Implementation
Decoder has 3 main parts:
Branch metrics calculation
Calculates local distance between every possible
state and the received symbol
Code Rate = 1/2 1 cycle
Code Rate = 1/3 2p cycles
Butterfly “add-compare-select” operation
Calculates path metrics to choose an optimal path
4 calculations done in a single cycle (VITDLADDSUB)
VCU: 2 cycles F28x: 15 cycles
Trace back
Reconstructs the original data using the maximum
likelihood path for the input sequence (VTRACE)
VCU: 3 cycles/stage F28x: 22 cycles/stage
Code Rate = number of inputs / number of outputs; VCU supports CR = 1/2 and CR = 1/3
Viterbi Instructions
Viterbi Operation Example Instruction Cycles
Clear Viterbi Transition VTCLEAR 1
Registers (VT0, VT1)
Double Add andSubtract VITDLADDSUB VR4,VR3,VR2,VRa 1
(low or high) VITDHADDSUB VR4,VR3,VR2,VRa 1
Double Subtract and Add VITDLSUBADD VR4,VR3,VR2,VRa 1
(low or high) VITDHSUBADD VR4,VR3,VR2,VRa 1
Branch Metrics Calculation VBITM2 VR0 1
Code Rate = 1/2 or 1/3 VBITM3 VR0, VR1, VR2 2p
Viterbi Select VITLSEL VRa, VRb, VR4, VR3 1
(low or high) VITHSEL VRa, VRb, VR4, VR3 1
Trace Back
VTRACE mem32, VR0, VT0, VT1 1
VTRACE VR1, VR0, VT0, VT1 1
Double Add and Subtract or VITDLADDSUB VR4,VR3,VR2,VRa
Subtract and Add ||VMOV32 mem32,VRb 1/1
with Parallel Store
Branch Matric (CR=1/2 or 1/3) VBITM3 VR0, VR1, VR2
||VMOV32 VR2, mem32 2p/1**
with Parallel Load
Viterbi Select VITLSEL VRa,VRb,VR4,VR3
1/1
with Parallel Load ||VMOV32 VR2, mem32
** VBITM2 || VMOV32 (For CR = 1/2) cycles are 1/1
Complex Multiply
VCU Summary
VCU Summary
VCU extends the capability of the C28x
CPU with additional support for:
CRC operations
Viterbi decode
Complex math
Module Objectives
Module Objectives
Module Topics
System Design ...........................................................................................................................................12-1
Module Topics........................................................................................................................................12-2
Emulation and Analysis Block ...............................................................................................................12-3
Flash Configuration and Memory Performance ....................................................................................12-6
Flash Programming ...............................................................................................................................12-9
Code Security Module (CSM) ..............................................................................................................12-11
Lab 12: Programming the Flash ..........................................................................................................12-14
View Breakpoints
15 5 4 0
16
16 or 32
64 dispatched
64 C28x Core
decoder unit
Aligned 2-level deep
64-bit fetch buffer
fetch
Flash Pipeline Enable
0 = disable (default)
1 = enable
FlashRegs.FOPT.bit.ENPIPE = 1;
15 1 0
reserved ENPIPE
Internal RAM 1 1
Internal RAM has best data performance – put time critical data here
Flash performance usually sufficient for most constants and tables
Note that the flash instruction fetch pipeline will also stall during a
flash data access
Flash Programming
Flash Programming Basics
The device CPU performs the flash programming
The CPU executes Flash utility code from RAM that reads the Flash
data and writes it into the Flash
We need to get the Flash utility code and the Flash data into RAM
FLASH CPU
Flash
Utility Emulator JTAG
Code
RAM
RS232 SCI
SPI
Bootloader
Flash
ROM
Data I2C
CAN
GPIO
TMS320F2806x
0x008000
L0 DPSARAM (2Kw)
0x008800
L1 DPSARAM (1Kw)
0x008C00
L2 DPSARAM (1Kw)
0x009000
L3 DPSARAM (4Kw)
0x00A000
L4 DPSARAM (8Kw)
0x00C000
reserved
0x3D7800
User OTP (1Kw)
0x3D7C00
reserved
0x3D7C80
ADC / OSC cal. data
0x3D7CC0
reserved
0x3D8000
FLASH (128Kw)
0x3F7FF8 PASSWORDS (8w)
0x3F8000
CSM Password
0x3D8000
CSM Registers
Key Registers – accessible by user; EALLOW protected
Address Name Description
0x00 0AE0 KEY0 Low word of 128-bit Key register
0x00 0AE1 KEY1 2nd word of 128-bit Key register
0x00 0AE2 KEY2 3rd word of 128-bit Key register
0x00 0AE3 KEY3 4th word of 128-bit Key register
0x00 0AE4 KEY4 5th word of 128-bit Key register
0x00 0AE5 KEY5 6th word of 128-bit Key register
0x00 0AE6 KEY6 7th word of 128-bit Key register
0x00 0AE7 KEY7 High word of 128-bit Key register
0x00 0AEF CSMSCR CSM status and control register
PWL in memory – reserved for passwords only
Address Name Description
0x3F 7FF8 PWL0 Low word of 128-bit password
0x3F 7FF9 PWL1 2nd word of 128-bit password
0x3F 7FFA PWL2 3rd word of 128-bit password
0x3F 7FFB PWL3 4th word of 128-bit password
0x3F 7FFC PWL4 5th word of 128-bit password
0x3F 7FFD PWL5 6th word of 128-bit password
0x3F 7FFE PWL6 7th word of 128-bit password
0x3F 7FFF PWL7 High word of 128-bit password
CSM Caveats
Never program all the PWL’s as 0x0000
Doing so will permanently lock the CSM
Flash addresses 0x3F7F80 to 0x3F7FF5,
inclusive, must be programmed to 0x0000 to
securely lock the CSM
Remember that code running in unsecured
RAM cannot access data in secured memory
Don’t link the stack to secured RAM if you have
any code that runs from unsecured RAM
Do not embed the passwords in your code!
Generally,
the CSM is unlocked only for debug
Code Composer Studio can do the unlocking
Device unlocked
Correct Yes
password? User can access on-
chip secure memory
No
ePWM2 triggering
ADC on period match data
using SOCA trigger every memory
20 µs (50 kHz) ePWM2
CPU copies
result to
buffer during
CLA ISR
...
Objective:
Program system into Flash Memory
Learn use of CCS Flash Programmer Display
using CCS
DO NOT PROGRAM PASSWORDS
Procedure
Adc.c F2806x_Headers_nonBIOS.cmd
Cla_12.c Filter.c
ClaTasks.asm Flash.c
ClaTasks_C.cla Gpio.c
CodeStartBranch.asm Lab.h
DefaultIsr_10_12.c Lab_12.cmd
DelayUs.asm Main_12.c
Dma.c Passwords.asm
ECap_7_8_9_10_12.c PieCtrl.c
EPwm_7_8_9_10_12.c PieVect.c
F2806x_Cla_typedefs.h SysCtrl.c
F2806x_DefaultIsr.h Watchdog.c
F2806x_GlobalVariableDefs.c
Note: The Flash.c and Passwords.asm files will be added during the lab exercise.
2. Open and inspect the linker command file Lab_12.cmd. Notice that a memory block
named FLASH_ABCDEFGH has been been created at origin = 0x3D8000, length =
0x01FF80 on Page 0. This flash memory block length has been selected to avoid
conflicts with other required flash memory spaces. See the reference slide at the end of
this lab exercise for further details showing the address origins and lengths of the various
memory blocks used.
3. Edit Lab_12.cmd to link the following compiler sections to on-chip flash memory
block FLASH_ABCDEFGH:
Compiler Sections:
4. In Lab_12.cmd notice that the section named “IQmath” is an initialized section that
needs to load to and run from flash. Previously the “IQmath” section was linked to
L4SARAM. Edit Lab_12.cmd so that this section is now linked to
FLASH_ABCDEFGH. Save your work and close the file.
5. Open and inspect InitPieCtrl() in PieCtrl.c. Notice the memcpy() function used to
initialize (copy) the PIE vectors. At the end of the file a structure is used to enable the
PIE.
7. Open and inspect Flash.c. The C compiler CODE_SECTION pragma is used to place
the InitFlash() function into a linkable section named “secureRamFuncs”.
8. The “secureRamFuncs” section will be linked using the user linker command file
Lab_12.cmd. Open and inspect Lab_12.cmd. The “secureRamFuncs” will load
to flash (load address) but will run from L4SARAM (run address). Also notice that the
linker has been asked to generate symbols for the load start, load size, and run start
addresses.
While not a requirement from a MCU hardware or development tools perspective (since
the C28x MCU has a unified memory architecture), historical convention is to link code
to program memory space and data to data memory space. Therefore, notice that for the
L4SARAM memory we are linking “secureRamFuncs” to, we are specifiying “PAGE
= 0” (which is program memory).
9. Open and inspect Main_12.c. Notice that the memory copy function memcpy() is
being used to copy the section “secureRamFuncs”, which contains the initialization
function for the flash control registers.
10. Add a line of code in main() to call the InitFlash() function. There are no passed
parameters or return values. You just type
InitFlash();
to 0x3F7FFF. During this lab, dummy passwords of 0xFFFF will be used – therefore only
dummy reads of the password locations are needed to unsecure the CSM. DO NOT PROGRAM
ANY REAL PASSWORDS INTO THE DEVICE. After development, real passwords are
typically placed in the password locations to protect your code. We will not be using real
passwords in the workshop.
The CSM module also requires programming values of 0x0000 into flash addresses 0x3F7F80
through 0x3F7FF5 in order to properly secure the CSM. Both tasks will be accomplished using a
simple assembly language file Passwords.asm.
12. Open and inspect Passwords.asm. This file specifies the desired password values
(DO NOT CHANGE THE VALUES FROM 0xFFFF) and places them in an initialized
section named “passwords”. It also creates an initialized section named “csm_rsvd”
which contains all 0x0000 values for locations 0x3F7F80 to 0x3F7FF5 (length of 0x76).
13. Open Lab_12.cmd and notice that the initialized sections for “passwords” and
“csm_rsvd” are linked to memories named PASSWORDS and CSM_RSVD,
respectively.
14. Open and inspect CodeStartBranch.asm. This file creates an initialized section
named “codestart” that contains a long branch to the C-environment setup routine.
This section needs to be linked to a block of memory named BEGIN_FLASH.
15. In the earlier lab exercises, the section “codestart” was directed to the memory
named BEGIN_M0. Edit Lab_12.cmd so that the section “codestart” will be
directed to BEGIN_FLASH. Save your work and close the opened files.
On power up the reset vector will be fetched and the ROM bootloader will begin execution. If
the emulator is connected, the device will be in emulator boot mode and will use the EMU_KEY
and EMU_BMODE values in the PIE RAM to determine the boot mode. This mode was utilized
in an earlier lab. In this lab, we will be disconnecting the emulator and running in stand-alone
boot mode (but do not disconnect the emulator yet!). The bootloader will read the OTP_KEY
and OTP_BMODE values from their locations in the OTP. The behavior when these values have
not been programmed (i.e., both 0xFFFF) or have been set to invalid values is boot to flash boot
mode.
16. Open and inspect Lab_12.cmd. Notice that the named section “Cla1Prog” will now
load to flash (load address) but will run from L3DPSARAM (run address). The linker will
also be used to generate symbols for the load start, load size, and run start addresses.
17. Open Cla_12.c and notice that the memory copy function memcpy() is being used to
copy the CLA program code from flash to L3DPSARAM using the symbols generated by
the linker. Just after the copy the Cla1Regs structure is used to configure the
L3DPSARAM block as CLA program memory space. Close the inspected files.
Build – Lab.out
18. Click the “Build” button to generate the Lab.out file to be used with the CCS Flash
Programmer. Check for errors in the Problems window.
19. Program the flash memory by clicking the “Debug” button (green bug). (If needed,
when the “Progress Information” box opens select “Details >>” in order to watch
the programming operation and status). After successfully programming the flash
memory the “Progress Information” box will close.
22. Single-Step by using the <F5> key (or you can use the Step Into button on the
horizontal toolbar) through the bootloader code until you arrive at the beginning of the
codestart section in the CodeStartBranch.asm file. (Be patient, it will take about
125 single-steps). Notice that we have placed some code in CodeStartBranch.asm
to give an option to first disable the watchdog, if selected.
23. Step a few more times until you reach the start of the C-compiler initialization routine at
the symbol _c_int00.
24. Now do Run Go Main. The code should stop at the beginning of your
main()routine. If you got to that point succesfully, it confirms that the flash has been
programmed properly, that the bootloader is properly configured for jump to flash mode,
and that the codestart section has been linked to the proper address.
25. You can now run the CPU, and you should observe the LED on the controlCARD
blinking. Try resetting the CPU, select the EMU_BOOT_FLASH boot mode, and then
hitting run (without doing all the stepping and the Go Main procedure). The LED should
be blinking again.
26. Halt the CPU.
28. Next, close the project by right-clicking on Lab12 in the Project Explorer
window and select Close Project.
End of Exercise
origin =
0x3D 8000
FLASH
length = 0x1FF80
page = 0 Lab_12.cmd
SECTIONS
{
0x3F 7F80 codestart :> BEGIN_FLASH, PAGE = 0
CSM_RSVD
length = 0x76 passwords :> PASSWORDS, PAGE = 0
page = 0 csm_rsvd :> CSM_RSVD, PAGE = 0
0x3F 7FF6
BEGIN_FLASH }
length = 0x2
page = 0
0x3F 7FF8 PASSWORDS
length = 0x8
page = 0
4
0x3F 7FF6 LB
_c_int00 5
“user” code sections
Passwords (8w) main ( )
{
……
3 ……
……
0x3F 8000 Boot ROM (32Kw) }
Boot Code
0x3F F75C
{SCAN GPIO}
2
BROM vector (32w)
0x3F FFC0 0x3F F75C
1
RESET
Module Objectives
Module Objectives
Note: Up to 2 SPI modules (A/B), 2 SCI module (A), 1 McBSP module (A), 1 I2C module (A),
1 USB (0), and 1 eCAN module (A) are available on the F2806x devices
Module Topics
Communications .......................................................................................................................................13-1
Module Topics........................................................................................................................................13-2
Communications Techniques .................................................................................................................13-3
Serial Peripheral Interface (SPI) ...........................................................................................................13-4
SPI Registers .....................................................................................................................................13-7
SPI Summary .....................................................................................................................................13-8
Serial Communications Interface (SCI) .................................................................................................13-9
Multiprocessor Wake-Up Modes .....................................................................................................13-11
SCI Registers ...................................................................................................................................13-14
SCI Summary ..................................................................................................................................13-15
Multichannel Buffered Serial Port (McBSP) .......................................................................................13-16
Definition: Bit, Word, and Frame ....................................................................................................13-16
Multi-Channel Selection ..................................................................................................................13-17
McBSP Summary ............................................................................................................................13-18
Inter-Integrated Circuit (I2C) ..............................................................................................................13-19
I2C Operating Modes and Data Formats .........................................................................................13-20
I2C Summary...................................................................................................................................13-21
Universal Serial Bus (USB) .................................................................................................................13-22
USB Communication .......................................................................................................................13-23
Enumeration ....................................................................................................................................13-23
F2806x USB Hardware ...................................................................................................................13-24
USB Controller Summary................................................................................................................13-24
Enhanced Controller Area Network (eCAN) .......................................................................................13-25
CAN Bus and Node .........................................................................................................................13-26
Principles of Operation ....................................................................................................................13-27
Message Format and Block Diagram...............................................................................................13-28
eCAN Summary ..............................................................................................................................13-30
Communications Techniques
Several methods of implementing a TMS320C28x communications system are possible. The
method selected for a particular design should reflect the method that meets the required data rate
at the lowest cost. Various categories of interface are available and are summarized in the
learning objective slide. Each will be described in this module.
C28x C28x
Port U2 Port
Destination
PCB PCB
clock
RX FIFO_3
SPIRXBUF.15-0
MSB LSB
SPIDAT.15-0 SPISOMI
SPITXBUF.15-0
TX FIFO_0
TX FIFO_3
Since data is shifted out of the SPIDAT register MSB first, transmission characters of less than 16
bits must be left-justified by the CPU software prior to be written to SPIDAT.
Received data is shifted into SPIDAT from the left, MSB first. However, the entire sixteen bits
of SPIDAT is copied into SPIBUF after the character transmission is complete such that received
characters of less than 16 bits will be right-justified in SPIBUF. The non-utilized higher
significance bits must be masked-off by the CPU software when it interprets the character. For
example, a 9 bit character transmission would require masking-off the 7 MSB’s.
Programmable data
length of 1 to 16 bits SPIDAT - Processor #1
Transmitted data of less 11001001XXXXXXXX
than 16 bits must be left
justified
MSB transmitted first
Received data of less
SPIDAT - Processor #2
than 16 bits are right
XXXXXXXX11001001
justified
User software must
mask-off unused MSB’s
SPI Registers
SPI Baud Rate Register
SpixRegs.SPIBRR
LSPCLK
, SPIBRR = 3 to 127
(SPIBRR + 1)
SPICLK signal =
LSPCLK
, SPIBRR = 0, 1, or 2
4
Baud Rate Determination: The Master specifies the communication baud rate using its baud rate
register (SPIBRR.6-0):
LSPCLK
• For SPIBRR = 3 to 127: SPI Baud Rate = bits/sec
( SPIBRR + 1)
LSPCLK
• For SPIBRR = 0, 1, or 2: SPI Baud Rate = bits/sec
4
From the above equations, one can compute
Maximum data rate = 20 Mbps @ 80 MHz
Character Length Determination: The Master and Slave must be configured for the same
transmission character length. This is done with bits 0, 1, 2 and 3 of the configuration control
register (SPICCR.3-0). These four bits produce a binary number, from which the character length
is computed as binary + 1 (e.g. SPICCR.3-0 = 0010 gives a character length of 3).
Status SpixRegs.SPIST
RX Overrun Flag, Interrupt Flag, TX Buffer Full Flag
SPI Summary
SPI Summary
TX FIFO_3 TX FIFO_3
Transmitter-data Transmitter-data
buffer register buffer register
8 8
RX FIFO_3 RX FIFO_3
Addr/
Start LSB 2 3 4 5 6 7 MSB Parity Stop 1 Stop 2
Data
0 = Odd 0 = Disabled
1 = Even 1 = Enabled
The basic unit of data is called a character and is 1 to 8 bits in length. Each character of data is
formatted with a start bit, 1 or 2 stop bits, an optional parity bit, and an optional address/data bit.
A character of data along with its formatting bits is called a frame. Frames are organized into
groups called blocks. If more than two serial ports exist on the SCI bus, a block of data will
usually begin with an address frame which specifies the destination port of the data as determined
by the user’s protocol.
The start bit is a low bit at the beginning of each frame which marks the beginning of a frame.
The SCI uses a NRZ (Non-Return-to-Zero) format which means that in an inactive state the
SCIRX and SCITX lines will be held high. Peripherals are expected to pull the SCIRX and
SCITX lines to a high level when they are not receiving or transmitting on their respective lines.
When configuring the SCICCR, the SCI port should first be held in an inactive state. This
is done using the SW RESET bit of the SCI Control Register 1 (SCICTL1.5). Writing a 0 to this
bit initializes and holds the SCI state machines and operating flags at their reset condition. The
SCICCR can then be configured. Afterwards, re-enable the SCI port by writing a 1 to the SW
RESET bit. At system reset, the SW RESET bit equals 0.
Majority
Vote
SCICLK
(Internal)
1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2
SCIRXD
Block of Frames
The SCI interrupt logic generates interrupt flags when it receives or transmits a complete
character as determined by the SCI character length. This provides a convenient and efficient
way of timing and controlling the operation of the SCI transmitter and receiver. The interrupt
flag for the transmitter is TXRDY (SCICTL2.7), and for the receiver RXRDY (SCIRXST.6).
TXRDY is set when a character is transferred to TXSHF and SCITXBUF is ready to receive the
next character. In addition, when both the SCIBUF and TXSHF registers are empty, the TX
EMPTY flag (SCICTL2.6) is set. When a new character has been received and shifted into
SCIRXBUF, the RXRDY flag is set. In addition, the BRKDT flag is set if a break condition
occurs. A break condition is where the SCIRXD line remains continuously low for at least ten
bits, beginning after a missing stop bit. Each of the above flags can be polled by the CPU to
control SCI operations, or interrupts associated with the flags can be enabled by setting the
RX/BK INT ENA (SCICTL2.1) and/or the TX INT ENA (SCICTL2.0) bits active high.
Additional flag and interrupt capability exists for other receiver errors. The RX ERROR flag is
the logical OR of the break detect (BRKDT), framing error (FE), receiver overrun (OE), and
parity error (PE) bits. RX ERROR high indicates that at least one of these four errors has
occurred during transmission. This will also send an interrupt request to the CPU if the RX ERR
INT ENA (SCICTL1.6) bit is set.
SCI Registers
Baud Rate Determination: The values in the baud-select registers (SCIHBAUD and SCILBAUD)
concatenate to form a 16 bit number that specifies the baud rate for the SCI.
LSPCLK
• For BRR = 1 to 65535: SCI Baud Rate = bits/sec
( BRR + 1) × 8
LSPCLK
• For BRR = 0: SCI Baud Rate = bits/sec
16
Max data rate = 5 Mbps @ 80 MHz
Note that the CLKOUT for the SCI module is one-half the CPU clock rate.
SCI Summary
SCI Summary
Asynchronous communications format
65,000+ different programmable baud rates
Two wake-up multiprocessor modes
Idle-line wake-up & Address-bit wake-up
CLK
FS
D a1 a0 b7 b6 b5 b4 b3 b2 b1 b0
Word
Bit
FS
D w6 w7 w0 w1 w2 w3 w4 w5 w6 w7
Frame
Word
Multi-Channel Selection
Multi-Channel Selection
Ch0-0
Frame TDM Bit Stream Multi-channel
Ch0-1
... M Transmit
C 0 Ch31 Ch1 Ch0
c & Ch5-0
O
D 1 Ch31 ... Ch1 Ch0 B Receive Ch5-1
E S only selected
C P Channels Ch27-0
Ch27-1
The McBSP keeps time sync with all channels, but only “listens” or “talks”
if the specific channel is enabled (reduces processing/bus overhead)
McBSP Summary
McBSP Summary
Independent clocking and framing for
transmit and receive
Internal or external clock and frame sync
Data size of 8, 12, 16, 20, 24, or 32 bits
TDM mode - up to 128 channels
Used for T1/E1 interfacing
µ-law and A-law companding
SPI mode
Direct Interface to many codecs
Can be serviced by the DMA
I2CXSR I2CDXR
TX FIFO
SDA
RX FIFO
I2CRSR I2CDRR
Clock
SCL
Circuits
I2C Arbitration
Arbitration procedure invoked if two or more master-
transmitters simultaneously start transmission
Procedure uses data presented on serial data bus (SDA) by
competing transmitters
First master-transmitter which drives SDA high is overruled
by another master-transmitter that drives SDA low
Procedure gives priority to the data stream with the lowest
binary value
SCL
Device #1 lost arbitration
and switches to slave-
Data from 1 0 receiver mode
device #1
Data from Device #2
1 0 0 1 0 1 drives SDA
device #2
SDA 1 0 0 1 0 1
I2C Summary
I2C Summary
USB
Formed by the USB Implementers Forum (USB-IF)
http://www.usb.org
USB-IF has defined standardized interfaces for
common USB application, known as Device Classes
Human Interface Device (HID)
Mass Storage Class (MSC)
Communication Device Class (CDC)
Device Firmware Upgrade (DFU)
Refer to USB-IF Class Specifications for more information
USB is:
Differential
Asynchronous
Serial
NRZI Encoded
Bit Stuffed
USB is a HOST centric bus!
USB Communication
USB Communication
A component on the bus is either a…
Host (the master)
Device (the slave) – also known as peripheral or
function
Hub (neither master nor slave; allows for expansion)
Enumeration
Enumeration
USB is universal because of Enumeration
Process in which a Host attempts to identify a Device
Ifno device attached to a downstream port,
then the port sees Hi-Z
When full-speed device is attached, it pulls up
D+ line
When the Host see a Device, it polls for
descriptor information
Essentially asking, “what are you?”
Descriptors contain information the host can
use to identify a driver
A
B
C
D E
CAN does not use physical addresses to address stations. Each message is sent with an identifier
that is recognized by the different nodes. The identifier has two functions – it is used for message
filtering and for message priority. The identifier determines if a transmitted message will be
received by CAN modules and determines the priority of the message when two or more nodes
want to transmit at the same time.
CAN Bus
Two wire differential bus (usually twisted pair)
Max. bus length depend on transmission rate
40 meters @ 1 Mbps
CAN_H
120Ω 120Ω
CAN_L
The MCU communicates to the CAN Bus using a transceiver. The CAN bus is a twisted pair
wire and the transmission rate depends on the bus length. If the bus is less than 40 meters the
transmission rate is capable up to 1 Mbit/second.
CAN Node
Wired-AND Bus Connection
CAN_H
120Ω 120Ω
CAN_L
CAN Transceiver
(e.g. TI SN65HVD23x)
TX RX
CAN Controller
(e.g. TMS320F28035)
Principles of Operation
Principles of Operation
Data messages transmitted are identifier based, not
address based
Content of message is labeled by an identifier that is
unique throughout the network
(e.g. rpm, temperature, position, pressure, etc.)
All nodes on network receive the message and each
performs an acceptance test on the identifier
If message is relevant, it is processed (received);
otherwise it is ignored
Unique identifier also determines the priority of the
message
(lower the numerical value of the identifier, the higher the
priority)
When two or more nodes attempt to transmit at the
same time, a non-destructive arbitration technique
guarantees messages are sent in order of priority
and no messages are lost
Start
Bit
Node A Node A wins
arbitration
Node B
Node C
CAN Bus
S 11-bit R I E
O Identifier T D r0 DLC 0…8 Bytes Data CRC ACK O
F R E F
S S I R E
11-bit 18-bit
O T r1 r0 DLC 0…8 Bytes Data
Identifier R D Identifier CRC ACK O
F R E R F
The MCU CAN module is a full CAN Controller. It contains a message handler for transmission
and reception management, and frame storage. The specification is CAN 2.0B Active – that is,
the module can send and accept standard (11-bit identifier) and extended frames (29-bit
identifier).
A message mailbox
32
Identifier – MID
Control – MCF
Data low – MDL Receive Buffer
Data high - MDH Transmit Buffer
Control Buffer
Status Buffer
SN65HVD23x
3.3-V CAN Transceiver
CAN Bus
The CAN controller module contains 32 mailboxes for objects of 0 to 8-byte data lengths:
• configurable transmit/receive mailboxes
• configurable with standard or extended indentifier
The CAN module mailboxes are divided into several parts:
• MID – contains the identifier of the mailbox
• MCF (Message Control Field) – contains the length of the message (to transmit or
receive) and the RTR bit (Remote Transmission Request – used to send remote
frames)
• MDL and MDH – contains the data
The CAN module contains registers which are divided into five groups. These registers are
located in data memory from 0x006000 to 0x0061FF. The five register groups are:
• Mailboxes
eCAN Summary
eCAN Summary
Fully compliant with CAN standard v2.0B
Supports data rates up to 1 Mbps
Thirty-two mailboxes
Configurable as receive or transmit
Configurable with standard or extended identifier
Programmable receive mask
Uses 32-bit time stamp on messages
Programmable interrupt scheme (two levels)
Programmable alarm time-out
Module Objectives
Module Objectives
TI Development Tools
Additional Resources
Product Information Center
On-line support
Module Topics
Development Support...............................................................................................................................14-1
Module Topics........................................................................................................................................14-2
TI Support Resources .............................................................................................................................14-3
C2000 Workshop Download Wiki ....................................................................................................14-3
controlSUITE™.................................................................................................................................14-4
C2000 Experimenter’s Kits ...............................................................................................................14-5
F28335 Peripheral Explorer Kit.........................................................................................................14-6
C2000 controlSTICK Evaluation Tool ..............................................................................................14-7
C2000 LaunchPad Evaluation Kit .....................................................................................................14-8
C2000 controlCARD Application Kits ..............................................................................................14-9
Product Information Resources .......................................................................................................14-10
TI Support Resources
C2000 Workshop Download Wiki
http://www.ti.com/hands-on-training
At the C2000 Workshop Download Wiki you will find all of the materials for the C2000 One-day
and Multi-day Workshops, as well as the C2000 archived workshops, which include support for
the F2407, F2812, F2808, and F28335 device families.
controlSUITE™
controlSUITE™
controlSUITE is a single portal for all C2000 software and has been designed to minimize
software development time. Included in controlSUITE are device-specific drivers and support
software, as well as complete system design examples used in sophisticated applications.
controlSUITE is a one-stop, single centralized location to find all of your C2000 software needs.
Download controlSUITE from the TI website.
The C2000 development kits are designed to be modular and robust. These kits are complete,
open source, evaluation and development tools where the user can modify both the hardware and
software to best fit their needs.
The various Experimenter’s Kits shown on this slide include a specific controlCARD and
Docking Station. Most have onboard USB JTAG emulation and no external emulator or power
supply is required. However, where noted, the kits based on a DIMM-168 controlCARD include
a 5-volt power supply and require an external JTAG emulator.
The Peripheral Explorer Kit provides a simple way to learn and interact with all F28335
peripherals. It includes onboard USB JTAG emulation.
The controlSTICK is an entry-level evaluation kit. It is a simple, stand-alone tool that allows
users to learn the device and software quickly and easily.
The LaunchPad is a low-cost evaluation kit. Like the controlSTICK, it is a simple, stand-alone
tool that allows users to learn the device and software quickly and easily. Additionally, various
BoosterPacks are available.
The controlCARD based Application Kits demonstrate the full capabilities of the C2000 device in
an application. All kits are completely open source with full documentation.
For more information and support, you can contact the product information center, visit the TI
E2E community, embedded processor Wiki, TI training web page, TI eStore, and the TI website.
Module Topics
Appendix A – Experimenter’s Kit ...........................................................................................................A-1
Module Topics......................................................................................................................................... A-2
F28069 controlCARD ............................................................................................................................. A-3
F28069 PCB Outline (Top View) .......................................................................................................A-3
LD1 / LD2 / LD3 ................................................................................................................................A-3
SW1 ....................................................................................................................................................A-3
SW2 ....................................................................................................................................................A-4
F28035 controlCARD ............................................................................................................................. A-5
F28035 PCB Outline (Top View) .......................................................................................................A-5
LD1 / LD2 / LD3 ................................................................................................................................A-5
SW1 ....................................................................................................................................................A-5
SW2 ....................................................................................................................................................A-6
SW3 ....................................................................................................................................................A-6
F28335 controlCARD ............................................................................................................................. A-7
F28335 PCB Outline (Top View) .......................................................................................................A-7
LD1 / LD2 / LD3 ................................................................................................................................A-8
SW1 ....................................................................................................................................................A-8
SW2 ....................................................................................................................................................A-9
Docking Station..................................................................................................................................... A-10
SW1 / LD1 ........................................................................................................................................ A-10
JP1 / JP2 ........................................................................................................................................... A-10
J1 / J2 /J3 / J8 / J9 ............................................................................................................................. A-10
F2833x Boot Mode Selection ........................................................................................................... A-11
F280xx Boot Mode Selection ........................................................................................................... A-11
J3 – DB-9 to 4-Pin Header Cable ..................................................................................................... A-12
F28069 controlCARD
F28069 PCB Outline (Top View)
SW1
SW2
F28035 controlCARD
F28035 PCB Outline (Top View)
SW1
SW2
SW3
F28335 controlCARD
F28335 PCB Outline (Top View)
SW1
SW2
1 1 1 1 FLASH
For a complete list of boot mode options see the F2833x Boot Mode
Selection table in the Docking Station section in this appendix.
Docking Station
SW1 / LD1
SW1 – USB: Power from USB; ON – Power from JP1
LD1 – Power-On indicator
JP1 / JP2
JP1 – 5.0 V power supply input
JP2 – USB JTAG emulation port
J1 / J2 /J3 / J8 / J9
J1 – ControlCARD 100-pin DIMM socket
J2 – JTAG header connector
J3 – UART communications header connector
J8 – Internal emulation enable/disable jumper (NO jumper for internal emulation)
J9 – User virtual COM port to C2000 device (Note: ControlCARD would need to be
modified to disconnect the C2000 UART connection from header J3)
Note: The internal emulation logic on the Docking Station routes through the FT2232 USB
device. By default this device enables the USB connection to perform JTAG
communication and in parallel create a virtual serial port (SCI/UART). As shipped, the
C2000 device is not connected to the virtual COM port and is instead connected to J3.