Hallo,
da mir die ASF zu undurchsichtig / fett ist und ich den Prozessor für
spezielle Anwendungen "voll im Griff" haben will,
programmiere ich "Bare Metal" und habe begonnen,
schlanke, leistungsfähige HAL-Module selbst zu schreiben.
Da für die äußerst komplexe DMA kaum Beispiele existieren,
veröffentliche ich hiermit meine Arbeit.
Meine anderen HAL-Module werde ich auch noch veröffentlichen...
Testprogramm Endlosausgabe Ringpuffer auf SPI:
(RAM-Ringpuffer => DMA => Master-SPI)
1 | //---------------------------
|
2 | #include <stdbool.h>
|
3 | #include "sam.h"
|
4 | #include "hal_dma.h"
|
5 |
|
6 | uint8_t buffer[100];
|
7 | DmacDescriptor *chdescr_ptr;
|
8 |
|
9 | //...Standard-Startup-Initialisierungen
|
10 | //- Initialisierung einer Master-SPI (SERCOM0)-> ergänzen!
|
11 |
|
12 | //------- DMA-Beispiel --------
|
13 | SetupDma();
|
14 | SetupDmaChannel(DMA_CHID_CHANNEL0, DMA_PRIORITY_3,
|
15 | DMA_TRIGACT_BEAT, DMA_TRIGSRC_SERCOM0_TX,
|
16 | DMA_EVACT_NONE);
|
17 | chdescr_ptr=
|
18 | AddDmaDescriptor(DMA_CHID_CHANNEL0,(void*const)&buffer[99],
|
19 | DMA_ADDR_INC_1,(void*const)&SERCOM0->SPI.DATA.reg,
|
20 | DMA_ADDR_INC_NONE, DMA_BEAT_SIZE_8B, sizeof(buffer),
|
21 | DMA_EVENT_OUTPUT_DISABLE);
|
22 | // while((uint32_t)chdescr_ptr == 0); // Null-Pointer: Fehler-Halt
|
23 |
|
24 | // Endlosausgabe: Descriptor verlinkt auf sich selbst!
|
25 | chdescr_ptr->DESCADDR.reg= (uint32_t)chdescr_ptr;
|
26 |
|
27 | EnableDmaChannel(DMA_CHID_CHANNEL0);
|
28 | //---------------------------------------------------------
|
Konstruktive Anregungen und Kritik willkommen!