PAC52XX GPIO Peripheral Firmware Design

Similar documents
IAR IDE Installation. Power Application Controller. Copyright 2018 Active-Semi, Inc.

Converting Firmware Projects to CoIde and IAR Embedded Workbench for ARM

CooCox IDE Installation

HYDRA-X EH-PROTOx-1 Heads

PAC52XX PCB Design and Layout Guidelines

PAC5523EVK1. Power Application Controllers. PAC5523EVK1 User s Guide. Copyright 2017 Active-Semi, Inc.

HYDRA-X10. Power Application Controllers TM. PAC HYDRA-X User s Guide. Copyright 2014 Active-Semi, Inc.

HYDRA-X23/X23S. Power Application Controllers. PAC HYDRA-X User s Guide. Copyright 2014 Active-Semi, Inc.

ET-UARTSWD Users Guide

PAC5232EVK1. Power Application Controllers. PAC5232EVK1 User s Guide. Copyright 2017 Active-Semi, Inc.

AN Sleep programming for NXP bridge ICs. Document information

PAC5532EVK1 User s Guide

C Routines for Setting Up the AIC on the TMS320C5x EVM

STM8 I 2 C optimized examples

Table 1: Cross Reference of Applicable Products. INTERNAL PIC NUMBER Arm Cortex M0+ UT32M0R GPIO Module QS30

Using LPC11Axx EEPROM (with IAP)

AN10955 Full-duplex software UART for LPC111x and LPC13xx

AN2667 Application note

UM0401 User manual. User manual for eight bit port expander STMPE801 demonstration board. Introduction

UM0792 User manual. Demonstration firmware for the DMX-512 communication protocol transmitter based on the STM32F103Zx.

Implementation of a CELP Speech Coder for the TMS320C30 using SPOX

AN Automatic RS-485 address detection. Document information

Writing TMS320C8x PP Code Under the Multitasking Executive

AN3980 Application note

ELEC 3040/3050 Lab Manual Lab 2 Revised 8/20/14. LAB 2: Developing and Debugging C Programs in MDK-ARM for the STM32L100RC Microcontroller

AN3279 Application Note

UM NVT2001GM and NVT2002DP demo boards. Document information

One 32-bit counter that can be free running or generate periodic interrupts

AN LPC1700 secondary USB bootloader. Document information. LPC1700, Secondary USB Bootloader, ISP, IAP

M3H Group(2) Application Note 12-bit Analog to Digital Converter (ADC-A)

AN SIO Tips and Tricks in PSoC 3 / PSoC 5. Application Note Abstract. Introduction

AT03262: SAM D/R/L/C System Pin Multiplexer (SYSTEM PINMUX) Driver. Introduction. SMART ARM-based Microcontrollers APPLICATION NOTE

LPC1300, FM+, Fast-mode Plus, I 2 C, Cortex-M3

TMS320C5x Interrupt Response Time

UM NVT2008PW and NVT2010PW demo boards. Document information

Evaluation Board for CS3308. Description CS Channel. Digitally Controlled Analog Volume Control. PC or External Serial Control Input

UM NXP USB PD shield board user manual COMPANY PUBLIC. Document information

AN2672 Application note

Base Timer Channel (BT) Features. General Description. When to Use a PDL_BT Component 1.0

UM User Manual for LPC54018 IoT Module. Rev November Document information

AN Entering ISP mode from user code. Document information. ARM ISP, bootloader

CDB5346. Evaluation Board for CS5346. Features. Description CS5346. Single-ended Analog Inputs. Single-ended Analog Outputs

AN3174 Application note

Dual Access into Single- Access RAM on a C5x Device

AN3996 Application Note

Incremental ADC Data Sheet

UM PCAL6524 demonstration board OM Document information

AN2361 Application note

QT3 Xplained Pro. Preface. Atmel QTouch USER GUIDE

STTS V memory module temperature sensor. Features

ATAES132A Firmware Development Library. Introduction. Features. Atmel CryptoAuthentication USER GUIDE

MF1 MOA4 S50. Contactless Chip Card Module Specification. This document gives specifications for the product MF1 MOA4 S50.

AN10428 UART-SPI Gateway for Philips SPI slave bridges

Capable of adjusting detection timings for start bit and data bit

Interrupts in Decoupled Parallel Mode for MPC5675K Configuration and Usage

AN Interfacing Philips Bridge IC with Philips microcontroller. Document information

Bit-reversed Addressing without Data Alignment on the C3x

Use the Status Register when the firmware needs to query the state of internal digital signals.

USER GUIDE. Atmel QT6 Xplained Pro. Preface

8K X 8 BIT LOW POWER CMOS SRAM

Multifunction Serial Interface (PDL_MFS) Features. General Description. When to Use a PDL_MFS Component. Quick Start 1.0

