djtulan Music, Hackerspace, Retrocomputing

Börni Party @ Martinsdorf (Part 1) - Dec 2022

Tracklist:

Rauschhaus - Chrom (Original Mix)
Solee - Skywalker (Original Mix)
Darksidevinyl - Black Shine
Green Lake Project - Thorn
Frannz - The Future of the Future Is the Present
Sultan + Shepard - Siwa
Kamilo Sanclemente - Galactic Dust (Original Mix)
Mollono.Bass - Mollono Dub
Cioz - Harakat
KISLO - Echo
Rodriguez Jr. - Mare Serenitatis
Oliver Schories - Trife (Original Mix)
flayman - Moonlight Orchestra
KYOTTO - Life in Beach
8 Bit Society - Get The Message (Daniel Barross DUB)
Röyksopp - The Night
Kaamin Parallel Voices - Advent (Extended Mix)
Petr Stancl - Crawling Snake
Anna Wall, Corbi - Regardless
Borneo - Trying
Tim Engelhardt - Idiosynkrasia
Mark Hoffen - Dreams

Börni Party @ Martinsdorf (Part 2) - Dec 2022

Tracklist:

ENERGY 52 - Cafe Del Mar (Michael Woods remix)
Boris Brejcha - LSD Waterpipe
Green Lake Project - Halo
Yaroslav Kinsky - Moons (Pablo Bolivar Remix)
Alexander Alar Sonita - Tokyo (Cherry (UA) Remix)
Casper Cole - Overground
Boss Axis - Happy End (Original Mix)
Mode Apart - Ghamish (Original Mix)
Monolink - Return to Oz (ARTBAT Remix)
Colyn - Wait For You
Colyn - Eriador
Einmusik - Dune Suave
Monastetiq & Zanjma - Glucose (Original Mix)
Marc DePulse & Rafael Cerato - Montague (Original Mix)
Noraj Cue, Anton Tumas - Ode to Life Formation (Anton Tumas ReFormation)
Th Moy - Time

Progressive Melodic House - Nov 2022

Tracklist:

1 Introspection (Peon Remix) - BonÏpso
2 Another Day - Yannick Mueller
3 Voices - Doctors On Decks
4 Able to Dream - 19:26
5 Saturn (Morttagua Remix) - Flow & Zeo Morttagua
6 Redlight - Swedish House Mafia, Sting
7 Make It Pop - BAUM Lina Simons
8 Før Rubicon - Tarjei & Are
9 Joint Jazz - Simon Adams
10 Higher Dimension (Jonathan Kaspar Remix) - Henri Bergmann ,Fat Cosmoe, Wennink, Jonathan Kaspar
11 Humanity - Paul Roux
12 Waterfall - Bicep
13 Phases - Ben Böhmer, Spencer Brown
14 Baja - Stephan Zovsky
15 Soon You'll Be Gone (Extended Vocal Mix) - Tinlicker Thomas Oliver
16 Woodstock (Hernan Cattaneo & Soundexile Extended Remix) - Eelke Kleijn
17 Safe (Joris Voorn Remix) - Monkey Safari, Joris Voorn
18 Begin Again - Ben Böhmer
19 Summer & Smoke - Cubicolor
20 Wake Up feat. Tarek Farwati (Endrik Schroeder Cosmic Rmx) - Neon Amish, Space Echo
21 Levitation (Original Mix) - Lonya & Mattia Pompeo
22 Mandalo - Mollono.Bass
23 Empress Calling - Lisandro (AR), Nukreative
24 Voodoo (Extended Mix) - Tinlicker Ben Böhmer
25 Fire - Guy J
26 Dreams - Mark Hoffen
27 Oriki (Hernan Cattaneo & Marcelo Vasami Remix) - Shai T
28 Cosmic Love (Original Mix) - Robert Babicz

Calculate CRC-32 with STM32 HAL CRC unit

Die STM32 Mikrocontroller Familie bittet die Möglichkeit einen CRC (Cyclic redundancy check) über bestimmte Speicherbereiche zu berechnen. Jedoch war es mit den default Einstellungen nicht ohne Weiteres möglich, das selbe Ergebnis zu erzielen.

Ausgangspunkt war folgender:

Der CRC-32 für das Programm im Flashspeicher des Mikrocontrollers sollte mit dem CRC-32 über das Binärfile verglichen werden können.
Da die STM32 Chips einen Hardware CRC bereitstellen, sollte dieser auch genutzt werden.

Aktivierung des CRC im Cube MX

