Nano code in a Portenta H7 lite - Bricked it?

Is there any reason the following code I have running on a nano would brick the H7?

// Define states
enum State {
  IDLE,
  STOP,
  DROPHEAD,
  PRESSURE1,
  PRESSURE2,
  GOHOME,
  CYCLE_COMPLETE
};

// Define input pins
const int startPin = 12;
const int StopPin = 11;
const int triggerPin = 10;
const int homePin = 9;
const int t1OutPin = 8;
const int t2OutPin = 7;

// Define output pins
const int t1StartPin = A5;
const int t2StartPin = A1;
const int dSol1Pin = A2;
const int dSol2Pin = A3;
const int uSol1Pin = A4;
const int runningPin = A0;

// Define initial states
State currentState = IDLE;
bool startActivated = false;
bool pressure1Done = false;
bool pressure2Done = false;
int startState;
int homeState;

//Timer stuff
unsigned long T1startTime;
unsigned long T2startTime;
int T1oldState;
int T2oldState;

void setup() {
  // Set input pins
  pinMode(startPin, INPUT_PULLUP);
  pinMode(StopPin, INPUT_PULLUP);
  pinMode(triggerPin, INPUT_PULLUP);
  pinMode(homePin, INPUT_PULLUP);
  pinMode(t1OutPin, INPUT_PULLUP);
  pinMode(t2OutPin, INPUT_PULLUP);

  // Set output pins
  pinMode(t1StartPin, OUTPUT);
  pinMode(t2StartPin, OUTPUT);
  pinMode(dSol1Pin, OUTPUT);
  pinMode(dSol2Pin, OUTPUT);
  pinMode(uSol1Pin, OUTPUT);
  pinMode(runningPin, OUTPUT);

  // Initialize outputs - Outputs are sinking so LOW is ON, HIGH is OFF. 
  digitalWrite(t1StartPin, HIGH);
  digitalWrite(t2StartPin, HIGH);
  digitalWrite(dSol1Pin, HIGH);
  digitalWrite(dSol2Pin, HIGH);
  digitalWrite(uSol1Pin, LOW);
  digitalWrite(runningPin, HIGH);
  
  Serial.begin(9600); 
  startState = digitalRead(startPin);
  homeState = digitalRead(homePin);
}

void loop() {
  switch (currentState) {
    case IDLE:
      if (digitalRead(StopPin) == LOW) {
        Serial.println('\n');
        Serial.println("STOP PRESSED");
        currentState = STOP;
        disableOutputs();
      } else if (digitalRead(homePin) == LOW && digitalRead(startPin) == LOW && startActivated == false) {
        Serial.println('\n');
        Serial.println("CYCLE STARTING");
        digitalRead(startPin);
        digitalRead(homePin);
        Serial.println((String)"Start State: " + startState);
        Serial.println((String)"Home State: " + homeState);
        Serial.println((String)"Active State: " + startActivated);        
        currentState = DROPHEAD;
        startActivated = true;
      }
      break;

    case STOP:
      if (digitalRead(StopPin) == HIGH) {
        Serial.println('\n');
        Serial.println("STOP RELEASED RETURNING TO IDLE");
        
        currentState = IDLE;
        resetProgram();
      }
      break;
    
    case DROPHEAD:
    if (digitalRead(StopPin) == LOW) {
        Serial.println('\n');
        Serial.println("STOP PRESSED");
        
        currentState = STOP;
        disableOutputs();
      }
    else if (digitalRead(startPin) == HIGH) {
        Serial.println('\n');
        Serial.println("START NOT PRESSED, RETURNING TO IDLE");
        
        currentState = IDLE;
        startActivated = false; 
      }
    else if (digitalRead(triggerPin) == HIGH && startActivated == true) {
    Serial.println('\n');
    Serial.println("DROPPING HEAD, PRESSURE 1 ON");
    Serial.println((String)"Active State: " + startActivated);
    Serial.println((String)"Timer 1 State: " + pressure1Done);
    Serial.println((String)"Timer 2 State: " + pressure2Done);
    
    currentState = PRESSURE1;
    releaseHead();
    enablePressure1();
    }
    else if (digitalRead(triggerPin) == LOW && startActivated == true) {
    Serial.println('\n');
    Serial.println("DROPPING HEAD, PRESSURE 1 NOT ON");
    
    releaseHead();
    currentState = PRESSURE1;
    }
      break;

    case PRESSURE1:
    if (digitalRead(StopPin) == LOW) {
        Serial.println('\n');
        Serial.println("STOP PRESSED");       
        currentState = STOP;
        disableOutputs();
      }
    else if (digitalRead(triggerPin) == LOW && pressure1Done == false && pressure2Done == false) {
    Serial.println('\n');
    Serial.println("STARTING TIMER 1");
    Serial.println((String)"Active State: " + startActivated);
    Serial.println((String)"Timer 1 State: " + pressure1Done);
    Serial.println((String)"Timer 2 State: " + pressure2Done);
    startT1();
    delay(100);
    pressure1Done = true;
    currentState = PRESSURE2;
    }
      break;

    case PRESSURE2:
    if (digitalRead(StopPin) == LOW) {
        Serial.println('\n');
        Serial.println("STOP PRESSED");     
        currentState = STOP;
        disableOutputs();
      }
    else if (digitalRead(triggerPin) == LOW && digitalRead(t1OutPin) == HIGH && pressure1Done == true && pressure2Done == false) {
    Serial.println('\n');
    Serial.println("PRESSURE 2 ON, STARTING TIMER 2");
    Serial.println((String)"Active State: " + startActivated);
    Serial.println((String)"Timer 1 State: " + pressure1Done);
    Serial.println((String)"Timer 2 State: " + pressure2Done);
    enablePressure2();
    startT2();
    delay(100);
    pressure2Done = true;
      currentState = GOHOME;
    }
      break;
    
    case GOHOME:
    if (digitalRead(StopPin) == LOW) {
        Serial.println('\n');
        Serial.println("STOP PRESSED");
        currentState = STOP;
        disableOutputs();
      }
    else if (digitalRead(triggerPin) == LOW && digitalRead(t2OutPin) == HIGH &&  pressure1Done == true && pressure2Done == true) {
    Serial.println('\n');
    Serial.println("RASISING HEAD");
    Serial.println((String)"Active State: " + startActivated);
    Serial.println((String)"Timer 1 State: " + pressure1Done);
    Serial.println((String)"Timer 2 State: " + pressure2Done);
    StopT1();
    StopT2();
    clampHead();
    currentState = CYCLE_COMPLETE;
    }
      break;
    
    case CYCLE_COMPLETE:
      if (digitalRead(homePin) == LOW) {
        Serial.println('\n');
        Serial.println("CYCLE COMPLETED SUCCESSFULLY RETURNING TO IDLE");
        
        currentState = IDLE;
        resetProgram();
      } else if (digitalRead(startPin) == LOW) {
        Serial.println('\n');
        Serial.println("START BUTTONS HELD - CYCLE COMPLETED SUCCESSFULLY RETURNING TO IDLE");
        
        currentState = IDLE;
        resetProgram();
      }
      break;
  }
}
    
