|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Use a single variable as the data source. Typically a register |
|
|
// Use a single variable as the data source. Typically a register |
|
|
// for receiving data from one of the hardware peripherals is used. |
|
|
// for receiving data from one of the hardware peripherals is used. |
|
|
void source(const signed char &p) { source(*(const uint8_t *)&p); } |
|
|
|
|
|
void source(const unsigned char &p) { |
|
|
|
|
|
|
|
|
void source(volatile const signed char &p) { source(*(volatile const uint8_t *)&p); } |
|
|
|
|
|
void source(volatile const unsigned char &p) { |
|
|
TCD->SADDR = &p; |
|
|
TCD->SADDR = &p; |
|
|
TCD->SOFF = 0; |
|
|
TCD->SOFF = 0; |
|
|
TCD->ATTR_SRC = 0; |
|
|
TCD->ATTR_SRC = 0; |
|
|
if ((uint32_t)p < 0x40000000 || TCD->NBYTES == 0) TCD->NBYTES = 1; |
|
|
if ((uint32_t)p < 0x40000000 || TCD->NBYTES == 0) TCD->NBYTES = 1; |
|
|
TCD->SLAST = 0; |
|
|
TCD->SLAST = 0; |
|
|
} |
|
|
} |
|
|
void source(const signed short &p) { source(*(const uint16_t *)&p); } |
|
|
|
|
|
void source(const unsigned short &p) { |
|
|
|
|
|
|
|
|
void source(volatile const signed short &p) { source(*(volatile const uint16_t *)&p); } |
|
|
|
|
|
void source(volatile const unsigned short &p) { |
|
|
TCD->SADDR = &p; |
|
|
TCD->SADDR = &p; |
|
|
TCD->SOFF = 0; |
|
|
TCD->SOFF = 0; |
|
|
TCD->ATTR_SRC = 1; |
|
|
TCD->ATTR_SRC = 1; |
|
|
if ((uint32_t)p < 0x40000000 || TCD->NBYTES == 0) TCD->NBYTES = 2; |
|
|
if ((uint32_t)p < 0x40000000 || TCD->NBYTES == 0) TCD->NBYTES = 2; |
|
|
TCD->SLAST = 0; |
|
|
TCD->SLAST = 0; |
|
|
} |
|
|
} |
|
|
void source(const signed int &p) { source(*(const uint32_t *)&p); } |
|
|
|
|
|
void source(const unsigned int &p) { source(*(const uint32_t *)&p); } |
|
|
|
|
|
void source(const signed long &p) { source(*(const uint32_t *)&p); } |
|
|
|
|
|
void source(const unsigned long &p) { |
|
|
|
|
|
|
|
|
void source(volatile const signed int &p) { source(*(volatile const uint32_t *)&p); } |
|
|
|
|
|
void source(volatile const unsigned int &p) { source(*(volatile const uint32_t *)&p); } |
|
|
|
|
|
void source(volatile const signed long &p) { source(*(volatile const uint32_t *)&p); } |
|
|
|
|
|
void source(volatile const unsigned long &p) { |
|
|
TCD->SADDR = &p; |
|
|
TCD->SADDR = &p; |
|
|
TCD->SOFF = 0; |
|
|
TCD->SOFF = 0; |
|
|
TCD->ATTR_SRC = 2; |
|
|
TCD->ATTR_SRC = 2; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Use a buffer (array of data) as the data source. Typically a |
|
|
// Use a buffer (array of data) as the data source. Typically a |
|
|
// buffer for transmitting data is used. |
|
|
// buffer for transmitting data is used. |
|
|
void sourceBuffer(const signed char p[], unsigned int len) { |
|
|
|
|
|
sourceBuffer((uint8_t *)p, len); } |
|
|
|
|
|
void sourceBuffer(const unsigned char p[], unsigned int len) { |
|
|
|
|
|
|
|
|
void sourceBuffer(volatile const signed char p[], unsigned int len) { |
|
|
|
|
|
sourceBuffer((volatile const uint8_t *)p, len); } |
|
|
|
|
|
void sourceBuffer(volatile const unsigned char p[], unsigned int len) { |
|
|
TCD->SADDR = p; |
|
|
TCD->SADDR = p; |
|
|
TCD->SOFF = 1; |
|
|
TCD->SOFF = 1; |
|
|
TCD->ATTR_SRC = 0; |
|
|
TCD->ATTR_SRC = 0; |
|
|
|
|
|
|
|
|
TCD->BITER = len; |
|
|
TCD->BITER = len; |
|
|
TCD->CITER = len; |
|
|
TCD->CITER = len; |
|
|
} |
|
|
} |
|
|
void sourceBuffer(const signed short p[], unsigned int len) { |
|
|
|
|
|
sourceBuffer((uint16_t *)p, len); } |
|
|
|
|
|
void sourceBuffer(const unsigned short p[], unsigned int len) { |
|
|
|
|
|
|
|
|
void sourceBuffer(volatile const signed short p[], unsigned int len) { |
|
|
|
|
|
sourceBuffer((volatile const uint16_t *)p, len); } |
|
|
|
|
|
void sourceBuffer(volatile const unsigned short p[], unsigned int len) { |
|
|
TCD->SADDR = p; |
|
|
TCD->SADDR = p; |
|
|
TCD->SOFF = 2; |
|
|
TCD->SOFF = 2; |
|
|
TCD->ATTR_SRC = 1; |
|
|
TCD->ATTR_SRC = 1; |
|
|
|
|
|
|
|
|
TCD->BITER = len / 2; |
|
|
TCD->BITER = len / 2; |
|
|
TCD->CITER = len / 2; |
|
|
TCD->CITER = len / 2; |
|
|
} |
|
|
} |
|
|
void sourceBuffer(const signed int p[], unsigned int len) { |
|
|
|
|
|
sourceBuffer((uint32_t *)p, len); } |
|
|
|
|
|
void sourceBuffer(const unsigned int p[], unsigned int len) { |
|
|
|
|
|
sourceBuffer((uint32_t *)p, len); } |
|
|
|
|
|
void sourceBuffer(const signed long p[], unsigned int len) { |
|
|
|
|
|
sourceBuffer((uint32_t *)p, len); } |
|
|
|
|
|
void sourceBuffer(const unsigned long p[], unsigned int len) { |
|
|
|
|
|
|
|
|
void sourceBuffer(volatile const signed int p[], unsigned int len) { |
|
|
|
|
|
sourceBuffer((volatile const uint32_t *)p, len); } |
|
|
|
|
|
void sourceBuffer(volatile const unsigned int p[], unsigned int len) { |
|
|
|
|
|
sourceBuffer((volatile const uint32_t *)p, len); } |
|
|
|
|
|
void sourceBuffer(volatile const signed long p[], unsigned int len) { |
|
|
|
|
|
sourceBuffer((volatile const uint32_t *)p, len); } |
|
|
|
|
|
void sourceBuffer(volatile const unsigned long p[], unsigned int len) { |
|
|
TCD->SADDR = p; |
|
|
TCD->SADDR = p; |
|
|
TCD->SOFF = 4; |
|
|
TCD->SOFF = 4; |
|
|
TCD->ATTR_SRC = 2; |
|
|
TCD->ATTR_SRC = 2; |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// Use a circular buffer as the data source |
|
|
// Use a circular buffer as the data source |
|
|
void sourceCircular(const signed char p[], unsigned int len) { |
|
|
|
|
|
sourceCircular((uint8_t *)p, len); } |
|
|
|
|
|
void sourceCircular(const unsigned char p[], unsigned int len) { |
|
|
|
|
|
|
|
|
void sourceCircular(volatile const signed char p[], unsigned int len) { |
|
|
|
|
|
sourceCircular((volatile const uint8_t *)p, len); } |
|
|
|
|
|
void sourceCircular(volatile const unsigned char p[], unsigned int len) { |
|
|
TCD->SADDR = p; |
|
|
TCD->SADDR = p; |
|
|
TCD->SOFF = 1; |
|
|
TCD->SOFF = 1; |
|
|
TCD->ATTR_SRC = ((31 - __builtin_clz(len)) << 3); |
|
|
TCD->ATTR_SRC = ((31 - __builtin_clz(len)) << 3); |
|
|
|
|
|
|
|
|
TCD->BITER = len; |
|
|
TCD->BITER = len; |
|
|
TCD->CITER = len; |
|
|
TCD->CITER = len; |
|
|
} |
|
|
} |
|
|
void sourceCircular(const signed short p[], unsigned int len) { |
|
|
|
|
|
sourceCircular((uint16_t *)p, len); } |
|
|
|
|
|
void sourceCircular(const unsigned short p[], unsigned int len) { |
|
|
|
|
|
|
|
|
void sourceCircular(volatile const signed short p[], unsigned int len) { |
|
|
|
|
|
sourceCircular((volatile const uint16_t *)p, len); } |
|
|
|
|
|
void sourceCircular(volatile const unsigned short p[], unsigned int len) { |
|
|
TCD->SADDR = p; |
|
|
TCD->SADDR = p; |
|
|
TCD->SOFF = 2; |
|
|
TCD->SOFF = 2; |
|
|
TCD->ATTR_SRC = ((31 - __builtin_clz(len)) << 3) | 1; |
|
|
TCD->ATTR_SRC = ((31 - __builtin_clz(len)) << 3) | 1; |
|
|
|
|
|
|
|
|
TCD->BITER = len / 2; |
|
|
TCD->BITER = len / 2; |
|
|
TCD->CITER = len / 2; |
|
|
TCD->CITER = len / 2; |
|
|
} |
|
|
} |
|
|
void sourceCircular(const signed int p[], unsigned int len) { |
|
|
|
|
|
sourceCircular((uint32_t *)p, len); } |
|
|
|
|
|
void sourceCircular(const unsigned int p[], unsigned int len) { |
|
|
|
|
|
sourceCircular((uint32_t *)p, len); } |
|
|
|
|
|
void sourceCircular(const signed long p[], unsigned int len) { |
|
|
|
|
|
sourceCircular((uint32_t *)p, len); } |
|
|
|
|
|
void sourceCircular(const unsigned long p[], unsigned int len) { |
|
|
|
|
|
|
|
|
void sourceCircular(volatile const signed int p[], unsigned int len) { |
|
|
|
|
|
sourceCircular((volatile const uint32_t *)p, len); } |
|
|
|
|
|
void sourceCircular(volatile const unsigned int p[], unsigned int len) { |
|
|
|
|
|
sourceCircular((volatile const uint32_t *)p, len); } |
|
|
|
|
|
void sourceCircular(volatile const signed long p[], unsigned int len) { |
|
|
|
|
|
sourceCircular((volatile const uint32_t *)p, len); } |
|
|
|
|
|
void sourceCircular(volatile const unsigned long p[], unsigned int len) { |
|
|
TCD->SADDR = p; |
|
|
TCD->SADDR = p; |
|
|
TCD->SOFF = 4; |
|
|
TCD->SOFF = 4; |
|
|
TCD->ATTR_SRC = ((31 - __builtin_clz(len)) << 3) | 2; |
|
|
TCD->ATTR_SRC = ((31 - __builtin_clz(len)) << 3) | 2; |