AN2094 PSoC® 1 - Getting Started With GPIO Author: Meenakshi Sundaram R Associated Part Family: CY8C24x23A, CY8C24x94, CY8C21x34, CY8C20x34, CY8C21x23, CY8C21x45, CY8C22x45, CY8C27x43, CY8C28xxx, CY8C29x66, CY7C64215, CYWUSB6953 Related Application Notes: None To get the latest version of this application note, or the associated project file, please visit http://www.cypress.com/AN2094. AN2094 discusses relevant topics on general-purpose input and output (GPIO) such as drive modes, shadow ® registers, and GPIO interrupts to get started with PSoC 1 GPIOs. This document also provides a few tips and briefs of the other resources associated with PSoC 1 GPIOs. Contents 1 2 3 4 5 6 7 1 Introduction ...............................................................1 Getting Started .........................................................3 2.1 PSoC Designer ................................................3 2.2 Code Examples ...............................................4 2.3 PSoC Designer Help........................................6 2.4 Technical Support ............................................6 GPIO Architecture ....................................................7 GPIO Drive Modes ...................................................8 4.1 Device Editor Configuration .............................9 4.2 Code-Level Configuration .............................. 10 4.3 Reading and Writing to a Port ........................ 11 4.4 Modifying the Drive Mode of a GPIO pin........ 12 Shadow Registers .................................................. 14 5.1 Use of Shadow Registers .............................. 14 GPIO Interrupts ...................................................... 16 6.2 Do’s and Don’ts While Using Interrupts ......... 20 Other GPIO Resources and Tips ............................ 21 7.1 GPIO Global Select Register ......................... 21 7.2 Analog Mux (AMUX) Bus Control Register .... 21 7.3 Naming a Pin ................................................. 21 7.4 Registers and Their Associated Register Banks ...................................................................... 24 8 Example Projects ................................................... 25 8.1 Project 1: Detecting LED Drive Mode ............ 25 8.2 Project 2: Use of Shadow Registers .............. 27 8.3 Project 3: LED Toggling Using Interrupts....... 29 8.4 Additional Code Examples............................. 30 Document History............................................................ 31 Worldwide Sales and Design Support ............................. 32 Products .......................................................................... 32 ® PSoC Solutions ............................................................. 32 Cypress Developer Community....................................... 32 Technical Support ........................................................... 32 Introduction The general-purpose input and output (GPIO) is a critical part of any microcontroller (MCU) as it is the bridge between the external world and the MCU. The type and nature of this bridge to the external world depends on the end application. PSoC has powerful and flexible general-purpose I/O (GPIO) pins that provide more features than traditional MCUs. 2 For instance, an ADC requires a GPIO to be an analog input, whereas an I C or SPI digital communication block requires the same GPIO to be digital. To correctly set up this bridge to the external world, you need to know the end application and the GPIO system of the MCU that is used. PSoC, similar to any other microcontroller, has its own GPIO system. This application note discusses the application-specific parameters of the GPIO system. A detailed technical overview of the system is available in the General-Purpose I/O chapter of the PSoC Core section in the respective device Technical Reference Manual (TRM). www.cypress.com Document No. 001-40480 Rev. *J 1 PSoC® 1 – Getting Started With GPIO Topics discussed in this application note include: GPIO drive modes: Discusses the types of drive modes available in PSoC 1, usage of each drive mode, and the procedure to dynamically reconfigure the drive mode in firmware with an example. Shadow registers: Describes the significance and the usage of GPIO shadow registers with an example. GPIO interrupts: Explains GPIO interrupts in PSoC 1 with a simple LED toggle example using interrupts. This document assumes that you are familiar with the PSoC Designer™ IDE. www.cypress.com Document No. 001-40480 Rev. *J 2 PSoC® 1 – Getting Started With GPIO 2 Getting Started Cypress provides a wealth of data at www.cypress.com to help you to select the right PSoC device for your design, and to help you to quickly and effectively integrate the device into your design. For a comprehensive list of resources, ® ® see the knowledge base article How to Design with PSoC 1, PowerPSoC , and PLC – KBA88292. Following is an abbreviated list for PSoC 1: Overview: PSoC Portfolio, PSoC Roadmap Product Selectors: PSoC 1, PSoC 3, PSoC 4, PSoC 5LP In addition, PSoC Designer includes a device selection tool. Application notes: Cypress offers a large number of PSoC application notes covering a broad range of topics, from basic to advanced level. Recommended application notes for getting started with PSoC 1 are: ® AN75320 - Getting Started with PSoC 1. ® AN2094 - PSoC 1 - Getting Started with GPIO. ® AN74170 - PSoC 1 Analog Structure and Configuration with PSoC Designer™ ® AN2041 - Understanding PSoC 1 Switched Capacitor Analog Blocks ® AN2219 - PSoC 1 Selecting Analog Ground and Reference Note: For CY8C29X66 devices related application notes, click here. Development Kits: CY3210-PSoCEval1 supports all PSoC 1 mixed-signal array families, including automotive, except the CY8C25/26xxx devices. The kit includes an LCD module, potentiometer, LEDs, and breadboarding space. CY3214-PSoCEvalUSB features a development board for the CY8C24x94 PSoC device. Special features of the board include USB and CapSense development and debugging support. Note: For CY8C29X66 devices related development kits, click here. The MiniProg1 and MiniProg3 devices provide interfaces for flash programming and debug. 2.1 PSoC Designer PSoC Designer is a free Windows-based Integrated Design Environment (IDE). Develop your applications using a library of pre-characterized analog and digital peripherals in a drag-and-drop design environment. Then, customize your design leveraging the dynamically generated API libraries of code. Figure 1 shows PSoC Designer windows. Note: This is not the default view. 1. Global Resources – all device hardware settings. 2. Parameters – the parameters of the currently selected User Modules. 3. Pinout – information related to device pins. 4. Chip-Level Editor – a diagram of the resources available on the selected chip. 5. Datasheet – the datasheet for the currently selected UM 6. User Modules – all available User Modules for the selected device. 7. Device Resource Meter – device resource usage for the current project configuration. 8. Workspace – a tree level diagram of files associated with the project. 9. Output – output from project build and debug operations. Note: For detailed information on PSoC Designer, open PSoC Designer IDE, go to Help > Documentation, open the “Designer Specific Documents” folder, and open the “IDE User Guide.pdf” document. www.cypress.com Document No. 001-40480 Rev. *J 3 PSoC® 1 – Getting Started With GPIO Figure 1. PSoC Designer Layout 2.2 Code Examples The following webpage lists the PSoC Designer based code examples. These code examples can speed up your design process by starting you off with a complete design, instead of a blank page, and also show how PSoC Designer User Modules can be used for various applications. http://www.cypress.com/documentation/code-examples/psoc-1-code-examples To access the code examples integrated with PSoC Designer, follow the path Start Page > Design Catalog > Launch Example Browser as shown in Figure 2. Figure 2. Code Examples in PSoC Designer www.cypress.com Document No. 001-40480 Rev. *J 4 PSoC® 1 – Getting Started With GPIO In the Example Projects Browser shown in Figure 3, you have the following options: Keyword search to filter the projects. Create a new project (and a new workspace if needed) based on the selection. This can speed up your design process by starting you off with a complete, basic design. You can then adapt that design to your application. Listing the projects based on category. Review the datasheet for the selection (on the Description tab). Review the code example for the selection. You can copy and paste code from this window to your project, which can help speed up code development, or Figure 3. Code Example Projects, with Sample Codes www.cypress.com Document No. 001-40480 Rev. *J 5 PSoC® 1 – Getting Started With GPIO 2.3 PSoC Designer Help Visit the PSoC Designer home page to download the latest version of PSoC Designer. Then, launch PSoC Designer and navigate to the following items: 2.4 IDE User Guide: Choose Help > Documentation > Designer Specific Documents > IDE User Guide.pdf. This guide gives you the basics for developing PSoC Creator projects. Simple User module Code Examples: Choose Start Page > Design Catalog > Launch Example Browser. These code examples demonstrate how to configure and use PSoC Designer User modules. Technical Reference Manual: Choose Help > Documentation > Technical Reference Manuals. This guide lists and describes the system functions of PSoC 1 devices. User module datasheets: Right-click a User module and select “Datasheet.” This datasheet explains the parameters and APIs of the selected user module. Device Datasheet: Choose Help > Documentation > Device Datasheets to pick the datasheet of a particular PSoC 1 device. Imagecraft Compiler Guide: Choose Help > Documentation > Compiler and Programming Documents > C Language Compiler User Guide.pdf. This guide provides the details about the Imagecraft compiler specific directives and Functions. Technical Support If you have any questions, our technical support team is happy to assist you. You can create a support request on the Cypress Technical Support page. If you are in the United States, you can talk to our technical support team by calling our toll-free number: +1-800-541-4736. Select option 8 at the prompt. You can also use the following support resources if you need quick assistance. Self-help Local Sales Office Locations www.cypress.com Document No. 001-40480 Rev. *J 6 PSoC® 1 – Getting Started With GPIO 3 GPIO Architecture Figure 4 shows the architecture of the PSoC 1 GPIO. Figure 4. GPIO Cell Architecture in PSoC 1 Schmitt Trigger Drive Mode Control There are two major parts in the GPIO cell: the Input path and the Output path. The input path has the Schmitt trigger circuit that acts as an interface between the pin and the MCU for digital signals. 2 The output of the Schmitt trigger connects to the MCU’s data bus, global input bus, I C input, interrupt controller, and so on. The pin is also directly connected to the internal analog bus that interfaces to the analog blocks inside the PSoC device. The output path has the drive mode select logic that can configure the pin to one of eight drive modes. The input to 2 the drive mode select comes from the internal data bus, which includes the data register, I C bus, and global output bus (connected to output of the digital block). There is also a connection to the internal analog bus (on select pins), which connects to the analog output buffer. www.cypress.com Document No. 001-40480 Rev. *J 7 PSoC® 1 – Getting Started With GPIO 4 GPIO Drive Modes PSoC 1 offers eight drive modes to configure a GPIO pin, as shown in Table 1. Figure 5 shows the GPIO cell configuration for each of the drive modes. Table 1. Drive Mode Details Sl. No. Drive mode Description Application High-Z Digital input interfacing to a signal source High-impedance digital input mode. In this with a strong drive, pull-up, or pull-down, mode, the pin acts as a digital input. Writing open-collector with external pull-up resistor, either ‘1’ or ‘0’ to the pin in this mode will have or open-emitter with external pull-down no effect. resistor. 2 High-Z analog High-impedance analog mode. In this mode, the pin acts as an analog pin. Similar to digital High-Z, except that in this mode the digital input circuit (the Schmitt trigger in Figure 1) in Analog input and on select pins, as analog the GPIO cell is disabled. If you are using the input and output. pin as a digital input, make sure that you select “HighZ”, not “HighZ Analog” drive mode. 3 Open drain-high (ODH) In this mode, writing a ‘1’ drives the pin to VDD while a ‘0’ is high-impedance state. This is similar to an open-emitter configuration. To provide an open-emitter interface with external pull-down resistor. This drive mode implements a wired OR connection. 4 Open drain-low (ODL) In this mode, writing a ‘0’ drives the pin to GND while writing a ‘1’ results in a highimpedance state. This is similar to an opencollector configuration. To provide an open-collector interface with external pull-up resistors. This implements a wired AND connection. Example – I2C pins. 5 Strong In this mode, writing a ‘1’ drives the pin to VDD and a ‘0’ drives it to GND. Digital output pin. Pull-down In this mode, writing a ‘1’ drives the pin to VDD and a ‘0’ drives it to GND through a resistor (5.6 kΩ approximately). As an interface to a signal with open-emitter output or to a switch connected to VDD. It can be used as an output to interface LEDs in the current sink mode. 7 Pull-up As an interface to a signal with openIn this mode, writing a ‘1’ drives the pin to VDD collector output such as tachometer signal through a resistor (5.6 kΩ approximately), and from motors or to a switch connected to GND. It can be used as an output to a ‘0’ drives it to GND. interface LEDs in the current source mode. 8 Strong Slow This mode is similar to the Strong mode, but the slope of the output is slightly controlled so that high harmonics are not present when the output switches. 1 6 www.cypress.com As a digital output with reduced radiated interference. Document No. 001-40480 Rev. *J 8 PSoC® 1 – Getting Started With GPIO Figure 5. Drive Mode Configuration Details The GPIO can be configured in two ways. The first method is to define the configuration as part of the initialization in PSoC Designer’s Device Editor. This method is useful when the pin configuration is fixed all the time. The other method is to configure the pin in the firmware. This method gives the flexibility of configuring the GPIO during runtime. 4.1 Device Editor Configuration The I/O pins may be configured by using the Pinout View mode of the Device Editor. Inside the Pinout View mode, a table appears in the lower left corner of the PSoC Designer interface (the position of this window may vary according the arrangement of windows). The table is shown in Figure 6. Figure 6. PSoC Designer Pinout Window (“Drive” List) www.cypress.com Document No. 001-40480 Rev. *J 9 PSoC® 1 – Getting Started With GPIO The various fields shown in Figure 6 are: 1. The Name field shows the name of the pin. You can rename the pin to make its purpose more obvious. Renaming the pin generates macros for the pin, such as the pin data register, pin mask, and drive mode registers in PSoCGPIOINT.inc and PSoCGPIOINT.h files. This is explained in detail in the section Naming a Pin. 2. The Port field shows the physical mapping of the pin. This field is not editable. 3. The Select field configures some of the following special behaviors of pins: a. AnalogInput: Only Port 0 and Port 2 have additional analog input and analog output options. AnalogInput gets analog signals from the outside world and connects to the analog column input mux or to PSoC blocks directly. For example, if you use an ADC, you must configure at least one of the pins as AnalogInput to get analog signals from the outside world. b. AnalogOutputBuf: Depending on the device family, some of the Port 0 pins are connected to internal analog output buffers. c. Default: The global bus is not connected and the drive strength is High-Z Analog. d. StdCPU: Normal I/O through the port. This is controlled by the CPU through the PRTxDR data register. e. Global_IN, Global_OUT: Global inputs and outputs provide the capability to route clock and data signals to the digital PSoC blocks. If you configure a pin as a Global_IN (input) or Global_OUT (output), then that pin can talk to the digital blocks. For example, if the Global_IN is selected, then this selection connects that particular pin to the Global_INPUT bus. This bus is used as an input to the digital PSoC blocks. f. AnalogMuxInput : Enables you to connect the pin to the analog mux bus, which you can route to various analog blocks inside the PSoC device. [1] [2] Apart from the previously mentioned pin types, there are pins that have special features, and are listed. For example, P1[0] and P1[1] have XtalOut and XtalIn, P1[4] has ExtSysClk, P1[5] and P1[7] have I2C_SDA and I2C_SCL, and so on. 4.2 g. The Drive field sets the drive mode of the pin as explained in Table 1 and Figure 5. h. The Interrupt field in the Pinout window sets the interrupt type of the pins. The pins may have rising edge, falling edge, or both interrupts. See GPIO Interrupts. i. The Initial Value field in the Pinout window sets the initial output value of the pin at startup. This value is imposed by populating the pin’s data register during the execution of automatically generated boot code. j. AnalogMUXBus Enables or disables the connection of the pin to the AMUX bus in the Chip Editor. To do the same in the firmware, see Analog Mux (AMUX) Bus Control Register). [2]: Code-Level Configuration [ 3] Another method to configure I/O pins is to directly modify the associated registers in the firmware using assembly or C language. This method allows you to dynamically configure I/O ports during program execution. The following registers control a GPIO: 1. PRTxDR register: This is the data register that controls the output state of a pin. Each port has an associated data register with each bit representing a pin. For example, PRT0DR controls Port0; Bit#0 of PRT0DR controls P0[0]. The state of a GPIO pin also can be read using the PRTxDR register. See Reading and Writing to a Port. 2. PRTxDMx registers: Each port has three registers to control the drive mode. The drive mode of the pins can be dynamically changed during run time by writing to these registers. See Modifying the Drive Mode of a GPIO pin. 3. PRTxICx registers: Each port has two registers that control the interrupt type of the pin (rising edge, falling edge, change in state and no interrupt). The interrupt type of a pin can be changed dynamically during run time by writing to these registers. See GPIO Interrupts. 1 The CPU can control the pin's output state only in this mode; that is, the register write to the port data register will take effect on the pins. 2 Available only in the CY8C21x34, 21x45, 22x45, 24x94, and 28xxx family of devices. Used in conjunction with the AnalogMuxBus field (available in previously mentioned devices) 3 If the pin configuration is fixed, then user-authored code is not required to configure the pins. PSoC Designer automatically generates the startup code to configure the pins according to the settings in the Device Editor. www.cypress.com Document No. 001-40480 Rev. *J 10 PSoC® 1 – Getting Started With GPIO 4.3 4. PRTxGS register: This register is used to connect or disconnect the GPIO pin to the Global Input or Global Output bus. See GPIO Global Select Register. 5. MUX_CRx register: In devices that have the analog mux bus, this register is used to connect or disconnect a pin to the analog mux bus. Each port is represented by a register and each bit in the register controls the corresponding port pin. For example, Bit#0 of MUX_CR0 register controls P0[0]. Reading and Writing to a Port When a port pin is disconnected from the global bus by clearing the corresponding bit in the PRTxGS register (by configuring the pin as StdCPU in the GPIO configuration window), and the drive mode of the pin is not HighZ or HighZ Analog, the state of the pin can be controlled by writing to the PRTxDR register. Port 0 Data Register (PRT0DR, Address = Bank 0, 00h) Port 1 Data Register (PRT1DR, Address = Bank 0, 04h) Port 2 Data Register (PRT2DR, Address = Bank 0, 08h) Port 3 Data Register (PRT3DR, Address = Bank 0, 0Ch) Port 4 Data Register (PRT4DR, Address = Bank 0, 10h) Port 5 Data Register (PRT5DR, Address = Bank 0, 14h) Port 6 Data Register (PRT6DR, Address = Bank 0, 18h) Port 7 Data Register (PRT7DR, Address = Bank 0, 1Ch) To write to a particular port pin, use the corresponding mask and bitwise AND or OR operation. For example, to set and clear P0[0]: In assembly: or reg[PRT0DR], 0x01 ; Set P0[0] and reg[PRT0DR], ~0x01 ; Clear P0[0] In C: PRT0DR |= 0x01; // Set P0[0] PRT0DR &= ~0x01; // Clear P0[0] To read from a port pin, read the PRTxDR register and use the corresponding bit mask. For example, to check the status of P0[1] and update an LED on P0[0]: In assembly: mov A, reg[PRT0DR] and A, 0x02 jnz PinHigh ; Code to process Pin cleared state and reg[PRT0DR], ~0x01 ; Set P0[0] jmp Exit PinHigh: ; Code to process Pin set state or reg[PRT0DR], 0x01 ; Clear P0[0] Exit: www.cypress.com Document No. 001-40480 Rev. *J 11 PSoC® 1 – Getting Started With GPIO In C: if (PRT0DR & 0x02) { // Code to process Pin Set state PRT0DR |= 0x01; // Set P0[0] } else { // Code to process Pin cleared state PRT0DR &= ~0x01; // Clear P0[0] } If a port pin is given a meaningful name in the GPIO configuration window, the data register and the pin mask may also be accessed using the pin macros generated by PSoC Designer. See the Naming a Pin section. 4.4 Modifying the Drive Mode of a GPIO pin Each port has three registers that sets the drive mode of every port pin. They are PRTxDM0, PRTxDM1, and PRTxDM2 registers, where ‘x’ is the port number. One bit from each of these three registers together configures a particular pin. For example, bit0 of PRT0DM0, PRT0DM1, and PRT0DM2 controls the P0[0] drive mode. Table 2 provides the configuration details. Table 2. Drive Mode Register Values PRTxDM2[n] PRTxDM1[n] PRTxDM0[n] Drive Mode 0 0 0 Resistive Pull-down 0 0 1 Strong Drive 0 1 0 High Impedance – Digital 0 1 1 Resistive Pull-up 1 0 0 Open Drain – High 1 0 1 Slow Strong drive 1 1 0 High Impedance – Analog 1 1 1 Open Drain - Low In Table 2, ‘x’ corresponds to the port number and ‘n’ corresponds to the bit in the drive mode register and the port pin to be configured. For instance, to configure Port 0 Pin 1 as resistive pull-down, clear bit ‘1’ of the PRT0DM0, PRT0DM1, and PRT0DM2 registers. Refer to the device TRM for more details. You must note that all the PRTxDM0 and PRTxDM1 registers are in Register Bank 1 (refer to the TRM for more information about register banks), whereas all the PRTxDM2 registers are in Register Bank 0. This knowledge is required to use the drive mode registers in assembly, where you have to select the register bank before accessing the registers. In C, the compiler takes care of bank assignments based on the register used. In Assembly: M8C_SetBank1 or reg[PRT2DM0], 0x20 and reg[PRT2DM1], ~0x20 M8C_SetBank0 and reg[PRT2DM2], ~0x20 In the assembly example, the first line is a call to the M8C_SetBank1 macro, which switches the register bank to ‘1’. This is done because PRT2DM0 and PRT2DM1 are in register bank 1. Bit 5 of the PRT2DM0 register is set by using the “OR” instruction and a mask of 0x20. Next, bit 5 of the PRT2DM1 register is cleared by using an AND instruction and a mask of inverse of 0x20. www.cypress.com Document No. 001-40480 Rev. *J 12 PSoC® 1 – Getting Started With GPIO Using M8C_SetBank0, it is switched back to register bank ‘0’, and using the AND instruction and a mask of inverse of 0x20, bit 5 or the PRT2DM2 register is cleared. The OR and AND instructions are read, modify, or write instructions. The content of the register is first read, an OR or AND operation is done on the value, and then the result is written back to the same register. With this method, you can modify particular bits without affecting the others. In C: PRT2DM0 |= 0x20; PRT2DM1 &= ~0x20 PRT2DM2 &= ~0x20; In C, the code is much simpler because the switching of the banks is taken care of by the C compiler. The “bitwise AND” (&=) or the “bitwise OR” (|=) must be used with the corresponding masks on the registers. If a port pin is renamed in the GPIO configuration window, the drive mode registers may also be accessed using the pin macros generated by PSoC Designer. See Naming a Pin. The modification of GPIO drive mode is demonstrated in Example #1, which is available for download from the application note’s web page. See the Appendix for details of this example project. www.cypress.com Document No. 001-40480 Rev. *J 13 PSoC® 1 – Getting Started With GPIO 5 Shadow Registers 5.1 Use of Shadow Registers In many designs, the same port can have both input (for example, switch with pull-up or pull-down input) and output pins (for example, an LED). In such designs, the instruction that is used to update the output pin might latch the input pin permanently to a ‘1’ or ‘0’. For instance, consider the following scenario: A switch input on P0_1 is configured in pull-down mode (the switch is connected between VDD and the pin). An LED output on P0_0 follows the switch state on P0_1 and the pin is configured as a strong drive (output pin). The following code accomplishes this. if (PRT0DR & { // Switch PRT0DR |= } else { // Switch PRT0DR &= } 0x02) pressed. Turn on the LED 0x01; // Set P0[0] released. Turn off the LED ~0x01; // Clear P0[0] Now, assume the switch is pressed, so the LED needs to be turned on. The code “PRT0DR |= 0x01” is a readmodify-write instruction that does the following: 1. Read – PRT0DR = x x x x x x 1 0 (Bit 0 = 0 LED Off; Bit 1 = ‘1’ as Switch pressed) 2. Modify – (PRT0DR | 00000001) = x x x x x x 1 1 3. Write – PRT0DR = x x x x x x 1 1 (Bit 0 = 1 LED ON; sets Bit 1, which connects the pin to VDD internally as writing ‘1’ to the pin in pull-down drive mode connects it to VDD) 4. In step #3, you can see that a ‘1’ is written to P0[1], which will permanently change the state of this pin to 1. Now even if the switch is released, the data register will keep driving a ‘1’ onto the pin and the code will always read a 1 on the switch input even if the switch is released. To overcome this scenario, a variable called the shadow register is used for such ports (having an input and output combination). When you use a shadow register, all the writes to the pin happens through this variable, and this variable should be initialized with the correct states for input pins. The value for a pull-up or Open Drain Low input pins should be set to ‘1’ in this register and a pull-down or Open Drain High input should be set to ‘0’. When the state of an output pin has to be changed, the read-modify-write instruction must be performed on the shadow register and then the shadow register should be copied to the port data register. All reads will take place directly on the port data register. The following code implements the shadow register: // Use ‘extern’ when using ShadowRegs UM extern BYTE Port_0_Data_SHADE; // Using shadow variables in code if(PRT0DR & 0x02) { Port_0_Data_SHADE |= 0x01; PRT0DR = Port_0_Data_SHADE; } else { www.cypress.com Port_0_Data_SHADE &= ~0x01; PRT0DR = Port_0_Data_SHADE; } Document No. 001-40480 Rev. *J 14 PSoC® 1 – Getting Started With GPIO Now the read-modify-write operation becomes: 1. Read – Port_0_Data_Shade = x x x x x x 0 0 (Bit 0 = 0 LED off; Bit 1 = ‘0’ as initialized, this not the data from the port directly) 2. Modify – (Port_0_Data_Shade | 00000001) = x x x x x x 0 1 3. Write – Port_0_Data_Shade = x x x x x x 0 1 4. Write to Port – PRT0DR = Port_0_Data_Shade PSoC Designer provides a user module (UM) called ShadowRegs, which is available under the Misc Digital user module category. By placing this UM in the project and assigning a port, a variable called Port_x_Data_SHADE is created in the PSoCConfig.asm file in the Library source files directory (See Figure 7), where ‘x’ is the port number. Now, you can use this variable across files by importing it using ‘extern BYTE Port_x_Data_SHADE’. User modules such as TX8SW, which manipulate the GPIO pins, will also use the shadow register and therefore having input pins mixed with output pins used by other user modules poses no problem. When you rename a pin and place a shadow register in the port, an alias for the shadow register with the pin name is also created in psocgpioint.h and psocgpioint.inc files. See the Naming a Pin section. Figure 7. Shadow Variable Location in PSoC Designer The usage of shadow registers is demonstrated in Example #2, which is available for download from the application note’s web page. See Appendix for details of this example project. www.cypress.com Document No. 001-40480 Rev. *J 15 PSoC® 1 – Getting Started With GPIO 6 GPIO Interrupts Interrupts are another important part of the GPIO system, especially when there is a need to process a digital signal with priority. The interrupt system in PSoC is a vast topic; to know about all the available interrupts in PSoC and their priorities, refer to the respective device TRMs. This section will discuss only the GPIO interrupts. Each GPIO pin in PSoC can be configured to generate an interrupt on rising edge, falling edge, or change from a previous read event. This way of configuring the event, which triggers the GPIO interrupt, can be done in two different ways – one way is to configure the interrupts in the GPIO configuration window (see Device Editor Configuration) and the other is in firmware. The registers that are associated with configuring and enabling GPIO interrupts are listed in Table 3. Table 3. GPIO Interrupt Configuration Related Registers Associated Register Description Values PRTxIE Interrupt enable register for each port ‘x’. Setting or clearing a bit in this register enables/disables the interrupt on that particular pin. PRTxIC0 and PRTxIC1 Interrupt control registers – used to set the type of event that triggers the interrupt – rising edge, falling edge, or Table 4 change from read. 1 – Enable 0 – Disable interrupt INT_MSK0 Interrupt enable mask register 0 Bit 5 of the register is global GPIO interrupt enable/disable bit. INT_MSK0_GPIO macro can be used as a mask to enable/disable the fifth bit in the register. INT_CLR0 Posted interrupt read and clear register 0 Bit 5 of the register is GPIO posted interrupt bit. Writing a 0 to the bit clears any posted GPIO interrupts. If the bit reads 1, then there is a posted GPIO interrupt or write a 1 to post a GPIO interrupt through software[ 4] Table 4. Interrupt Control Registers Setting PRTxIC1 [n] PRTxIC0 [n] Interrupt Type Description 0 0 Disabled Interrupt disabled 0 1 Falling Edge Interrupt on 1 to 0 transition of the input signal 1 0 Rising Edge Interrupt on 0 to 1 transition of the input signal 1 1 Change from Read Change in pin’s current state with respect to last read value of PRTxDR[n] In Table 4, ‘x’ denotes the port number and ‘n’ denotes the bit of the register/pin of the port to be configured. To implement a GPIO interrupt, do the following: 1. In the GPIO configuration window, set the type of interrupt for the pin. This can also be done in code by writing to the PRTxICx registers. 2. In the main application code, enable GPIO interrupt by setting bit 5 of the INT_MSK0 register. This can be done by using the M8C_EnableIntMask macro. 3. Enable the interrupt for the corresponding pin by writing to the PRTxIE register. If the interrupt type is selected in the GPIO configuration window, then PSoC Designer automatically sets the PRTxIE register bit during the bootup process. 4. Write a C or assembly ISR for processing the interrupt. If the ISR is written in C, then declare the ISR using the #pragma interrupt_handler directive to tell the compiler that the function is an ISR. 4 Write 0 and ENSWINT = 0 Clear posted interrupt if it exists. Write 1 and ENSWINT = 0 No effect. Write 0 and ENSWINT = 1 No effect. Write 1 and ENSWINT = 1 Post an interrupt for general-purpose inputs and outputs (pins). ENSWINT bit is bit 7 of INT_MSK3 register. www.cypress.com Document No. 001-40480 Rev. *J 16 PSoC® 1 – Getting Started With GPIO 5. Place the code to redirect the interrupt to the ISR function. This can be done in two ways: a. When the interrupt is enabled in the GPIO configuration window, PSoC Designer generates a library file called psocgpioint.asm. This file has a placeholder function PSoC_GPIO_ISR where the interrupt may be redirected. For example, if you have a C function called MyGpioIsr, place the code “ljmp _MyGpioIsr” (an underscore has to be added to the function name while calling a C function from assembly). b. Directly add the redirect instruction to the boot code. To do this, open the boot.tpl file in the project folder. This is the template file using which PSoC Designer generates the boot.asm file. In the boot.tpl file, in the GPIO interrupt vector, comment out the code “@INTERRUPT_7” and add the redirect instruction to your GPIO ISR. Save the boot.tpl file and generate application. Now the boot.asm file will have the redirect instruction to the GPIO ISR. Note that there is only one interrupt vector associated with GPIO interrupts. If interrupt is enabled on multiple pins, it is the responsibility of the application code to detect which pin caused the interrupt and process it accordingly. In the example code below, interrupts on P0_0 and P0_1 are enabled. The P0_0 interrupt is configured as a falling edge interrupt, whereas P0_1 is configured as ‘change from read’. The GPIO interrupt is enabled using the M8C_EnableIntMask macro, and finally global interrupt is enabled. In the GPIO_ISR, there are ‘if’ control structures placed to check which pin caused this instance of the ISR, and the data is processed accordingly. Setting Up and Enabling GPIO Interrupt /* P0_0 configured as falling edge interrupt */ PRT0IC0 |= 0x01; PRT0IC1 &= ~0x01; /* P0_1 configured as Change from Read interrupt */ PRT0IC0 |= 0x02; PRT0IC1 |= 0x02; /* Enable P0_1 and P0_0 interrupts */ PRT0IE |= 0x03; /* Enable GPIO interrupts */ M8C_EnableIntMask(INT_MSK0, INT_MSK0_GPIO); /* Enable Global interrupts */ M8C_EnableGInt; Writing the GPIO ISR /* Function prototype for GPIO_ISR*/ #pragma interrupt_handler GPIO_ISR /* GPIO ISR in C where GPIO interrupts are processed */ void GPIO_ISR(void) { /* variable to have a copy of prev P0_1 value for change from read comparison */ static BYTE port0_prevValue; /* Check if interrupt because of P0_0 First condition checks for P0_0 to be Second condition checks if it was ‘1’ if(((PRT0DR & 0x01) == 0) && ((PRT0DR { /* Process P0_0 interrupt */ } www.cypress.com falling edge: '0' in the last ISR */ & 0x01) == 0x01)) Document No. 001-40480 Rev. *J 17 PSoC® 1 – Getting Started With GPIO /* Check if interrupt because of P0_1 change from read */ if ((PRT0DR ^ port0_prevValue)==0x02) { /* Process P0_1 interrupt */ } /* Store values of P0_0 and P0_1 for next ISR */ port0_prevValue = PRT0DR & 0x03; } 6.1.1 Setting Up the Redirect to the ISR Inside the psocgpioint.asm file: ;-----------------------------------------; FUNCTION NAME: PSoC_GPIO_ISR ; ; DESCRIPTION: Unless modified, this implements only a null handler stub. ; ;------------------------------------------ PSoC_GPIO_ISR: ;@PSoC_UserCode_BODY@ (Do not change this line.) ;--------------------------------------; Insert your custom code below this banner ;--------------------------------------ljmp _GPIO_ISR ;-----------------------------------------; Insert your custom code above this banner ;-----------------------------------------;@PSoC_UserCode_END@ (Do not change this line.) reti Similarly, the following code shows the same implementation in assembly Inside the boot.tpl file: org 1Ch ;GPIO Interrupt Vector ;`@INTERRUPT_7` ljmp _GPIO_ISR reti After making these changes, save the boot.tpl file and generate the application. 6.1.2 Setting Up and Enabling GPIO Interrupt ; P0_1 configured as change from read ; Interrupt M8C_SetBank1 or reg[PRT0IC0], 0x02 or reg[PRT0IC1], 0x02 ; Enable P0_1 interrupt M8C_SetBank0 or reg[PRT0IE], 0x02 ;Enable GPIO interrupts M8C_EnableIntMask INT_MSK0, INT_MSK0_GPIO ;Enable Global interrupts M8C_EnableGInt www.cypress.com Document No. 001-40480 Rev. *J 18 PSoC® 1 – Getting Started With GPIO Code 1: GPIO ISR export MyGpioIsr area text ;GPIO ISR in ASM where all GPIO ISRs ;are processed GPIO_ISR: ;Preserve CUR_PP, X and A push A push X mov A, reg[CUR_PP] push A ;Change CUR_PP to port0PrevValue's Ram ;page (port0PrevValue can be defined ;in any ‘.c’ file included in the ;project as a global BYTE variable) RAM_SETPAGE_CUR >_port0PrevValue ;Read PRT0DR into A mov A, reg[PRT0DR] ;take a copy of PRT0DR into X for ;storing in port0PrevValue at the end mov X, A ;XOR PRT0DR value in A and PRT0DR's ;prev value xor A, [<_port0PrevValue] ;AND with 0x02 to read P0_1's state and A, 0x02 ;If zero flag is set, no change in ;state, so not P0_1 ISR jz .NoP0_1_ISR ; ;Comes here if the XOR operation ;resulted a non zero result ; ;Process code for P0_1 ISR ; .NoP0_1_ISR: ; ;Process code for other GPIO ISRs ; RAM_SETPAGE_CUR >_port0PrevValue mov [<_port0PrevValue], X ;Restore CUR_PP, X and A in order they ;were pushed pop A mov reg[CUR_PP], A pop X pop A reti The method to redirect to the ISR remains the same as we used in the C example. In the ljmp instruction placed inside the psocgpioint.asm file or the boot.tpl file, the underscore before the MyGpioIsr is not needed. Example #3 demonstrates the implementation of GPIO interrupts. You can download it from the application note’s web page. See the Appendix for details of this example project. www.cypress.com Document No. 001-40480 Rev. *J 19 PSoC® 1 – Getting Started With GPIO 6.2 Do’s and Don’ts While Using Interrupts Global interrupt enable bit must be set using the M8C_EnableGInt macro. When a GPIO interrupt is configured as ‘Change from Read’, the pin value should be read using the PRTxDR register for the next interrupt to occur. Only a change in the last read value of PRTxDR and current pin state triggers this interrupt. The ISR function in C should be defined using the “#pragma interrupt_handler” directive for the ISR to properly execute and return control. The ISR function defined in the asm file should preserve the registers used and restore them before exiting. The function should use the RETI instruction to return instead of the normal RET instruction. The redirect to the ISR function defined in C or ASM may either be placed inside the psocgpioint.asm file or the boot.tpl file. The boot.tpl file and the location of the GPIO ISR are shown in Figure 8. The drive mode of the GPIO should not be set to high-impedance analog or else interrupt will never occur for that particular pin. Figure 8. GPIO ISR Location in the boot.tpl File www.cypress.com Document No. 001-40480 Rev. *J 20 PSoC® 1 – Getting Started With GPIO 7 Other GPIO Resources and Tips 7.1 GPIO Global Select Register The PRTxGS register determines if a GPIO pin is under the control of the CPU or is connected to the Global In or Global Out bus. When the bit corresponding to the pin in the PRTxGS register is cleared, the pin can be controlled by the CPU by writing to the PRTxDR register. When the bit in PRTxGS register is set, the pin is connected to the Global bus – Global In and Global Out – and can be directly connected to the input or output of a digital block. 7.2 Analog Mux (AMUX) Bus Control Register [ 5] The Analog Mux (AMUX) Bus Control Register (MUX_CRx) enables or disables the connection of a GPIO pin to the internal analog mux bus. This analog mux bus is then available as input to various analog blocks inside the PSoC device. For instance, setting the bit '0' of MUX_CR1 connects P1_0 to the AMuX bus. Refer to the respective device TRM for more information about the AMUX settings and routing. 7.3 Naming a Pin In the GPIO configuration window, each pin is assigned a unique meaningful name, as shown in Figure 9. Figure 9. Naming a Pin When a pin is given a name, PSoC Designer generates macros for all the registers associated with the pin in the PSoCGPIOINT.h for C files and PSoCGPIOINT.asm for ASM files for easy access. The macro list includes macros for: 5 Port data register (PRTxDR) Port drive mode registers (PRTxDMx) Port interrupt enable register (PRTxIE) Port interrupt setup registers (PRTxICx) Port global select register (PRTxGS) Pin mask Shadow register Available only in CY8C21x34, 21x45, 22x45, 24x94, and 28xxx family of devices. www.cypress.com Document No. 001-40480 Rev. *J 21 PSoC® 1 – Getting Started With GPIO Table 5 provides an overview of the macros generated in the PSoCGPIOINT.h file for use in C files and PSoCGPIOINT.inc for use in ASM files. These macros can be directly used in any function to access the pin-related settings and information. Table 5. Macros Associated With a Named Pin Pin Name LED_1 Port Data Register LED_1_Data_ADDR Port Drive Mode 0 Register LED_1_DriveMode_0_ADDR Port Drive Mode 1 Register LED_1_DriveMode_1_ADDR Port Drive Mode 2 Register LED_1_DriveMode_2_ADDR Port Global Select Register LED_1_GlobalSelect_ADDR Port Interrupt Enable Register LED_1_IntEn_ADDR Port Interrupt Control 0 Register LED_1_IntCtrl_0_ADDR Port Interrupt Control 1 Register LED_1_IntCtrl_1_ADDR Pin Mask LED_1_MASK Shadow Register LED_1_DataShadow The advantage of using pin names and pin macros is that if a pin is moved to a different port, PSoC Designer will automatically update the registers associated with the pin macros and no change to the application code is required. The following code snippets show the usage of these macros: To directly write to the LED_1 pin using the data register: /* Write 1 to LED_1 pin */ LED_1_Data_ADDR |= LED_1_MASK; /* Write 0 to LED_1 pin */ LED_1_Data_ADDR &= ~LED_1_MASK; To write to the LED_1 pin using the shadow register: /* Write 1 to LED_1 */ LED_1_DataShadow |= LED_1_MASK; LED_1_Data_ADDR = LED_1_DataShadow; /* Write 0 to LED_1 */ LED_1_DataShadow &= ~LED_1_MASK; LED_1_Data_ADDR = LED_1_DataShadow; To change the drive mode of LED_1 to strong mode: /* Set LED_1 drive mode to strong */ LED_1_DriveMode_0_ADDR |= LED_1_MASK; LED_1_DriveMode_1_ADDR &= ~LED_1_MASK; LED_1_DriveMode_2_ADDR &= ~LED_1_MASK; www.cypress.com Document No. 001-40480 Rev. *J 22 PSoC® 1 – Getting Started With GPIO To connect or disconnect LED_1 from global bus: /* Connect LED_1 to global bus */ LED_1_GlobalSelect_ADDR |= LED_1_MASK; /* Disconnect LED_1 from global bus */ LED_1_GlobalSelect_ADDR &= ~LED_1_MASK; To read from a pin named SW and write to the pin named LED_1: if (SW_Data_ADDR & SW_MASK) { /* Write 1 to LED_1 */ LED_1_DataShadow |= LED_1_MASK; LED_1_Data_ADDR = LED_1_DataShadow; } else { /* Write 0 to LED_1 */ LED_1_DataShadow &= ~LED_1_MASK; LED_1_Data_ADDR = LED_1_DataShadow; } Figure 10 shows the pin macros in the psocgpiont.h and psocgpioint.inc files. Figure 10. Pin-Related Macros www.cypress.com Document No. 001-40480 Rev. *J 23 PSoC® 1 – Getting Started With GPIO 7.4 Registers and Their Associated Register Banks Two banks are available in the PSoC 1 register map. Each of the port configuration registers belongs to one of these register banks. It is necessary to know to which bank a particular register belongs, to access the register in assembly. In C code, the compiler automatically takes care of bank switching. To change the register bank to bank 0 in ASM, use the M8C_SetBank0 macro. Similarly, for bank 1 use the M8C_SetBank1 macro. Table 6 provides the register bank details for each of the GPIO registers discussed in this application note. Table 6. GPIO-Related Registers and Their Register Banks Register Register bank PRTxDR 0 PRTxDM0 1 PRTxDM1 1 PRTxDM2 0 PRTxIE 0 PRTxGS 0 PRTxIC0 1 PRTxIC1 1 INT_MSK0 0 INT_CLR0 0 MUX_CRx 1 www.cypress.com Document No. 001-40480 Rev. *J 24 PSoC® 1 – Getting Started With GPIO 8 Example Projects 8.1 Project 1: Detecting LED Drive Mode This example project demonstrates how the drive mode of a pin may be reconfigured on the fly using the PRTxDMx registers. In most systems, LEDs are usually connected to sink current through the GPIOs to turn them on. In certain systems, instead of sinking, the GPIOs source current to the LEDs to turn them on. Though LED implementation is known when the system is designed, there may be cases where you want to upgrade or update the design without changing the firmware. For example, you have included a sourcing GPIO LED design and find that the GPIO is not capable of sourcing enough current. Or you move to a LED with a higher current rating and change the design to LED sink mode, but you want the device to adjust itself depending on the mode the LEDs are connected to the GPIOs. This example lets you add that feature to your design, where you find out the mode in which the LED is connected to a GPIO pin and then turn ON or OFF the LED accordingly. The flow chart in Figure 11 explains how the LED drive mode is detected internally. Figure 11. Detecting LED Drive Mode Algorithm Start Configure LED In Pull Down Mode And Write 0 A Small Delay Is Pin High? Yes LED Drive Is Active Low No LED Drive Is Active High Configure LED To Strong Drive Mode Write 0 If Active High Write 1 If Active Low End To implement the example project following hardware are required: CY3210 PSoCEval1 with 28-pin CY8C29466-24PXI PDIP PSoC 1. Spare LED and 1-kΩ resistor to check the LED sink mode CY3217 MiniProg1 or CY8CKIT-002 MiniProg3. Connecting wires www.cypress.com Document No. 001-40480 Rev. *J 25 PSoC® 1 – Getting Started With GPIO To test the example project, follow the following steps 1. 2. 3. 4. 5. 6. Insert the CY8C29466-24PXI 28-pin device into the 28-pin PDIP socket provided on the CY3210 board. Connect MiniProg1 or MiniProg3 to the programing header (J11) of the CY3210 board. Open PSoC programmer 3.23.1 or later and connect MiniProg1 or MiniProg3. Browse the AN2094_GPIO_DM_Reconfig.hex file available in the root directory of the AN2094_GPIO_DM_Reconfig project attached with this application note i.e. open folder AN2094 > AN2094_GPIO_DM_Reconfig > AN2094_GPIO_DM_Reconfig.hex Program the device using selected file by using program button of PSoC programmer. To know more about programming options please see AN2015 - PSoC 1 Reading and Writing Flash & E2PROM. Connect P0_1 to SW and P0_0 to LED1, as shown in Figure 12. Figure 12. Wire Connections for project 1 7. 8. 9. 10. Connect the character LCD (provided with CY3210 PSoCEval1 kit) to the J9 header on the CY3210 board. Remove JP3 on the CY3210 kit for 5-V operation. Power the board using a MiniProg1 or MiniProg3 or a 5-V DC adapter. LCD row 0 should display “LED ACT HI” and when SW is pressed, LED1 glows and LCD row 1 displays “SW ON”, as shown in Figure 13. 11. Similarly, if you wire up a spare LED in sink mode via a 1-kΩ resistor (one end connected to LED and other end connected to Vcc) and connect it to P0_0, the LCD will display “LED ACT LOW” and LED ON/OFF follows SW ON/OFF, as shown in Figure 14. Figure 13. Example 1 Output - LED Active HIGH www.cypress.com Document No. 001-40480 Rev. *J 26 PSoC® 1 – Getting Started With GPIO Figure 14. Example 1 Output - LED Active LOW 8.2 Project 2: Use of Shadow Registers To demonstrate the importance and use of shadow registers, a simple setup using the CY3210-PSoCEval1 board is created as shown in Figure 15. In this example, the hardware has a provision to enable or disable the shadow register feature on power-up. When P0_2 is connected to VDD during power-up, shadow registers are disabled and when it is connected to GND, shadow registers are enabled. This example demonstrates the scenario explained in the section Use of Shadow Registers, where the same port has an input switch and an output LED. 8.2.1 Hardware Required 8.2.2 CY3210 PSoCEval1 with 28-pin CY8C29466-24PXI PDIP PSoC 1 CY3217 MiniProg1 Connecting wires Test Procedure 1. 2. 3. 4. 5. 6. 7. Insert the CY8C29466-24PXI 28-pin device into the 28-pin PDIP socket provided on the CY3210 board. Connect MiniProg1 or MiniProg3 to the programing header (J11) of the CY3210 board. Open PSoC programmer 3.23.1 or later and connect MiniProg1 or MiniProg3. Browse the AN2094_GPIO_with_ShadowRegs.hex file available in the root directory of the AN2094_GPIO_with_ShadowRegs project attached with this application note i.e. AN2094>AN2094_GPIO_with_ShadowRegs> AN2094_GPIO_with_ShadowRegs.hex Program the device using selected file by using program button of PSoC programmer. To know more about programming options please see AN2015 - PSoC 1 Reading and Writing Flash & E2PROM Connect the character LCD (provided with CY3210 PSoCEval1 kit) to the J9 header on the CY3210 board. To test the project without shadow variables, connect P0_0 to LED1, P0_1 to SW, and P0_2 to VDD, as shown in Figure 15. www.cypress.com Document No. 001-40480 Rev. *J 27 PSoC® 1 – Getting Started With GPIO Figure 15. Pin Connections for Example 2 without Shadow Registers 8. Remove JP3 in the CY3210 kit for 5-V operation. 9. Power the board using a MiniProg1 or MiniProg3 or a 5-V DC adapter. 10. Now, press SW once and release; observe that LCD row 1 displays “SW ON” and LED1 will be ON. This is because there is no shadow variable used. Figure 16. Project 2 Output without Shadow Registers 11. Power off the board and connect P0_2 to GND, as shown in Figure 17. Figure 17. Pin Connections for Example 2 With Shadow Registers www.cypress.com Document No. 001-40480 Rev. *J 28 PSoC® 1 – Getting Started With GPIO 6. Power up the board. 7. LCD row 0 will display “Shadow - ON”. Pressing the switch will display SW ON and the LED will glow as shown in Figure 18. Releasing the switch will display SW OFF and the LED will be turned off. Figure 18. Example 2 Output With Shadow Registers 8.3 Project 3: LED Toggling Using Interrupts To demonstrate the use of GPIO interrupts, a simple LED toggle algorithm is implemented in this example. The rising edge interrupt is enabled on the pin, which is connected to a switch. In the ISR, a flag is set to indicate the rising edge on the switch. The LED is toggled in the while loop after a simple 2-ms debounce. The LED ON/OFF status is displayed on the LCD. 8.3.1 Hardware Required 8.3.2 CY3210 PSoCEval1 with 28-pin CY8C29466-24PXI PDIP PSoC 1. CY3217 MiniProg1 Connecting wires Test Procedure 1. 2. 3. 4. 5. 6. 7. Insert the CY8C29466-24PXI 28-pin device into the 28-pin PDIP socket provided on the CY3210 board. Connect MiniProg1 or MiniProg3 to the programing header (J11) of the CY3210 board. Open PSoC programmer 3.23.1 or later and connect MiniProg1 or MiniProg3. Browse the AN2094_GPIO_Interrupt_Usage.hex file available in the root directory of the AN2094_GPIO_with_ShadowRegs project attached with this application note i.e. AN2094> AN2094_GPIO_Interrupt_Usage> AN2094_GPIO_Interrupt_Usage.hex Program the device using selected file by using program button of PSoC programmer. To know more about programming options please see AN2015 - PSoC 1 Reading and Writing Flash & E2PROM Connect the character LCD (provided with CY3210 PSoCEval1 kit) to the J9 header on the CY3210 board. To test the project, connect P0_0 to LED1 and P0_1 to SW as shown in Figure 19. 8. Remove JP3 in the CY3210 kit for 5-V operation. 9. Power the board using MiniProg1 or a 5-V DC adapter. 10. Press SW and see LED1 toggling on each press. www.cypress.com Document No. 001-40480 Rev. *J 29 PSoC® 1 – Getting Started With GPIO 11. Row 0 on the LCD displays “GPIO ISR Proj”; row 1 displays the LED ON/OFF status, as shown in Figure 19 and Figure 20. Figure 19. Example 3 Output With LED ON Figure 20. Example 3 Output With LED OFF 8.4 Additional Code Examples More code examples using PSoC 1 devices are available in PSoC Designer 5.4. SP1 or later. To access them, go to: Start Page > Design Catalog > Launch Example Browser. www.cypress.com Document No. 001-40480 Rev. *J 30 PSoC® 1 – Getting Started With GPIO Document History ® Document Title: AN2094 - PSoC 1 - Getting Started With GPIO Document Number: 001-40480 Revision ECN Orig. of Change Submission Date Description of Change ** 1532004 SFV 11/13/2007 Re-catalogued application note. *A 1778285 SFV 12/18/2007 Associated Project files zipped with source document. *B 2188526 MAXK 06/05/2008 Corrected Table 1. Drive Mode Configuration. (project files zipped with source files) Adapted example project to operate on CY3210-EVAL1 board. *C 3181445 MAXK 02/24/2011 Updated firmware for PSoC Designer 5.1 SP1. General information and readability updates. Template changes. *D 3283657 MAXK 06/15/2011 No Technical updates. Document title updated. Changed title to Getting started with GPIO. *E 3665015 MSUR 07/03/2012 Covered relevant topics to get started with GPIOs. Updated the associated project and template. Complete rewrite. Updated images showing the example outputs (Figure 6, 7, 10, 12, 13, and 14). *F 4053232 MSUR 07/08/2013 Added Code 10 and 11 to demonstrate assembly implementation of GPIO ISR. Updated references related to the above modifications. Updated projects to include drive mode setting through assembly. Updated projects to PSoC designer 5.3. Updated GPIO ISR project to have a better switch debounce. Added a section GPIO Architecture and explained the architecture of the GPIO cell Added a section Code Level Configuration and explained all the registers associated with GPIO. *G 4330651 GRAA 04/02/2014 Changed the order of sections to improve the flow of the AN In the GPIO Interrupts section, added code snippets to show how the redirect to a GPIO ISR is achieved through psocgpioint.asm file or boot.tpl file Added more details to the “Naming a Pin” section. Provided code snippets on the usage of all the GPIO macros. Moved all the example projects to appendix to improve the flow of AN. *H 4371610 MSUR 06/05/2014 Sunset Review. *I 4494118 DIMA 09/05/2014 Added the Additional Code Examples section to provide a reference to code examples integrated with PSoC Designer 5.4. *J 4952015 ASRI 10/15/2015 Added instructions in Project 1: Detecting LED Drive Mode, Example 2: Use of Shadow Registers and Example 3: LED Toggling Using Interrupts, to test the example projects associated with this application note. Updated the projects to PSoC Designer 5.4 SP1. Added Getting Started. www.cypress.com Document No. 001-40480 Rev. *J 31 PSoC® 1 – Getting Started With GPIO Worldwide Sales and Design Support Cypress maintains a worldwide network of offices, solution centers, manufacturer’s representatives, and distributors. To find the office closest to you, visit us at Cypress Locations. PSoC® Solutions Products Automotive cypress.com/go/automotive psoc.cypress.com/solutions Clocks & Buffers cypress.com/go/clocks PSoC 1 | PSoC 3 | PSoC 4 | PSoC 5LP Interface cypress.com/go/interface Lighting & Power Control cypress.com/go/powerpsoc Cypress Developer Community Memory cypress.com/go/memory PSoC cypress.com/go/psoc Touch Sensing cypress.com/go/touch USB Controllers cypress.com/go/usb Wireless/RF cypress.com/go/wireless Community | Forums | Blogs | Video | Training Technical Support cypress.com/go/support PSoC is a registered trademark and PSoC Creator is a trademark of Cypress Semiconductor Corp. All other trademarks or registered trademarks referenced herein are the property of their respective owners. Cypress Semiconductor 198 Champion Court San Jose, CA 95134-1709 Phone Fax Website : 408-943-2600 : 408-943-4730 : www.cypress.com © Cypress Semiconductor Corporation, 2007-2015. The information contained herein is subject to change without notice. Cypress Semiconductor Corporation assumes no responsibility for the use of any circuitry other than circuitry embodied in a Cypress product. Nor does it convey or imply any license under patent or other rights. Cypress products are not warranted nor intended to be used for medical, life support, life saving, critical control or safety applications, unless pursuant to an express written agreement with Cypress. Furthermore, Cypress does not authorize its products for use as critical components in life-support systems where a malfunction or failure may reasonably be expected to result in significant injury to the user. The inclusion of Cypress products in life-support systems application implies that the manufacturer assumes all risk of such use and in doing so indemnifies Cypress against all charges. This Source Code (software and/or firmware) is owned by Cypress Semiconductor Corporation (Cypress) and is protected by and subject to worldwide patent protection (United States and foreign), United States copyright laws and international treaty provisions. Cypress hereby grants to licensee a personal, non-exclusive, non-transferable license to copy, use, modify, create derivative works of, and compile the Cypress Source Code and derivative works for the sole purpose of creating custom software and or firmware in support of licensee product to be used only in conjunction with a Cypress integrated circuit as specified in the applicable agreement. Any reproduction, modification, translation, compilation, or representation of this Source Code except as specified above is prohibited without the express written permission of Cypress. Disclaimer: CYPRESS MAKES NO WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, WITH REGARD TO THIS MATERIAL, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. Cypress reserves the right to make changes without further notice to the materials described herein. Cypress does not assume any liability arising out of the application or use of any product or circuit described herein. Cypress does not authorize its products for use as critical components in life-support systems where a malfunction or failure may reasonably be expected to result in significant injury to the user. The inclusion of Cypress’ product in a life-support systems application implies that the manufacturer assumes all risk of such use and in doing so indemnifies Cypress against all charges. Use may be limited by and subject to the applicable Cypress software license agreement. www.cypress.com Document No. 001-40480 Rev. *J 32