Arduino DUE - DMA
- Войдите на сайт для отправки комментариев
Сб, 25/01/2014 - 17:34
Доброго времени суток.
Кто знаком с DMA контроллером в МК, можете подсказать: как настроить DMA на копирование данных с исключениями. Фактически, есть два буфера - необходимо переписать данные из одного в другой, но не копировать опредленный байт данных. На Си++ это можно представить:
inline void cpy(const uint8_t *Source, uint8_t *Dest, uint16_t Count) {
for (uint32_t i = 0; i<Count; ++i){
if ((*Source) != [БАЙТ ИСКЛЮЧЕНИЕ]) {
*Dest=*Source;
}
++Source;
++Dest;
};
}
Нашел простое копирование на github. Оно работает, но как реализовать исключение - без понятия.
void memcpy32(uint32_t *dst, uint32_t *src, uint32_t n) { DMADONE=0; dmac_channel_disable(DMAC_MEMCH); DMAC->DMAC_CH_NUM[DMAC_MEMCH].DMAC_SADDR = (uint32_t)src; DMAC->DMAC_CH_NUM[DMAC_MEMCH].DMAC_DADDR = (uint32_t)dst; DMAC->DMAC_CH_NUM[DMAC_MEMCH].DMAC_DSCR = 0; DMAC->DMAC_CH_NUM[DMAC_MEMCH].DMAC_CTRLA = n | DMAC_CTRLA_SRC_WIDTH_WORD | DMAC_CTRLA_DST_WIDTH_WORD; DMAC->DMAC_CH_NUM[DMAC_MEMCH].DMAC_CTRLB = DMAC_CTRLB_SRC_DSCR | DMAC_CTRLB_DST_DSCR | DMAC_CTRLB_FC_MEM2MEM_DMA_FC | DMAC_CTRLB_SRC_INCR_INCREMENTING | DMAC_CTRLB_DST_INCR_INCREMENTING; DMAC->DMAC_CH_NUM[DMAC_MEMCH].DMAC_CFG = DMAC_CFG_SOD | DMAC_CFG_FIFOCFG_ASAP_CFG; dmac_channel_enable(DMAC_MEMCH); }https://drive.google.com/open?id=1bCkKSV9zpPAAtMq3zAqMvIk7so0ys60c