Arduino DUE - DMA

krikus
Offline
Зарегистрирован: 22.07.2011

Доброго времени суток.

Кто знаком с 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;
	};
}

 

krikus
Offline
Зарегистрирован: 22.07.2011

Нашел простое копирование на 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);
}

 

Novi4ek
Offline
Зарегистрирован: 07.07.2018
Здравствуйте помогите пожалуйста вывести на дисплей LPH8731-3C данные DS18B20 и bmp280 с помощью ProMini 3.3v
Вот мои наработки

https://drive.google.com/open?id=1bCkKSV9zpPAAtMq3zAqMvIk7so0ys60c