F28004x Microcontroller 1-0
F28004x Microcontroller 1-0
Workshop
Kenneth W. Schachter
Revision 1.0
July 2019
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
July 2019 – Revision 1.0
Mailing Address
Texas Instruments
C2000 Training Technical
13905 University Boulevard
Sugar Land, TX 77479
Texas Instruments
C2000 Technical Training
C2000 is a trademark of Texas Instruments. Copyright © 2019 Texas Instruments. All rights reserved.
Workshop Outline
Workshop Outline
1. Architecture Overview
2. Programming Development Environment
• Lab: Linker command file
3. Peripheral Register Programming
4. Reset and Interrupts
5. System Initialization
• Lab: Watchdog and interrupts
6. Analog Subsystem
• Lab: Build a data acquisition system
7. Control Peripherals
• Lab: Generate and graph a PWM waveform
8. Direct Memory Access (DMA)
• Lab: Use DMA to buffer ADC results
9. Control Law Accelerator (CLA)
• Lab: Use CLA to filter PWM waveform
10. System Design
• Lab: Run the code from flash memory
11. Communications (SCI echoback from C2000Ware)
12. Support Resources
Workshop Manual
Development Tools
F280049C LaunchPad
XDS110 LED1: XDS110
Debug Power External S1: LED5: GPIO34 (green) J11: S2: Boot J14:
Probe (device) Debug Reset LED4: GPIO23 (red) FSI Modes CAN
Port
J2/J4 * J6/J8 *
XDS110 emulation circuitry
J1/J3 * J5/J7 *
F280049C controlCARD
J1:A - USB S1:A - isolated emulation and S1: Boot LED D2:
emulation/ UART communication enable Modes GPIO31 (red)
UART switch
XDS100v2 emulation
and isolation circuitry
LED D3:
GPIO34 (red)
LED D1:
Power
(green)
J1: FSI
TMDSHSECDOCK is a baseboard that provides header pin access to key signals on compatible
HSEC180-based controlCARDs. A breadboard area is available for rapid prototyping. Board
power can be provided by either a USB cable or a 5V barrel power supply.
Unless otherwise noted, the terms C28x and F28004x refer to TMS320F28004x family of devices
throughout the remainder of this workshop manual. For specific details and differences between
device family members, please refer to the device data sheet, user’s guides, and the technical
reference manual.
Module Objectives
When this module is complete, you should have a basic understanding of the F28004x
architecture and how all of its components work together to create a high-end, uniprocessor
control system.
Module Objectives
Chapter Topics
Architecture Overview ................................................................................................................ 1-1
Introduction to the TMS320F28004x ......................................................................................... 1-3
C28x Internal Bussing ........................................................................................................... 1-4
C28x CPU + FPU + VCU + TMU and CLA ............................................................................... 1-5
Special Instructions ............................................................................................................... 1-6
CPU Pipeline ......................................................................................................................... 1-7
C28x CPU + FPU + VCU + TMU Pipeline ............................................................................ 1-8
Memory ..................................................................................................................................... 1-9
Memory Map ......................................................................................................................... 1-9
Dual Code Security Module (DCSM) .................................................................................. 1-10
Peripherals .......................................................................................................................... 1-10
Fast Interrupt Response Manager .......................................................................................... 1-11
Math Accelerators ................................................................................................................... 1-12
Viterbi / Complex Math Unit (VCU-II) .................................................................................. 1-12
Trigonometric Math Unit (TMU)........................................................................................... 1-13
Configurable Logic Block (CLB) .............................................................................................. 1-14
On-Chip Safety Features ........................................................................................................ 1-15
Summary ................................................................................................................................. 1-16
The above block diagram represents an overview of the device features; however refer to the
data sheet for details about a specific device family member. The F28004x CPU is based on the
TI 32-bit C28x fixed-point accumulator-based architecture and it is capable of operating at a clock
frequency of up to 100 MHz. The CPU is tightly coupled with a Floating-Point Unit (FPU) which
enables support for hardware IEEE-754 single-precision floating-point format operations. Also, a
tightly coupled Trigonometric Math Unit (TMU) extends the capability of the CPU to efficiently
execute trigonometric and arithmetic operations commonly found in control system applications.
Similar to the FPU, the TMU provides hardware support for IEEE-754 single-precision floating-
point operations which accelerate trigonometric math functions. A Viterbi, Complex Math, and
CRC Unit (VCU) further extends the capabilities of the CPU for supporting various
communication-based algorithms and is very useful for general-purpose signal processing
applications, such as filtering and spectral analysis.
The Control Law Accelerator (CLA) is an independent 32-bit floating-point math hardware
accelerator which executes real-time control algorithms in parallel with the main C28x CPU,
effectively doubling the computational performance. With direct access to the various control and
communication peripherals, the CLA minimizes latency, enables a fast trigger response, and
avoids CPU overhead. Also, with direct access to the ADC results registers, the CLA is able to
read the result on the same cycle that the ADC sample conversion is completed, providing “just-
in-time” reading, which reduces the sample to output delay.
The 32-bit-wide data busses provide single cycle 32-bit operations. This multiple bus architecture
(Harvard Bus Architecture) enables the C28x to fetch an instruction, read a data value and write a
data value in a single cycle. All peripherals and memory blocks are attached to the memory bus
with prioritized memory accesses.
The DSP features include a modified Harvard architecture and circular addressing. The RISC
features are single-cycle instruction execution, register-to-register operations, and a modified
Harvard architecture. The microcontroller features include ease of use through an intuitive
instruction set, byte packing and unpacking, and bit manipulation.
The C28x 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 C28x 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 multiply-accumulate
(MAC) capabilities can also support 64-bit processing, enable the C28x to efficiently handle
higher numerical resolution calculations 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). The devices also feature floating-point units.
The addition of the Floating-Point Unit (FPU) to the fixed-point CPU core enables support for
hardware IEEE-754 single-precision floating-point format operations. The FPU adds an extended
set of floating-point registers and instructions to the standard C28x architecture, providing
seamless integration of floating-point hardware into the CPU.
Special Instructions
C28x Atomic Read/Modify/Write
Atomic Instructions Benefits
LOAD Simpler programming
READ
Atomic instructions are a group of small common instructions which 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.
CPU Pipeline
C28x CPU Pipeline
A F 1 F 2 D1 D2 R1 R2 E W 8-stage pipeline
B F 1 F 2 D1 D2 R1 R2 E W
C F 1 F 2 D1 D2 R1 R2 E W
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 C28x 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 C28x CPU 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.
With the 8-stage pipeline most operations can be performed in a single cycle.
Floating-point unit (FPU), VCU and TMU 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.
Memory
The F28004x utilizes a memory map where the unified memory blocks can be accessed in either
program space, data space, or both spaces. This type of memory map lends itself well for
supporting high-level programming languages. The memory map structure consists of RAM
blocks dedicated to the CPU, RAM blocks accessible by the CPU and CLA, RAM blocks
accessible by the DMA module, message RAM blocks between the CPU and CLA, CAN
message RAM blocks, flash, and one-time programmable (OTP) memory. The Boot ROM is
factory programmed with boot software routines and standard tables used in math related
algorithms.
Memory Map
The C28x CPU core contains no memory, but can access on-chip and off-chip memory. The
C28x 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.
0x080000
0x008000
FLASH
LS0 – LS7 RAM
(2Kx16 each) (128Kx16)
0x3F8000
Boot ROM (32Kx16)
0x3FFFC0
BROM Vectors (64x16)
There are two dedicated RAM block (M0 and M1) which are tightly coupled with the CPU, and
only the CPU has access to them. The PIE Vectors are a special memory area containing the
vectors for the peripheral interrupts. The eight local shared memory blocks, LS0 through LS7,
are accessible by the CPU and CLA. The four global shared memory blocks, GS0 through GS3,
are accessible by CPU and DMA.
There are two types of message RAM blocks: CLA message RAM blocks and CAN message
RAM blocks. The CLA message RAM blocks are used to share data between the CPU and CLA.
The CAN message RAM blocks contains message objects and parity bits for the message
objects (CAN message RAM can only be accessed in debug mode).
The user OTP is a one-time, programmable, memory block which contains device specific
calibration data for the ADC, internal oscillators, and buffered DACs, in addition to settings used
by the flash state machine for erase and program operations. Additionally, it contains locations
for programming security settings, such as passwords for selectively securing memory blocks,
configuring the standalone boot process, as well as selecting the boot-mode pins in case the
factory-default pins cannot be used. This information is programmed into the dual code security
module (DCSM). The flash memory is primarily used to store program code, but can also be
used to store static data. The boot ROM and boot ROM vectors are located at the bottom of the
memory map.
Z1_CSMPSWD0 Z2_CSMPSWD0
Z1_CSMPSWD1 Z2_CSMPSWD1
Z1_CSMPSWD2 Z2_CSMPSWD2
Z1_CSMPSWD3 Z2_CSMPSWD3
Peripherals
The F28004x is available with a variety of built in peripherals optimized to support control
applications. See the data sheet for specific availability.
• PGA • SCI
• ePWM
• Watchdog • I2C
• eCAP
• DMA • LIN
• eQEP
• CLA • CAN
• CMPSS
• SDFM • FSI
• ADC
• SPI • PMBUS
• DAC
context save
Auto Context Save
T ST0
AH AL
PH PL
AR1 (L) AR0 (L)
DP ST1
DBSTAT IER
PC(msw) PC(lsw)
By incorporating the very fast interrupt response manager with the peripheral interrupt expansion
(PIE) block, it is possible to allow up to 192 interrupt vectors to be processed by the CPU. More
details about this will be covered in the reset, interrupts, and system initialization modules.
Math Accelerators
Viterbi / Complex Math Unit (VCU-II)
Viterbi / Complex Math Unit (VCU)
Extends C28x instruction
set to support: VCU execution
registers
Viterbi operations
VSTATUS
Decode for communications
Data path logic for VCU-II
Complex math VR0 Instruction
1. General instructions
16-bit fixed-point complex FFT VR1
2. CRC instructions
used in spread spectrum VR2
3. Arithmetic instructions
communications, and many signal VR3 4. Galois Field instructions
processing algorithms VSM0
VR4 to 5. Complex FFT instructions
Complex filters VSM63
VR5
used to improve data reliability,
transmission distance, and power VR6
efficiency
VR7
Power Line Communications
(PLC) and radar applications VR8
VCU
Cyclic Redundancy Check Control Logic
VT0
(CRC)
Communications and memory VT1
robustness checks
VCRC
Other: OFDM interleaving &
de-interleaving, Galois Field
arithmetic, AES acceleration
The Viterbi, Complex Math, and CRC Unit (VCU) adds an extended set of registers and
instructions to the standard C28x architecture for supporting various communications-based
algorithms, such as power line communications (PLC) standards PRIME and G3. These
algorithms typically require Viterbi decoding, complex Fast Fourier Transform (FFT), complex
filters, and cyclical redundancy check (CRC). By utilizing the VCU a significant performance
benefit is realized over a software implementation. It performs fixed-point operations using the
existing instruction set format, pipeline, and memory bus architecture. Additionally, the VCU is
very useful for general-purpose signal processing applications such as filtering and spectral
analysis.
y = r * sin(rad)
y
r
x
calculating common
Trigonometric operations
x = r * cos(rad)
Operation Instruction Exe Cycles Result Latency FPU Cycles w/o TMU
Z = Y/X DIVF32 Rz,Ry,Rx 1 5 ~24
Y = sqrt(X) SQRTF32 Ry,Rx 1 5 ~26
Y = sin(X/2pi) SINPUF32 Ry,Rx 1 4 ~33
Y = cos(X/2pi) COSPUF32 Ry,Rx 1 4 ~33
Y = atan(X)/2pi ATANPUF32 Ry,Rx 1 4 ~53
Instruction To QUADF32 Rw,Rz,Ry,Rx 3 11 ~90
Support ATAN2 ATANPUF32 Ra,Rz
Calculation ADDF32 Rb,Ra,Rw
Y = X * 2pi MPY2PIF32 Ry,Rx 1 2 ~4
Y = X * 1/2pi DIV2PIF32 Ry,Rx 1 2 ~4
The Trigonometric Math Unit (TMU) is an extension of the FPU and the C28x instruction set, and
it efficiently executes trigonometric and arithmetic operations commonly found in control system
applications. Similar to the FPU, the TMU provides hardware support for IEEE-754 single-
precision floating-point operations that are specifically focused on trigonometric math functions.
Seamless code integration is accomplished by built-in compiler support that automatically
generates TMU instructions where applicable. This dramatically increases the performance of
trigonometric functions, which would otherwise be very cycle intensive. It uses the same pipeline,
memory bus architecture, and FPU registers as the FPU, thereby removing any special
requirements for interrupt context save or restore.
B U B
implement custom digital U
S
S u
s
CLB2 Int
logic functions L
O
CPU I/F CELL
Tile2
Enhances existing A
L
be connected to external L
GPIO pins U
S
CLB4 Int
Each tile contains the core L
O
CPU I/F CELL
Tile4
reconfiguration logic C
A
L
The Configurable Logic Block (CLB) is configured by software and it allows for the
implementation of custom digital logic functions. Enhancements to the existing peripherals are
enabled through a set of crossbar interconnections. This provides a high level of connectivity to
existing control peripherals such as the enhanced pulse width modulators (ePWM), the enhanced
capture modules (eCAP), and the enhanced quadrature encoder pulse modules (eQEP). The
crossbars also allow the CLB to be connected to external GPIO pins. Therefore, the CLB can be
configured to interact with device peripherals to perform small logical functions such as simple
PWM generators, or to implement custom serial data exchange protocols.
The CLB subsystem contains a number of identical tiles. There are four tiles in the F28004x CLB
subsystems. Each tile contains combinational and sequential logic blocks, as well as other
dedicated hardware. The figure above shows the structure of the CLB subsystem in the F28004x
device.
Annunciation
Single error pin for external signalling of error
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)
Trigonometric math unit (TMU)
Atomic read-modify-write instructions
Fast interrupt response manager
128Kw on-chip flash memory
Dual code security module (DCSM)
Control peripherals
Analog peripherals
Direct memory access (DMA)
Shared GPIO pins
Communications peripherals
Module Objectives
Module Objectives
Chapter Topics
Programming Development Environment ................................................................................ 2-1
Code Composer Studio ............................................................................................................. 2-3
Software Development and COFF Concepts........................................................................ 2-3
Code Composer Studio ......................................................................................................... 2-4
Edit and Debug Perspective (CCSv9) ................................................................................... 2-5
Target Configuration ............................................................................................................. 2-6
CCSv9 Project ....................................................................................................................... 2-7
Creating a New CCSv9 Project ............................................................................................. 2-8
CCSv9 Build Options – Compiler / Linker ............................................................................. 2-9
CCS 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 2: Linker Command File ................................................................................................... 2-18
Each file of code, called a module, may be written independently, including the specification of all
resources necessary for the proper operation of the module. Modules can be written using Code
Composer Studio (CCS) or any text editor capable of providing a simple ASCII file output. The
expected extension of a source file is .ASM for assembly and .C for C programs.
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.
The concept of COFF tools is to allow modular development of software independent of hardware
concerns. An individual assembly language file is written to perform a single task and may be
linked with several other tasks to achieve a more complex total system.
Writing code in modular form permits code to be developed by several people working in parallel
so the development cycle is shortened. Debugging and upgrading code is faster, since
components of the system, rather than the entire system, is being operated upon. Also, new
systems may be developed more rapidly if previously developed modules can be used in them.
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 defines how CCS connects to the device. It describes the device using
GEL files and device configuration files. The configuration files are XML files and have a
*.ccxml file extension.
CCSv9 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.
CCSv9 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 TI-RTOS, as well as build configurations.
To create a new project, you need to select the following menu items:
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. Tool-chain
To make it easier to choose build options, CCS provides a graphical user interface (GUI) for the
various compiler and linker options. Here’s a sample of the configuration options.
Compiler Linker
22 categories for code 9 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)
The 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:
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 RAMM0
(0x400)
.ebss
0x00 0400 RAMM1
(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.
The format is: Name: origin = 0x????, length = 0x????
For example, if you placed a 256Kw FLASH starting at memory location 0x080000, it would read:
MEMORY
{
FLASH: origin = 0x080000 , length = 0x040000
}
Each memory segment is defined using the above format. If you added RAMM0 and RAMM1, it
would look like:
MEMORY
{
RAMM0: origin = 0x000000 , length = 0x0400
RAMM1: 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:> RAMM0 PAGE 1
.cinit:> FLASH PAGE 0
.stack:> RAMM1 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.
on-chip
memory
F28004x
System Description:
• TMS320F28004x
• All internal RAM
blocks allocated
Placement of Sections:
• .text into RAM Block RAMGS01 on PAGE 0 (program memory)
• .cinit into RAM Block RAMGS01 on PAGE 0 (program memory)
• .ebss into RAM Block RAMM0 on PAGE 1 (data memory)
• .stack into RAM Block RAMM1 on PAGE 1 (data memory)
Note: The lab exercises in this workshop have been developed and targeted for the F280049C
LaunchPad. Optionally, the F280049C Experimenter Kit can be used. Refer to Appendix
A for additional information on using the F280049C Experimenter Kit with this workshop.
• F280049C LaunchPad:
Using the supplied USB cable – plug the USB Standard Type A connector into the computer USB
port and the USB Micro Type B connector into the LaunchPad. This will power the LaunchPad
using the power supplied by the computer USB port. Additionally, this USB port will provide the
JTAG communication link between the device and Code Composer Studio.
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 C/C++ projects. A CCS Debug perspective view will
automatically be enabled when the debug session is started. This perspective is used for
debugging C/C++ projects.
In the file name field type F28004x.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 XDS110 USB Debug Probe”. In the “Board or Device” box
type TMS320F280049C to filter the options. In the box below, check the box to select
“TMS320F280049C”.
The LaunchPad XDS110 USB Debug Probe is only wired to support 2-pin cJTAG mode.
Under Advanced Setup click “Target Configuration” and highlight “Texas Instruments
XDS110 USB Debug Probe_0”. Under Connection Properties set the JTAG/SWD/cJTAG
Mode to “cJTAG (1149.7) 2-pin advanced modes”.
Click Save to save the configuration, then close the “F28004x.ccxml” setup window by
clicking the X on the tab.
5. To view the target configurations, click:
A CCS Project window will open. At the top of this window, filter the “Target” options by using
the pull-down list on the left and choose “28004x Piccolo”. In the pull-down list immediately
to the right, choose the “TMS320F280049C”.
Leave the “Connection” box blank. We have already set up the target configuration.
7. The next 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:\F28004x\Labs\Lab2\project
and make sure you are looking in C:\F28004x\Labs\Lab2\source. 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 sign (‘+’ or ‘>’) to the left of Lab2 and notice that the
files are listed.
Project Properties
14. A “Properties” window will open and in the section on the left under “Build” be sure that the
“C2000 Compiler” and “C2000 Linker” options are visible. Next, under “C2000 Linker” select
the “Basic Options”. Notice that .out and .map files are being specified. The .out file is
the executable code that will be loaded into the MCU. The .map file will contain a linker
report showing memory usage and section addresses in memory. Also notice the stack size
is set to 0x200.
15. Under “C2000 Compiler” select the “Processor Options”. Notice the large memory model
and unified memory boxes are checked. Next, notice the “Specify CLA support” is set to
cla2, the “Specify floating point support” is set to fpu32, the “Specify TMU support” is set to
TMU0, and the “Specify VCU support” is set to vcu0. Select Apply and Close 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
sign (‘+’ or ‘>’) 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 red circle with a white “x” inside of it.
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.
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 <enter>. 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 “16-Bit Hex – TI Style” 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.
End of Exercise
The Driverlib is written in C and all source code can be found within C2000Ware. It provides
drivers for all peripherals, as well as drivers for configuring various memory mapped device
settings. In this module, you will learn how to use the Driverlib to facilitate programming the
peripherals and the device.
Module Objectives
Module Objectives
Chapter Topics
Peripherial Register Programming ............................................................................................ 3-1
Register Programming Model ................................................................................................... 3-3
Driver Library (Driverlib) ............................................................................................................ 3-5
Construction of a Driverlib Function ...................................................................................... 3-6
Driverlib Optimization ............................................................................................................ 3-7
Driverlib API Functions and Examples .................................................................................. 3-8
Content Assist ....................................................................................................................... 3-9
Driverlib Documentation ........................................................................................................ 3-9
Driverlib Summary............................................................................................................... 3-10
Lab File Directory Structure ................................................................................................ 3-10
simplifies programming
Bit Fields Bit Field Header Files
C structures – Peripheral
Register Header Files
Direct Register access whole or by
bits and bit fields are
manipulated without masking
Registers and Addresses Ease-of-use with CCS IDE
Direct
User code (C or assembly)
Hardware defines and access register
addresses
The various levels of the programming model provide different degrees of abstraction. The
highest level is DriverLib which are C functions that automatically set the bit fields. This gives you
a minimum amount of flexibility in exchange for a reduced learning curve and simplified
programming. The bit field header files are C structures that allow registers to be access whole
or by bits and bit fields, and modified without masking. This provides a balance between ease of
use and flexibility when working with Code Composer Studio. Direct access to the registers is the
lowest level where the user code, in C or assembly, defines and access register addresses.
*CMPR1 = 0x1234;
The above slide provides a comparison of each programming model, from the lowest level to the
highest level of abstraction. With direct access to the registers, the register addresses are
#defined individually and the user must compute the bit-field mask. The bit field header files
define all registers as structures and the bit fields are directly accessible. DriverLib performs low-
level register manipulation and provides the highest level of abstraction. This workshop makes
use of the Driverlib, which provides flexibility and makes it easy to program the device. Device
support packages can be downloaded from www.ti.com.
The Driver Library (Driverlib) is a set of drivers for accessing the peripherals and device
configuration registers. While Driverlib is not drivers in the pure operating system sense (does
not a common interface and does not connect into a global device driver), they do provide a
software layer to facilitate a slightly higher level of programming.
With the direct register access model, the peripherals are programmed by writing values directly
to the peripheral’s registers. A set of macros is provided to simplify this process. These macros
are stored in several header files contained in the \inc directory.
epwm.h
hw_memmap.h
Contains typedef enum values for:
#define EPWM2_BASE 0x00004100U // EPWM2
EPWM_CLOCK_DIVIDER (_1 = 0)
EPWM_HSCLOCK_DIVIDER (_1 = 0)
hw_epwm.h
Contains #define for all:
EPWM_xxx values in epwm.h
Note: CCS ‘F3’ will open declaration
Driverlib Optimization
Driverlib Optimization
In general, software abstraction can come at the cost of performance
However, Driverlib’s low-level abstraction and optimization-conscious
design makes it efficient
The optimization options are selected in the CCS project by right-clicking on the project in the
project explorer window and then clicking ‘Properties’. In the properties window, the optimization
settings are located under: Build C2000 Compiler Optimization
Optimization Example
Read ADC conversion results
Optimization level of -O2
Single MOV instruction is generated for each function call
See the F28004x Peripheral Driver Library User’s Guide for details
Driverlib Examples
Example projects are helpful for getting started
C:\ti\c2000\C2000Ware_<version>\driverlib\f28004x\examples
Content Assist
Content Assist
The Content Assist feature can be used to offer suggestions for completing function and
parameter names. Also, hover over the function to view its description.
Driverlib Documentation
Driverlib Documentation
Available in .pdf or .html formats
C:\ti\c2000\C2000Ware_<version>\device_support\f28004x\docs
Driverlib Summary
Driverlib Summary
Easier code development
Easy to use
Has been written to be optimized well
CCS – hover over function to view description
Compatible with Bit Field Header Files
TI has already done all the work!
Use the correct Driverlib package for your device:
Note: CCSv9 will automatically add ALL files contained in the folder where the project is created
Module Objectives
Module Objectives
Reset Sources
Peripheral Reset
Chapter Topics
Reset and Interrupts ................................................................................................................... 4-1
Reset and Boot Process ........................................................................................................... 4-3
Reset - Bootloader ................................................................................................................ 4-5
Emulation Boot Mode ............................................................................................................ 4-6
Stand-Alone Boot Mode ........................................................................................................ 4-7
Boot Mode Definition ............................................................................................................. 4-8
Reset Code Flow – Summary ............................................................................................... 4-9
Emulation Boot Mode using Code Composer Studio GEL ................................................... 4-9
Getting to main() ................................................................................................................. 4-10
Peripheral Software Reset Registers .................................................................................. 4-11
Interrupts ................................................................................................................................. 4-12
Interrupt Processing ............................................................................................................ 4-13
Interrupt Enable Register (IER) ........................................................................................... 4-14
Interrupt Global Mask Bit (INTM) ........................................................................................ 4-14
Peripheral Interrupt Expansion (PIE) .................................................................................. 4-15
PIE Block Initialization ......................................................................................................... 4-18
Interrupt Signal Flow – Summary........................................................................................ 4-20
Interrupt Response and Latency ......................................................................................... 4-21
When the MCU is powered-on, and each time the MCU is reset, the internal bootloader software
located in the boot ROM is executed. The boot ROM contains bootloading routines and
execution entry points into specific on-chip memory blocks. This initial software program is used
to load an application to the device RAM through the various bootable peripherals, or it can be
configured to start an application located in flash. The F28004x is extremely flexible in its ability
to use alternate, reduce, or completely eliminate boot mode selection pins by programming a
BOOTPIN_CONFIG register.
Reset - Bootloader
Reset – Bootloader
Reset vector
Reset fetched from
ENPIE = 0 boot ROM
INTM = 1 0x3F FFC0
YES Emulator NO
Connected ?
After the MCU is powered-up or reset, the peripheral interrupt expansion block, also known as the
PIE block, and the master interrupt switch INTM are disabled. This prevents any interrupts during
the boot process. The program counter is set to 0x3FFFC0, where the reset vector is fetched.
Execution then continues in the boot ROM at the code section named InitBoot. If the emulator is
connected, then the boot process follows the Emulation Boot mode flow. In Emulation Boot
mode, the boot is determined by the EMU-BOOTPIN-CONFIG and EMU-BOOTDEF-LOW/HIGH
registers located in the PIE RAM. If the emulator is not connected, the boot process follows the
Stand-alone Boot mode flow. In Stand-alone Boot mode, the boot is determined by two GPIO
pins or the Z1-OTP-BOOTPIN-CONFIG and Z1-OTP-BOOTDEF-HIGH/LOW registers located in
the DCSM OTP.
In Emulation Boot mode, first the KEY value located in the EMU-BOOTPIN-CONFIG register (bit
fields 31-24) is checked for a value of 0x5A or 0xA5. If the KEY value is not 0x5A or 0xA5, the
“wait” boot mode is entered. The KEY value and the Boot Mode Selection Pin values (BMSP2-0,
bit fields 23-0) can then be modified using the debugger and a reset is issued to restart the boot
process. This is the typical sequence followed during device power-up with the emulator con-
nected, allowing the user to control the boot process using the debugger.
Once the EMU-BOOTPIN-CONFIG register is configured and a reset is issued, the KEY value is
checked again. If the KEY value is set to 0xA5 the Stand-alone Boot mode is emulated and the
Z1-OTP-BOOTPIN-CONFIG register is read for the boot pins and boot mode. Otherwise, the
KEY value is set to 0x5A and the boot mode is determined by the BMSP bit field values in the
EMU-BOOTPIN-CONFIG register and the EMU-BOOTDEF-LOW/HIGH registers. The EMU-
BOOTPIN-CONFIG register contains three BMSP bit fields. If the BMSP bit field is set to 0xFF,
then the bit field is not used. Therefore, the boot modes can be set by zero, one, two, or three
BMSP bit fields. This provides one, two, four, or eight boot mode options, respectively. Details
about the BOOTDEF options will be discussed after the Stand-alone Boot mode is covered.
In Stand-alone Boot mode, if the KEY value located in the Z1-OTP-BOOTPIN-CONFIG register
(bit fields 31-24) is not 0x5A, the boot mode is determined by the default GPIO24 and GPIO32
pins. These two pins provide four boot options – Parallel I/O, SCI/Wait, CAN or Flash. If the KEY
value is 0x5A the boot mode is determined by the BMSP bit field values in the Z1-OTP-
BOOTPIN-CONFIG and the OTP-BOOTDEF-LOW/HIGH registers. The Z1-OTP-BOOTPIN-
CONFIG register contains three BMSP bit fields. If the BMSP bit field is set to 0xFF, then the
GPIO pin is not used. Therefore, the boot modes can be set by zero, one, two, or three GPIO
pins. This provides one, two, four, or eight boot mode options, respectively.
31 - 24 23 - 16 15 - 8 7-0
BOOTDEF-LOW BOOT_DEF3 BOOT_DEF2 BOOT_DEF1 BOOT_DEF0
The value in the BOOT_DEF bit fields determines which peripheral is used for bootloading or the
entry point that is used for code execution. In the BOOT_DEF bit field the lower bits define the
boot mode used and the upper bits define the options for that bit mode. Utilizing this type of
booting technique provides flexibility for selecting multiple boot modes, as well as reducing the
number of boot mode pins.
0x080000 0x080000
0x08EFF0
FLASH (128Kw)
0x090000
0x09EFF0
/********************************************************************/
/* EMU Boot Mode - Set Boot Mode During Debug */
/********************************************************************/
menuitem "EMU Boot Mode Select"
hotmenu EMU_BOOT_SARAM()
{
*(unsigned long *)0xD00 = 0x5AFFFFFF;
*0xD04 = 0x0005;
}
hotmenu EMU_BOOT_FLASH()
{
*(unsigned long *)0xD00 = 0x5AFFFFFF;
*0xD04 = 0x0003;
}
Getting to main()
After reset how do we get to main()?
At the code entry point, branch to _c_int00()
Part of compiler run-time support library
Sets up compiler environment
Calls 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 RAMM0; 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.
SYSCTL_PERIPH_RES_EPWMx (x = 1 to 8) SYSCTL_PERIPH_RES_CMPSSx (x = 1 to 7)
SYSCTL_PERIPH_RES_ECAPx (x = 1 to 7) SYSCTL_PERIPH_RES_PGAx (x = 1 to 7)
SYSCTL_PERIPH_RES_EQEPx (x = 1 or 2) SYSCTL_PERIPH_RES_DACx (x = A or B)
SYSCTL_PERIPH_RES_SD1 SYSCTL_PERIPH_RES_FSITXA
SYSCTL_PERIPH_RES_SCIx (x = A or B) SYSCTL_PERIPH_RES_FSIRXA
SYSCTL_PERIPH_RES_SPIx (x = A or B) SYSCTL_PERIPH_RES_LINA
SYSCTL_PERIPH_RES_I2CA SYSCTL_PERIPH_RES_PMBUSA
SYSCTL_PERIPH_RES_CANx (x = A or B)
The peripheral software reset register (SOFTPRESx) contains the reset bit for each peripheral.
The Driverlib functions are used to reset a peripheral, as shown above.
Interrupts
Interrupt Sources
TINT0
Timer0 NMI
NMI NMI
LPMINT
LPM Logic WAKEINT
WDINT CPU
Watchdog
INPUT4
XINT1 PIE INT1
GPIO0 (Peripheral to
INPUT5
GPIO1 XINT2 Interrupt INT12
Input INPUT6 Expansion)
●
●
XINT3
●
X-BAR INPUT13
XINT4
GPIOx
INPUT14
XINT5
TINT1
Timer1 INT13
TINT2
Peripheral Timer2 INT14
Interrupts
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 five external interrupt lines,
which are mapped through the Input X-BAR, and the external reset pin. The CPU core has 14
interrupt lines. The Peripheral Interrupt Expansion block, known as the PIE block, is connected to
the core interrupt lines 1 through 12 and is used to expand the CPU core interrupt capability,
allowing up to 192 possible interrupt sources.
Interrupt Processing
Maskable Interrupt Processing
Conceptual Core Overview
INT1 1
INT2 0 C28x
CPU
INT14 1
By using a series of flag and enable registers, the CPU can be configured to service one interrupt
while others remain pending, or perhaps disabled when servicing certain critical tasks. When an
interrupt signal occurs on a core line, the interrupt flag register (IFR) for that core line is set. If the
appropriate interrupt enable register (IER) is enabled for that core line, and the interrupt global
mask (INTM) is enabled, the interrupt signal will propagate to the core. Once the interrupt service
routine (ISR) starts processing the interrupt, the INTM bit is disabled to prevent nested interrupts.
The IFR is then cleared and ready for the next interrupt signal. When the interrupt servicing is
completed, the INTM bit is automatically enabled, allowing the next interrupt to be serviced.
Notice that when the INTM bit is ‘0’, the “switch” is closed and enabled. When the bit is ‘1’, the
“switch” is open and disabled. The IER is managed by enabling and disabling Driverlib parameter
values. The INTM bit in the status register is managed by using a Driverlib function or in-line
assembly instructions (macro).
INTM
INT10.y interrupt group C28x
IER
IFR
12 Interrupts
INT11.y interrupt group CPU
INT13 (TINT1)
INT14 (TINT2)
NMI
The C28x CPU core has a total of fourteen interrupt lines, of which two interrupt lines are directly
connected to CPU Timers 1 and 2 (on INT13 and INT14, respectively) and the remaining twelve
interrupt lines (INT1 through INT12) are used to service the peripheral interrupts. A Peripheral
Interrupt Expansion (PIE) module multiplexes up to sixteen peripheral interrupts into each of the
twelve CPU interrupt lines, further expanding support for up to 192 peripheral interrupt signals.
The PIE module also expands the interrupt vector table, allowing each unique interrupt signal to
have its own interrupt service routine (ISR), permitting the CPU to support a large number of
peripherals.
The PIE module has an individual flag and enable bit for each peripheral interrupt signal. Each of
the sixteen peripheral interrupt signals that are multiplexed into a single CPU interrupt line is
referred to as a “group”, so the PIE module consists of 12 groups. Each PIE group has a 16-bit
flag register (PIEIFRx), a 16-bit enable register (PIEIERx), and a bit field in the PIE acknowledge
register (PIEACK) which acts as a common interrupt mask for the entire group. For a peripheral
interrupt to propagate to the CPU, the appropriate PIEIFR must be set, the PIEIER enabled, the
CPU IFR set, the IER enabled, and the INTM enabled. Note that some peripherals can have
multiple events trigger the same interrupt signal, and the cause of the interrupt can be determined
by reading the peripheral’s status register.
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 sixteen interrupt sources.
Each group has a PIE interrupt enable register and a PIE interrupt flag register. Note that
interrupt lines 13, 14, and NMI bypass the PIE block.
Note: above label names proceed with INT_ and #defines are located in driverlib/inc/hw_ints.h
The PIE assignment table maps each peripheral interrupt to the unique vector location for that
interrupt service routine. Notice the interrupt numbers on the left represent the twelve core group
interrupt lines and the interrupt numbers across the top represent the lower eight of the sixteen
peripheral interrupts within the core group interrupt line. The next figure shows the upper eight of
the sixteen peripheral interrupts within the core group interrupt line.
INT1
INT2
INT3
INT6
CLA1PR FSIRXA_ FSIRXA_ FSITXA_ FSITXA_
INT7 DCC OMCRC INT2 INT1 INT2 INT1
INT9
ADCC_
INT10 ADCC4 ADCC3 ADCC2 EVT
INT11
CLA_UND CLA_OV SYS_PLL RAM_ACC FLASH_CO RAM_CO
INT12 ERFLOW ERFLOW _SLIP _VIOL RR_ERR RR_ERR
Note: above label names proceed with INT_ and #defines are located in driverlib/inc/hw_ints.h
Similar to the core interrupt process, the PIE module has an individual flag and enable bit for
each peripheral interrupt signal. Each PIE group has a 16-bit flag register, a 16-bit enable
register, and a bit field in the PIE acknowledge register which acts as a common interrupt mask
for the entire group. An enable PIE bit in the PIECTRL register is used to activate the PIE
module. Note that when using the Driverlib function to enable and disable interrupts, both the
PIEIER and CPU core IER registers are modified.
Two separate functions are called to initialize the the interrupt module and PIE block. During
processor initialization the interrupt vectors, as mapped in the PIE interrupt assignment table, is
copied to the PIE RAM and then the PIE module is enabled by setting ENPIE to ‘1’. When the
CPU receives an interrupt, the vector address of the ISR is fetched from the PIE RAM, and the
interrupt with the highest priority that is both flagged and enabled is executed. Priority is
determined by the location within the interrupt vector table. The lowest numbered interrupt has
the highest priority when multiple interrupts are pending.
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 execution
of the boot code is completed, the selected boot option determines the code entry point. In this
figure, two different entry points are shown. The one on the left is for memory block M0 RAM,
and the one on the right is for flash.
In either case, the CodeStartBranch.asm file has a Long Branch instruction to the entry point of
the runtime support library. After the runtime support library completes execution, main is called.
In main, the two functions are called to initialize the interrupt process and enable the PIE module.
When the CPU receives an interrupt, the vector address of the ISR is fetched from the PIE RAM,
and the interrupt with the highest priority that is both flagged and enabled is executed. Priority is
determined by the location within the interrupt vector table.
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
Chapter Topics
System Initialization .................................................................................................................... 5-1
Oscillator/PLL Clock Module ..................................................................................................... 5-3
Initializing Clock Modules ...................................................................................................... 5-5
Watchdog Timer ........................................................................................................................ 5-6
General Purpose Digital I/O .................................................................................................... 5-10
Configuring GPIO Pins ........................................................................................................ 5-11
GPIO Input X-Bar ................................................................................................................ 5-14
GPIO Output X-Bar ............................................................................................................. 5-15
External Interrupts ................................................................................................................... 5-17
Low Power Modes ................................................................................................................... 5-18
Register Protection.................................................................................................................. 5-20
Lab 5: System Initialization ..................................................................................................... 5-22
MUX
1/n PLLSYSCLK
XCLKIN X1
XTAL OSC
(X2 n.c.) PLLCLK
PLL 1
XTAL
XTAL
SYSPLLMULT SYSCLK
X2 CPU CPUCLK
PCLKCRx
PERxSYSCLK
PCLKCRx
PERxLSPCLK
LOSPCP LSPCLK
The device clock signals are derived from one of four clock sources: Internal Oscillator 1
(INTOSC1), Internal Oscillator 2 (INTOSC2), External Oscillator (XTAL), and single-ended 3.3V
external clock (XCLKIN). At power-up, the device is clocked from the on-chip 10 MHz oscillator
INTOSC2. INTSOC2 is the primary internal clock source, and is the default system clock at
reset. The device also includes a redundant on-chip 10 MHz oscillator INTOSC1. INTOSC1 is a
backup clock source, which normally only clocks the watchdog timers and missing clock detection
circuit. Additionally, the device includes dedicated X1 and X2 pins for supporting an external
clock source such as an external oscillator, crystal, or resonator.
LOSPCP LSPCLK
SYSCTL_PLL_ENABLE
SYSCTL_OSCSRC_OSC1 SYSCTL_PLL_DISABLE
SYSCTL_OSCSRC_OSC2
SYSCTL_SYSDIV(x)
SYSCTL_OSCSRC_XTAL
where x is either 1 or an
even value up to 126
SYSCTL_FMULT_0
SYSCTL_IMULT(x) SYSCTL_LSPCLK_PRESCALE_x
SYSCTL_FMULT_1_4
where x is a value where x is 1, 2, 4, 6, 8, 10, 12, 14
from 1 to 127 SYSCTL_FMULT_1_2
SYSCTL_FMULT_3_4
SysCtl_setClock(config); SysCtl_setLowSpeedClock( );
The config parameter is the OR of several LSPCLK = SYSCLK / 4 (default)
different values, many of which are grouped
into sets where only one can be chosen
The clock sources can be multiplied using the PLL and divided down to produce the desired clock
frequencies for a specific application. A clock source can be fed directly into the CPU or
multiplied using the PLL. The PLL provides the capability to use the internal 10 MHz oscillator
and run the device at the full 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 7-bit integer and 2-bit fractional ratio control to select different CPU clock rates.
The C28x CPU provides a SYSCLK 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 SYSCLK and use their own clock prescalers for
operation.
device.h
#define DEVICE_SETCLOCK_CFG (SYSCTL_OSCSRC_XTAL |
100 MHz SYSCLK frequency
based on SYSCTL_IMULT(10) |
DEVICE_SETCLOCK_CFG SYSCTL_FMULT_NONE |
PLLSYSCLK = 20MHz SYSCTL_SYSDIV(2) |
(XTAL_OSC) * 10 (IMULT) * 1 SYSCTL_PLL_ENABLE)
(FMULT) / 2 (PLLCLK_BY_2)
The peripheral clock control register (PCLKCRx) allows individual peripheral clock signals to be
enabled or disabled using a Driverlib function. If a peripheral is not being used, its clock signal
could be disabled, thus reducing power consumption.
SYSCTL_PERIPH_CLK_EPWMx (x = 1 to 8) SYSCTL_PERIPH_CLK_CMPSSx (x = 1 to 7)
SYSCTL_PERIPH_CLK_ECAPx (x = 1 to 7) SYSCTL_PERIPH_CLK_PGAx (x = 1 to 7)
SYSCTL_PERIPH_CLK_EQEPx (x = 1 or 2) SYSCTL_PERIPH_CLK_DACx (x = A or B)
SYSCTL_PERIPH_CLK_SD1 SYSCTL_PERIPH_CLK_FSITXA
SYSCTL_PERIPH_CLK_SCIx (x = A or B) SYSCTL_PERIPH_CLK_FSIRXA
SYSCTL_PERIPH_CLK_SPIx (x = A or B) SYSCTL_PERIPH_CLK_LINA
SYSCTL_PERIPH_CLK_I2CA SYSCTL_PERIPH_CLK_PMBUSA
SYSCTL_PERIPH_CLK_CANx (x = A or B) SYSCTL_PERIPH_CLK_DCC0
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 user-selectable reset or interrupt is triggered. During runtime the correct
key values in the proper sequence must be written to the watchdog key register in order to reset
the counter before it overflows.
Watchdog Timer
Resets the device if the CPU crashes
Watchdog counter runs independently 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 set the PWM outputs to a high-impedance state, which will turn off the power converters in a
properly designed system.
The watchdog timer starts running immediately after system power-up/reset, and must be dealt
with by software soon after. Specifically, the watchdog must be serviced or disabled within 13.11
milliseconds (using a 10 MHz watchdog clock) after any reset before a watchdog initiated reset
will occur. This translates into 131,072 watchdog clock 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.
WDCNTR
8-bit Watchdog
Counter
CLR CNT
WDRST
System Output
Reset Pulse
WDWCR WDCNTR
less than WDINT
window WDWCR
55 + AA
Detector minimum
Good Key
WDCHK
Watchdog
Reset Key
Register 3
/
/ Bad WDCHK Key
WDKEY 3
1 0 1
The watchdog clock is divided by the pre-divider and then pre-scaled, if desired for slower
watchdog time periods. A watchdog disable switch allows the watchdog to be enabled and
disabled. Also a watchdog override switch provides an additional safety mechanism to insure the
watchdog cannot be disabled. Once set, the only means to disable the watchdog is by a system
reset.
During initialization, a value ‘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. The watchdog also contains an optional
“windowing” feature that requires a minimum delay between counter resets.
SysCtl_setWatchdogPredivider(SYSCTL_WD_PREDIV_x);
where x is 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, or 4096
default = 512 (providing backwards compatibility)
SysCtl_setWatchdogPrescaler(SYSCTL_WD_PRESCALE_x);
where x is 1, 2, 4, 8, 16, 32, or 64
default = 1
1 0xAA No action
2 0xAA No action
3 0x55 WD counter enabled for reset on next AAh write
4 0x55 WD counter enabled for reset on next AAh write
5 0x55 WD counter enabled for reset on next AAh write
6 0xAA WD counter is reset
7 0xAA No action
8 0x55 WD counter enabled for reset on next AAh write
9 0xAA WD counter is reset
10 0x55 WD counter enabled for reset on next AAh write
11 0x23 No effect; WD counter not reset on next AAh write
12 0xAA No action due to previous invalid value
13 0x55 WD counter enabled for reset on next AAh write
14 0xAA WD counter is reset
GPIO Port A
[GPIO 0 to 15] [GPIO 0 to 15]
Direction Register
(GPADIR)
GPIO Port A Group GPIO Port A Mux2 [GPIO 0 to 31]
Mux2 Register Register
(GPAGMUX2) (GPAMUX2)
[GPIO 16 to 31] [GPIO 16 to 31]
Internal Bus
GPIO Port B
[GPIO 32 to 47] [GPIO 32 to 47]
Direction Register
(GPBDIR)
GPIO Port B Group GPIO Port B Mux2 [GPIO 32 to 63]
Mux2 Register Register
(GPBGMUX2) (GPBMUX2)
[GPIO 48 to 63] [GPIO 48 to 63]
Analog
Input Input
Port H
[GPIO 224 to 255]
Inverter Qual
The F28004x device incorporates a multiplexing scheme to enable each I/O pin to be configured
as a GPIO pin or one of several peripheral I/O signals. Sharing a pin across multiple functions
maximizes application flexibility while minimizing package size and cost. A GPIO Group
multiplexer and four GPIO Index multiplexers provide a double layer of multiplexing to allow up to
twelve independent peripheral signals and a digital I/O function to share a single pin. Each output
pin can be controlled by either a peripheral or either the CPU or CLA. By default, all of the pins
are configured as GPIO, and when configured as a signal input pin, a qualification sampling
period can be specified to remove unwanted noise. Optionally, each pin has an internal pullup
resistor that can be enabled in order to keep the input pin in a known state when no external
signal is driving the pin. The GPIO pins are grouped into two ports (Port A and Port B), and each
port has 32 pins. For a GPIO, each port has a series of registers that are used to control the
value on the pins, and within these registers each bit corresponds to one GPIO pin. Additionally,
Analog Port H is an input ony which has input qualification capability.
If the pin is configured as GPIO, a direction (DIR) register is used to specify the pin as either an
input or output. By default, all GPIO pins are inputs. The current state of a GPIO pin
corresponds to a bit value in a data (DAT) register, regardless if the pin is configured as GPIO or
a peripheral function. Writing to the DAT register bit field clears or sets the corresponding output
latch, and if the pin is configured as an output the pin will be driven either low or high. The state
of various GPIO output pins on the same port can be easily modified using the SET, CLEAR, and
TOGGLE registers. The advantage of using these registers is a single instruction can be used to
modify only the pins specified without disturbing the other pins. This also eliminates any timing
issues that may occur when writing directly to the data registers.
The input qualification scheme is very flexible, and the type of input qualification can be
configured for each GPIO pin individually. In the case of a GPIO input pin, the qualification can
be specified as only synchronize to SYSCLKOUT or qualification by a sampling window. For pins
that are configured as peripheral inputs, the input can also be asynchronous in addition to
synchronized to SYSCLKOUT or qualified by a sampling window.
SYSCLK
Qualification Period
GPIO_setQualificationPeriod(pin, divider);
pin is the GPIO pin number
divider is the value by which the frequency of SYSCLKOUT is divided
and it can be 1 or an even value between 2 and 510 inclusive
Port Functions
GPIO_readPortData(port);
GPIO_writePortData(port, outVal);
GPIO_setPortPins(port, pinMask);
GPIO_clearPortPins(port, pinMask);
GPIO_togglePortPins(port, pinMask);
port is the GPIO port: GPIO_PORT_x where x is the port letter
outVal parameter is bit-packed value (32 pins) written to the port
pinMask parameter is a bit-packed value (32 pins) masking the port
The Input X-BAR is used to route external GPIO signals into the device. It has access to every
GPIO pin, where each signal can be routed to any or multiple destinations which include the
ADCs, eCAPs, ePWMs, Output X-BAR, and external interrupts. This provides additional flexibility
above the multiplexing scheme used by the GPIO structure. Since the GPIO does not affect the
Input X-BAR, it is possible to route the output of one peripheral to another, such as measuring the
output of an ePWM with an eCAP for frequency testing.
XBAR_setInputPin(input, pin);
input Destinations (pin is the GPIO pin number)
XBAR_INPUT1 eCAPx, ePWM X-BAR, ePWM[TZ1, TRIP1], Output X-BAR
XBAR_INPUT2 eCAPx, ePWM X-BAR, ePWM[TZ2, TRIP2], Output X-BAR
XBAR_INPUT3 eCAPx, ePWM X-BAR, ePWM[TZ3, TRIP3], Output X-BAR
XBAR_INPUT4 eCAPx, ePWM X-BAR, XINT1, Output X-BAR
XBAR_INPUT5 eCAPx, ePWM X-BAR, XINT2, ADCEXTSOC, EXTSYNCIN1, Output X-BAR
XBAR_INPUT6 eCAPx, ePWM X-BAR, XINT3, ePWM[TRIP6], EXTSYNCIN2, Output X-BAR
XBAR_INPUT7 eCAPx, ePWM X-BAR
XBAR_INPUT8 eCAPx, ePWM X-BAR
XBAR_INPUT9 eCAPx, ePWM X-BAR
XBAR_INPUT10 eCAPx, ePWM X-BAR
XBAR_INPUT11 eCAPx, ePWM X-BAR
XBAR_INPUT12 eCAPx, ePWM X-BAR
XBAR_INPUT13 eCAPx, ePWM X-BAR, XINT4
XBAR_INPUT14 eCAPx, ePWM X-BAR, XINT5
XBAR_INPUT15 eCAPx
XBAR_INPUT16 eCAPx
The Output X-BAR is used to route various internal signals out of the device. It contains eight
outputs that are routed to the GPIO structure, where each output has one or multiple assigned pin
positions, which are labeled as OUTPUTXBARx. Additionally, the Output X-BAR can select a
single signal or logically OR up to 32 signals.
External Interrupts
External Interrupts
5 external interrupt signals
XINT1, XINT2, XINT3, XINT4 and XINT5
Each external interrupt can be mapped to any of
the GPIO pins via the X-BAR Input architecture
XINT1-5 are sources for Input X-BAR signals 4, 5, 6,
13, and 14 respectively
XINT1, XINT2, and XINT3 also have a free-
running 16-bit counter which measures the
elapsed time between interrupts
Counter resets to zero each time the interrupt occurs
Driverlib function used to read counter value:
GPIO_getInterruptCounter(extIntNum);
extIntNum parameter is: GPIO_INT_XINTx (x = 1, 2, or 3)
GPIO_setInterruptPin(pin, extIntNum);
GPIO_setInterruptType(extIntNum, intType);
GPIO_[enable|disable]Interrupt(extIntNum);
pin is the GPIO pin number
extIntNum parameter specifies the external interrupt
GPIO_INT_XINT1
GPIO_INT_XINT2
GPIO_INT_XINT3
GPIO_INT_XINT4
GPIO_INT_XINT5
intType parameter specifies the type of interrupt trigger
GPIO_INT_TYPE_FALLING_EDGE
GPIO_INT_TYPE_RISING_EDGE
GPIO_INT_TYPE_BOTH_EDGES
HALT
INTOSC – not automatically powered down; software
configurable
XTAL – can be powered down by software at any time
STANDBY is not supported but can be emulated – see
device Technical Reference Manual
See device data sheet for each low power mode
power consumption
Exit
Interrupt GPIO Any
Watchdog
Reset 0 - 63 Enabled
Interrupt
Low Power Signal Interrupt
Mode
Register Protection
LOCK Protection Registers
“LOCK” registers protects several system configuration
registers from spurious CPU writes
Once the LOCK Driverlib functions are set the respective
locked registers can no longer be modified by software:
ASysCtl_lockTemperatureSensor ASysCtl_lockCMPHNMux PGA_lockRegisters
ASysCtl_lockANAREF ASysCtl_lockCMPLNMux SysCtl_lockAccessControlRegs
ASysCtl_lockVMON ASysCtl_lockVREG SysCtl_lockSyncSelect
ASysCtl_lockDCDC DAC_lockRegister XBAR_lockInput
ASysCtl_lockPGAADCINMux EPWM_lockRegisters XBAR_lockOutput
ASysCtl_lockCMPHPMux HRPWM_lockRegisters XBAR_lockEPWM
ASysCtl_lockCMPLPMux MemCfg_commitConfig
A series of “lock” registers can be used to protect several system configuration settings from
spurious CPU writes. After the lock registers bits are set, the respective locked registers can no
longer be modified by software. However, some registers have lock/unlock capability.
EALLOW Protection (1 of 2)
EALLOW Protection (2 of 2)
Driverlib functions automatically take care of
EALLOW and EDIS protection
The following registers are protected:
Device Configuration & Emulation
Flash
Code Security Module
PIE Vector Table
DMA, CLA, SD, EMIF, X-Bar (some registers)
CANA/B (control registers only; mailbox RAM not protected)
ePWM, CMPSS, ADC, DAC (some registers)
GPIO (control registers only)
System Control
See device data sheet and Technical Reference Manual for detailed listings
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
interrupt process will be tested by using the watchdog to generate an interrupt. This lab will make
use of the F28004x Driver Library (Driverlib) to simplify the programming of the device. 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:\F28004x\Labs\Lab5\source:
CodeStartBranch.asm Lab_5_6_7.cmd
DefaultIsr_5.c Main_5.c
device.c Watchdog_5.c
Gpio.c
${PROJECT_ROOT}/../../f28004x_driverlib/driverlib/inc
${PROJECT_ROOT}/../../Lab_common/include
driverlib.lib
and click OK. Then in the library search path section (“Add <dir> to library
search path”) click the Add icon. In the “Add directory path” window type:
${PROJECT_ROOT}/../../f28004x_driverlib/driverlib/ccs/Debug
and click OK.
5. Now, we need to setup the predefined symbols. Under “C2000 Compiler” select
“Predefined Symbols”. In the predefined name box that opens (“Pre-define NAME”)
click the Add icon. Then in the “Enter Value” window type _LAUNCHXL_F280049C.
This name is used in the project to conditionally include #defines for pin numbers and
other GPIO configuration code specific to the LaunchPad (rather than the controlCARD).
This conditional code is located in the device.h file. Click OK to include the name.
Finally, click Apply and Close to save and close the Properties window.
Memory Configuration
6. Open and inspect the linker command file Lab_5_6_7.cmd. Notice that the user defined
section “codestart” is being linked to a memory block named BEGIN_M0. The
codestart section contains code that branches to the code entry point of the project. The
bootloader must branch to the codestart section at the end of the boot process. Recall
that the emulation boot mode "RAM" branches to address 0x000000 upon bootloader
completion.
Notice that the linker command file Lab_5_6_7.cmd has a memory block named
BEGIN_M0: origin = 0x000000, length = 0x0002, in program memory. The
existing parts of memory blocks BOOT_RSVD and RAMM0 in data memory has been
modified to avoid any overlaps with this memory block.
7. 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. Close the Lab_5_6_7.cmd linker command file.
System Initialization
8. Open and inspect main_5.c. Notice the Device_init() function call to device.c for
initializing the device.
9. Open Watchdog_5.c and edit the file to configure the watchdog for generating a reset.
Also, edit the file to disable the watchdog. Make the modifications to the file at the
appropriate locations in the code. Save your work.
10. Open and inspect Gpio.c. Notice the Driverlib functions that are being used to
configure the GPIO pins. Also, notice the input X-BAR configuration. This file will be
used in the remaining lab exercises.
13. 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 “RAMM0” at address
0x000000. Set the bootloader mode using the menu bar by clicking:
Scripts EMU Boot Mode Select EMU_BOOT_RAM
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_RAM.
15. 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. (Alternatively, 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 (or become trapped as explained in the watchdog hardware reset below).
16. 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”.
18. Build the project by clicking Project Build Project. Select Yes to “Reload the
program automatically”.
Alternatively, you can add the “Build” button to the tool bar in the CCS Debug
perspective (if it is not already there) so that it will available for future use. Click Window
Perspective Customize Perspective… and then select the Tool Bar
Visibility tab. Check the Code Composer Studio Project Build box. This will automatically
select the “Build” button in the Tool Bar Visibility tab. Click OK.
19. Again, 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.
20. This time we will have the watchdog issue a reset that will toggle the XRSn pin (i.e.
perform a hardware reset). Now 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 RAMM0 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 RAMM0,
and execution continued until the breakpoint was hit in main( ).
21. In Main_5.c notice the two function calls to interrupt.c for initializing the PIE
registers and PIE vectors:
Interrupt_initModule();
Interrupt_initVectorTable();
22. Modify main()to enable global interrupts at the appropriate location in the code.
23. In Watchdog_5.c modify the Driverlib function to cause the watchdog to generate an
interrupt rather than a reset.
24. Using the “PIE Interrupt Assignment Table” shown in the previous module find the
location for the watchdog interrupt “INT_WAKE” and fill in the following information:
25. Next modify Watchdog_5.c at the appropriate locations in the code as follows:
• Add the Driverlib function to re-map the watchdog interrupt signal to call the ISR
function. (Hint: #define name in driverlib/inc/hw_ints.h and label name
in DefaultIsr_5.c)
• Add the Driverlib function to enable the appropriate PIEIER and core IER
27. Inspect DefaultIsr_5.c. This file contains interrupt service routines. The ISR for
WAKE interrupt 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.
30. Run your code. Where did your code stop? Are the results as expected? If things went
as expected, your code should stop at the “ESTOP0” instruction in the wakeISR().
32. 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. During this lab exercise, the watchdog was actually
re-enabled (or disabled again) in the file Watchdog_5.c.
Module Objectives
Module Objectives
Understand the operation of the:
Analog-to-Digital Converter (ADC)
Analog Subsystem:
• Three 12-Bit Analog-to-Digital Converters (ADCs)
o 3.45 MSPS each (up to 10.35 MSPS per system)
o Selectable internal reference of 2.5v or 3.3v
o Ratiometric external reference set by VREFHI/VREFLO
• Seven Comparator Subsystems (CMPSS)
o Each contains:
Two analog comparators
Two programmable 12-bit reference DACs
One ramp generator and Two digital glitch filter
• Seven Programmable Gain Amplifiers (PGAs)
o Each features:
Four programmable gain modes: 3x, 6x, 12x, 24x
Programmable output filtering
• Two 12-bit Buffered Digital-to-Analog Converter Outputs (DACs)
o Selectable reference voltage
Chapter Topics
Analog Subsystem ...................................................................................................................... 6-1
Analog-to-Digital Converter (ADC) ............................................................................................ 6-3
ADC Module Block Diagram ................................................................................................. 6-3
ADC Triggering ..................................................................................................................... 6-5
ADC Conversion Priority ....................................................................................................... 6-7
Post Processing Block ........................................................................................................ 6-10
ADC Clocking Flow ............................................................................................................. 6-12
ADC Timing ......................................................................................................................... 6-13
ADC Conversion Result Registers ...................................................................................... 6-13
Signed Input Voltages ......................................................................................................... 6-14
Built-In ADC Calibration ...................................................................................................... 6-14
Analog Subsystem External Reference .............................................................................. 6-15
Comparator Subsystem (CMPSS) .......................................................................................... 6-16
Comparator Subsystem Block Diagram .............................................................................. 6-17
Programmable Gain Amplifier (PGA) ...................................................................................... 6-18
PGA Block Diagram ............................................................................................................ 6-18
Digital-to-Analog Converter (DAC) .......................................................................................... 6-19
Buffered DAC Block Diagram.............................................................................................. 6-20
Analog Subsystem Interconnect ............................................................................................. 6-21
Analog Group Connections ................................................................................................. 6-22
Analog Group Connection – Example ................................................................................. 6-23
Lab 6: Analog-to-Digital Converter.......................................................................................... 6-25
Post Processing
ADCRESULT0
ADCIN1
ADCIN2 ADCRESULT1
Blocks
12-bit Result
ADCIN3 S/H ADCRESULT2
MUX A/D MUX
Converter
ADCIN14 SOCx ADCRESULT15
ADCIN15
ADC full-scale ADC ADC
input range is CHSEL EOCx ADCINT1-4
Generation Interrupt
VREFLO to VREFHI Logic Logic
SOCx Signal ADCINT1
ADCINT2
SOC0 TRIGSEL CHSEL ACQPS
SOCx Triggers
*** Multiple ADC modules allow for simultaneous sampling or independent operation ***
The various trigger sources that can be used to start an ADC conversion include the General-
Purpose Timers, the ePWM modules, an external pin, and by software. Also, the flag setting of
either ADCINT1 or ADCINT2 can be configured as a trigger source which can be used for
continuous conversion operation. The ADC interrupt logic can generate up to four interrupts.
The results for SOC 0 through 15 appear in result registers 0 through 15, respectively.
The figure above is a conceptual view highlighting a single ADC start-of-conversion functional
flow from triggering to interrupt generation. This figure is replicated 16 times and the Driverlib
functions highlight the sections that they modify.
ADC Triggering
Example – ADC Triggering
Sample A1 A3 A5 when ePWM1 SOCB/D is generated and then generate ADCINT1:
SOCB/D (ETPWM1)
SOC0 Channel Sample Result0 no interrupt
A1 20 cycles
SOC1 Channel Sample
A3 26 cycles Result1 no interrupt
Software Trigger
The top example in the figure above shows channels A1, A3, and A5 being converted with a
trigger from EPWM1. After A5 is converted, ADCINT1 is generated. The bottom example shows
channels A2, A4, and A6 being converted initially by a software trigger. Then, after A6 is
converted, ADCINT2 is generated and also fed back as a trigger to start the process again.
ADCINT1
SOC3 Channel Sample
B3 20 cycles Result3 no interrupt
The ADC ping-pong triggering example in the figure above shows channels B0 through B5 being
converted, triggered initially by software. After channel B2 is converted, ADCINT1 is generated,
which also triggers channel B3. After channel B5 is converted, ADCINT2 is generated and is also
fed back to start the process again from the beginning. Additionally, ADCINT1 and ADCINT2 are
being used to manage the ping-pong interrupts for the interrupt service routines.
When multiple triggers are received at the same time, the ADC conversion priority determines the
order in which they are converted. Three different priority modes are supported. The default
priority mode is round robin, where no start-of-conversion has an inherently higher priority over
another, and the priority depends upon a round robin pointer. The round robin pointer operates in
a circular fashion, constantly wrapping around to the beginning. In high priority mode, one or
more than one start-of-conversion is assigned as high priority. The high priority start-of-
conversion can then interrupt the round robin wheel, and after it has been converted the wheel
will continue where it was interrupted. High priority mode is assigned first to the lower number
start-of-conversion and then in increasing numerical order. If two high priority start-of-conversion
triggers occur at the same time, the lower number will take precedence. Burst mode allows a
single trigger to convert one or more than one start-of-conversion sequentially at a time. This
mode uses a separate Burst Control register to select the burst size and trigger source.
High Priority
SOC0
SOC1 SOC Priority
SOC2 Determines cutoff point
SOC3 for high priority and
round robin mode
SOC4
SOCPRIORITY
SOC5
SOC6 ADC_setSOCPriority(base, priMode);
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
In this conversion priority functional diagram, the Start-of-Conversion Priority Control Register
contains two bit fields. The Start-of-Conversion Priority bit fields determine the cutoff point
between high priority and round robin mode, whereas the Round-Robin Pointer bit fields contains
the last converted round robin start-of-conversion which determines the order of conversions.
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
BURSTSIZE
SOC Burst Size
Determines how many
BURSTTRIGSEL SOCs are converted per
burst trigger
The Round-Robin Burst mode utilizes an ADC Burst Control register to enable the burst mode,
determine the burst size, and select the burst trigger source. This register is modified using the
two Driverlib functions shown in the figure.
SOC SOC
SOC 12 8
SOC1 is converted; 3
RRPOINTER stays pointing to SOC5
SOC SOC
11 SOC 9
10
SOC6 & SOC7 is converted;
RRPOINTER points to SOC7;
SOC8 is now highest RR priority
FREECOUNT
+ EVENTx
ADCEVTSTAT.PPBxTRIPHI
ADCEVTSTAT.PPBxZERO
Offset Correction
w/ Saturation
ADCPPBxOFFCAL Threshold Compare
Zero
ADC Output + - saturate
Crossing
Σ ADCRESULTy
Detect
ADCPPBxTRIPHI + INTx
Error/Bipolar Calculation
-
+ Twos
-
ADCPPBxOFFREF Σ Comp ADCPPBxRESULT
Inv +
Enable
ADCPPBxCONFIG.TWOSCOMPEN ADCPPBxTRIPLO -
ADCEVTINTSEL.PPBxZERO
ADCEVTINTSEL.PPBxTRIPHI
ADCEVTINTSEL.PPBxTRIPLO
To further enhance the capabilities of the ADC, each ADC module incorporates four post-
processing blocks (PPB), and each PPB can be linked to any of the ADC result registers. The
PPBs can be used for offset correction, calculating an error from a set-point, detecting a limit and
zero-crossing, and capturing a trigger-to-sample delay. Offset correction can simultaneously
remove an offset associated with an ADCIN channel that was possibly caused by external
sensors or signal sources with zero-overhead, thereby saving processor cycles. Error calculation
can automatically subtract out a computed error from a set-point or expected result register value,
reducing the sample to output latency and software overhead. Limit and zero-crossing detection
automatically performs a check against a high/low limit or zero-crossing and can generate a trip
to the ePWM and/or generate an interrupt. This lowers the sample to ePWM latency and reduces
software overhead. Also, it can trip the ePWM based on an out-of-range ADC conversion without
any CPU intervention which is useful for safety conscious applications. Sample delay capture
records the delay between when the SOCx is triggered and when it begins to be sampled. This
can enable software techniques to be used for reducing the delay error.
ADCEVTINT
Post Processing Block 3
EVENTx ADCEVT3
INTx
SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ADCA);
ADC Timing
ADC Timing
SYSCLK = 100 MHz (10 ns period)
ADCCLK = 50 MHz (20 ns period)
ADCINTCYCLE
Generate Early Generate Late
Interrupt Interrupt
SYSCLK ADCCLK
Note: above table based on internal reference of 3.3 V; for external reference VREFHI
is VDDA maximum, however VREFHI is typically selected as 2.5 V or 3.0 V
VREFLO
GND
The F28004x includes independent Comparator Subsystem (CMPSS) modules that are useful for
supporting applications such as peak current mode control, switched-mode power, power factor
correction, and voltage trip monitoring. The Comparator Subsystem modules have the ability to
synchronize with a PWMSYNC event.
>
0 2 CTRLthUTH
0 12-bit ChatH 0 Digital 3 To hUTtUT X-BAR
D Q 1 DACHVALA S
DACH 0 _ D RQ Cilter R
>
1 ChatCTL[CTRLthUTHS9L]
>
9b Catx_Hb 1 R Q
ChatCTL[ChatHLbV] hR
Ramp Denerator 1
ChatCTL[ChatHShURC9] 0 0
ChatSTS[ChatHLATCH]
ChatDACCTL[DACShURC9] 1 hR
ChatSTSCLR[HSYbCCLR9b] ChatCTL[ASYbCH9b]
ChatSTSCLR[HLATCHCLR]
9tWa1SYbCt9R
0 0 0
9tWa2SYbCt9R
1
9tWa3SYbCt9R 9tWaSYbCt9R 1
2
hR
... … ChatSTSCLR[LLATCHCLR]
9tWanSYbCt9R n-1 ChatSTSCLR[LSYbCCLR9b] ChatCTL[ASYbCL9b]
9tWaBLAbK
AbD hR
ChatDACCTL[BLAbK9b] 0 0
ChatDACCTL[RAatShURC9]
ChatSTS[ChatLLATCH]
1
9tWa1BLAbK Catx_Lt
0 SYSCLK > + hR
9tWa2BLAbK
1 R Q
9tWa3BLAbK DACLVALS D Q 0 ChatL 0
2 12-bit Digital ChatCTL[CTRLtLS9L]
>
R
... DACLVALA D RQ S
>
… DACL 0 Cilter
9tWanBLAbK D Q 1 _ 1 3 CTRLtL
n-1 Catx_Lb 1 ChatSTS[ChatLSTS]
2 To 9tWa X-BAR
>
9b ChatCTL[ChatLLbV] SYbCL
1
ChatDACCTL[BLAbKShURC9] SYSCLK ASYbCL
ChatDACCTL[SWLhADS9L] ChatCTL[ChatLShURC9] 0 To hUTtUT X-BAR
ChatCTL[CTRLthUTLS9L]
Each CMPSS module is designed around a pair of analog comparators which generates a digital
output indicating if the voltage on the positive input is greater than the voltage on the negative
input. The comparator positive and negative input signals are independently selectable by using
the analog subsystem interconnect scheme. The positive input to the comparator is always
driven from an external pin. The negative input can be driven by either an external pin or an
internal programmable 12-bit digital-to-analog (DAC) as a reference voltage. Values written to
the DAC can take effect immediately or be synchronized with ePWM events. A falling-ramp
generator is optionally available to the control the internal DAC reference value for one
comparator in the module. Each comparator output is fed through a programmable digital filter
that can remove spurious trip signals. Also included is PWM blanking capability to clear-and-
reset existing or imminent trip conditions near the EPWM cycle boundaries.The output of the
CMPSS generates trip signals to the ePWM event trigger submodule and GPIO structure.
PGA Output
Filter pin can be
used as a regular
ADC/CMPSS pin
The buffered 12-bit DAC module can be used to provide a programmable reference output
voltage and it includes an analog output buffer that is capable of driving an external load. Values
written to the DAC can take effect immediately or be synchronized with ePWM events.
Internal 1.65 V 1
VDAC 0 DACREF
0
Reference 2.5 V 1 0
1
Circuit
VREFHI DAC_[enable|disable]Output(base);
DAC_setShadowValue(base, value);
SYSCLK
VDDA
VSSA
EPWM1SYNCPER 0
EPWM2SYNCPER 1
VSSA DAC_setGainMode(base, mode);
EPWM7SYNCPER 6 DAC_setLoadMode(base, mode);
EPWM8SYNCPER 7
DAC_setPWMSyncSignal(base, signal);
Two sets of DACVAL registers are present in the buffered DAC module: DACVALA and
DACVALS. DACVALA is a read-only register that actively controls the DAC value. DACVALS is a
writable shadow register that loads into DACVALA either immediately or synchronized with the
next PWMSYNC event. The ideal output of the internal DAC can be calculated as shown in the
equation above.
The Analog Subsystem Interconnect enables a very flexible pin usage, allowing for smaller device
packages. The DAC outputs, comparator subsystem inputs, PGA functions, and digital inputs are
multiplexed with the ADC inputs. This type of interconnect permits a single pin to route a signal
to multiple analog modules. The figure below is the generic analog group structure
Analog Group x
The general-purpose ADC input pins, shown by the red and green lines, connects to the ADCs
and the input multiplexers which feed the positive and negative comparator subsystem inputs.
Also, the ADC input pins connect as inputs to the AIOs.
The PGA input pin, shown by the red line, connects to the PGA and the input multiplexers which
feed the positive comparator subsystem inputs. The PGA output, shown by the green line,
connects to the ADCs and the input multiplexers which feed the positive comparator subsystem
inputs. The PGA filtered output, shown by the blue line, connects to the ADCs and the input
multiplexers which feed the positive comparator subsystem inputs, in addition to being an input to
the AIO.
Using the Analog Pins and Internal Connection table, notice that group name G1_ADCAB is
connected to pin 10 and has a pin name as A3. This signal is always connected to ADCA and it
is multiplexed with the comparator subsystem inputs. It is also connected to AIO233. The
remaining pin numbers, pin names, and connections are determined the same way.
For this example, the complete Analog Group 1 connections are shown. Again, notice that pin
name ‘A3’ is connected to pin 10 as an input to ADCAIN3, and it is multiplexed with the
comparator subsystem inputs. Also, it is connected as an input to AIO233. The other remaining
connections can be mapped back to the Analog Pins and Internal Connection table.
‘A3’ (10) A3
AIO233
‘A2/B6/PGA1_OF’ (9) A2, B6
AIO224
‘C0’ (19) C0
AIO237
‘PGA1_IN’ (18)
A11, B7
‘PGA1_GND’ (14)
ADCINA0
...
ePWM2 triggering
DAC-B ADC on period match
using SOCA trigger every
20 µs (50 kHz) View ADC
Sine buffer PWM
samples
Table
Code Composer
Studio
ePWM2
Recall that there are three basic ways to initiate an ADC start of conversion (SOC):
1. Using software
a. SOCx (where x = 0 to 15) causes a software initiated conversion
[ADC_TRIGGER_SW_ONLY]
2. Automatically triggered on user selectable conditions
a. CPU Timer 0/1/2 interrupt [ADC_TRIGGER_CPU1_TINTx]
b. ePWMxSOCA / ePWMxSOCB (x = 1 to 8) [ADC_TRIGGER_EPWMx_SOCA/B]
- 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/D)
c. ADC interrupt ADCINT1 or ADCINT2
- triggers SOCx selected by the ADC Interrupt Trigger SOC
[ADC_INT_SOC_TRIGGER_NONE or ADC_INT_SOC_TRIGGER_ADCINTx]
3. Externally triggered using a pin
a. SOCx trigger by ADCEXTSOC via INPUT5 X-BAR GPIO pin
[ADC_TRIGGER_GPIO]
One or more of these methods may be applicable to a particular application. In this lab exercise,
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 (GPIO25) high and low in the ADC
interrupt service routine. The ADC ISR will also toggle LED5 on the LaunchPad 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 ADCA channel 0 (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
• GPIO25 pin is also toggled in the ADC ISR
• ADC ISR will also toggle the LaunchPad LED5 as a visual indication that it is running
Procedure
Adc_6.c Gpio.c
CodeStartBranch.asm Lab_5_6_7.cmd
Dac.c Main_6.c
DefaultIsr_6.c SineTable.c
device.c Watchdog.c
EPwm_6.c
Note: The Dac.c and SineTable.c files are used to generate a sine waveform in the
second part of this lab exercise.
Open a memory browser to view some of the contents of the ADC results buffer. The
address label for the ADC results buffer is AdcBuf (type &AdcBuf) in the “Data” memory
page. Then <enter> to view the contents of the ADC result buffer.
Note: Exercise care when connecting any jumper wires to the LaunchPad header pins
since the power to the USB connector is on!
Refer to the following diagram for the location of the pins that will need to be connected:
11. Using a jumper wire, connect the ADCINA0 (pin #70) to “GND” (pin #20) on the
LaunchPad. Then run the code again, and halt it after a few seconds. Verify that the
ADC results buffer contains the expected value of ~0x0000.
12. Adjust the jumper wire to connect the ADCINA0 (pin #70) to “+3.3V” (pin #11; GPIO-
59) on the LaunchPad. (Note: pin # GPIO-59 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.
13. Adjust the jumper wire to connect the ADCINA0 (pin #70) to GPIO25 (pin #31) on the
LaunchPad. 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 GPIO25 pin alternately high and low. (Also, the ADC
ISR is toggling the LED5 on the LaunchPad as a visual indication that the ISR is running).
If you had an oscilloscope available to display GPIO25, 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 GPIO25 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).
A. Windows within Code Composer Studio can be updated at up to a 10 Hz rate while the
MCU is running. This not only allows graphs and watch windows to update, but also
allows the user to change values in watch or memory windows, and have those
changes affect the MCU behavior. This is very useful when tuning control law
parameters on-the-fly, for example.
B. It allows the user to halt the MCU and step through foreground tasks, while specified
interrupts continue to get serviced in the background. This is useful when debugging
portions of a real-time system (e.g., serial port receive code) while keeping critical
parts of your system operating (e.g., commutation and current loops in motor control).
We will only be utilizing capability “A” above during the workshop. Capability “B” is a
particularly advanced feature, and will not be covered in the workshop.
17. The memory and graph windows displaying AdcBuf should still be open. The jumper wire
between ADCINA0 (pin #70) and GPIO25 (pin #31) should still be connected. In real-
time mode, we will have our window continuously refresh at the default rate. To view the
refresh rate click:
Window Preferences…
and in the section on the left select the “Code Composer Studio” category. Click the sign
(‘+’ or ‘>’) to the left of “Code Composer Studio” and select “Debug”. In the section on the
right notice the default setting:
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. To enable and run real-time emulation mode, click the “Enable Silicon Real-time Mode”
toolbar button . A window may open and if prompted select Yes to the “Do you want to
enable realtime mode?” question. This will force the debug enable mask bit (DBGM) in
status register ST1 to ‘0’, which will allow the memory and register values to be passed to
the host processor for updating (i.e. debug events are enabled). Hereafter, Resume and
Suspend are used to run and halt real-time debugging. In the remaining lab exercises
we will run and halt the code in real-time emulation mode.
22. Carefully remove and replace the jumper wire from GPIO25 (pin #31). 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 real-time. 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 GPIO25 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, halt the CPU.
25. Notice the following code lines in the ADCA1 ISR in DefaultIsr_6.c:
//--- Write to DAC-B to create input to ADC-A0
if(SINE_ENABLE == 1)
{
DacOutput = DacOffset + ((QuadratureTable[iQuadratureTable++] ^ 0x8000) >> 5);
}
else
{
DacOutput = DacOffset;
}
if(iQuadratureTable > (SINE_PTS – 1)) // Wrap the index
{
iQuadratureTable = 0;
}
DAC_setShadowValue(DACB_BASE, DacOutput);
The variable DacOffset allows the user to adjust the DC output of DACB from the
Expressions window in CCS. The variable Sine_Enable is a switch which adds a fixed
frequency sine wave to the DAC offset. The sine wave is generated using a 25-point
look-up table contained in the SineTable.c file. We will plot the sine wave in a graph
window while manually adjusting the offset.
26. Open and inspect SineTable.c. (If needed, open the Project Explorer window in the
CCS Debug perspective view by clicking View Project Explorer). The file
consists of an array of 25 signed integer points which represent four quadrants of
sinusoidal data. The 25 points are a complete cycle. In the source code we need to
sequentially access each of the 25 points in the array, converting each one from signed
16-bit to un-signed 12-bit format before writing it to the DACVALS register of DACB.
27. Add the following variables to the Expressions window:
• SINE_ENABLE
• DacOffset
28. Adjust the jumper wire to connect the ADCINA0 (pin #70) to DACB (pin #30) on the
LaunchPad. Refer to the following diagram for the pins that need to be connected.
30. At this point, the graph should be displaying a DC signal near zero. Click on the
DacOffset variable in the Expressions window and change the value to 800. This
changes the DC output of the DAC which is applied to the ADC input. The level of the
graph display should be about 800 and this should be reflected in the value shown in the
memory buffer (note: 800 decimal = 0x320 hex).
31. Enable the sine generator by changing the variable SINE_ENABLE in the Expressions
window to 1.
32. You should now see sinusoidal data in the graph window.
33. Try removing and re-connecting the jumper wire to show this is real data is running in
real-time emulation mode. Also, you can try changing the DC offset variable to move the
input waveform to a different average value (the maximum distortion free offset is about
2000).
36. Next, close the project by right-clicking on Lab6 in the Project Explorer window and
select Close Project.
End of Exercise
Module Objectives
Module Objectives
Chapter Topics
Control Peripherals ..................................................................................................................... 7-1
PWM Review ............................................................................................................................. 7-3
ePWM........................................................................................................................................ 7-5
ePWM Time-Base Sub-Module ............................................................................................ 7-7
ePWM Compare Sub-Module ............................................................................................. 7-10
ePWM Action Qualifier Sub-Module ................................................................................... 7-13
Asymmetric and Symmetric Waveform Generation using the ePWM ................................ 7-19
PWM Computation Example ............................................................................................... 7-20
ePWM Dead-Band Sub-Module .......................................................................................... 7-21
ePWM Chopper Sub-Module .............................................................................................. 7-23
ePWM Trip-Zone and Digital Compare Sub-Modules ........................................................ 7-25
ePWM Event-Trigger Sub-Module ...................................................................................... 7-31
High Resolution PWM (HRPWM)........................................................................................ 7-33
eCAP ....................................................................................................................................... 7-35
eQEP ....................................................................................................................................... 7-39
Sigma Delta Filter Module (SDFM) ......................................................................................... 7-42
Lab 7: Control Peripherals ...................................................................................................... 7-44
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 can be difficult to control when operating in the proportional region, but
are easy to control in the saturation and cutoff regions. Since PWM is a digital signal by nature
and easy for an MCU to generate, it is ideal for use with power switching devices. Essentially,
PWM performs a DAC function, where the duty cycle is equivalent to the DAC analog amplitude
value.
ePWM
ePWM Module Signals and Connections
ePWMx-1
EPWMxSYNCI EPWMxTZINT
INPUT PIE
EPWMxINT
X-Bar CLA
EQEPERR – TZ4 EPWMxA
eQEP
GPIO
CLOCKFAIL – TZ5 ePWMx EPWMxB
SYSCTRL MUX
EMUSTOP – TZ6
CPU
EPWMxSOCA
ePWM EPWMxSOCB ADC
X-Bar EPWMxSYNCO
ePWMx+1
Note: the order in which the ePWM modules are connected is determined by the device synchronization scheme
The ePWM modules are highly programmable, extremely flexible, and easy to use, while being
capable of generating complex pulse width waveforms with minimal CPU overhead or
intervention. Each ePWM module is identical with two PWM outputs, EPWMxA and EPWMxB,
and multiple modules can synchronized to operate together as required by the system application
design. 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, as well as generate interrupts. The
outputs of the comparators are used as inputs to the ePWM X-Bar. Next, the internal details of
the ePWM module will be covered.
ePWM1
EPWM1
SYNCOUT
ePWM2
EPWM4 EXT
SYNCOUT SYNCOUT
ePWM3 ePWM4
EPWM7
SYNCOUT
ePWM5 ePWM7
ECAP1
SYNCOUT SYNCOUT
ePWM6 ePWM8 eCAP1
ECAP4
SYNCOUT
eCAP2 eCAP4
EPWM4SYNCIN
ECAP1SYNCIN eCAP7
ECAP4SYNCIN
ECAP6SYNCIN
Various ePWM modules (and eCAP units) can be grouped together for synchronization.
The time-base submodule consists of a dedicated 16-bit counter, along with built-in
synchronization logic to allow multiple ePWM modules to work together as a single system. A
clock pre-scaler divides the EPWM clock to the counter and a period register is used to control
the frequency and period of the generated waveform. The period register has a shadow register,
which acts like a buffer to allow the register updates to be synchronized with the counter, thus
avoiding corruption or spurious operation from the register being modified asynchronously by the
software.
TBPRD
Asymmetrical
Waveform
Count Up Mode
TBCTR
TBPRD
Asymmetrical
Waveform
TBPRD
Symmetrical
Waveform
The time-base counter operates in three modes: up-count, down-count, and up-down-count. In
up-count mode the time-base counter starts counting from zero and increments until it reaches
the period register value, then the time-base counter resets to zero and the count sequence starts
again. Likewise, in down-count mode the time-base counter starts counting from the period
register value and decrements until it reaches zero, then the time-base counter is loaded with the
period value and the count sequence starts again. In up-down-count mode the time-base counter
starts counting from zero and increments until it reaches the period register value, then the time-
base counter decrements until it reaches zero and the count sequence repeats. The up-count
and down-count modes are used to generate asymmetrical waveforms, and the up-down-count
mode is used to generate symmetrical waveforms.
Phase
φ=240°
En
o o .
SyncIn
EPWM3A
φ=120°
o
CTR=zero o
CTR=CMPB * o o EPWM3B
X o
SyncOut φ=240°
* Extended selection for EPWM_setSyncOutPulseMode(base, mode);
CMPC and CMPD available
Synchronization allows multiple ePWM modules to work together as a single system. The
synchronization is based on a synch-in signal, time-base counter equals zero, or time-base
counter equals compare B register, which can also be extended to compare C and compare D.
Additionally, the waveform can be phase-shifted.
Shadow
Period
Register
EPWM_setTimeBaseCountMode(base, counterMode);
The counter-compare submodule continuously compares the time-base count value to four
counter compare registers (CMPA, CMPB, CMPC, and CMPD) and generates four independent
compare events (i.e. time-base counter equals a compare register value) which are fed to the
action-qualifier and event-trigger submodules. The counter compare registers are shadowed to
prevent corruption or glitches during the active PWM cycle. Typically CMPA and CMPB are used
to control the duty cycle of the generated PWM waveform, and all four compare registers can be
used to start an ADC conversion or generate an ePWM interrupt. For the up-count and down-
count modes, a counter match occurs only once per cycle, however for the up-down-count mode
a counter match occurs twice per cycle since there is a match on the up count and down count.
Count Up Mode
TBCTR
TBPRD .. .. ..
. .. .. ..
CMPA Asymmetrical
CMPB Waveform
.. ..
TBCTR
TBPRD
. .
.. ... ..
CMPA Symmetrical
CMPB Waveform
The above ePWM Compare Event Waveform diagram shows the compare matches which 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.
Shadow Shadow
Compare A Compare B
If shadow mode disabled
TB Signals Signals to
Counter Compare AQ & ET
Compare C Compare D
Shadow Shadow
EPWM_disableCounterCompareShadowLoadMode(base, compModule);
Immediate mode – the shadow register is not used
The action-qualifier submodule is the key element in the ePWM module which is responsible for
constructing and generating the switched PWM waveforms. It utilizes match events from the
time-base and counter-compare submodules for performing actions on the EPWMxA and
EPWMxB output pins. These first three submodules are the main blocks which are used for
generating a basic PWM waveform.
SW Z CA CB P T1 T2 Do Nothing
X X X X X X X
SW Z CA CB P T1 T2
Clear Low
↓ ↓ ↓ ↓ ↓ ↓ ↓
SW Z CA CB P T1 T2
Set High
↑ ↑ ↑ ↑ ↑ ↑ ↑
SW Z CA CB P T1 T2
Toggle
T T T T T T T
Tx Event Sources = DCAEVT1, DCAEVT2, DCBEVT1, DCBEVT2, TZ1, TZ2, TZ3, EPWMxSYNCIN
The Action Qualifier actions are setting the pin high, clearing the pin low, toggling the pin, or do
nothing to the pin, based independently on count-up and count-down time-base match event.
The match events are when the time-base counter equals the period register value, the time-base
counter is zero, the time-base counter equals CMPA, the time-base counter equals CMPB, or a
Trigger event (T1 and T2) based on a comparator, trip, or sync signal. Note that zero and period
actions are fixed in time, whereas CMPA and CMPB actions are moveable in time by
programming their respective registers. Actions are configured independently for each output
using shadowed registers, and any or all events can be configured to generate actions on either
output. 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 setting of the action qualifier with the compare matches are
used to modulate the output pins. Notice that the output pins for EPWMA and EPWMB are
completely independent. In the example above, the EPWMA output is being set high on the zero
match and cleared low on the compare A match. The EPWMB output is being set high on the
zero match and cleared low on the compare B match.
TBCTR
. .
TBPRD
. .
. .
CMPB
. . .
CMPA
CA CB CA CB
↑ ↓ ↑ ↓
EPWMA
Z Z Z
T T T
EPWMB
In the example above, the EPWMA output is being set high on the compare A match and being
cleared low on the compare B match, while the EPWMB output is being toggled on the zero
match.
TBCTR
TBPRD
... ...
CMPB
. . . .
. .
CMPA
.
CA CA CA CA
↑ ↓ ↑ ↓
EPWMA
CB CB CB CB
↑ ↓ ↑ ↓
EPWMB
In the example above, there are different output actions on the up-count and down-count using a
single compare register. The EPWMA and EPWMB outputs are being set high on the compare A
and B up-count matches and cleared low on the compare A and B down-count matches.
TBCTR
TBPRD .. ..
CMPB
. .
. .
CMPA
.
CA CB CA CB
↑ ↓ ↑ ↓
EPWMA
Z P Z P
↓ ↑ ↓ ↑
EPWMB
And finally in the example above, again using different output actions on the up-count and down-
count, the EPWMA output is being set high on the compare A up-count match and being cleared
low on the compare B down-count match. The EPWMB output is being cleared low on the zero
match and being set high on the period match.
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:
= 1024 ≈ 1000
10
Asymmetric PWM: approx. 10 bit resolution since 2
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 ↑ ↓
.
fPWM = 100 kHz
(TPWM = 10 ms)
Period
Compare .
CA P
Counter ↑ ↓
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. This sub-module supports
independently programmable rising-edge and falling-edge delays with various options for
generating the appropriate signal outputs on EPWMxA and EPWMxB.
Original EPWM
Shadow
RED
EPWMxA Dead EPWMxA Rising Edge Delay
EPWMxB Band EPWMxB FED
Falling Edge Delay
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.
.
Rising
Edge
0 Delay
° S4° In Out
0
.
°1
0
° S1° 0
° S6°
(14-bit ° ° S2 RED PWMxA
°1
°
counter)
°1 °1
0
° °
DEDB_
MODE
°
S8 1
. 0
° S7° PWMxB
.
0
1 S8 ° ° S3 FED 1
° S0 °
. °
Falling 1
0
° ° S5 ° ° Edge °1 °
°0 Delay °
0
°1 In Out
OUTSWAP
POLSEL OUT_MODE
(14-bit
IN_MODE counter)
.
PWMxB
HALFCYCLE
See the F28004x Driver Library User’s Guide for available functions
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 resistor acts to limit the current rise rate towards the gate during transistor opening, thus
increasing the opening time. When closing the transistor however, current flows unimpeded from
the gate via the by-pass diode and closing time is therefore not affected. While this passive
The PWM chopper submodule is used with pulse transformer-based gate drives to control the
power switching devices. This submodule modulates a high-frequency carrier signal with the
PWM waveform that is generated by the action-qualifier and dead-band submodules.
Programmable options are available to support the magnetic properties and characteristics of the
transformer and associated circuitry.
Shown in the figure below, 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.
Chopper Waveform
EPWMxA
EPWMxB
CHPFREQ
EPWMxA
EPWMxB
Programmable
Pulse Width With One-
OSHT (OSHTWTH) Shot Pulse
on EPWMxA
Sustaining
and/or
EPWMxA Pulses EPWMxB
See the F28004x Driver Library User’s Guide for available functions
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.
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 CPU
Sensors core P
Digital EPWMxA W
Compare M
EPWMxTZINT
Cycle-by-Cycle O
ePWM X-Bar U
TZ1 – TZ3 INPUT X-Bar Mode T
TZ4 EQEP1ERR P
eQEP1 EPWMxB U
TZ5 CLOCKFAIL One-Shot
SYSCTRL T
CPU TZ6 EMUSTOP Mode S
See ‘Trip-Zone Submodule Mode Control Logic’ figure in F28004x TRM for details
The trip-zone submodule utilizes a fast clock independent logic mechanism to quickly handle fault
conditions by forcing the EPWMxA and EPWMxB outputs to a safe state, such as high, low, or
high-impedance, thus avoiding any interrupt latency that may not protect the hardware when
responding to over current conditions or short circuits through ISR software. It supports one-shot
trips for major short circuits or over current conditions, and cycle-by-cycle trips for current limiting
operation. The trip-zone signals can be generated externally from any GPIO pin which is mapped
through the Input X-Bar (TZ1 – TZ3), internally from an inverted eQEP error signal (TZ4), system
clock failure (TZ5), or from an emulation stop output from the CPU (TZ6). Additionally, numerous
trip-zone source signals can be generated from the digital-compare subsystem.
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 a safe
immediately after the pin is driven low. An interrupt will also be generated.
The digital compare submodules receive their trip signals from the Input X-BAR and ePWM X-
BAR.
The ePWM X-BAR is used to route various internal and external signals to the ePWM modules.
Eight trip signals from the ePWM X-BAR are routed to all of the ePWM modules.
ePWM X-BAR
The ePWM X-BAR architecture block diagram shown below is replicated 8 times. The ePWM X-
BAR can select a single signal or logically OR up to 32 signals. The table in the figure defines the
various trip sources that can be multiplexed to the trip-zone and digital compare submodules.
XBAR_setEPWMMuxConfig(trip, muxConfig);
MUX 0 1 2 3 MUX 0 1 2 3
0 CMPSS1.CTRIPH CMPSS1.CTRIPH_OR_CTRIPL ADCAEVT1 ECAP1OUT 16 SD1FLT1.COMPH SD1FLT1.COMPH_OR_COMPL
1 CMPSS1.CTRIPL INPUTXBAR1 ADCCEVT1 17 SD1FLT1.COMPL INPUT7 CLAHALT
2 CMPSS2.CTRIPH CMPSS2.CTRIPH_OR_CTRIPL ADCAEVT2 ECAP2OUT 18 SD1FLT2.COMPH SD1FLT2.COMPH_OR_COMPL
3 CMPSS2.CTRIPL INPUTXBAR2 ADCCEVT2 19 SD1FLT2.COMPL INPUT8
4 CMPSS3.CTRIPH CMPSS3.CTRIPH_OR_CTRIPL ADCAEVT3 ECAP3OUT 20 SD1FLT3.COMPH SD1FLT3.COMPH_OR_COMPL
5 CMPSS3.CTRIPL INPUTXBAR3 ADCCEVT3 21 SD1FLT3.COMPL INPUT9
6 CMPSS4.CTRIPH CMPSS4.CTRIPH_OR_CTRIPL ADCAEVT4 ECAP4OUT 22 SD1FLT4.COMPH SD1FLT4.COMPH_OR_COMPL
7 CMPSS4.CTRIPL INPUTXBAR4 ADCCEVT4 23 SD1FLT4.COMPL INPUT10
8 CMPSS5.CTRIPH CMPSS5.CTRIPH_OR_CTRIPL ADCBEVT1 ECAP5OUT 24
9 CMPSS5.CTRIPL INPUTXBAR5 25 INPUT11
10 CMPSS6.CTRIPH CMPSS6.CTRIPH_OR_CTRIPL ADCBEVT2 ECAP6OUT 26
11 CMPSS6.CTRIPL INPUTXBAR6 27 INPUT12
12 CMPSS7.CTRIPH CMPSS7.CTRIPH_OR_CTRIPL ADCBEVT3 ECAP7OUT 28
13 CMPSS7.CTRIPL ADCSOCA 29 INPUT13
14 ADCBEVT4 EXTSYNCOUT 30
15 ADCSOCB 31 INPUT14
●
Time-Base Sub-Module
● DCBEVT1
DCBH Digital Trip Generate PWM Sync
TRIPIN12 Event B1
Compare Event-Trigger Sub-Module
TRIPIN14
Generate SOCB
TRIPIN15 blanking
Digital Trip Trip-Zone Sub-Module
TRIP COMBO DCBL
Event B2 Trip PWMB Output
Compare
Generate Trip Interrupt
DCBEVT2
EPWM_selectDigitalCompareTripInput(base, tripSource, dcType);
EPWM_[enable|disable]DigitalCompareTripCombinationInput(base, tripInput, dcType);
The digital-compare subsystem compares signals external to the ePWM module, such as a signal
from the CMPSS analog comparators, to directly generate PWM events or actions which are then
used by the trip-zone, time-base, and event-trigger submodules. These ‘compare’ events can trip
the ePWM module, generate a trip interrupt, sync the ePWM module, or generate an ADC start of
conversion. A compare event is generated when one or more of its selected inputs are either
high or low. The signals can originate from any external GPIO pin which is mapped through the
Input X-Bar and from various internal peripherals which are mapped through the ePWM X-Bar.
Additionally, an optional ‘blanking’ function can be used to temporarily disable the compare action
in alignment with PWM switching to eliminate noise effects.
The event-trigger submodule manages the events generated by the time-base, counter-compare,
and digital-compare submodules for generating an interrupt to the CPU and/or a start of
conversion pulse to the ADC when a selected event occurs.
. .. . ..
. . . .
TBPRD
. .. .. ..
CMPD
.
CMPC
. . .
CMPB
CMPA
CTR = 0
CTR = PRD
CTR = 0 or PRD
CTRU = CMPA
CTRD = CMPA
CTRU = CMPB
CTRD = CMPB
CTRU = CMPC
CTRD = CMPC
CTRU = CMPD
CTRD = CMPD
DCAEVT1.soc / DCBEVT1.soc generates EPWMxSOCA/B pulse (x = 1 to 8)
These event triggers can occur when the time-base counter equals zero, period, zero or period,
the up or down count match of a compare register. Recall that the digital-compare subsystem
can also generate an ADC start of conversion based on one or more compare events. Notice
counter up and down are independent and separate.
The event-trigger submodule also incorporates pre-scaling logic to issue an interrupt request or
ADC start of conversion at every event or up to every fifteenth event.
Regular
Device Clock PWM Step
(i.e. 100 MHz) (i.e. 10 ns)
HRPWM
Micro Step (~150 ps)
The ePWM module is capable of significantly increase its time resolution capabilities over the
standard conventionally derived digital PWM. This is accomplished by adding 8-bit extensions to
the counter compare register (CMPxHR), period register (TBPRDHR), and phase register
(TBPHSHR), providing a finer time granularity for edge positioning control. This is known as
high-resolution PWM (HRPWM) and it is based on micro edge positioner (MEP) technology. The
MEP logic is capable of positioning an edge very finely by sub-dividing one coarse system clock
of the conventional PWM generator with time step accuracy on the order of 150 picoseconds. A
self-checking software diagnostics mode is used to determine if the MEP logic is running
optimally, under all operating conditions such as for variations caused by temperature, voltage,
and process. HRPWM is typically used when the PWM resolution falls below approximately 9 or
10 bits which occurs at frequencies greater than approximately 200 kHz with an EPWMCLK of
100 MHz.
eCAP
Capture Module (eCAP)
Timer
Trigger
pin
Timestamp
Values
The capture units allow time-based logging of external signal transitions. It is used to accurately
time external events by timestamping transitions on the capture input pin. It can be used to
measure the speed of a rotating machine, determine the elapsed time between pulses, calculate
the period and duty cycle of a pulse train signal, and decode current/voltage measurements
derived from duty cycle encoded current/voltage sensors.
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.
Capture 1 Polarity
Register Select 1 Other
Sources
Event Qualifier
Reset Capture 2 Polarity [127:16]
Register Select 2
32-Bit
Event
Time-Stamp
Prescale
Counter
Capture 3 Polarity
Register Select 3 [15:0]
Input
Capture 4 Polarity X-BAR
Hi-Res
Register Select 4
Capture
The eCAP module captures signal transitions on a dedicated input pin and sequentially loads a
32-bit time-base counter value in up to four 32-bit time-stamp capture registers (CAP1 – CAP4).
By using a 32-bit counter, rollover is minimized. Independent edge polarity can be configured as
rising or falling edge, and the module can be run in either one-shot mode for up to four time-
stamp events or continuous mode to capture up to four time-stamp events operating as a circular
buffer. The capture input pin is routed through the Input X-Bar, allowing any GPIO pin on the
device to be used as the input. Also, the input capture signal can be pre-scaled and interrupts
can be generated on any of the four capture events. The time-base counter can be run in either
absolute or difference (delta) time-stamp mode. In absolute mode the counter runs continuously,
whereas in difference mode the counter resets on each capture
Shadowed
Period
shadow
Period Register mode
immediate Register (CAP3)
mode
(CAP1)
32-Bit PWM
Output
Time-Stamp Compare
X-BAR
Counter Logic
Compare
immediate
mode Register Compare
shadow
(CAP2) Register mode
Shadowed (CAP4)
If the module is not used in capture mode, the eCAP module can be configured to operate as a
single channel asymmetrical PWM module (i.e. time-base counter operates in count-up mode).
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.
eQEP
What is an Incremental Quadrature
Encoder?
A digital (angular) position sensor
Ch. A
Ch. B
shaft rotation
The eQEP module interfaces with a linear or rotary incremental encoder for determining position,
direction, and speed information from a rotating machine that is typically found in high-
performance motion and position-control systems.
(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
A quadrature decoder state machine is used to determine position from two quadrature signals.
Position/Counter
Compare
Generate the direction and
clock for the position counter
Generate a sync output in quadrature count mode
and/or interrupt on a
position compare match
See the F28004x Driver Library User’s Guide for available functions
The inputs include two pins (QEPA and QEPB) for quadrature-clock mode or direction-count
mode, an index pin (QEPI), and a strobe pin (QEPS). These pins are configured using the GPIO
multiplexer and need to be enabled for synchronous input. In quadrature-clock mode, two square
wave signals from a position encoder are inputs to QEPA and QEPB which are 90 electrical
degrees out of phase. This phase relationship is used to determine the direction of rotation. If
the position encoder provides direction and clock outputs, instead of quadrature outputs, then
direction-count mode can be used. QEPA input will provide the clock signal and QEPB input will
have the direction information. The QEPI index signal occurs once per revolution and can be
used to indicate an absolute start position from which position information is incrementally
encoded using quadrature pulses. The QEPS strobe signal can be connected to a sensor or limit
switch to indicate that a defined position has been reached.
Ch. A
Quadrature Ch. B
Capture
EQEPxA/XCLK
32-Bit Unit EQEPxB/XDIR
Time-Base
Quadrature
QEP Decoder EQEPxI Index
Watchdog
CPUx.SYSCLK EQEPxS Strobe
from homing sensor
Position/Counter
Compare
The above figure shows a summary of the connections to the eQEP module.
Digital
Isolator
The SDFM is a four-channel digital filter designed specifically for current measurement and
resolver position decoding in motor control applications. Each channel can receive an
independent delta-sigma modulator bit stream which is processed by four individually
programmable digital decimation filters. The filters include a fast comparator for immediate digital
threshold comparisons for over-current and under-current monitoring. Also, a filter-bypass mode
is available to enable data logging, analysis, and customized filtering. The SDFM pins are
configured using the GPIO multiplexer. A key benefit of the SDFM is it enables a simple, cost-
effective, and safe high-voltage isolation boundary.
TMS320F28004x
SDFM enables galvanic isolation when utilized in conjunction with isolated sigma delta modulators
ePWM1
TB Counter
Compare jumper CPU copies
data
Action Qualifier wire ADC memory
result to
RESULT0 buffer during
ADC ISR
Input X-BAR
ADC-
Capture 1 Register INA0
...
Capture 2 Register
Capture 3 Register
Capture 4 Register
Procedure
Adc.c EPwm_7.c
CodeStartBranch.asm Gpio.c
Dac.c Lab_5_6_7.cmd
DefaultIsr_7.c Main_7.c
device.c SineTable.c
ECap_7.c Watchdog.c
Note: The ECap_7.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.
7. Open a memory browser to view some of the contents of the ADC results buffer. The
address label for the ADC results buffer is AdcBuf (type &AdcBuf) in the “Data” memory
page. We will be running our code in real-time mode, and we will need to have the
memory window continuously refresh.
8. Run the code (real-time mode). 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:
10. The graphical display should show the generated 2 kHz, 25% duty cycle symmetric PWM
waveform. The period of a 2 kHz signal is 500 ms. You can confirm this by measuring the
period of the waveform using the “measurement marker mode” graph feature. Disable
continuous refresh for the graph before taking the measurements. 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.
Then enable continuous refresh for the graph.
FFT Order 10
23. Open a memory browser to view the address label PwmPeriod. (Type &PwmPeriod in
the address box). The address label PwmDuty (address &PwmDuty) should appear in
the same memory browser window. Scroll the window up, if needed.
24. Set the memory browser properties format to “32-Bit UnSigned Int”. We will be running
our code in real-time mode, and we will need to have the memory browser continuously
refresh.
25. Run the code (real-time mode). Notice the values for PwmDuty and PwmPeriod.
Questions:
• How do the captured values for PwmDuty and PwmPeriod relate to the compare register
and time-base period settings for ePWM1A?
• What is the value of PwmDuty in memory?
28. Save all changes and build the project. Select Yes to “Reload the program
automatically”.
29. Run the code (real-time mode) and verify that the results are the same.
33. In the Registers window scroll down and expand “EPwm1Regs”. Then scroll down and
expand “CMPA”. In the Value field for “CMPA” right-click and set the Number Format to
Decimal. The Registers window must be enabled for continuous refresh.
34. Change the “CMPA” 18750 value (within a range of 2500 and 22500). Notice the effect
on the PWM waveform in the graph. Also, notice the value for PwmDuty changes in the
Memory Browser window.
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.
35. In DefaultIsr_7.c notice the code in the ADCA1 interrupt service routine used to
modulate the PWM1A output between 10% and 90% duty cycle
37. With the code still running in real-time mode, change the “PWM_MODULATE” from “0” to
“1” and observe the PWM waveform in the graph. The value for PwmDuty will update
continuously in the Memory Browser window. Also, in the Registers window notice the
CMPA value being continuously updated.
40. Next, close the project by right-clicking on Lab7 in the Project Explorer window and
select Close Project.
End of Exercise
Module Objectives
Module Objectives
Chapter Topics
Direct Memory Access................................................................................................................ 8-1
Direct Memory Access (DMA) ................................................................................................... 8-3
Basic Operation ..................................................................................................................... 8-4
DMA Examples ..................................................................................................................... 8-6
Channel Priority Modes ......................................................................................................... 8-9
DMA Throughput ................................................................................................................. 8-10
DMA Driverlib Functions ..................................................................................................... 8-11
Lab 8: Servicing the ADC with DMA ....................................................................................... 8-13
The DMA module provides a hardware method of transferring data between peripherals and/or
memory without intervention from the CPU, effectively freeing up the CPU for other functions.
Using the DMA is ideal when an application requires a significant amount of time spent moving
large amounts of data from off-chip peripheral to on-chip memory, or from a peripheral such as
the ADC result register to a memory RAM block, or between two peripherals. Additionally, the
DMA is capable of rearranging the data for optimal CPU processing such as binning and “ping-
pong” buffering.
Specifically, the DMA can read data from the ADC result registers, transfer to or from memory
blocks G0 through G3, transfer to or from the various peripherals, and also modify registers in the
ePWM. A DMA transfer is started by a peripheral or software trigger. There are six independent
DMA channels, where each channel can be configured individually and each DMA channel has
its own unique PIE interrupt for CPU servicing. All six DMA channels operate the same way,
except channel 1 can be configured at a higher priority over the other five channels. At its most
basic level the DMA is a state machine consisting of two nested loops and tightly coupled
address control logic which gives the DMA the capability to rearrange the blocks of data during
the transfer for post processing. When a DMA transfers is completed, the DMA can generate an
interrupt.
Basic Operation
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
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
ADCA 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,
ADCA configured to re-trigger (continuous conversion)
GS1 RAM
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
ADCA 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 ADCA 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
1 cycle delay to start each burst
1 cycle delay returning from CH1
high priority interrupt
32-bit transfer doubles throughput
Example: 128 16-bit words from ADC to RAM
8 bursts * [(4 cycles/word * 16 words/burst) + 1] = 520 cycles
ch1IsHighPri value is ‘false’ for round-robin or ‘true’ for CH1 high priority
base is the DMA channel base address: DMA_CHx_BASE (x = 1 to 6)
trigger value is located in dma.h – see table on next slide for values
config value is the logical OR of:
DMA_CFG_ONESHOT_x (x = DISABLE or ENABLE)
DMA_CFG_CONTINUOUS_x (x = DISABLE or ENABLE)
DMA_CFG_SIZE_xBIT (x = 16 or 32)
data
Objective: memory
Configure the DMA to buffer Display
ADCA Channel A0 ping-pong using CCS
style with 50 samples per buffer
Procedure
Adc.c EPwm.c
CodeStartBranch.asm Gpio.c
Dac.c Lab_8.cmd
DefaultIsr_8.c Main_8.c
device.c SineTable.c
Dma_8.c Watchdog.c
ECap.c
Inspect Lab_8.cmd
2. Open and inspect Lab_8.cmd. Notice that a section called “dmaMemBufs” is being
linked to RAMGS2. This section links the destination buffer for the DMA transfer to a DMA
accessible memory space. Close the inspected file.
3. Edit Dma_8.c to implement the DMA operation as described in the objective for this lab
exercise:
• Enable the peripheral interrupt trigger for channel 1 DMA transfer
• Generate an interrupt at the beginning of a new transfer
• Enable the DMA channel CPU interrupt
Note: the DMA has been configured for an ADC interrupt “ADCA1” to trigger the start of a
DMA CH1 transfer. Additionally, the DMA is set for 16-bit data transfers with one burst
per trigger and auto re-initialization at the end of the transfer. At the end of the code the
channel is enabled to run.
4. Open Main_8.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();
at the desired spot in main().
5. Edit Adc.c to comment out the code used to enable the ADCA1 interrupt in PIE group 1.
This is no longer being used. The DMA interrupt will be used instead.
6. Using the “PIE Interrupt Assignment Table” find the location for the DMA Channel 1
interrupt “INT_DMA_CH1” and fill in the following information:
• Add the Driverlib function to re-map the DMA_CH1 interrupt signal to call the ISR
function. (Hint: #define name in driverlib/inc/hw_ints.h and label name
in DefaultIsr_8.c)
• Add the Driverlib function to enable the appropriate PIEIER and core IER
8. Inspect DefaultIsr_8.c and notice that this file contains the DMA interrupt service
routine which implements the ping-pong style buffer. Save all modified files.
11. Run the code (real-time mode). Open and watch the memory browser update. Verify
that the ADC result buffer contains updated values.
12. 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:
13. The graphical display should show the generated 2 kHz, 25% duty cycle symmetric PWM
waveform. Notice that the results match the previous lab exercise.
14. Halt the code.
16. Next, close the project by right-clicking on Lab8 in the Project Explorer window and
select Close Project.
End of Exercise
Module Objectives
Module Objectives
Chapter Topics
Control Law Accelerator............................................................................................................. 9-1
Control Law Accelerator (CLA) ................................................................................................. 9-3
CLA Block Diagram ............................................................................................................... 9-4
CLA Tasks ............................................................................................................................. 9-4
CLA Memory and Register Access ....................................................................................... 9-5
CLA Control and Execution Registers .................................................................................. 9-6
Task Trigger .......................................................................................................................... 9-6
Software Trigger .................................................................................................................... 9-7
Background Task .................................................................................................................. 9-8
Memory Configuration ........................................................................................................... 9-9
Task Vector ......................................................................................................................... 9-10
CLA Initialization ................................................................................................................. 9-10
Enabling CLA Support in CCS ............................................................................................ 9-11
CLA Task C Programming .................................................................................................. 9-11
C2000Ware – CLA Software Support ................................................................................. 9-13
CLA Compiler Scratchpad Memory Area ............................................................................ 9-13
CLA Initialization Code Example ......................................................................................... 9-14
CLA Task C Code Example ................................................................................................ 9-14
CLA Code Debugging ......................................................................................................... 9-15
Lab 9: CLA Floating-Point FIR Filter ....................................................................................... 9-16
C28x CPU
ADC PWM
CLA
The CLA is an independent 32-bit floating-point math hardware accelerator which executes real-
time control algorithms in parallel with the main C28x CPU, effectively doubling the computational
performance. The CLA responds directly to peripheral triggers, which can free up the C28x CPU
for other tasks, such as communications and diagnostics. With direct access to the various
control and communication peripherals, the CLA minimizes latency, enables a fast trigger
response, and avoids CPU overhead. Also, with direct access to the ADC results registers, the
CLA is able to read the result on the same cycle that the ADC sample conversion is completed,
providing “just-in-time” reading, which reduces the sample to output delay.
CLA Tasks
CLA Tasks
Task Triggers
(Peripheral Interrupts)
Task1 Trigger
Task2 Trigger
Task3 Trigger
Task4 Trigger CLA CLA_INT1-8 INT11 C28x
MPERINT1-8 PIE
Task5 Trigger Control & Execution LVF, LUF INT12 CPU
Registers
Task6 Trigger
Task7 Trigger
Task8 Trigger
Programming the CLA consists of initialization code, which is performed by the CPU, and tasks.
A task is similar to an interrupt service routine, and once started it runs to completion. Each task
is capable of being triggered by a variety of peripherals without CPU intervention, which makes
the CLA very efficient since it does not use interrupts for hardware synchronization, nor must the
CLA do any context switching. Unlike the traditional interrupt-based scheme, the CLA approach
becomes deterministic. The CLA supports eight independent tasks and each is mapped back to
an event trigger. Also, the CLA is capable of running a continuous background task. Since the
CLA is a software programmable accelerator, it is very flexible and can be modified for different
applications.
LS0 – LS7 RAM LS0 – LS7 RAM PF1, PF2, PF3, and PF8
Program Data MSG RAMs Registers
CPU to CLA ePWM eCAP ADC GPIO
RAM RAM
CLA to CPU HRPWM eQEP SPI PMBus
(2Kw each) (2Kw each) (128w/128w) CMPSS DAC LIN CLB
SDFM PGA FSI
The CLA has access to the LSx RAM blocks and each memory block can be configured to be
either dedicated to the CPU or shared between the CPU and CLA. After reset the memory block
is mapped to the CPU, where it can be initialized by the CPU before being shared with the CLA.
Once it is shared between the CPU and CLA it then can be configured to be either program
memory or data memory. When configured as program memory it contains the CLA program
code, and when configured as data memory it contains the variable and coefficients that are used
by the CLA program code. Additionally, dedicated message RAMs are used to pass data
between the CPU and CLA, and CLA and CPU.
LSxCLAPGM
CLA1TASKSRCSELx – Task Interrupt Source Select (Task 1-8) MPC – 16-bit Program Counter (initialized by
MVECT1-8 – Task Interrupt Vector (MVECT1/2/3/4/5/6/7/8) appropriate MVECTx register or MVECTBGRND)
LSxCLAPGM – Memory Map Configuration (LS0 – LS7 RAM) MR0-3 – CLA Floating-Point Result Registers (32 bit)
MAR0-1 – CLA Auxiliary Registers (16 bit)
Task Trigger
Task Trigger Driverlib Functions
CLA1TASKSRCSELx MIFR MIER
• •
•
•
•
• 1
Task
Triggers •
•
•
•
•
• 0
Software Trigger
Software Triggering a Task
Tasks can also be started by a software
trigger using the CPU
Method #1: Write to Interrupt Force Register (MIFRC)
15 - 8 7 6 5 4 3 2 1 0
CLA_forceTask(base, taskFlags);
base is the CLA base address: CLA1_BASE
taskFlags value is the bitwise OR of the tasks:
CLA_TASKFLAG_x (x = 1 to 8) or CLA_TASKFLAG_ALL
Background Task
Background Task
Option to run 8 tasks or 7 tasks and 1
background task
Task 8 can be set to be the background task
While Tasks 1-7 service peripheral triggers in the foreground
Runs continuously until disabled or device/soft reset
Can be triggered by a peripheral or software
Tasks 1 - 7 can interrupt background task in priority
order (Task1 is highest, Task7 is lowest)
Can make portions of background task
uninterruptible, if needed
Background Task Uses:
Run continuous functions such as communications
and clean-up routines
MVECTBGRNDACTIVE
MVECTBGRND
MPC MVECT1-8 CLA
Program Core
Memory CLA Program Bus
Memory Configuration
Memory Config Driverlib Functions
Program CLA Data
Memory CLA Program Bus Core CLA Data Bus Memory
LSxCLAPGM
Set the LSx memory RAM configuration (CPU only or CPU & CLA)
MemCfg_setLSRAMMasterSel(ramSection, masterSel);
Set the CLA memory RAM configuration type (LSx = Data or Program)
MemCfg_setCLAMemType(ramSections, claMemType);
ramSection parameter value is:
MEMCFG_SECT_LSx (x = 0 to 7)
masterSel value is RAM section dedicated to the CPU or shared between the
CPU and the CLA:
MEMCFG_LSRAMMASTER_CPU_ONLY
MEMCFG_LSRAMMASTER_CPU_CLA1
ramSections parameter value is an OR of:
MEMCFG_SECT_LSx (x = 0 to 7)
claMemType value is RAM section is configured as CLA data memory or CLA
program memory:
MEMCFG_CLA_MEM_DATA or MEMCFG_CLA_MEM_PROGRAM
Task Vector
Task Vector Driverlib Functions
Task interrupt vector registers (MVECT1 to MVECT8)
contain the start address for each task
MVECTBGRNDACTIVE
MVECTBGRND
MPC MVECT1-8 CLA
Program Core
Memory CLA Program Bus
CLA Initialization
CLA Initialization
Performed by the CPU during software initialization
1. Copy CLA task code from flash to CLA program RAM
2. Initialize CLA data RAMs, as needed
Populate with data coefficients, constants, etc.
Resource Explorer
CLAmath
Examples
SECTIONS
{
Note: when using the legacy MDEBUGSTOP instruction, a CLA single step executes one pipeline cycle,
whereas a CPU single step executes one instruction (and flushes the pipeline); see TRM for details
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 exercise 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.
Procedure
Adc.c EPwm.c
Cla_9.c f28004x_globalvariabledefs.c
ClaTasks_C.cla f28004x_headers_nonbios.cmd
CodeStartBranch.asm Gpio.c
Dac.c Lab_9.cmd
DefaultIsr_9_10.c Main_9.c
device.c SineTable.c
Dma.c Watchdog.c
ECap.c
${PROJECT_ROOT}/../../f28004x_headers/include
3. Next, we will confirm that CLA support has been enabled. Under “C2000 Compiler”
select “Processor Options” and notice the “Specify CLA support” is set to cla2. This
is needed to compile and assemble CLA code. Click Apply and Close to save and
close the Properties window.
Inspect Lab_9.cmd
4. Open and inspect Lab_9.cmd. Notice that a section called “Cla1Prog” is being linked
to RAMLS4. This section links the CLA program tasks to the CPU memory space. Two
other sections called “Cla1Data1” and “Cla1Data2” are being linked to RAMLS1 and
RAMLS2, respectively, for the CLA data. These memory spaces will be mapped to the
CLA memory space during initialization. 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
exercise 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.
5. The CLA C compiler uses a section called .scratchpad for storing local and compiler
generated temporary variables. This scratchpad memory area is allocated using the
linker command file. Notice .scratchpad is being linked to RAMLS0. Close the
Lab_9.cmd linker command file.
run an FIR filter. The CLA needs to be configured to start Task 1 on the ADCAINT1 interrupt
trigger. The next section will setup the PIE interrupt for the CLA.
6. 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.
7. Edit Cla_9.c to implement the CLA operation as described in the objective for this lab
exercise:
• Set Task 1 peripheral interrupt trigger source to ADCA1
• Set Task 8 peripheral interrupt trigger source to SOFTWARE
• Disable the Background Task
• Enable the use of the IACK instruction to trigger a task
• Enable CLA Task 8 interrupt for one-time initialization routine (clear delay buffer)
• Enable CLA Task 1 interrupt
Note: the CLA has been configured for RAMLS0, RAMLS1, RAMLS2, and RAMLS4 memory
blocks to be shared between the CPU and CLA. The RAMLS4 memory block is mapped
to CLA program memory space, and the RAMLS0, RAMLS1 and RAMLS2 memory blocks
are mapped to CLA data memory space. Also, the RAMLS0 memory block is used for the
CLA C compiler scratchpad. Notice that CLA Task 8 interrupt is disabled after the one-
time initialization routine (clear delay buffer) is completed.
8. Open Main_9.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();
9. In Main_9.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.
11. Using the “PIE Interrupt Assignment Table” find the location for the CLA Task 1 interrupt
“INT_CLA1_1” and fill in the following information:
16. Run the code (real-time mode). Open and watch the memory browser window update.
Verify that the ADC result buffer contains updated values.
17. Setup a dual-time graph of the filtered and unfiltered ADC results buffer. Click:
Tools Graph Dual Time and set the following values:
18. 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.
19. Halt the code.
End of Exercise
Module Objectives
Module Objectives
JTAG Emulation
Analysis and Diagnostic Capabilities
Flash Configuration and
Memory Performance
Flash Programming
Dual Code Security Module (DCSM)
Chapter Topics
System Design .......................................................................................................................... 10-1
Emulation and Analysis Block ................................................................................................. 10-3
Analysis and Diagnostic Capabilities ...................................................................................... 10-5
Flash Configuration and Memory Performance ...................................................................... 10-7
Flash Programming ............................................................................................................... 10-11
Dual Code Security Module (DCSM) .................................................................................... 10-13
Lab 10: Programming the Flash ............................................................................................ 10-17
ERAD Module
ERAD expands device debug and system analysis capabilities
to 10 hardware breakpoints and 10 hardware watchpoints
8 Enhanced Bus
Comparator Units
C28x CPU ERAD
Similar to ACU/DCU
Inputs: address bus, Address Bus
program counter, data bus Data Bus Event
Enhanced Bus Output
Comparison mode Program Counter Comparator
Debug Units (EBC)
(>, >=, <, <=) Triggers
ACU DCU
x8
Output: debug triggers,
event output
4 Benchmark System
Event Counter Units Benchmark
Similar to count feature in System Events System Event
Counter Unit
ACU (BSEC)
x4
Inputs: events from EBC,
system events
Outputs: debug events
Counter
ERAD can be used by the Events
application or debugger
*** Refer to the F28004x data sheet for value details ***
For 100 MHz, RWAIT = 4
core
2-level deep decoder
fetch buffer unit
128-bit data
cache Data read either from
program or data memory
Flash or OTP
Internal RAM 1 1
Internal RAM has best data performance – put time critical data here
Flash performance often sufficient for constants and tables
Note that the flash instruction fetch pipeline will also stall during a
flash data access
For best flash performance, arrange data so that all 128 bits in a
cache line are utilized (e.g. sequential access)
flash.c
void Flash_initModule(uint32_t ctrlBase, uint32_t eccBase, uint16_t waitstates)
{
Flash_setBankPowerMode(ctrlBase, FLASH_BANK0, FLASH_BANK_PWR_ACTIVE);
Flash_setBankPowerMode(ctrlBase, FLASH_BANK1, FLASH_BANK_PWR_ACTIVE);
Flash_setPumpPowerMode(ctrlBase, FLASH_PUMP_PWR_ACTIVE);
Flash_disableCache(ctrlBase); //disable before changing wait states
Flash_disablePrefetch(ctrlBase); //disable before changing wait states
Flash_setWaitstates(ctrlBase, waitstates);
Flash_enableCache(ctrlBase); //enable to improve performance
Flash_enablePrefetch(ctrlBase); //enable to improve performance
Flash_enableECC(eccBase);
}
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 memory
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
ROM
Flash I2C
Data
CAN
GPIO
F28004x
0x0008 0000
Flash Bank 0
0x0008 FFFF 64K x 16
0x0009 0000
Flash Bank 1
0x0009 FFFF 64K x 16
Zone Selection
Each securable on-chip memory resource can
be allocated to either zone 1 (Z1), zone 2 (Z2),
or as non-secure
DcsmZ1Regs.Z1_GRABSECTR register:
Allocates individual flash sectors to zone 1 or non-secure
DcsmZ2Regs.Z2_GRABSECTR register:
Allocates individual flash sectors to zone 2 or non-secure
DcsmZ1Regs.Z1_GRABRAMR register:
Allocates LS0-7 to zone 1 or non-secure
DcsmZ2Regs.Z2_GRABRAMR register:
Allocates LS0-7 to zone 2 or non-secure
Technical Reference Manual contains a table to resolve mapping conflicts
CSM Passwords
Zx_CSMPSWD0
Zx_CSMPSWD1
Zx_CSMPSWD2
Zx_CSMPSWD3
xxx11111111111111111111111111111 0x020
xxx11111111111111111111111111110 0x030 Zone Select Block
xxx1111111111111111111111111110x 0x040
xxx111111111111111111111111110xx 0x050 Addr. Offset 32-bit Content
xxx11111111111111111111111110xxx 0x060
xxx1111111111111111111111110xxxx 0x070 0x0 Zx-EXEONLYRAM
xxx111111111111111111111110xxxxx 0x080 0x2 Zx-EXEONLYSECT
xxx11111111111111111111110xxxxxx 0x090
xxx1111111111111111111110xxxxxxx 0x0A0 0x4 Zx-GRABRAM
xxx111111111111111111110xxxxxxxx 0x0B0
xxx11111111111111111110xxxxxxxxx 0x0C0 0x6 Zx-GRABSECT
xxx1111111111111111110xxxxxxxxxx 0x0D0
xxx111111111111111110xxxxxxxxxxx 0x0E0 0x8 Zx-CSMPSWD0
xxx11111111111111110xxxxxxxxxxxx 0x0F0 0xA Zx-CSMPSWD1
xxx1111111111111110xxxxxxxxxxxxx 0x100
xxx111111111111110xxxxxxxxxxxxxx 0x110 0xC Zx-CSMPSWD2
xxx11111111111110xxxxxxxxxxxxxxx 0x120
xxx1111111111110xxxxxxxxxxxxxxxx 0x130 0xE Zx-CSMPSWD3
xxx111111111110xxxxxxxxxxxxxxxxx 0x140
xxx11111111110xxxxxxxxxxxxxxxxxx 0x150
xxx1111111110xxxxxxxxxxxxxxxxxxx 0x160 Final link pointer value is
xxx111111110xxxxxxxxxxxxxxxxxxxx 0x170
xxx11111110xxxxxxxxxxxxxxxxxxxxx 0x180 resolved by comparing all three
xxx1111110xxxxxxxxxxxxxxxxxxxxxx 0x190 individual link pointer values
xxx111110xxxxxxxxxxxxxxxxxxxxxxx 0x1A0
xxx11110xxxxxxxxxxxxxxxxxxxxxxxx 0x1B0 (bit-wise voting logic)
xxx1110xxxxxxxxxxxxxxxxxxxxxxxxx 0x1C0 OTP value “1” programmed as
xxx110xxxxxxxxxxxxxxxxxxxxxxxxxx 0x1D0
xxx10xxxxxxxxxxxxxxxxxxxxxxxxxxx 0x1E0 “0” (no erase operation)
xxx0xxxxxxxxxxxxxxxxxxxxxxxxxxxx 0x1F0
Start
Write the CSM Password
of that Zone into
CSMKEY(0/1/2/3) registers
Zone secure
after reset
or runtime
Correct No
Read Linkpointer and password?
calculate the address
of ZoneSelectBlock
Yes
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 EPwm.c
Cla.c f28004x_globalvariabledefs.c
ClaTasks_C.cla f28004x_headers_nonbios.cmd
CodeStartBranch.asm Gpio.c
Dac.c Lab_10.cmd
DefaultIsr_9_10.c Main_10.c
device.c SineTable.c
Dma.c Watchdog.c
ECap.c
Each initialized section actually has two addresses associated with it. First, it has a LOAD
address which is the address to which it gets loaded at load time (or at flash programming time).
Second, it has a RUN address which is the address from which the section is accessed at
runtime. The linker assigns both addresses to the section. Most initialized sections can have the
same LOAD and RUN address in the flash. However, some initialized sections need to be loaded
to flash, but then run from RAM. This is required, for example, if the contents of the section
needs to be modified at runtime by the code.
3. Open and inspect the linker command file Lab_10.cmd. Notice that the first flash sector
has been divided into two blocks named BEGIN_FLASH and FLASH_BANK0_SEC0.
The FLASH_BANK0_SEC0 flash sector origin and length has been modified to avoid
conflicts with the other flash sector spaces. The remaining flash sectors have been
combined into a single block named FLASH_BANK0_SEC1_15. Additionally, a second
bank is available named FLASH_BANK1_SEC0_15. See the reference slide at the end
of this lab exercise for further details showing the address origins and lengths of the
various flash sectors used.
4. Edit Lab_10.cmd to link the following compiler sections to on-chip flash memory block
FLASH_BANK0_SEC1_15:
Compiler Sections:
process is part of Driverlib. In main(), the call to Interrupt_initModule() enables vector fetching
from PIE block, and the call to Interrupt_initVectorTable() loads the vector table. In Driverlib, both
functions are part of interrupt.c.
5. In the Driverlib, flash.c uses the C compiler CODE_SECTION pragma to place the
Flash_initModule() function into a linkable section named “.TI.ramfunc”.
6. The “.TI.ramfunc” section will be linked using the user linker command file Lab_10.cmd.
In Lab_10.cmd the “.TI.ramfunc” will load to flash (load address) but will run from
RAMLS5 (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
RAMLS5 memory we are linking “.TI.ramfunc” to, we are specifiying “PAGE = 0” (which is
program memory).
8. In the earlier lab exercises, the section “codestart” was directed to the memory named
BEGIN_M0. Edit Lab_10.cmd so that the section “codestart” will be directed to
BEGIN_FLASH. Save your work.
On power up the reset vector will be fetched and the ROM bootloader will begin execution. If the
debug probe (emulator) is connected, the device will be in emulation boot mode and will use the
EMU-BOOT registers values in the PIE RAM to determine the boot mode. This mode was
utilized in the previous lab exercises. In this lab exercise, we will be disconnecting the debug
probe and running in stand-alone boot mode (but do not disconnect the emulator yet!). The
bootloader will read the Z1-OTP-BOOT registers values from their locations in the OTP. The
behavior when these values have not been programmed (i.e., KEY not 0x5A) or have been set to
invalid values is boot to flash boot mode.
9. In Lab_10.cmd notice that the named section “Cla1Prog” will now load to flash (load
address) but will run from RAMLS4 (run address). The linker will also be used to
generate symbols for the load start, load size, and run start addresses.
10. Open Cla.c and notice that the memory copy function memcpy() is being used to copy
the CLA program code from flash to RAMLS4 using the symbols generated by the linker.
Just after the copy the Driverlib MemCfg_setCLAMemType() function is used to configure
the RAMLS4 block as CLA program memory space. Close the opened files.
Build – Lab.out
11. 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.
12. Program the flash memory by clicking the “Debug” button (green bug). The CCS Debug
perspective view will open and the flash memory will be programmed. (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. Then the program will load automatically, and
you should now be at the start of main().
The program counter should now be at address 0x3FC7A5 in the “Disassembly” window,
which is the start of the bootloader in the Boot ROM. If needed, click on the “View
Disassembly…” button in the window that opens, or click View Disassembly.
This has the debugger load values into EMU-BOOT registers so that the bootloader will
jump to "Flash" at address 0x080000.
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.
16. You can now run the CPU, and you should observe the LED5 on the LaunchPad blinking.
18. Try resetting the CPU, select the EMU_BOOT_FLASH boot mode, and then hitting run
(without doing the Go Main procedure). The LED should be blinking again.
21. Next, close the project by right-clicking on Lab10 in the Project Explorer window and
select Close Project.
23. Disconnect the USB cable from the LaunchPad (i.e. remove power from the LaunchPad).
24. Re-connect the USB cable to the LaunchPad (i.e. power the LaunchPad). The LED
should be blinking, showing that the code is now running from flash memory.
End of Exercise
Lab_10.cmd
SECTIONS
{
codestart :> BEGIN_FLASH, PAGE = 0
FLASH (128Kw)
5
“user” code sections
3
main ( )
{
……
……
……
0x3F8000 Boot ROM (32Kw) }
Boot Code
InitBoot
{SCAN GPIO}
2
BROM vector (64w)
0x3FFFC0 * reset vector
1
The intent of this module is not to give exhaustive design details of the communication
peripherals, but rather to provide an overview of the features and capabilities. Once these
features and capabilities are understood, additional information can be obtained from various
resources such as the Technical Reference Manual, as needed. This module will cover the basic
operation of the communication peripherals, as well as some basic terms and how they work.
Module Objectives
Module Objectives
The F28004x MCU includes numerous communications peripherals that extend the connectivity
of the device. These communications peripherals include Serial Peripheral Interface (SPI), Serial
Communication Interface (SCI), Local Interconnect Network (LIN), Inter-Integrated Circuit (I2C)
Controller Area Network (CAN), Power Management Bus (PMBus), and Fast Serial Interface
(FSI).
Chapter Topics
Communications ....................................................................................................................... 11-1
Communications Techniques .................................................................................................. 11-3
Serial Peripheral Interface (SPI) ............................................................................................. 11-4
SPI Summary ...................................................................................................................... 11-6
Serial Communications Interface (SCI) ................................................................................... 11-7
Multiprocessor Wake-Up Modes ......................................................................................... 11-9
SCI Summary .................................................................................................................... 11-11
Local Interconnect Network (LIN) ......................................................................................... 11-12
LIN Message Frame and Data Timing .............................................................................. 11-13
LIN Summary .................................................................................................................... 11-14
Inter-Integrated Circuit (I2C) ................................................................................................. 11-15
I2C Operating Modes and Data Formats .......................................................................... 11-16
I2C Summary .................................................................................................................... 11-17
Controller Area Network (CAN) ............................................................................................. 11-18
CAN Bus and Node ........................................................................................................... 11-19
Principles of Operation ...................................................................................................... 11-20
Message Format and Block Diagram ................................................................................ 11-21
CAN Summary .................................................................................................................. 11-22
Power Management Bus (PMBus) ........................................................................................ 11-23
Conceptual Block Diagram and Connections ................................................................... 11-23
PMBus Summary .............................................................................................................. 11-24
Fast Serial Interface (FSI) ..................................................................................................... 11-25
CPU Interface and Connection ......................................................................................... 11-26
FSI Summary .................................................................................................................... 11-27
Lab 11: C2000Ware SCI Echoback Example ....................................................................... 11-28
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
module objective slide. Each will be described in this module.
In a multiprocessing system, they are an excellent choice when both devices have an available
serial port and the data rate requirement is relatively low. Serial interface is even more desirable
when the devices are physically distant from each other because the inherently low number of
wires provides a simpler interconnection.
Serial ports require separate lines to implement, and they do not interfere in any way with the
data and address lines of the processor. The only overhead they require is to read/write new
words from/to the ports as each word is received/transmitted. This process can be performed as
a short interrupt service routine under hardware control, requiring only a few cycles to maintain.
The C2000 device family has both synchronous and asynchronous serial ports. The features and
operation will be described in this module.
The Master can initiate a data transfer at any time because it controls the SPICLK signal. The
software, however, determines how the Master detects when the Slave is ready to broadcast.
clock
RX FIFO_0
SPIRXBUF.15-0
MSB LSB
SPIDAT.15-0 SPISOMI
SPITXBUF.15-0
TX FIFO_0
TX FIFO_15
4. MSB of the Master’s shift register (SPIDAT) is shifted out, and LSB of the Slave’s shift
register (SPIDAT) is loaded
9. If data is in SPITXBUF (either Slave or Master), it is loaded into SPIDAT and transmission
starts again as soon as the Master’s SPIDAT is loaded
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
justified XXXXXXXX11001001
SPI Summary
SPI Summary
TX FIFO_0 TX FIFO_0
Transmitter-data Transmitter-data
buffer register buffer register
8 8
RX FIFO_15 RX FIFO_15
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
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 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
Programmable data word format
1 to 8 bit data word length
1 or 2 stop bits
even/odd/no parity
The LIN standard is based on the SCI (UART) serial data link format. The communication
concept is single-master/multiple-slave with a message identification for multi-cast transmission
between any network nodes.
Mask
LINRX SCIRXSHF
Filter Parity
Calculator
LINTX SCITXSHF
Bit
Monitor
TD0
TD1
TD2
TD3
TD4
TD5
TD6
TD7
LM_CLK
(Internal)
LINRX
12 V
1 KΩ
LIN bus (master node only)
12 V
Vdd (e.g., 3.3 V)
LIN Transceiver
~5 KΩ
Vdd
TX RX
LIN Controller
(F28004x)
LIN Summary
LIN Summary
The I2C provides an interface between devices that are compliant I2C-bus specification version
2.1 and connect using an I2C-bus. External components attached to the 2-wire serial bus can
transmit or receive 1 to 8-bit data to or from the device through the I2C module.
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
A
B
C
D E
The CAN module is a serial communications protocol that efficiently supports distributed real-time
control with a high level of security. It supports bit-rates up to 1 Mbit/s and is compliant with the
CAN 2.0B protocol specification.
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_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
120W 120W
CAN_L
CAN Transceiver
(e.g. TI SN65HVD23x)
TX RX
CAN Controller
(TMS320F28004x)
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).
CAN
Module Interface
Test
Message Modes
Only
RAM Register and Message
Message Object Access (IFx)
32 RAM
Message Interface
Objects Message Handler
(mailboxes)
CAN Core
CAN_TX CAN_RX
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 contains registers which are divided into five groups:
• Mailboxes
CAN Summary
CAN Summary
Fully compliant with CAN standard v2.0B
Supports data rates up to 1 Mbps
Thirty-two message objects
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
ALERT DMA
DIV PMBCTRL Registers
CTL
GPIO Bit Clock
CPU
MUX SDA PMBTXBUF
Shift
Register
PMBRXBUF
SCL PMBUSA_INT
PIE
PMBus Module
The PMBus module provides an interface for communicating between the microcontroller and
other devices that are compliant with the System Management Interface (SMI) specification.
PMBus is an open-standard digital power management protocol that enables communication
between components of a power system.
PMBus Connections
F28004x Alert DEVICE
Control #1
PMBus Data
Write Physical
Module Clock Protect Address
Alert DEVICE
Control #2
Data
Write Physical
Clock Protect Address
Alert DEVICE
Control #N
Data
Write Physical
Clock Protect Address
PMBus Summary
PMBus Summary
Provides a standard and flexible means for
digital power management
SDA and SCL timings derived from SYSCLK
To comply with the PMBus timing specifications
the bit clock must be set to 10 MHz or less
The FSI module is a highly reliable high-speed serial communication peripheral capable of
operating at dual data rate providing 100 Mbps transfer using a 50 MHz clock. The FSI consists
of independent transmitter and receiver cores that are configured and operated independently.
FSI is a point-to-point communication protocol operating in a single-master/single-slave
configuration. With this high-speed data rate and low channel count, the FSI can be used to
increase the amount of information transmitted and reduce the costs to communicate over an
isolation barrier.
Note: while there is no true concept of a master or a slave node in the FSI protocol,
this example uses this nomenclature as a simple way to describe the data flow
FSI Summary
FSI Summary
Highly reliable high-speed serial peripheral
for communicating over an isolation barrier
High-speed data rate and low channel count
Increases the amount of information transmitted
and reduce the costs
Separate transmit and receive modules
Point-to-point communication protocol
FSI transmitter core communicates directly to a
single FSI receiver core
Skew compensation for signal delay due to
isolation
Line break detection
For this lab exercise, the F28004x Driver Library (Driverlib) SCI echoback example will be used.
The SCI echoback example receives and returns data through the SCI-A port. The CCS terminal
feature will be used to view the data from the SCI and to send characters to the SCI. Each
character that is received by the SCI port is sent back to the host. The program will print out a
greeting and then ask you to enter a character which it will echo back to the terminal. Also, a
watch variable ‘loop count’ is included to count the number of characters sent.
The SCI-A port on the F280049C LaunchPad will communicate to the host PC using the USB
connection. The XDS110 debug probe enumerates as both a debugger and a virtual COM port.
By default, SCI-A is mapped to the virtual COM port of the XDS110 debug probe using GPIO28
and GPIO29. (Alternately, SCI-A can be connected to a host PC using an external connection via
a transceiver and cable).
Procedure
C:\ti\c2000\C2000Ware_<version>\driverlib\f28004x\examples\sci
4. In the “Discovered projects” window that opens select sci_ex1_echoback and then
click Finish to import the project.
5. The sci_ex1_echoback project should now appear in the Project Explorer window.
Expand the project and open the ‘targetConfigs’ folder. Rename the file name from
TMS320F280049M.ccxml to TMS320F280049C.ccxml (i.e. change from “M” to “C”).
Next, double-left click on the TMS320F280049C.ccxml file.
6. In the window that opens, select the emulator using the “Connection” pull-down list and
choose “Texas Instruments XDS110 USB Debug Probe”. In the “Board or Device” box
type TMS320F280049C to filter the options. In the box below, check the box to select
“TMS320F280049C”.
7. Under Advanced Setup click “Target Configuration” and highlight “Texas Instruments
XDS110 USB Debug Probe_0”. Under Connection Properties set the JTAG/SWD/cJTAG
Mode to “cJTAG (1149.7) 2-pin advanced modes”.
Click Save to save the configuration, then close the “TMS320F280049C.ccxml” setup
window by clicking the X on the tab.
Inspect sci_ex1_echoback.c
8. Open and inspect sci_ex1_echoback.c. Notice that code lines 139 through 148 use
the Driverlib functions to configure SCI-A.
Next, code lines 161 through 169 displays the greeting on the terminal and waits for a
character to be entered. Code lines 174 and 179 through 181 reads a character and
writes it back to the terminal. Finally, code line 186 increments the loop counter.
10. 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_RAM using the Scripts menu.
View Terminal
13. A Launch Terminal window will open. Configure the terminal with the following settings:
• Choose terminal: Serial Terminal
• Serial Port: (from above COM port number X)
• Baud rate: 9600
• Data size: 8
• Parity: None
• Stop bits: 1
• Encoding: Default (ISO-8859-1)
16. Run the code (using the Resume button on the toolbar). The program will print out a
greeting and then ask you to enter a character which it will echo back to the terminal.
Hello World!
You will enter a character, and the DSP will echo it back!
Enter a character:
17. Enter a character and the character will echo back to the terminal. Also, the loopCounter
will increment with each character sent.
18. Halt the code (using the Suspend button on the toolbar).
20. Next, close the project by right-clicking on sci_ex1_echoback in the Project Explorer
window and select Close Project.
End of Exercise
Module Objectives
Module Objectives
Chapter Topics
Support Resources ................................................................................................................... 12-1
TI Support Resources ............................................................................................................. 12-3
C2000 MCU Device Workshops Website ........................................................................... 12-3
Documentation Resources .................................................................................................. 12-4
C2000Ware™ ..................................................................................................................... 12-4
C2000 Experimenter’s Kit ................................................................................................... 12-5
F28335 Peripheral Explorer Kit ........................................................................................... 12-6
C2000 LaunchPad Evaluation Kit ....................................................................................... 12-7
C2000 controlCARD Application Kits .................................................................................. 12-8
XDS100/110/200 Class JTAG Debug Probes .................................................................... 12-9
Product Information Resources ........................................................................................ 12-10
TI Support Resources
C2000 MCU Device Workshops Website
C2000 MCU Device Workshops Website
https://training.ti.com/c2000-mcu-device-workshops
At the TI Training Portal you will find all of the materials for the C2000 Microcontroller Workshops,
which include support for the following device families:
• TMS320F28004x
• TMS320F2837xD
• TMS320F2806x
• TMS320F2803x
• TMS320F2802x
• TMS320F2833x
• TMS320F280x
• TMS320F281x
• TMS320F240x
• F28M35x
Documentation Resources
Documentation Resources
Data Sheet
Contains device electrical characteristics and
timing specifications
Key document for hardware engineers
Silicon Errata
Contains deviations from original specifications
Includes silicon revision history
Technical Reference Manual (TRM)
Contains architectural descriptions and
register/bit definitions
Key document for firmware engineers
Workshop Materials
Hands-on device training materials
For hardware and software engineers
Documentation resources can be found at
www.ti.com/c2000
C2000Ware™
C2000Ware™
Resource Explorer
Directory Structure
C2000Ware for C2000 microcontrollers is a cohesive set of software infrastructure, tools, and
documentation that is designed to minimize system development time. It includes device-specific
drivers and support software, as well as system application examples. C2000Ware provides the
needed resources for development and evaluation. It can be downloaded from the TI website.
The C2000 Experimenter Kits is a tool for device exploration and initial prototyping. 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. The docking station provides access to all of the controlCARD signals with two
prototyping breadboard areas and header pins, allowing for development of custom solutions.
Most have on-board USB JTAG emulation capabilities and no external debug probe 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 debug probe.
The C2000 Peripheral Explorer Kit is a learning tool for new C2000 developers and university
students. The kit includes a peripheral explorer board and a controlCARD with the
TMS320F28335 microcontroller. The board includes many hardware-based peripheral
components for interacting with the various peripherals common to C2000 microcontrollers, such
as the ADC, PWMs, eCAP, I2C, CAN, SPI and McBSP. A teaching ROM is provided containing
presentation slides, a learning textbook, and laboratory exercises with solutions.
The C2000 LaunchPads are low-cost, powerful evaluation platforms which are used to develop
real-time control systems based on C2000 microcontrollers. Various LaunchPads are available
and developers can find a LaunchPad with the required performance and feature mix for any
application. The C2000 BoosterPacks expand the power of the LaunchPads with application-
specific plug-in boards, allowing developers to design full solutions using a LaunchPad and
BoosterPack combination.
The C2000 Application Kits demonstrate the full capabilities of the C2000 microcontroller in a
specific application. The kits are complete evaluation and development tools where the user can
modify both the hardware and software to best fit their needs. Each kit uses a device specific
controlCARD and a specific application board. All kits are completely open source with full
documentation and are supplied with complete schematics, bill of materials, board design details,
and software. Visit the TI website for a complete list of available Application Kits.
Texas
Instruments
XDS110
The JTAG debug probes are used during development to program and communicate with the
C20000 microcontroller. While almost all C2000 development tool include emulation capabilities,
after you have developed your own target board an external debug probe will be needed. Debug
probes are available with different features and at different price points. Shown here are popular
debug probes from various manufacturers.
For more information and support, contact the product information center, visit the TI E2E
community, embedded processor Wiki, TI training web page, TI eStore, and the TI website.
Chapter Topics
Appendix A – F280049C Experimenter Kit .............................................................................. A-1
F280049C Experimenter Kit ......................................................................................................A-3
Initial Hardware Setup ...........................................................................................................A-3
Docking Station and LaunchPad Pin Mapping......................................................................A-3
controlCARD and LaunchPad LED Mapping ........................................................................A-3
Docking Station and LaunchPad Pin Locations ....................................................................A-4
Stand-Alone Operation (No Emulator) ..................................................................................A-4
Insert the F280049C controlCARD into the Docking Station connector slot. Using the two (2)
supplied USB cables – plug the USB Standard Type A connectors into the computer USB ports
and plug the USB Mini-B connectors as follows:
On the Docking Station move switch S1 to the “USB-ON” position. This will power the Docking
Station and controlCARD using the power supplied by the computer USB port. Additionally, the
other computer USB port will power the on-board isolated JTAG emulator and provide the JTAG
communication link between the device and Code Composer Studio.