UM LPC54018 IoT module. Document information. LPC54018, OM40007, Amazon FreeRTOS, AWS, GT1216 LPC54018 IoT module user manual

Broadband system applications i.e. WCDMA, CATV, etc. General purpose Voltage Controlled Attenuators for high linearity applications

This section describes the various input and output connections for the SysInt Component.

Hardware UART for the TMS320C3x

AT09381: SAM D - Debugging Watchdog Timer Reset. Introduction. SMART ARM-based Microcontrollers APPLICATION NOTE

Comparator (Comp) Features. General Description. When to use a Comparator 1.60

Evaluation Board for CS5345

CAUTION This device is sensitive to ElectroStatic Discharge (ESD). Therefore care should be taken during transport and handling.

Document status: Preliminary

Pad Configuration and GPIO Driver for MPC5500 Martin Kaspar, EMEAGTM, Roznov Daniel McKenna, MSG Applications, East Kilbride

74ABT General description. 2. Features and benefits. 3. Ordering information. Quad 2-input AND gate

AN2737 Application note Basic in-application programming example using the STM8 I 2 C and SPI peripherals Introduction

Emulating Dual SPI Using FlexIO

Ethernet1 Xplained Pro

AN2261 APPLICATION NOTE

This optional pin is present if the Mode parameter is set to SyncMode or PulseMode. Otherwise, the clock input does not show.

AN2676 Application note

uip, TCP/IP Stack, LPC1700

IoT Sensing SDK. Getting started with IoT Sensing SDK (ISSDK) v1.7 middleware. Document information. IoT Sensing SDK, ISSDK, MCUXpresso, middleware

Evaluation Board for CS4398

CE PSoC 4: Time-Stamped ADC Data Transfer Using DMA

STEVAL-CCM002V1. TFT-LCD panel demonstration board based on the STM32 as LCD controller. Features. Description

STM3220G-SK/KEI. Keil starter kit for STM32F2 series microcontrollers (STM32F207IG MCU) Features. Description

Preliminary. Gas Sensor Analog Front End Datasheet GasSensorAFE V Features and Overview. This datasheet contains Preliminary information.

How to use the NTAG I²C plus for bidirectional communication. Rev June

UnRegistered MB39C602 LED LIGHTING SYSTEM BULB 9W ZIGBEE CONTROL USER MANUAL. Fujitsu Semiconductor Design (Chengdu) Co. Ltd.

IMPORTANT NOTICE. use

Input/Output Programming

XE166 Family AP Application Note. Microcontrollers. X E D r i v e C a r d H a r d w a r e D e s c r i p t i o n Board REV.

Shadow Registers Datasheet ShadowRegs V 1.1. Features and Overview

Use the IDAC8 when a fixed or programmable current source is required in an application.

Reading a 16-Bit Bus With the TMS320C5x Serial Port

UM PR533 - PCSC Tool. User manual COMPANY PUBLIC. Rev November Document information

Evaluation Board for CS5351

Use the Status Register when the firmware needs to query the state of internal digital signals.

AN CBTL08GP053 Programmer's Guide. Document information. Keywords Abstract

AC Induction Motor (ACIM) Control Board

UM0693 User manual. 1 Introduction. STM8L101-EVAL demonstration firmware

TMS320C5x Memory Paging (Expanding its Address Reach)

Transcription:

APPLICATION NOTE PAC52XX GPIO Peripheral Firmware Design TM Marc Sousa Senior Manager, Systems and Firmware www.active-semi.com Copyright 2014 Active-Semi, Inc.

TABLE OF CONTENTS APPLICATION NOTE... 1 Table of Contents... 2 Overview... 3 PAC52XX GPIO Peripheral Registers... 4 PAC52XX GPIO SDK... 7 GPIO Block Diagram... 8 Digital Output Configuration... 9 Digital Input Configuration... 10 Analog Input Configuration... 11 Drive Strength Configuration... 12 Weak Pull-up and Pull-Down Configuration... 13 Changing to IO mode from Peripheral Mode... 14 PAC52XX GPIO Interrupts... 15 Configuring Interrupts... 15 Configuring Interrupts Manually... 16 Changing Interrupt Polarity... 16 Processing Interrupts... 16 About Active-Semi... 18 2014 Copyright, Active-Semi International, Inc. - 2 - Rev 1.0 October, 2014

OVERVIEW The PAC52XX family of controllers have a power set of peripherals to ease design of mixed-signal control and other embedded systems. Included in this family are a highly configurable set of GPIO that can be used by the application. The IO pins on the PAC52XX can be used for both the other peripherals (timers, ADC, serial communications) or for program defined input/output. 1 The number of IO pins on each device in the PAC52XX family may vary. There are up to 5 GPIO ports, each with up to 8 pins that may be used by the application. The GPIO ports are named as follows: GPIOA GPIOB GPIOC GPIOD GPIOE GPIOC are used for analog input for the ADC, and have special configuration and limited features for GPIO. For more information on configuring GPIOC for analog input, see the PAC52XX User Guide, or application notes on the PAC52XX ADC. When used as GPIO, the IO pins have the following features: May be configured as digital input or output Configurable drive strength (except GPIOC) Configurable weak pull-up or pull-down to VDDIO (except GPIOC) Configurable interrupts The chapters that follow will describe how to implement firmware to take advantage of the GPIO features. In the firmware examples in this application note, two types of firmware are shown for each example: PAC52XX peripheral registers and the PAC52XX SDK. 1 For information on how other peripherals use the GPIO when in peripheral mode, see the PAC52XX User Guide, or other application notes on this topic. 2014 Copyright, Active-Semi International, Inc. - 3 - Rev 1.0 October, 2014

PAC52XX GPIO PERIPHERAL REGISTERS The PAC52XX Peripheral Registers are a representation of all the PAC52XX registers as a set of data structures. Complete registers can be written to, as well as portions of registers (e.g., selected bits) using C-language bit-fields. The GPIO peripheral register header file is named pac5xxx_gpio.h and is located in the SDK installation directory. Below are the contents of this peripheral header file for reference: typedef union { IO uint32_t w; struct { IO uint32_t s : 16; uint32_t : 16; }; struct { IO uint32_t b : 8; uint32_t : 24; }; struct { IO uint32_t P0 : 1; /*!< P0 (bit 0) */ IO uint32_t P1 : 1; /*!< P1 (bit 1) */ IO uint32_t P2 : 1; /*!< P2 (bit 2) */ IO uint32_t P3 : 1; /*!< P3 (bit 3) */ IO uint32_t P4 : 1; /*!< P4 (bit 4) */ IO uint32_t P5 : 1; /*!< P5 (bit 5) */ IO uint32_t P6 : 1; /*!< P6 (bit 6) */ IO uint32_t P7 : 1; /*!< P7 (bit 7) */ uint32_t : 24; }; struct { IO uint32_t LO_P0 : 1; /*!< PY (bit 0) for low port */ IO uint32_t LO_P1 : 1; /*!< P1 (bit 1) for low port */ IO uint32_t LO_P2 : 1; /*!< P2 (bit 2) for low port */ IO uint32_t LO_P3 : 1; /*!< P3 (bit 3) for low port */ IO uint32_t LO_P4 : 1; /*!< P4 (bit 4) for low port */ IO uint32_t LO_P5 : 1; /*!< P5 (bit 5) for low port */ IO uint32_t LO_P6 : 1; /*!< P6 (bit 6) for low port */ IO uint32_t LO_P7 : 1; /*!< P7 (bit 7) for low port [e.g., for GPIOXY, this is GPIOX7 */ uint32_t : 8; IO uint32_t HI_P0 : 1; /*!< P6 (bit 0) for high port */ IO uint32_t HI_P1 : 1; /*!< P6 (bit 1) for high port */ IO uint32_t HI_P2 : 1; /*!< P6 (bit 2) for high port */ IO uint32_t HI_P3 : 1; /*!< P6 (bit 3) for high port */ IO uint32_t HI_P4 : 1; /*!< P6 (bit 4) for high port */ IO uint32_t HI_P5 : 1; /*!< P6 (bit 5) for high port */ IO uint32_t HI_P6 : 1; /*!< P6 (bit 6) for high port */ IO uint32_t HI_P7 : 1; /*!< P7 (bit 7) for high port [e.g., for GPIOXY, this is GPIOY7 */ uint32_t : 8; }; } PAC5XXX_GPIO_PINS_TypeDef; #define GPIO_DS_8MA 0 /*!< GPIO Drive Strength: 8mA */ #define GPIO_DS_16MA 1 /*!< GPIO Drive Strength: 16mA */ typedef union { IO uint32_t w; struct { IO uint32_t s : 16; uint32_t : 16; }; struct { IO uint32_t b : 8; uint32_t : 24; }; struct { IO uint32_t P0 : 2; /*!< P0 (bit 0) */ IO uint32_t P1 : 2; /*!< P1 (bit 1) */ IO uint32_t P2 : 2; /*!< P2 (bit 2) */ IO uint32_t P3 : 2; /*!< P3 (bit 3) */ IO uint32_t P4 : 2; /*!< P4 (bit 4) */ IO uint32_t P5 : 2; /*!< P5 (bit 5) */ IO uint32_t P6 : 2; /*!< P6 (bit 6) */ IO uint32_t P7 : 2; /*!< P7 (bit 7) */ uint32_t : 16; }; struct { IO uint32_t LO_P0 : 2; /*!< PY (bit 0) for low port */ IO uint32_t LO_P1 : 2; /*!< PY (bit 1) for low port */ IO uint32_t LO_P2 : 2; /*!< PY (bit 2) for low port */ IO uint32_t LO_P3 : 2; /*!< PY (bit 3) for low port */ IO uint32_t LO_P4 : 2; /*!< PY (bit 4) for low port */ IO uint32_t LO_P5 : 2; /*!< PY (bit 5) for low port */ IO uint32_t LO_P6 : 2; /*!< PY (bit 6) for low port */ IO uint32_t LO_P7 : 2; /*!< PY (bit 7) for low port [e.g., for GPIOYZ, this is GPIOY7 */ IO uint32_t HI_P0 : 2; /*!< PZ (bit 0) for high port */ 2014 Copyright, Active-Semi International, Inc. - 4 - Rev 1.0 October, 2014

