Trouble interfacing with LPC1768 with custom pin definitions

I am trying to use mbed to flash firmware onto my SKR V1.3 to get around controlling it using g-code due to personal needs but my firmware does nothing when flahsed. I’ve added custom pin definitions to PinNames.h in the TARGET_LPC13XX folder and after compiling it successfully to a firmware.bin file in platformio, I plug it in back into my board and it does nothing. The SKR V1.3 already has a bootloader on it which reads from the sd card so I don’t know why my motors won’t spin when I turn the board on with the below .cpp file.

main.cpp:

#include "mbed.h"

DigitalOut xEN(P2_1); //Pin 74 of LPC
DigitalOut xSTP(P2_2); //Pin 73 of LPC
DigitalOut xDIR(P2_6); //Pin 67 of LPC

int main() {

    xDIR = 1; //Sets dir pin to high and direction to clockwise

   //Should keep spinning till I unplug the SKR V1.3
    while(1) {
        xSTP = 1;
        thread_sleep_for(0.002);
        xSTP = 0;
        thread_sleep_for(0.002);
    }
}

Modified PinNames.h file:

/* mbed Microcontroller Library
 * Copyright (c) 2006-2013 ARM Limited
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#ifndef MBED_PINNAMES_H
#define MBED_PINNAMES_H

#include "cmsis.h"

#ifdef __cplusplus
extern "C" {
#endif

typedef enum {
    PIN_INPUT,
    PIN_OUTPUT
} PinDirection;

#define PORT_SHIFT  5

typedef enum {
    // LPC1347 Pin Names
    P0_0 = 0,
    P0_1 = 1,
    P0_2 = 2,
    P0_3 = 3,
    P0_4 = 4,
    P0_5 = 5,
    P0_6 = 6,
    P0_7 = 7,
    P0_8 = 8,
    P0_9 = 9,
    P0_10 = 10,
    P0_11 = 11,
    P0_12 = 12,
    P0_13 = 13,
    P0_14 = 14,
    P0_15 = 15,
    P0_16 = 16,
    P0_17 = 17,
    P0_18 = 18,
    P0_19 = 19,
    P0_20 = 20,
    P0_21 = 21,
    P0_22 = 22,
    P0_23 = 23,
    //Extra pin definitons I put her personally
    P0_24 = 24,            // Pin 08 - LPC1768
    P0_25 = 25,           // Pin 07 - LPC1768
    P0_26 = 26,            // Pin 06 - LPC1768
    P0_27 = 27,            // Pin 25 - LPC1768
    P0_28 = 28,            // Pin 24 - LPC1768
    P0_29 = 29,            // Pin 29 - LPC1768
    P0_30 = 30,            // Pin 47 - LPC1768


    // Extra pins definitions I put there personally
    P1_0 = 32,              // Pin 95 - LPC1768
    P1_1 = 33,              // Pin 94 - LPC1768
    P1_4 = 36,              // Pin 93 - LPC1768
    P1_8 = 40,              // Pin 92 - LPC1768
    P1_9 = 41,              // Pin 91 - LPC1768
    P1_10 = 42,            // Pin 90 - LPC1768
    P1_13 = 45,
    P1_14 = 46,
    P1_15 = 47,
    P1_16 = 48,

    //Extra pins definitions I put there personally
    P1_17 = 49,            // Pin 86 - LPC1768
    P1_18 = 50,            // Pin 32 - LPC1768

    P1_19 = 51,
    P1_20 = 52,
    P1_21 = 53,
    P1_22 = 54,
    P1_23 = 55,
    P1_24 = 56,
    P1_25 = 57,
    P1_26 = 58,
    P1_27 = 59,
    P1_28 = 60,
    P1_29 = 61,
    //extra pin I put in personally
    P1_30 = 62,            // Pin 21 - LPC1768

    P1_31 = 63,

    //Extra pins I put in personally
    P2_0 = 64,            // Pin 75 - LPC1768
    P2_1 = 65,             // Pin 74 - LPC1768
    P2_2 = 66,             // Pin 73 - LPC1768
    P2_3 = 67,             // Pin 70 - LPC1768
    P2_4 = 68,             // Pin 69 - LPC1768
    P2_5 = 69,             // Pin 68 - LPC1768
    P2_6 = 70,             // Pin 67 - LPC1768
    P2_7 = 71,             // Pin 66 - LPC1768
    P2_8 = 72,             // Pin 65 - LPC1768
    P2_9 = 73,             // Pin 64 - LPC1768
    P2_10 = 74,             // Pin 53 - LPC1768
    P2_11 = 75,           // Pin 52 - LPC1768
    P2_12 = 76,           // Pin 51 - LPC1768
    P2_13 = 77,           // Pin 50 - LPC1768

    p1  = P0_0,
    p2  = P0_11,
    p3  = P0_12,
    p4  = P0_13,
    p5  = P0_14,
    p6  = P1_31,
    p8  = P0_16,
    p9  = P0_22,
    p10 = P0_23,
    p13 = P1_29,
    p14 = P1_21,
    p15 = P0_8,
    p16 = P0_9,
    p17 = P1_24,
    p18 = P0_4,
    p19 = P1_13,
    p20 = P1_14,
    p21 = P1_22,
    p22 = P0_17,
    p23 = P0_5,
    p24 = P0_21,
    p25 = P0_19,
    p26 = P0_18,
    p27 = P1_15,
    p28 = P1_16,
    p29 = P1_25,
    p30 = P1_19,
    p33 = P0_20,
    p34 = P0_2,
    p35 = P1_26,
    p36 = P1_27,
    p37 = P1_20,
    p38 = P1_23,
    p39 = P0_7,
    p40 = P1_28,

    UART_TX = P0_19,
    UART_RX = P0_18, 

    // Not connected
    NC = (int)0xFFFFFFFF,

    LED1 = p21,
    LED2 = p21,
    LED3 = p21,
    LED4 = p21,

    // Standard but not supported pins
    USBTX = NC,
    USBRX = NC,

} PinName;

typedef enum {
    CHANNEL0 = PIN_INT0_IRQn,
    CHANNEL1 = PIN_INT1_IRQn,
    CHANNEL2 = PIN_INT2_IRQn,
    CHANNEL3 = PIN_INT3_IRQn,
    CHANNEL4 = PIN_INT4_IRQn,
    CHANNEL5 = PIN_INT5_IRQn,
    CHANNEL6 = PIN_INT6_IRQn,
    CHANNEL7 = PIN_INT7_IRQn
} Channel;

typedef enum {
    PullUp = 2,
    PullDown = 1,
    PullNone = 0,
    Repeater = 3,
    OpenDrain = 4,
    PullDefault = PullDown
} PinMode;

#ifdef __cplusplus
}
#endif

#endif

SKR V1.3 schematic link: BIGTREETECH-SKR-V1.3/SKR-V1.3-SCH.pdf at master · bigtreetech/BIGTREETECH-SKR-V1.3 · GitHub

Hi,

Can you measure that your new output pins work? Just set 1 and 0 in second delay and measure with multimeter. You could also try something like this:
int main() {
while (true) {
xSTP = !xSTP;
wait(0.002);
}
}

Regards,
Pekka

Hello,

I tested pins voltages on the stepper drivers chips for STP and DIR when I set:

xDIR =1;

and xSTP = 1;

and xDIR = 0;

and xSTP = 0;

and no matter the configuration, xSTP relative to xGND is always 2V and xDIR relative to xGND is always 0V, regardless if I set the pins to high or low.

bump

You shouldn’t need to edit the PinNames.h in order to write a program like this, that file is part of MBed and shouldn’t need to be changed. Also it looks like you edited the PinNames for the LPC1347 instead of PinNames for the LPC1768, so your edited version likely is not being used.

Did the main.cpp that you posted compile before you edited PinNames.h? If not, what was the error?

the enable pin is declared but not set, have you tried to set it to 0 or 1? Should enable when set = 0.

Ok this is weird. I tested a bunch of inputs on the xEN pin:

EN turns on when set to

xEN = 0;
xEN = 1;
XEN = false;
xEN = true;

xEN.write(0);

and they all result in the xEN pin reading 2.9-3V. However, when I remove the xEN pin declaration:

DigitalOut xEN(P2_1); //Pin 74 of LPC

It disables. Why?

Hmm, this honestly sounds like it could be a hardware problem, like the IO pin got fried at some point. Does the same thing happen if you use a different pin?

I measured the yDIR and ySTP pins with my multimeter and the yDIR pin reads 2.0V and the ySTP fluctuates rapidly between 2.0V-0V meaning its being properly switched, and the yEN pin is at 0V. However… The y stepper isn’t turning. Its properly connected and I know the stepper works because it spun when I had marlin 2 firmware on it with G-code.

Is there something im missing because all of the proper connections seem to be there.

Code I used:

DigitalOut ySTP(P0_19); //Pin 59
DigitalOut yDIR(P0_20); //Pin 58

int main() {

    yDIR = 1; //Sets dir pin to high and direction to clockwise

   //Should keep spinning till I unplug the SKR V1.3
    while(1) {
        ySTP = 1;
        thread_sleep_for(0.002);
        ySTP = 0;
        thread_sleep_for(0.002);
    }
}

Hmm, what’s the logic level of the stepper motor controller that you are interfacing with? 2V may be too low for it to recognize a logic high.

Also, since the LPC1768 is a 3.3V device, 2V on an output pin is very suspicious – it should be 3.3V or 0V. Is it possible that there could be a short to ground on the pins?

how would i check for a short to ground on the pins?

First of all, try unplugging the LPC1768 from anything connected to it, and check if the voltage is back to normal. You can also use an ohmmeter to measure the resistance between those pins and ground (make sure to turn off the power first!).

The only thing plugged to it are the stepper drivers.

the lpc1768 is soldered onto the board and im worried about accidently killing the processor shorting its leads since they’re so tiny, is there a way for me to not do that?

In the meantime, ill double the steppers work with marlin to confirm if the board works

Are you using a custom board that you made?

no im using an SKR V1.3, the schematic is in the question post

which drivers are you using and in which mode? When there are TMC2130 configured for SPI Mode, then the dir/step are not connected to the driver. There are many configuration options by jumpers.

im using drv8825 drivers and the board is in stp/dir mode. I tested the board with marlin and ive confirmed the steppers work fine and the board is functional.

im going to check the pin voltages and see whats being turned on.

EDIT: the xSTP pin seems to fluctuate between 0-2V, the xDIR pin has 0V, and the xEN pin has 0V. Is there something im missing?

sounds strange, for the static signal it should be nearly 0 V or nearly 3.3 V. I hope you are not measuring with your multimeter when xSTP is toggeling with 2 ms on / 2 ms off?
For which target and how are you compiling?

i was measuring while xSTP is fluxuating, im not sure how to do it otherwise with marlin and pronterface fast enough. The target was the lpc1768 and SKR V1.3 in the configuration.h file

Hello Ryan,

According to the DRV8825 datasheet the minimum pulse duration for STEP low (and STEP high) is 1.9us and the maximum step frequency is 250kHz (STEP period = 4us → STEP high = 2us + STEP low = 2us).
It seems that your code is producing such (maximum) step frequency:

//Should keep spinning till I unplug the SKR V1.3
    while(1) {
        ySTP = 1;
        thread_sleep_for(0.002);  // 2us
        ySTP = 0;
        thread_sleep_for(0.002);  // 2us
    }

For sure that’s still within the specification limits. But maybe the stepper will start to spin if you try to reduce the frequency (increase the sleep time durations).

Best regards, Zoltan