Forum: Mikrocontroller und Digitale Elektronik CRC bis 8k Flash statt 16kb


von Martin W. (wassertropfen)


Lesenswert?

Ich möchte über 16kB Flash bei einem STM32F030F4 eine CRC laufen lassen. 
Bis 8kb gibt es keine Probleme.Das Problem: Sobald 8kB(<8192) 
überschritten werden, wird GPIOB->BRR|=GPIO_Pin_1; nicht mehr erreicht 
??? uV 5.10 ST-LinkV2
1
#define FLASH_BASE            ((uint32_t)0x08000000) /*!< FLASH base address in the alias region */
2
3
GPIOB->BSRR|=GPIO_Pin_1;
4
CRC_DeInit();
5
CRC_ResetDR();
6
uint32_t *pFLASH= (uint32_t *)FLASH_BASE;
7
test_CRC=CRC_CalcBlockCRC(pFLASH,8192);
8
GPIOB->BRR|=GPIO_Pin_1;

von Detlef K. (adenin)


Lesenswert?

CRC_CalcBlockCRC() ist fehlerhaft?
:)

von Martin W. (wassertropfen)


Lesenswert?

CRC_CalcBlockCRC() ist aus der std_Peripheral_Lib von ST :)

von c-hater (Gast)


Lesenswert?

Martin W. schrieb:

> CRC_CalcBlockCRC() ist aus der std_Peripheral_Lib von ST :)


Es soll tatsächlich schon gelegentlich vorgekommen sein, daß in C-Libs 
Fehler waren...

Das mag für die C-Götzenanbeter und die Copy&Paste-Spasten völlig 
unmöglich scheinen, ist aber definitiv eine Tatsache.

Wie wäre es denn, wenn du einfach mal in die Funktion reindebuggst und 
schaust, was die bei 8k+1 anders macht als bei 8k?

Möglicherweise genügt es aber auch schon, einfach nur die Doku zur 
Funktion zu lesen. Vielleicht ist eine Beschränkung auf 8k ja sogar 
dokumentiert (wozu auch immer die nötig oder sinnvoll sein mag).

von AchWas (Gast)


Lesenswert?

> ...  Copy&Paste-Spasten ...

Warum diese Beleidigung?

von Martin W. (wassertropfen)


Lesenswert?

Es wird die HW-CRC auf dem STM32F030F4 angesprochen. Eine Limitierung 
auf 8kB ist dort nicht vorhanden.
1
/**
2
  * @brief  Computes the 32-bit CRC of a given buffer of data word(32-bit).
3
  * @param  pBuffer: pointer to the buffer containing the data to be computed
4
  * @param  BufferLength: length of the buffer to be computed
5
  * @retval 32-bit CRC
6
  */
7
uint32_t CRC_CalcBlockCRC(uint32_t pBuffer[], uint32_t BufferLength)
8
{
9
  uint32_t index = 0;
10
  
11
  for(index = 0; index < BufferLength; index++)
12
  {
13
    CRC->DR = pBuffer[index];
14
  }
15
  return (CRC->DR);
16
}

von holger (Gast)


Lesenswert?

Wieviel Flash hat dein Controller denn?
Die CRC Berechnung wird in uint32_t Häppchen
gemacht. Wenn du 8192 eingibst wird über 32kB
eine CRC gebildet.

von Lattice User (Gast)


Lesenswert?

Martin W. schrieb:
> Es wird die HW-CRC auf dem STM32F030F4 angesprochen. Eine Limitierung
> auf 8kB ist dort nicht vorhanden.
>
1
/**
2
>   * @brief  Computes the 32-bit CRC of a given buffer of data 
3
> word(32-bit).
4
>   * @param  pBuffer: pointer to the buffer containing the data to be 
5
> computed
6
>   * @param  BufferLength: length of the buffer to be computed
7
>   * @retval 32-bit CRC
8
>   */
9
> uint32_t CRC_CalcBlockCRC(uint32_t pBuffer[], uint32_t BufferLength)
10
> {
11
>   uint32_t index = 0;
12
> 
13
>   for(index = 0; index < BufferLength; index++)
14
>   {
15
>     CRC->DR = pBuffer[index];
16
>   }
17
>   return (CRC->DR);
18
> }
19
>

Was aber klar zu sehen ist, dass die Bufferlänge in Einheiten von 32bit 
angegeben wird.

test_CRC=CRC_CalcBlockCRC(pFLASH,8192/sizeof(uint32_t));
sollte funktionieren

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.