# GPIO Button Interrupt via PDL

## L*ab Objective:*

&#x20;   In this lab, participants will employ the Peripheral Driver Library (PDL) to set up GPIO interrupts for detecting button presses on the Infineon PSoC 6 microcontroller. Instead of traditional polling techniques, the system will be optimized to immediately react to button actuation via the interrupt-driven method. Through this activity, participants will gain insights into leveraging PDL for efficient interrupt handling, and learning to utilize hardware features to enhance system responsiveness while preserving CPU resources for other critical tasks.

## 🔥 Requirements

<table><thead><tr><th width="429">Resources</th><th>Links</th></tr></thead><tbody><tr><td>Computer</td><td>💻</td></tr><tr><td>ModusToolbox™ software v3.0 or later</td><td><a href="https://www.infineon.com/modustoolbox">Link</a></td></tr><tr><td>CY8CKIT-062S2-43012 Infineon Board</td><td><a href="https://github.com/Advance-Innovation-Centre-AIC/BIIL_MTB-100_Hello_World_and_LED_Blinking_Programming_Template/assets/88732241/0215501d-b774-4045-8e64-ef49e28d8404">Link</a></td></tr><tr><td>Technical Report</td><td><a href="https://www.dropbox.com/scl/fi/amaxc94pte0ut2i1r5ewx/Technical-Report-Lab00.paper?rlkey=b3xm3vrerz9xgv1glb30cvy9z&#x26;dl=0">dropbox</a></td></tr></tbody></table>

## 🚩 Let start

### Create Application

<figure><img src="https://1856353139-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MClo3nC-1US0rbK8Qau%2Fuploads%2F0y2Ay2JLfn6Rx43h4pzl%2Fimage.png?alt=media&#x26;token=70d92e2e-9620-40fc-b4f4-7dc7b4763486" alt=""><figcaption></figcaption></figure>

### Use Device Configurator and set the button pin to have a falling edge interrupt.

<figure><img src="https://1856353139-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MClo3nC-1US0rbK8Qau%2Fuploads%2FAqR4vWyatofnqkBNX1ye%2Fimage.png?alt=media&#x26;token=8de0ac77-bf38-489d-9d4e-cb5c3f63f810" alt=""><figcaption><p>Enable the button Pin </p></figcaption></figure>

<figure><img src="https://1856353139-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MClo3nC-1US0rbK8Qau%2Fuploads%2FZXE3tCA6ggTfX7yH91G7%2Fimage.png?alt=media&#x26;token=77d9dae5-ccdc-462b-92fe-011c788c291b" alt=""><figcaption><p>Enable the LED Pin</p></figcaption></figure>

### Coding

* Coding: Open the main.c file and add the following code to the main(void) function.

{% code title="main.c" %}

```c
#include "cy_pdl.h"
#include "cyhal.h"
#include "cybsp.h"
#include "cy_retarget_io.h"

#define PORT_INTR_MASK  (0x00000001UL << CYBSP_USER_BTN_PORT_NUM)

void Interrupt_Handler(void){
	// Get interrupt cause
	uint32_t intrSrc = Cy_GPIO_GetInterruptCause0();
	/* Check if the interrupt was from the button's port */
	if(PORT_INTR_MASK == (intrSrc & PORT_INTR_MASK)){
		/* Clear the interrupt */
		Cy_GPIO_ClearInterrupt(CYBSP_USER_BTN_PORT, CYBSP_USER_BTN_NUM);
		// Toggle LED
		Cy_GPIO_Inv(CYBSP_USER_LED_PORT, CYBSP_USER_LED_NUM);
	}
}

int main(void)
{
    cy_rslt_t result;

    /* Initialize the device and board peripherals */
    result = cybsp_init() ;
    if (result != CY_RSLT_SUCCESS)
    {
        CY_ASSERT(0);
    }

    /* Enable global interrupts */
    __enable_irq();

    // Interrupt config structure
     cy_stc_sysint_t intrCfg =
 	{
 		/*.intrSrc =*/ CYBSP_USER_BTN_IRQ,
 		/*.intrPriority =*/ 3UL
 	};

     /* Initialize the interrupt with vector for Interrupt_Handler */
 	Cy_SysInt_Init(&intrCfg, &Interrupt_Handler);
 	/* Send the button through the glitch filter */
 	Cy_GPIO_SetFilter(CYBSP_USER_BTN_PORT, CYBSP_USER_BTN_NUM);

	
 	/* Enable the interrupt*/
 	NVIC_EnableIRQ(intrCfg.intrSrc);


    for (;;)
    {
    	/* Do nothing */
    }
}
```