IO uint32_t HI_P1 : 2; /*!< PZ (bit 1) for high port */ IO uint32_t HI_P2 : 2; /*!< PZ (bit 2) for high port */ IO uint32_t HI_P3 : 2; /*!< PZ (bit 3) for high port */ IO uint32_t HI_P4 : 2; /*!< PZ (bit 4) for high port */ IO uint32_t HI_P5 : 2; /*!< PZ (bit 5) for high port */ IO uint32_t HI_P6 : 2; /*!< PZ (bit 6) for high port */ IO uint32_t HI_P7 : 2; /*!< PZ (bit 7) for high port [e.g., for GPIOYZ, this is GPIOZ7 */ }; } PAC5XXX_GPIO_PSEL_TypeDef; typedef struct { IO PAC5XXX_GPIO_PINS_TypeDef OUT; /*!< Offset: 0x0000 GPIO Output Register */ IO PAC5XXX_GPIO_PINS_TypeDef OUTEN; /*!< Offset: 0x0004 GPIO Output Enable Register */ IO PAC5XXX_GPIO_PINS_TypeDef DS; /*!< Offset: 0x0008 GPIO Output Drive Strength Register */ IO PAC5XXX_GPIO_PINS_TypeDef PU; /*!< Offset: 0x000C GPIO Output Weak Pull-up Register */ IO PAC5XXX_GPIO_PINS_TypeDef PD; /*!< Offset: 0x0010 GPIO Output Weak Pull-down Register */ I PAC5XXX_GPIO_PINS_TypeDef IN; /*!< Offset: 0x0014 GPIO Input Register */ IO PAC5XXX_GPIO_PINS_TypeDef INE; /*!< Offset: 0x0024 GPIO Input Enable Register */ IO PAC5XXX_GPIO_PSEL_TypeDef PSEL; /*!< Offset: 0x001C GPIO Peripheral Select Register */ IO PAC5XXX_GPIO_PINS_TypeDef INTP; /*!< Offset: 0x0020 GPIO Interrupt Polarity Select Register */ IO PAC5XXX_GPIO_PINS_TypeDef INTE; /*!< Offset: 0x0024 GPIO Interrupt Enable Register */ IO PAC5XXX_GPIO_PINS_TypeDef INTF; /*!< Offset: 0x0028 GPIO Interrupt Flag Register */ IO PAC5XXX_GPIO_PINS_TypeDef INTM; /*!< Offset: 0x002C GPIO Interrupt Mask Register */ } PAC5XXX_GPIO_TypeDef; As seen above, the peripheral header file defines all of the registers for each GPIO port so they can be accessed efficiently by the application firmware. The structure of all 5 GPIO ports is the same, and each GPIO port can be referenced in firmware using pointers as shown below. Each GPIO port has a type of PAC5XXX_GPIO_TypeDef. GPIOA GPIOB GPIOC GPIOD GPIOE PAC5XXX_GPIOA->[reg.field_name] PAC5XXX_GPIOB->[reg.field_name] PAC5XXX_GPIOC->[reg.field_name] PAC5XXX_GPIOD->[reg.field_name] PAC5XXX_GPIOE->[reg.field_name] For example, the following fields in the following registers may be addressed as shown below. GPIOA pin 5 output enable: GPIOD pin 7 input state: GPIOB (all pins) output state: PAC5XXX_GPIOA->OUTEN.P5 PAC5XXX_GPIOD->IN.P7 PAC5XXX_GPIOB->OUT.b The field_name represents how the register will be read or written by the program. The field_name may either be a bit-field (one or more bits that be referenced by a single name) or the entire register. The following conventions are used in the PAC52XX Peripheral Header files: Field Name Access w 32-bit word (reads register as a 32-bit word) s 16-bit word (reads register as a 16-bit word) b 8-bit unsigned character P0 Single bit (pin 0) P1 Single bit (pin 1) P2 Single bit (pin 2) P3 Single bit (pin 3) P4 Single bit (pin 4) P5 Single bit (pin 5) P6 Single bit (pin 6) P7 Single bit (pin 7) 2014 Copyright, Active-Semi International, Inc. - 5 - Rev 1.0 October, 2014

2014 Copyright, Active-Semi International, Inc. - 6 - Rev 1.0 October, 2014

PAC52XX GPIO SDK The PAC52XX SDK is a C-Language interface that allows higher-level programming of the PAC52XX, without having to know the details of the register memory map, and bit positions within registers. The SDK is most useful for configuration, where there are many registers that need to be written. The definition of the PAC52XX GPIO SDK is located in the file pac5xxx_driver_gpio.h. In this file, the user can call C-language functions to configure and operate the GPIO. When possible, the SDK uses inline functions to implement the functions for simple register reads and writes, to maintain performance. Other functions that perform many register reads and writes contain the function inside a *.c file, that is a C-callable function. For example, to check to see if the interrupt flag is set for any pin in GPIOA the user may call this function: RAMFUNC_GPIO static uint8_t pac5xxx_gpio_int_flag_set_a(void) { return PAC5XXX_GPIOA->INTF.b; } Since this is a single register read, then this is just as efficient as using the peripheral header files, but the user does not need to know details of register names. For more complex functions, the user would call a C-language function. For example, the function to configure interrupts on GPIOB is shown below: RAMFUNC_GPIO void pac5xxx_gpio_configure_interrupt_b(uint8_t port_mask, uint8_t active_high_mask); In the examples below, both types of techniques are described. 2014 Copyright, Active-Semi International, Inc. - 7 - Rev 1.0 October, 2014

GPIO BLOCK DIAGRAM Each PAC52XX device has a different number of GPIO ports and pins available. However, the same design for each GPIO (exception GPIOC) is the same. The block diagram for each GPIO port is similar to the one shown below, for GPIOB. This will be the same for GPIOA, GPIOB, GPIOD and GPIOE. GPIOC has a different design, since it is also used for analog input. The block diagram for GPIOC is shown below: As shown above, GPIOC does not have support for the drive strength or weak pull-up/pull-down as the other GPIO ports. 2014 Copyright, Active-Semi International, Inc. - 8 - Rev 1.0 October, 2014

DIGITAL OUTPUT CONFIGURATION To use a GPIO pin for digital output (under firmware control), the output enable signal must be set to on and then the output state may be used. As soon as the output enable signal is set to on, the pin will be driven to the state specified by the output state register (0 by default) so care should be taken to configure the output state before turning on the output enable. Note that for GPIOC, the input enable signal may be used for analog input, and must be cleared for this operation. To perform the following actions, the code below may be used. Set GPIOA, pin 5 and to logic high: PAC5XXX_GPIOA->OUT.P5 = 1; PAC5XXX_GPIOA->OUTEN.P5 = 1; pac5xxx_gpio_out_pin_set_a(5); pac5xxx_gpio_out_enable_a(0x20); // sets all pins with this mask Set GPIOD, all pins to logic low: PAC5XXX_GPIOD->OUT.b = 0; PAC5XXX_GPIOD->OUTEN.b = 0xFF; pac5xxx_gpio_out_d(0); pac5xxx_gpio_out_enable_a(0xff); Set GPIOC, P2 and P3 to logic high: PAC5XXX_GPIOC->OUT.P2 = 1; PAC5XXX_GPIOC->OUT.P3 = 1; PAC5XXX_GPIOC->INE.P2 = 0; PAC5XXX_GPIOC->INE.P3 = 0; PAC5XXX_GPIOC->OUTEN.P2 = 1; PAC5XXX_GPIOC->OUTEN.P3 = 1; pac5xxx_gpio_out_pin_set_a(2); pac5xxx_gpio_out_pin_set_a(3); pac5xxx_gpio_digital_enable_c(0x0c); // sets all pins with this mask pac5xxx_gpio_out_enable_a(0xc0); // sets all pins with this mask 2014 Copyright, Active-Semi International, Inc. - 9 - Rev 1.0 October, 2014

DIGITAL INPUT CONFIGURATION To use a GPIO pin for digital input (under firmware control), the output enable signal must be set to off (0) and then the input state may be used. The input state is always available, if the pin is set to be an input or an output, so it may always be sampled. Note that for GPIOC, the input enable signal is used for analog input, and must be set for this operation. To perform the following actions, the code below may be used. Sample GPIOA, pin 5: PAC5XXX_GPIOA->OUTEN.P5 = 0; state = PAC5XXX_GPIOA->IN.P5; pac5xxx_gpio_out_enable_a(0x20); // sets all pins with this mask state = pac5xxx_gpio_in_pin_a(5); Sample GPIOC, pin 2: PAC5XXX_GPIOC->OUTEN.P2 = 0; PAC5XXX_GPIOC->INE.P2 = 1; state = PAC5XXX_GPIOC->IN.P2; pac5xxx_gpio_out_enable_a(0x00); // clears all pins with this mask pac5xxx_gpio_digital_enable_c(0x04); // sets all pins with this mask state = pac5xxx_gpio_in_pin_c(2); 2014 Copyright, Active-Semi International, Inc. - 10 - Rev 1.0 October, 2014

