Forum: Mikrocontroller und Digitale Elektronik [STM32] CRC per DMA berechnen


von Oliver (Gast)


Lesenswert?

Hallo zusammen,

statt die CRC über den gesamten Flash per While-Schleife zu berechnen, 
möchte ich dies per DMA erledigen. Per Schleife funktioniert es bereits, 
ich scheitere an der Konfiguration des DMA-Kanals. Trotz DMA-Enable will 
er scheinbar nicht loslaufen (der Counter-Restwert für die verbleibenden 
Daten ändert sich nicht). Irgendwas mache ich wohl falsch.

Hier ist mein Code:
1
DMA_InitTypeDef   DMA_InitStructure;
2
3
/* Enable DMA1 clock -------------------------------------------------------*/
4
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
5
6
// Get address of CRC data register (Should be 0x40012440U on STM32F051)
7
uint32_t ui32CRC_DR_Address = reinterpret_cast<uint32_t>(& (CRC->DR));
8
9
DMA_DeInit(DMA1_Channel2);
10
DMA_InitStructure.DMA_PeripheralBaseAddr = ui32CRC_DR_Address;
11
DMA_InitStructure.DMA_MemoryBaseAddr = drvCRC::ui32Flash_Start;
12
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
13
DMA_InitStructure.DMA_BufferSize = 16383;
14
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
15
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
16
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
17
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
18
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
19
DMA_InitStructure.DMA_Priority = DMA_Priority_Low;
20
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
21
DMA_Init(DMA1_Channel2, &DMA_InitStructure);
22
23
/* Enable DMA1 Channel3 */
24
DMA_Cmd(DMA1_Channel2, ENABLE);
25
uint32_t cnt;
26
while (RESET == DMA_GetFlagStatus(DMA1_FLAG_TC2))
27
{
28
   cnt = DMA_GetCurrDataCounter(DMA1_Channel2);
29
}
30
// Dieser Code wird nie erreicht, da while nicht beendet
31
DMA_ClearFlag(DMA1_FLAG_TC2);

Vielleicht fällt euch etwas ins Auge.

Viele Grüße

Oliver

von Georg (Gast)


Lesenswert?

Hallo,

hatte das gleiche Problem, bei mir hat folgende Änderung geholfen.

DMA_InitStructure.DMA_M2M = DMA_M2M_Enable;

Gruß

Georg

von Ingo (Gast)


Lesenswert?

Der Counter für die Verbleibenden Variablen ändert sich auch nicht. Der 
Wert wird in ein Shadow-Register kopiert und dieses wird tatsächlich 
verringert. Das steht aber nirgends, hab's im www mal gefunden.

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.