CRC Berechnung Firmware

Gast #4737648
Auf dieser Seite war ich bereits schon. Mir ist nur noch nicht ganz klar 
wie so eine CRC Berechnung über einen 128kByte Block realisiert werden 
kann.
Gast #4737731
Viewer schrieb:
> Leonhard schrieb:
>> Guten Morgen,
>>
>> bezüglich einer CRC Berechnung über eine Firmware von insgesamt 128kByte
>> suche ich ein Verfahren und wie man dieses realisieren könnte.
>
> CRC32 oder ADLER32

Adler berechnet KEINE CRC

Zur CRC ist auch wichtig zu wissen, welches Polynom verwendet wird und 
welcher Startwert. Wenn die nicht übereinstimmen bei Sender und 
Empfänger, kommen unterschiedliche Ergebnisse raus und somit nützt das 
nix...
Gast #4737756
Es gibt auf dem Mikrocontroller einen CRC Engine. Allerdings weiss ich 
die exakte Implementierung nicht. Auf der PC Seite soll ja auch die 
Berechnung durchgeführt werden.
Gast #4737793
Nochwas: Wenn auf dem (unbekannten) µC eine CRC-Engine existiert, gibts 
da bestimmt ein Datenblatt und Application Notes vom Hersteller. Und 
auch dafür existieren garantiert Beispiele und Anleitungen in Hülle und 
Fülle. Wenn du verrätst, um welchen µC es sich handelt, findet sich hier 
im Forum vielleicht sogar jemand, der genau das schonmal gemacht hat und 
dir Tipps geben kann.
Gast #4737820
Leonhard schrieb:
> Guten Morgen,
>
> bezüglich einer CRC Berechnung über eine Firmware von insgesamt 128kByte
> suche ich ein Verfahren und wie man dieses realisieren könnte.

Hier bitte schön, das habe ich aus meiner Firmware für dich rausgekrammt 
:)
1
uint32_t crc32_check (uint8_t* buf, uint16_t len) {
2

3
  uint32_t* pBuffer = (uint32_t*)buf;
4
  uint32_t BufferLength = (len/4);
5
  uint32_t index = 0;
6

7
  if(!CRCenabledFlag) {
8
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE);
9
  }
10
  CRC_ResetDR();
11

12
  for(index = 0; index < BufferLength; index++) {
13
     CRC->DR = __RBIT(pBuffer[index]);
14
  }
15
  return __RBIT(CRC->DR) ^ 0xFFFFFFFF;
16
}
Gast #4737834
Die interne CRC Berechnung von Infineon habe ich schon Inbetrieb 
genommen.
Die Berechnung scheint auch zu funktionieren. Jetzt benötige ich diese 
Implementierung auch auf der PC Seite.
Gast #4737835
Die folgende Implemntierung bringt mir auf der PC Seite nichts.
1
uint32_t crc32_check (uint8_t* buf, uint16_t len) {
2

3
  uint32_t* pBuffer = (uint32_t*)buf;
4
  uint32_t BufferLength = (len/4);
5
  uint32_t index = 0;
6

7
  if(!CRCenabledFlag) {
8
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE);
9
  }
10
  CRC_ResetDR();
11

12
  for(index = 0; index < BufferLength; index++) {
13
     CRC->DR = __RBIT(pBuffer[index]);
14
  }
15
  return __RBIT(CRC->DR) ^ 0xFFFFFFFF;
16
}

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.