Die default Einstellungen im Cube MX, einem Tool zum Konfigurieren von STM32 Chips schaut wie folgt aus:

undefined

Im Quellcode wird dann folgender Hardware Init Code erzeugt:

/**
  * @brief CRC Initialization Function
  * @param None
  * @retval None
  */
static void MX_CRC_Init(void)
{

  /* USER CODE BEGIN CRC_Init 0 */

  /* USER CODE END CRC_Init 0 */

  /* USER CODE BEGIN CRC_Init 1 */

  /* USER CODE END CRC_Init 1 */
  hcrc.Instance = CRC;
  hcrc.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_ENABLE;
  hcrc.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_ENABLE;
  hcrc.Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_NONE;
  hcrc.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_DISABLE;
  hcrc.InputDataFormat = CRC_INPUTDATA_FORMAT_BYTES;
  if (HAL_CRC_Init(&hcrc) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN CRC_Init 2 */

  /* USER CODE END CRC_Init 2 */
}

Im Usercode lässt sich dann folgende HAL Funktion ausführen:

uint32_t HAL_CRC_Calculate(CRC_HandleTypeDef *hcrc, uint32_t pBuffer[], uint32_t BufferLength)

Dieser Funktion wird das HAL CRC Handle übergaben, ein Pointer auf den Beginn des Speicherbereichs und einer Länge des Bereiches.

Leider führten die default Einstellungen nicht zum gewünschten Ergebnis, wenn man die gleichen Daten mit einem Standard CRC-32 verglich. Beispielsweise, wenn man das Ergebnis mit diesem Online Tool verglich: https://emn178.github.io/online-tools/crc32_checksum.html

Nach einer längeren Suche im Internet wurde ich wie so oft auf stackoverflow.com fündig. In folgendem Beitrag wurde ein Lösungsweg vorgestellt: https://stackoverflow.com/questions/39646441/how-to-set-stm32-to-generate-standard-crc32

Richtige Einstellung Cube MX

Im Cude MX müssen die Einstellungen von "Input Data Inversion Mode" auf "Byte" und "Output Data Inversion Mode" auf "Enable" gesetzt werden.

undefined

Danach schaut der erzeugte Init Code folgendermaßen aus:

/**
  * @brief CRC Initialization Function
  * @param None
  * @retval None
  */
static void MX_CRC_Init(void)
{

  /* USER CODE BEGIN CRC_Init 0 */

  /* USER CODE END CRC_Init 0 */

  /* USER CODE BEGIN CRC_Init 1 */

  /* USER CODE END CRC_Init 1 */
  hcrc.Instance = CRC;
  hcrc.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_ENABLE;
  hcrc.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_ENABLE;
  hcrc.Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_BYTE;
  hcrc.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_ENABLE;
  hcrc.InputDataFormat = CRC_INPUTDATA_FORMAT_BYTES;
  if (HAL_CRC_Init(&hcrc) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN CRC_Init 2 */

  /* USER CODE END CRC_Init 2 */
}

Soweit so gut, ein kleiner Hack wird trotzdem noch benötigt.

Das Ergebnis muss noch einmal verXORt werden. Ich habe mir dazu einfach eine Funktion geschrieben, die über den gewünschten Bereich rechnet:

extern CRC_HandleTypeDef hcrc;

#define ROM_START    (( uint32_t*) 0x08000000)
#define ROM_SIZE      ( uint32_t)  0x20000

uint32_t GetCRC(void) {
   return ~HAL_CRC_Calculate(&hcrc, ROM_START, ROM_SIZE);
}

Mit dem XOR Operanden ~ erhält man schließlich das richtige Ergebnis.

Da beim Kompilieren des Binaries keine fixe Größe erzeugt wird, habe ich im Makefile eine Zeile Code eingefügt, die mein Binary fix auf 128kB vergrößert und den Rest mit 0en befüllt. Das geht unter Linux mit dem Befehl "truncate" sehr einfach.

$(BUILD_DIR)/%.bin: $(BUILD_DIR)/%.elf | $(BUILD_DIR)
	$(BIN) $< $@
	truncate $@ --size 131072

Man muss bei dieser Methode jedenfalls gut aufpassen, dass der erzeugte Programmcode nicht größer wird, als die eingestellte Größe!
Ansonsten wird das Programm unabsichtlich abgeschnitten. Ich habe einfach mal das doppelte an Platz reserviert.

Nun ergeben die CRC-32 über das gebaute Binary file und die Berechnung innerhalb des Mikrocontrollers die gleiche CRC-32.

Home ← Ältere Posts