{% endcode %}

### Build the Application

### Launching the Application

> Note: Before launching the program to the board, make sure that you have already connected the board to the computer through a USB cable.

<figure><img src="https://github.com/Advance-Innovation-Centre-AIC/BIIL_MTB-100_Hello_World_and_LED_Blinking_Programming_Template/assets/88732241/7a6bb6ef-cb63-4613-98a1-42f9617ad724" alt="" width="188"><figcaption><p>set up USB cable</p></figcaption></figure>

### Result&#x20;

<figure><img src="https://1856353139-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MClo3nC-1US0rbK8Qau%2Fuploads%2FjxgczOoyo9bWUHB85nid%2Fimage.png?alt=media&#x26;token=87b97cf5-64bc-49ee-93e7-02e3adfd3cda" alt=""><figcaption><p>Press Button 1st time to Turn ON LED (toggle LED), Press Button 2nd time to Turn OFF LED</p></figcaption></figure>

> #### 🎉 <mark style="color:blue;">Congratulations! You can now complete Lab105</mark>

## Workshop:

#### Exercise 1: Change From USER LED to RGB Green/Red/Blue

#### Exercise 2: Add Loop LED to the Loop function

```
// RED LED turn on and Turn of
Cy_GPIO_Clr(CYBSP_LED_RGB_RED_PORT, CYBSP_LED_RGB_RED_NUM); // Turn ON the Red LED
Cy_SysLib_Delay(1000U);

Cy_GPIO_Set(CYBSP_LED_RGB_RED_PORT, CYBSP_LED_RGB_RED_NUM); // Turn OFF the Red LED
Cy_SysLib_Delay(1000U);
```

## Supported toolchains (make variable 'TOOLCHAIN')

* GNU Arm® embedded compiler v10.3.1 (`GCC_ARM`) - Default value of `TOOLCHAIN`
* Arm® compiler v6.16 (`ARM`)
* IAR C/C++ compiler v9.30.1 (`IAR`)

## Supported kits (make variable 'TARGET')

* [PSoC™ 62S2 Wi-Fi Bluetooth® pioneer kit](https://www.infineon.com/CY8CKIT-062S2-43012) (`CY8CKIT-062S2-43012`)
* [PSoC™ 62S1 Wi-Fi Bluetooth® pioneer kit](https://www.infineon.com/CYW9P62S1-43438EVB-01) (`CYW9P62S1-43438EVB-01`)
* [PSoC™ 62S1 Wi-Fi Bluetooth® pioneer kit](https://www.infineon.com/CYW9P62S1-43012EVB-01) (`CYW9P62S1-43012EVB-01`)
* [PSoC™ 62S3 Wi-Fi Bluetooth® prototyping kit](https://www.infineon.com/CY8CPROTO-062S3-4343W) (`CY8CPROTO-062S3-4343W`)

## Related resources

| Resources                       | Links                                                                                                                                                      |
| ------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
| ModusToolbox™ Software Training | [link](https://www.dropbox.com/sh/waj898o4o8eccx0/AAB3hBBaIQo2OvJ5-fubGJIha/training-modustoolbox-level1-getting-started-master/Manual/Ch2-Tools.pdf?dl=0) |

## Other resources

Infineon provides a wealth of data at [www.infineon.com](http://www.infineon.com) to help you select the right device, and quickly and effectively integrate it into your design.

## Document history

Document title: *BILL\_MTB-106* – *GPIO-PDL Button interrupt*<br>

<table><thead><tr><th width="149">Version</th><th>Description of change</th></tr></thead><tbody><tr><td>1.0.0</td><td>Lab 106: Learn basic GPIO control with PSoC 6 using Interrupt Button to toggle the LED via PDL</td></tr></tbody></table>

## Authors:

* *Assoc. Prof. Wiroon Sriborrirux*
* *Mr. Sriengchhun Chheang*
* *Mr. Sabol Socare*<br>

<br>

***

© BDH Corporation, 2022-2023
