CRC bis 8k Flash statt 16kb

#3860153
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;
Gast #3860249
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).
#3860268
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
}
Gast #3860287
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren