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