ANALOG INPUT CONFIGURATION To use a GPIO pin for analog input only GPIOC may be used. To configure this behavior, the output enable signal must be set to off (0) and the input enable signal must also be set to off (0). To perform the following actions, the code below may be used. Use GPIOC, pin 0-3 for ADC: PAC5XXX_GPIOC->OUTEN.P0 = 0; PAC5XXX_GPIOC->OUTEN.P1 = 0; PAC5XXX_GPIOC->OUTEN.P2 = 0; PAC5XXX_GPIOC->OUTEN.P3 = 0; PAC5XXX_GPIOC->INEN.P0 = 0; PAC5XXX_GPIOC->INEN.P1 = 0; PAC5XXX_GPIOC->INEN.P2 = 0; PAC5XXX_GPIOC->INEN.P3 = 0; pac5xxx_gpio_out_enable_a(0); // sets all pins with this mask pac5xxx_gpio_digital_enable_c(0); // sets all pins with this mask 2014 Copyright, Active-Semi International, Inc. - 11 - Rev 1.0 October, 2014

DRIVE STRENGTH CONFIGURATION In the PAC52XX, any available GPIOA, GPIOB, GPIOD and GPIOE pin drive strength may be configured between low-current drive strength and high-current drive strength. GPIOC does not have this feature. For the specific drive strength for each of these settings, see the PAC52XX data sheet for then device used. Of course, the user must also set the output enable signal for the given ports and pins to use this feature. To perform the following actions, the code below may be used. Set GPIOA, pin 5 to high-current: PAC5XXX_GPIOA->DS.P5 = 1; PAC5XXX_GPIOA->OUTEN.P5 = 0; pac5xxx_gpio_out_drive_strength_a(0x20); // sets all pins with this mask pac5xxx_gpio_out_enable_a(0x20); // sets all pins with this mask Set GPIOB, all pins to low-current: PAC5XXX_GPIOB->DS.b = 0; PAC5XXX_GPIOA->OUTEN.b = 0xFF; pac5xxx_gpio_out_drive_strength_b(0); // sets all pins with this mask pac5xxx_gpio_out_enable_b(0xff); // sets all pins with this mask 2014 Copyright, Active-Semi International, Inc. - 12 - Rev 1.0 October, 2014

WEAK PULL-UP AND PULL-DOWN CONFIGURATION In the PAC52XX, any available GPIOA, GPIOB, GPIOD and GPIOE pin may be configured to have a weak pull-up, weak pull-down or neither. GPIOC does not have this feature. Of course, this feature should be used when configuring the pin as a digital input. Also, the user needs to make sure that the pull-up and pull-down bits are not both enabled at the same time. To perform the following actions, the code below may be used. Set GPIOA, pin 5 weak pull-up: PAC5XXX_GPIOA->PD.P5 = 0; PAC5XXX_GPIOA->PU.P5 = 1; PAC5XXX_GPIOA->OUTEN.P5 = 0; state = PAC5XXX_GPIOA->IN.P5; // Set pull-down to disabled // Set pull-up to enabled // Set pin to digital input // Sample input state pac5xxx_gpio_out_pull_down_a(0); pac5xxx_gpio_out_pull_up_a(0x20); pac5xxx_gpio_out_enable_a(0); // sets all pins in port with this mask // sets all pins in port with this mask // sets all pins in port with this mask Set GPIOB, all pins weak pull-down: PAC5XXX_GPIOB->PU.b = 0; PAC5XXX_GPIOB->PD.b = 1; PAC5XXX_GPIOA->OUTEN.b5 = 0; state = PAC5XXX_GPIOA->IN.b; // Set all pins pull-up to disabled // Set all pins pull-down to enabled // Set all pins to input // Sample all pins input state pac5xxx_gpio_out_pull_down_b(0); pac5xxx_gpio_out_pull_up_b(0xff); pac5xxx_gpio_out_enable_b(0); // sets all pins in port with this mask // sets all pins in port with this mask // sets all pins in port with this mask 2014 Copyright, Active-Semi International, Inc. - 13 - Rev 1.0 October, 2014

