Thanks Jeremy, the main problem I'm having now is understanding pin multiplexing and GPIO configuration. Once I get my head around this I should be able to start uploading to the "Documents" section of the forum instructions on interfacing to displays and keypads and other projects. I hope that they will prove a helpful resource for beginners and free up NXP staff to focus on more complex questions.
I tried the suggestions you made above but was not able to get it working. Just to clarify, I'm trying to get the red LED on the breadboard in the photo below to blink: 
In your code you configured GPIO_AD_04.
In pin_mux.c in the SDK KPP example GPIO_AD_04 is column 2 of the matrix keypad, and in readme.txt is says column 2 is set to Arduino interface J57-10, so I thought to connect the cathode of the LED to J57-10 (black cable) and blink it using negative logic. I checked the hardware and everything seems fine - the red LED is not broken and the red cable is supplying 3.3V to the anode of the LED.
I made some modifications to the code and tried again, but at this point I was just guessing. Below is the final (unsuccessful) code I tried. It's the iled_blink example from the SDK with the following changes (I left the green led on the i.MX RT1010 EVK as a heartbeat - it's blinking as expected):
The board.h code (I only made changes in the /*! @brief The USER_LED used for board */ section - I commented out the original code and added my new code):
/*! @brief The USER_LED used for board */
//********Start original******** ->
//#define LOGIC_LED_ON (0U)
//#define LOGIC_LED_OFF (1U)
//#ifndef BOARD_USER_LED_GPIO
//#define BOARD_USER_LED_GPIO GPIO1
//#endif
//#ifndef BOARD_USER_LED_GPIO_PIN
//#define BOARD_USER_LED_GPIO_PIN (11U)
//#endif
//<- ********End original********
//********Start new******** ->
#define LOGIC_LED_ON (0U)
#define LOGIC_LED_OFF (1U)
#ifndef BOARD_USER_LED_GPIO
#define BOARD_USER_LED_GPIO GPIO1
#endif
#ifndef BOARD_USER_LED_GPIO_PIN
#define BOARD_USER_LED_GPIO_PIN (11U)
#endif
#ifndef BOARD_USER_LED2_GPIO_PIN
#define BOARD_USER_LED2_GPIO_PIN (18U)
#endif
//<- ********End new********
The pin_mux.c code (I only made changes in the BOARD_InitPins function. This was entered by hand, I didn't use the Config Tools):
void BOARD_InitPins(void) {
//********Start original******** ->
// CLOCK_EnableClock(kCLOCK_Iomuxc); /* iomuxc clock (iomuxc_clk_enable): 0x03U */
//
// /* GPIO configuration of USER_LED on GPIO_11 (pin 1) */
// gpio_pin_config_t USER_LED_config = {
// .direction = kGPIO_DigitalOutput,
// .outputLogic = 0U,
// .interruptMode = kGPIO_NoIntmode
// };
// /* Initialize GPIO functionality on GPIO_11 (pin 1) */
// GPIO_PinInit(GPIO1, 11U, &USER_LED_config);
//
// IOMUXC_SetPinMux(
// IOMUXC_GPIO_11_GPIOMUX_IO11, /* GPIO_11 is configured as GPIOMUX_IO11 */
// 0U); /* Software Input On Field: Input Path is determined by functionality */
// IOMUXC_GPR->GPR26 = ((IOMUXC_GPR->GPR26 &
// (~(IOMUXC_GPR_GPR26_GPIO_SEL_MASK))) /* Mask bits to zero which are setting */
// | IOMUXC_GPR_GPR26_GPIO_SEL(0x00U) /* Select GPIO1 or GPIO2: 0x00U */
// );
// IOMUXC_SetPinConfig(
// IOMUXC_GPIO_11_GPIOMUX_IO11, /* GPIO_11 PAD functional properties : */
// 0x1060U); /* Slew Rate Field: Slow Slew Rate
// Drive Strength Field: R0/4
// Speed Field: medium(100MHz)
// Open Drain Enable Field: Open Drain Disabled
// Pull / Keep Enable Field: Pull/Keeper Enabled
// Pull / Keep Select Field: Keeper
// Pull Up / Down Config. Field: 100K Ohm Pull Down
// Hyst. Enable Field: Hysteresis Disabled */
//<- ********End original********
//********Start new******** ->
CLOCK_EnableClock(kCLOCK_Iomuxc); /* iomuxc clock (iomuxc_clk_enable): 0x03U */
/* GPIO configuration of GPIO_11 on GPIO_11 (pin 1) */
gpio_pin_config_t GPIO_11_config = {
.direction = kGPIO_DigitalOutput,
.outputLogic = 0U,
.interruptMode = kGPIO_NoIntmode
};
/* Initialize GPIO functionality on GPIO_11 (pin 1) */
GPIO_PinInit(GPIO1, 11U, &GPIO_11_config);
/* GPIO configuration of LPSPI1_SDO on GPIO_AD_04 (pin 56) */
gpio_pin_config_t LPSPI1_SDO_config = {
.direction = kGPIO_DigitalOutput,
.outputLogic = 0U,
.interruptMode = kGPIO_NoIntmode
};
/* Initialize GPIO functionality on GPIO_AD_04 (pin 56) */
GPIO_PinInit(GPIO1, 18U, &LPSPI1_SDO_config);
IOMUXC_SetPinMux(
IOMUXC_GPIO_11_GPIOMUX_IO11, /* GPIO_11 is configured as GPIOMUX_IO11 */
0U); /* Software Input On Field: Input Path is determined by functionality */
IOMUXC_SetPinMux(
IOMUXC_GPIO_AD_04_GPIOMUX_IO18, /* GPIO_AD_04 is configured as GPIOMUX_IO18 */
0U); /* Software Input On Field: Input Path is determined by functionality */
IOMUXC_GPR->GPR26 = ((IOMUXC_GPR->GPR26 &
(~(IOMUXC_GPR_GPR26_GPIO_SEL_MASK))) /* Mask bits to zero which are setting */
| IOMUXC_GPR_GPR26_GPIO_SEL(0x00U) /* Select GPIO1 or GPIO2: 0x00U */
);
IOMUXC_SetPinConfig(
IOMUXC_GPIO_11_GPIOMUX_IO11, /* GPIO_11 PAD functional properties : */
0x1060U); /* Slew Rate Field: Slow Slew Rate
Drive Strength Field: R0/4
Speed Field: medium(100MHz)
Open Drain Enable Field: Open Drain Disabled
Pull / Keep Enable Field: Pull/Keeper Enabled
Pull / Keep Select Field: Keeper
Pull Up / Down Config. Field: 100K Ohm Pull Down
Hyst. Enable Field: Hysteresis Disabled */
IOMUXC_SetPinConfig(
IOMUXC_GPIO_AD_04_GPIOMUX_IO18, /* GPIO_AD_04 PAD functional properties : */
0x1060U); /* Slew Rate Field: Slow Slew Rate
Drive Strength Field: R0/4
Speed Field: medium(100MHz)
Open Drain Enable Field: Open Drain Disabled
Pull / Keep Enable Field: Pull/Keeper Enabled
Pull / Keep Select Field: Keeper
Pull Up / Down Config. Field: 100K Ohm Pull Down
Hyst. Enable Field: Hysteresis Disabled */
//<- ********End new********
}
and finally led_blink.c:
/*
* Copyright 2019 NXP
* All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include "board.h"
#include "pin_mux.h"
#include "clock_config.h"
/*******************************************************************************
* Definitions
******************************************************************************/
//********Start original******** ->
#define EXAMPLE_LED_GPIO BOARD_USER_LED_GPIO
#define EXAMPLE_LED_GPIO_PIN BOARD_USER_LED_GPIO_PIN
//<-********End original********
//********Start new******** ->
#define EXAMPLE_LED_GPIO BOARD_USER_LED_GPIO
#define EXAMPLE_LED_GPIO_PIN BOARD_USER_LED_GPIO_PIN
#define EXAMPLE_LED2_GPIO_PIN BOARD_USER_LED2_GPIO_PIN
//********<-End new********
/*******************************************************************************
* Prototypes
******************************************************************************/
/*******************************************************************************
* Variables
******************************************************************************/
volatile uint32_t g_systickCounter;
/* The PIN status */
volatile bool g_pinSet = false;
/*******************************************************************************
* Code
******************************************************************************/
void SysTick_Handler(void)
{
if (g_systickCounter != 0U)
{
g_systickCounter--;
}
}
void SysTick_DelayTicks(uint32_t n)
{
g_systickCounter = n;
while (g_systickCounter != 0U)
{
}
}
/*!
* @brief Main function
*/
int main(void)
{
/* Board pin init */
BOARD_InitPins();
BOARD_BootClockRUN();
BOARD_InitDebugConsole();
/* Set systick reload value to generate 1ms interrupt */
if (SysTick_Config(SystemCoreClock / 1000U))
{
while (1)
{
}
}
while (1)
{
/* Delay 1000 ms */
SysTick_DelayTicks(1000U);
if (g_pinSet)
{
GPIO_PinWrite(EXAMPLE_LED_GPIO, EXAMPLE_LED_GPIO_PIN, 0U);
//********Start New******** ->
GPIO_PinWrite(EXAMPLE_LED_GPIO, EXAMPLE_LED2_GPIO_PIN, 0U);
//<-********End New********
g_pinSet = false;
}
else
{
GPIO_PinWrite(EXAMPLE_LED_GPIO, EXAMPLE_LED_GPIO_PIN, 1U);
//********Start New******** ->
GPIO_PinWrite(EXAMPLE_LED_GPIO, EXAMPLE_LED2_GPIO_PIN, 1U);
//<-********End New********
g_pinSet = true;
}
}
}
Apologies for the long post, I hope it makes sense.
Daniel