Я не силен в программировании, в этих магических числах, ноReflector писал(а):Зачем там memcpy если копировать нужно один 64-х битный элемент массива?
Спойлер
Код: Выделить всё
/* Handles DMA1_Channel1 interrupt request */
void WS2812B_DMA_HANDLER(void)
{ static uint8_t pixel_cnt = 0; // счетчик пикселей
GPIOA->ODR |= GPIO_Pin_2;
uint32_t isr = WS2812B_DMA->ISR;
WS2812B_DMA->IFCR = isr;
if(isr & WS2812B_DMA_IT_HT)
{
*((uint64_t*)&DMABuffer[0]) = *((uint64_t*)&tablica[pixeld[pixel_cnt].g]);
*((uint64_t*)&DMABuffer[8]) = *((uint64_t*)&tablica[pixeld[pixel_cnt].r]);
*((uint64_t*)&DMABuffer[16]) = *((uint64_t*)&tablica[pixeld[pixel_cnt].b]);
}
else
{
*((uint64_t*)&DMABuffer[24]) = *((uint64_t*)&tablica[pixeld[pixel_cnt].g]);
*((uint64_t*)&DMABuffer[32]) = *((uint64_t*)&tablica[pixeld[pixel_cnt].r]);
*((uint64_t*)&DMABuffer[40]) = *((uint64_t*)&tablica[pixeld[pixel_cnt].b]);
}
if(pixel_cnt++ == (PIXEL_CNT+1)) // процедура передачи закончена
{
pixel_cnt=0; ws_status = 0;
// Disable Timer выключение канала
WS2812B_TIM->CR1 &= (uint16_t)(~((uint16_t)TIM_CR1_CEN));
// DMA1 Channel1 disable
WS2812B_DMA_CHANNEL->CCR &= (uint16_t)(~DMA_CCR1_EN);
// Clear DMA1_Channel1 interrupts
WS2812B_DMA->IFCR = WS2812B_DMA_IT_HT;
WS2812B_DMA->IFCR = WS2812B_DMA_IT_TC;
}
GPIOA->ODR &= ~GPIO_Pin_2;
}
При добавлении кода
выигрыш во времени так же есть. С ws_status потом займусь.VladislavS писал(а):Попробуй вот такую конструкцию


