Поигрался я с идеей
iddqd, есть 2 варианта:
1 вариант, когда пины располагаются на одном порту, не важно в какой последовательности.
ОЗУ на один пин 4 байта, на 8 пинов 32 байта.
Если хранить картинку 256*256 точек, да в добавок в цветном изображении, параллельный порт 8 пинов, 256*256*3*32 = 6.291.456 байт.?
Ну как так можно без кода обойтись? Ведь еще сжать картинку можно, без кода ни как.
1 вариант не интересен, обычный дма, буфер, чего тут интересного.
2 вариант, это когда на разных BSRR.
Проблема: ни как не поменять значение в регистре CPAR
без выключения канала.
Значит дма будем запускать только на один пин, а в прерывании выключать канал,
подсовывать адрес и данные и заново включать канал.
Ну поморгать светодиодами в реальном железе я поморгал, ну нету у меня логических анализаторов что бы посмотреть что в реальности происходит, но как бы в отладчике - вроде все верно моргает.
Вот код самого прерывания
Спойлер
Код: Выделить всё
const port_pin pins_out[] = {
pn(A,0),
pn(B,1),
pn(C,2),
pn(A,3),
pn(B,4),
pn(C,8),
pn(C,6),
pn(C,9),
pn(C,5),
pn(C,7)
};
Код: Выделить всё
void DMA1_Channel1_IRQHandler(void)
{ static uint32_t a=0;
uint32_t isr = DMA1->ISR;
DMA1->IFCR = isr;
if(a++ == (sf(pins_out)-1)) a=0;
DMA1_Channel1->CCR &= (~DMA_CCR1_EN);
while (DMA1_Channel1->CCR & DMA_CCR1_EN);
DMA1_Channel1->CNDTR = 1;
DMA1_Channel1->CPAR = (uint32_t) &((GPIO_TypeDef *) pins_out[a].port)->BSRR;
DMA1_Channel1->CMAR = (uint32_t) &data_dma[a];
DMA1_Channel1->CCR |= DMA_CCR1_EN;
}
data_dma = количеству пиновСамое главное - без кода ни как.
А теперь вопрос в практическом применении, для чего и за чем? И где тут выигрыш в скорости?