HuHu
Member
Teensy 4.0 UART RX to DMA
Can anyone help to convert the T3.6 example below to T4.0?
Best Regards,
HuHu
Can anyone help to convert the T3.6 example below to T4.0?
Best Regards,
HuHu
Code:
//---------------------------------------------------------------------------------------
// UART Rx to DMA ping pong
#include <DMAChannel.h>
#define PRREG(x) Serial.print(#x" 0x"); Serial.println(x,HEX)
#define SAMPLES 1024
DMAMEM static uint8_t rx_buffer[SAMPLES];
DMAChannel dma(false);
volatile uint8_t *dest;
void isr(void)
{
uint32_t daddr;
dma.clearInterrupt();
daddr = (uint32_t)(dma.TCD->DADDR);
if (daddr < (uint32_t)rx_buffer + sizeof(rx_buffer) / 2) {
// DMA is filling the first half of the buffer
// so we must print the second half
dest = &rx_buffer[SAMPLES / 2];
} else {
// DMA is filling the second half of the buffer
// so we must print the first half
dest = rx_buffer;
}
}
void dmainit()
{
// set up a DMA channel to store UART byte
// Serial4 UART3
dma.begin(true); // Allocate the DMA channel first
dma.source((uint8_t &) UART3_D);
dma.destinationBuffer(rx_buffer, sizeof(rx_buffer));
dma.TCD->CSR = DMA_TCD_CSR_INTHALF | DMA_TCD_CSR_INTMAJOR;
dma.triggerAtHardwareEvent(DMAMUX_SOURCE_UART3_RX);
dma.enable();
dma.attachInterrupt(isr);
}
void setup()
{
Serial.begin(9600);
while (!Serial);
dmainit();
Serial4.begin(4800);
UART3_C5 = UART_C5_RDMAS; // ? enable DMA
}
void loop()
{
static uint32_t prev = millis();
if (dest) {
// print or write to SD
uint32_t t = millis();
Serial.print(t - prev); Serial.println(" ms");
Serial.println((uint32_t)dest, HEX);
for (int i = 0; i < SAMPLES / 2; i++)Serial.print((char)dest[i]);
Serial.println();
prev = t; // interrupt period
dest = 0; // wait for next interrupt
}
}
//---------------------------------------------------------------------------------------
Last edited by a moderator: