Hallo!
Wie kann man im STM32 den DMA Controller (in meinem Fall DMA1_Channel2)
komplett zurücksetzen?
Ich möchte eigentlich nur einen Buffer mit Daten vom SPI Interface
füllen.
Die Initialisierung sowie das Neusetzen der Buffergröße erfolgt mit
dieser Funktion.
1 | void DMA_Configuration(uint32_t sample_buffersize)
|
2 | {
|
3 | DMA_InitTypeDef DMA_InitStructure;
|
4 |
|
5 | /* SPI1 MASTER RX DMA_Channel (DMA1_Channel2) configuration ---------------------------------*/
|
6 | DMA_DeInit(DMA1_Channel2);
|
7 | DMA_StructInit(&DMA_InitStructure);
|
8 | DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&(SPI1->DR));
|
9 | DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&sample_buffer;
|
10 | DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
|
11 | DMA_InitStructure.DMA_BufferSize = sample_buffersize;
|
12 | DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
|
13 | DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
|
14 | DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
|
15 | DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
|
16 | DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
|
17 | DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
|
18 | DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
|
19 | DMA_Init(DMA1_Channel2, &DMA_InitStructure);
|
20 |
|
21 | /* Enable DMA1 Channel2 Transfer Complete interrupt */
|
22 | DMA_ITConfig(DMA1_Channel2, DMA_IT_TC | DMA_IT_HT, ENABLE);
|
23 |
|
24 | /* Enable DMA1 Channel2 transfer */
|
25 | DMA_Cmd(DMA1_Channel2, ENABLE);
|
26 | }
|
Das Problem ist aber, daß neue Daten an eine falsche Stelle von
sample_buffer geschrieben werden.
Daher vermute ich daß die internen Register des DMA-Kanals nicht richtig
zurückgesetzt wurden.
Nach einem Reset klappt alles einwandfrei, nur nach nochmaligem Aufrufen
der Funktion passiert der Fehler.
Das Einlesen der Daten wird zum passenden Zeitpunkt manuell getriggert
indem einfach ein Datenwort über SPI gesendet werden (SPI1->DR = 0;)
Das SPI Device bekommt seine Clock-Impulse und sendet die Daten an den
Controller. Das empfangene Datenwort soll per DMA in den Buffer
geschrieben werden bis nach n Transfers dieser gefüllt ist. Die
Auswertung erfolgt in den Interrupt-Routinen HT2 (buffer start bis
buffer / 2) und TC2 (buffer / 2 bis buffer ende)
Habe ich irgendwo einen Denkfehler?
Grüße,
Bernhard