void releaseHead() {
  digitalWrite(uSol1Pin, HIGH);
}

void clampHead() {
  digitalWrite(uSol1Pin, LOW);
  digitalWrite(dSol1Pin, HIGH);
  digitalWrite(dSol2Pin, HIGH);
}

void enablePressure1() {
  digitalWrite(dSol1Pin, LOW);
}

void enablePressure2() {
  digitalWrite(dSol2Pin, LOW);
}

void startT1() {
  digitalWrite(t1StartPin, LOW);
}
void StopT1() {
  digitalWrite(t1StartPin, HIGH);
}

void startT2() {
  digitalWrite(t2StartPin, LOW);
}
void StopT2() {
  digitalWrite(t2StartPin, HIGH);
}

void disableOutputs() {
  digitalWrite(t1StartPin, HIGH);
  digitalWrite(t2StartPin, HIGH);
  digitalWrite(dSol1Pin, HIGH);
  digitalWrite(dSol2Pin, HIGH);
  digitalWrite(uSol1Pin, HIGH);
  digitalWrite(runningPin, HIGH);
}

void enableReturn() {
  digitalWrite(t1StartPin, HIGH);
  digitalWrite(t2StartPin, HIGH);
  digitalWrite(dSol1Pin, HIGH);
  digitalWrite(dSol2Pin, HIGH);
  digitalWrite(uSol1Pin, LOW);
  digitalWrite(runningPin, HIGH);
}

void resetProgram() {
  startActivated = false;
  pressure1Done = false;
  pressure2Done = false;
  currentState = IDLE;
  enableReturn();
}

Its a simple state machine which I am using to control a pneumatic press with 2 different pressures (it gets various signals from some other devices).

I was eager to try out the new H7 when it arrived and I just swapped it in place of the nano, downloading the program on the main core, immediately it did some weird things with various outputs being on, from memory A2 was one of the ones that was just not how it should be at boot up. I checked a couple of things, tried cycling the program and it didn't work.
I attempted to download the program again and open the serial monitor, when I did this all the outputs went LOW, turning on all my relays and the orange light came on.

Now its bricked, I've got the bits to hopefully reinstall the bootloader via Jtag and get it running again, but I am curious what I did wrong? I guess it was naïve of me to assume the nano code would just work on the H7.

Any ideas?

Most likely the code even not compiled for Portenta board because incompatible pin names.

It compiled with no issues. I do freely admit though that I didn't really do any research besides looking at the pinout chart in the packet. I just sort of assumed it would work.

The code doesn't contains any board-specific instructions and should works on any arduino-compatible board.
The only possible issue could be a pins. Check that all pins used at the beginning of the code point to existing Portenta pins, available for use (that is, not occupied by PSRAM, Flash etc...)

1 Like

Thank you, I'll see what I can find. Do you know if there is a particular document I should be looking for to check which pins are not occupied?

Sorry, honesty I know nothing about Portenta