Uart 9 Bit auf dem Portenta H7 (STM32)

Hallo,
Ich möchte gerne auf einem Arduino H7 eine 9 Bit Uart Kommunikation nutzen.
Aktuell nutze ich zum testen einen Nano, der dafür <util/setbaud.h> nutzt. Dies unterstützt der H7 aber leider nicht.
Ich habe bereits gegoogelt etc., habe aber nichts finden können.
Eventuell habt Ihr eine Lösung.

Hier der Code vom Nano:

  #define BAUD 9600
  #include <Wire.h> 
  #include <util/setbaud.h>
  #include <LiquidCrystal_I2C.h>
  long Rx_T; // Read time
  unsigned long Rx_Fail;
  LiquidCrystal_I2C lcd(0x27,16,2); //LCD 16 zeichen, 2 reihen
  
void setup() {
    //Anleitung:
    //https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART

    // Baut rate setzen
    UBRR0H = UBRRH_VALUE;
    UBRR0L = UBRRL_VALUE;
    // Asynchronen Modus  
    UCSR0A &= ~(1 << U2X0);
    // Set async, no parity, 1 stop, 9bit
    UCSR0C = (0<<UMSEL01)|(0<<UMSEL00)|(0<<UPM01)|(0<<UPM00)|(0<<USBS0)|(1<<UCSZ01)|(1<<UCSZ00);
    UCSR0B |= (1<<UCSZ02); // 9bit
    // Aktivieren rx/tx
    UCSR0B |= (1<<RXEN0)|(1<<TXEN0);

    lcd.init();
    lcd.backlight();      //Beleuchtung an
    lcd.print("Neustart"); //Reihe 1
    lcd.setCursor(0,1);   //Reihe 2
    lcd.print("Neustart");
}

void loop() {
  // Senden
    Send();

  // Empfangen
    Rx_T=Empfangen();
    if (Rx_T>0){
      lcd.clear();
      lcd.print("Rx_T: ");
      lcd.print(Rx_T);
      lcd.setCursor(0,1);
      lcd.print("Fail: ");
      lcd.print(Rx_Fail);
      Rx_Fail=0;
    } else {
      Rx_Fail+=1;
    }

  delay (100);
}

void Send(){
  // Senden / Anfrage
    // Adresse Senden
      // Warten bis senden möglich ist
        while ( !( UCSR0A & (1<<UDRE0)));
      // Ein bit 9 (Adresse)
        UCSR0B |= (1<<TXB80);
      // (Adresse)
        UDR0 = 0x0B; // 0x08:Münzer + 0x03:Poll
    // Checksumme
      // Warten bis senden möglich ist
        while ( !( UCSR0A & (1<<UDRE0)));
      // Aus bit 9 (Daten)
        UCSR0B &= ~(1<<TXB80);
      // Checksumme
        UDR0 = 0x0B;
}

long Empfangen (){
  long Time_Left = 0;
  unsigned long Start_T = millis();
  // Empfangen
    // Warten bis senden möglich ist
      do {
        //Prüfen ob Empfangszeit überschritten wird
          Time_Left=millis()-Start_T;
          if (Time_Left>10){
            return   (Time_Left*-1);
          }
          
        //if (Time_Left > 10000) return -Time_Left;
        //Time_Left += 1;
      } while (!(UCSR0A & (1<<RXC0))); // Keine Neue Nachricht

    // Etwas emnpfangen...
      byte temp;
      temp = UDR0;  // Daten Abholen...
      return Time_Left;
}

Über "UCSR0B" wird dann das Bit 9 gesetzt / ausgelesen...

      // Ein bit 9 (Adresse)
        UCSR0B |= (1<<TXB80);
      // Aus bit 9 (Daten)
        UCSR0B &= ~(1<<TXB80);

https://www.st.com/resource/en/reference_manual/cd00171190-stm32f101xx-stm32f102xx-stm32f103xx-stm32f105xx-and-stm32f107xx-advanced-arm-based-32-bit-mcus-stmicroelectronics.pdf
(die Doku gibt es auch für den STM32H747)

9 Bit sind also sicherlich möglich

Wie?
Nicht mit Arduino Serial.

evtl. über die vorbereiteten HAL Funktionen/Strukturen.
Da müsstest du mal in den mitgelieferten Dateien nachschauen.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.