Код: Выделить всё
void dma1_channel5_isr(){
if(DMA1->ISR & DMA_ISR_TCIF5){ // transfer complete - stop
TIM1->SR = 0;
TIM1->CR1 |= TIM_CR1_OPM;
TIM1->CCR1 = 0;
}
DMA1->IFCR = DMA_IFCR_CGIF5;
}
uint8_t dmabuff[] = {3,6,3,3,6,6,3,6};
static void sendone(){
TIM1->CR1 = 0; // stop
DMA1_Channel5->CCR &= ~DMA_CCR_EN; // disable DMA to reconfigure
TIM1->DIER = TIM_DIER_UDE; // enable DMA requests
DMA1->IFCR = DMA_IFCR_CGIF5;
DMA1_Channel5->CNDTR = 8;
DMA1_Channel5->CMAR = (uint32_t)dmabuff;
DMA1_Channel5->CCR |= DMA_CCR_EN; // start DMA
TIM1->CR1 = TIM_CR1_CEN | TIM_CR1_URS;
}
В прерывании по завершению передачи можно и так написать: TIM1->CR1=0 — ничего не изменится. Устанавливать линию в 0 внутри прерывания таймера нельзя: слишком медленно, в итоге получается лишний короткий импульс.
Я на гитхабе, в ЖЖ