CHANGING TO IO MODE FROM PERIPHERAL MODE In the PAC52XX, any available GPIOA, GPIOB, GPIOD and GPIOE pin may be configured to be used for a peripheral or for IO. For information on how to set any port and pin to peripheral mode, see the PAC52XX User Guide or the Application Note on that peripheral. Below it shows how to change the ports and pins from peripheral mode to IO mode. Note that GPIOC does not have this feature. To perform the following actions, the code below may be used. Set GPIOA, pin 5 to IO mode as an output: PAC5XXX_GPIOA->OUT.P5 = 0; PAC5XXX_GPIOA->OUTEN.P5 = 1; PAC5XXX_GPIOA->PSEL.P5 = 0; // Set to known state // Set pin to digital output // Set pin to IO mode; pac5xxx_gpio_out_set_a(0); // sets all pins in port with this mask pac5xxx_gpio_out_enable_a(0x20); // sets all pins in port with this mask pac5xxx_gpio_peripheral_select_a(0);// sets all pins in port with this mask Set GPIOB, all pins to IO mode as an input: PAC5XXX_GPIOB->OUTEN.b = 0; PAC5XXX_GPIOB->PSEL.b = 0; // Set pins to digital input // Set pin to IO mode pac5xxx_gpio_out_enable_b(0); // sets all pins in port with this mask pac5xxx_gpio_peripheral_select_b(0);// sets all pins in port with this mask 2014 Copyright, Active-Semi International, Inc. - 14 - Rev 1.0 October, 2014

PAC52XX GPIO INTERRUPTS In the PAC52XX, any available GPIO pin may be configured to be used to generate interrupts to the Cortex M0. The GPIO interrupt features allow the user to configure the following: Interrupt enable/disable (at GPIO peripheral) Interrupt enable/disable (at Cortex-M0 NVIC) Global Interrupt enable/disable (for Cortex-M0) Interrupt mask enable/disable Interrupt polarity Interrupt flag per pin Because of the flexibility of the interrupt configuration, a few different registers must be written in a certain order, so it is recommended to use the SDK functions to configure interrupts. The SDK allows the user to configure the interrupt all at one time, or change individual interrupt features one at a time using the SDK functions. Configuring Interrupts To configure interrupts for a GPIO pin (or pins), the SDK allows the user to complete this by calling a single function for each GPIO port. These functions configure the interrupt pins, polarity and clear the interrupt flags in one function so the user does not have to perform these steps individually. To perform this operation, the following code may be used. Configure GPIOA, pin 5 for interrupts with high to low edge transition: pac5xxx_gpio_configure_interrupt_b(0x20, 0x00); // arg: pin_mask, act_high_mask This single function will do the following: Set the interrupt mask (based on the first argument) Set the interrupt polarity (low to high [0] or high to low [1]) Enable the GPIO pin interrupt Enable the NVIC interrupt for GPIO port to the Cortex-M0 Clear the interrupt flag (for any interrupts that have already fired) Un-mask the interrupt The user must make sure that the global interrupt enable flag has already been enabled. This can be done through: enable_irq(); // Global interrupt enable To disable global interrupts, the user should disable the global flag via: disable_irq(); // Global interrupt disable Once these steps are performed, the user should be able to receive interrupts in the interrupt handler, as shown in the sections below. 2014 Copyright, Active-Semi International, Inc. - 15 - Rev 1.0 October, 2014

Configuring Interrupts Manually The PAC52XX provides functions that allow the user to configure the interrupts manually, without calling the function shown above. It is important that the functions be called in this order, to have them properly work. Specifically, the interrupt must be masked first, then the interrupt enabled, then the interrupt unmasked. Below is the code that will properly enable the interrupts on GPIOB0, for high-to-low transitions: pac5xxx_gpio_int_mask_b(0x01); // Set interrupt mask at startup (interrupt startup workaround) pac5xxx_gpio_int_polarity_b(0); // Set interrupt polarity for high-to-low transitions pac5xxx_gpio_int_enable_b(0x01); // Enable interrupts in GPIO controller for GPIOB, pin 0 NVIC_EnableIRQ(GpioB_IRQn); // Enable interrupts in the global NVIC (Cortex-M0) pac5xxx_gpio_int_flag_clear_b(0x01); // Clear any active interrupt flags on GPIOB, pin 0 (write 1 to clear) pac5xxx_gpio_int_mask_b(0); // Un-mask GPIOB, pin 0 and interrupts are now enabled Once these steps are followed assuming the global interrupt enable flag is set interrupts will be processed by the Cortex-M0. Changing Interrupt Polarity The PAC52XX may configure interrupts for low-to-high or high-to-low transitions, but not both at the same time. If the user needs to configure the polarity of the interrupts, they may call the following functions. Configuring High-to-Low Transitions on GPIOA, pin 5: pac5xxx_gpio_int_polarity_a(0); Configuring Low-to-High Transitions on GPIOB, pins 1-7: pac5xxx_gpio_int_polarity_a(0x7f); These functions may be called at any time, including when the interrupt is enabled and un-masked. If the function is called when interrupts are enabled and un-masked, then the next time an interrupt condition happens, the interrupt will be received. The interrupt does not have to be disabled and re-enabled for this. For GPIOC, users should make sure that the input enable signal is set to 1, so that the GPIOC pins may receive digital input. Processing Interrupts Once the steps above are followed to process interrupts, interrupts can be received by the Cortex-M0. Each GPIO port has its own interrupt handler that must be named as follows in the table below. GPIO Port Port Pin Interrupt handler function signature GPIOA 0-7 void GpioA_IRQHandler(void) GPIOB 0-7 void GpioB_IRQHandler(void) GPIOC 0-7 void GpioC_IRQHandler(void) GPIOD 0-7 void GpioD_IRQHandler(void) GPIOE 0-7 void GpioE_IRQHandler(void) 2014 Copyright, Active-Semi International, Inc. - 16 - Rev 1.0 October, 2014

When an interrupt is generated, the interrupt flag is set for the pin. The interrupt flag is set whether the interrupt is enabled or not. Of course, the interrupt to the Cortex-M0 is only generated if the interrupt is enabled and unmasked. Once the flag is set, the Cortex-M0 will call the interrupt service routine (ISR) for the given GPIO port. The user must define a function with the name of the ISR from the table above, or the default ISR will be called (in the system startup files and does nothing). For example, if GPIOA, pin 0 has been configured to enable interrupts on a high-to-low edge transition as shown above then the following ISR would be defined to handle the interrupt: void GpioA_IRQHandler(void) { // handle interrupt led_on_red(); // When complete, clear the interrupt flag pac5xxx_gpio_int_flag_clear_a(0x01); // Clear interrupt flag on GPIOA, pin 0 } Clearing the interrupt flag before the end of the ISR is important, because if the flag stays set, this ISR will be called repeatedly (according to priority) until the flag is cleared. For more information on the Cortex-M0 interrupt configuration (interrupt priorities and scheduling, etc.) see the ARM Cortex-M0 documentation. 2014 Copyright, Active-Semi International, Inc. - 17 - Rev 1.0 October, 2014

ABOUT ACTIVE-SEMI Active-Semi, Inc. headquartered in Dallas, TX is a leading innovative semiconductor company with proven power management, analog and mixed-signal products for end-applications that require power conversion (AC/DC, DC/DC, DC/AC, PFC, etc.), motor drivers and control and LED drivers and control along with ARM microcontroller for system development. Active-Semi s latest family of (PAC) ICs offer high-level of integration with 32-bit ARM Cortex M0, along with configurable power management peripherals, configurable analog front-end with high-precision, high-speed data converters, single-ended and differential PGAs, integrated low-voltage and high-voltage gate drives. PAC IC offers unprecedented flexibility and ease in the systems design of various end-applications such as Wireless Power Transmitters, Motor drives, UPS, Solar Inverters and LED lighting, etc. that require a microcontroller, power conversion, analog sensing, highvoltage gate drives, open-drain outputs, analog & digital general purpose IO, as well as support for wired and wireless communication. More information and samples can be obtained from http://www.activesemi.com or by emailing marketing@active-semi.com Active-Semi shipped its 1 Billionth IC in 2012, and has over 120 in patents awarded and pending approval. LEGAL INFORMATION & DISCLAIMER Copyright 2012-2013 Active-Semi, Inc. All rights reserved. All information provided in this document is subject to legal disclaimers. Active-Semi reserves the right to modify its products, circuitry or product specifications without notice. Active-Semi products are not intended, designed, warranted or authorized for use as critical components in life-support, life-critical or safety-critical devices, systems, or equipment, nor in applications where failure or malfunction of any Active-Semi product can reasonably be expected to result in personal injury, death or severe property or environmental damage. Active-Semi accepts no liability for inclusion and/or use of its products in such equipment or applications. Active-Semi does not assume any liability arising out of the use of any product, circuit, or any information described in this document. No license, express, implied or otherwise, is granted under any patents, copyrights or other intellectual property rights of Active-Semi or others. Active-Semi assumes no liability for any infringement of the intellectual property rights or other rights of third parties which would result from the use of information contained herein. Customers should evaluate each product to make sure that it is suitable for their applications. Customers are responsible for the design, testing, and operation of their applications and products using Active-Semi products. Customers should provide appropriate design and operating safeguards to minimize the risks associated with their applications and products. All products are sold subject to Active-Semi's terms and conditions of sale supplied at the time of order acknowledgment. Exportation of any Active-Semi product may be subject to export control laws. Active-Semi, Active-Semi logo, Solutions for Sustainability,, Micro Application Controller, Multi-Mode Power Manager, Configurable Analog Front End, and Application Specific Power Drivers are trademarks of Active-Semi, I. ARM is a registered trademark and Cortex is a trademark of ARM Limited. All referenced brands and trademarks are the property of their respective owners. 2014 Copyright, Active-Semi International, Inc. - 18 - Rev 1.0 October, 2014