i finally got it working as it thought to
Code:
#include <Arduino.h>
#include <DMAChannel.h>
#define buffer_len 128
#define sfreq 44100
#define samp_timer F_BUS_ACTUAL / sfreq
extern "C" void xbar_connect(unsigned int input, unsigned int output);
DMAChannel dma;
DMAMEM static volatile __attribute__((aligned(32))) int tx_buffer[buffer_len];
int volatile cnt = 0;
void modulator()
{
dma.clearInterrupt();
if (cnt++ > sfreq / buffer_len)
{
cnt = 0;
digitalToggle(LED_BUILTIN);
}
}
void setup()
{
// place test values
for (int x = 0; x < buffer_len; x++)
tx_buffer[x] = 5000 + x + 25;
TMR4_ENBL &= ~(1 << 3); //Disable
TMR4_SCTRL3 = TMR_SCTRL_OEN | TMR_SCTRL_FORCE;
TMR4_CSCTRL3 = TMR_CSCTRL_CL1(1);
TMR4_CNTR3 = 0;
TMR4_LOAD3 = 0;
TMR4_COMP13 = samp_timer;
TMR4_CMPLD13 = samp_timer;
TMR4_CTRL3 = TMR_CTRL_CM(1) | TMR_CTRL_PCS(8) | TMR_CTRL_LENGTH | TMR_CTRL_OUTMODE(3);
TMR4_DMA3 = TMR_DMA_CMPLD1DE;
TMR4_CNTR3 = 0;
//route the timer output through XBAR to edge trigger DMA request
CCM_CCGR2 |= CCM_CCGR2_XBAR1(CCM_CCGR_ON); //enable XBAR
xbar_connect(XBARA1_IN_QTIMER4_TIMER3, XBARA1_OUT_DMA_CH_MUX_REQ30);
XBARA1_CTRL0 = XBARA_CTRL_EDGE0(1) | XBARA_CTRL_DEN0;
dma.sourceBuffer(tx_buffer, sizeof(tx_buffer));
dma.destination(CCM_ANALOG_PLL_VIDEO_NUM);
dma.triggerAtHardwareEvent(DMAMUX_SOURCE_XBAR1_0);
dma.interruptAtHalf();
dma.interruptAtCompletion();
dma.attachInterrupt(modulator);
dma.enable();
TMR4_ENBL |= (1 << 3); //Enable
pinMode(LED_BUILTIN, OUTPUT);
}
void loop()
{
// put your main code here, to run repeatedly:
}
to Frank - it migth be a good idea to set XBARA_CTRL_EDGE0 to 1 wich means fire on rising edge. you used 3 and fire dma request on rsing and falling edge of TMR4_CH3 out.