Контроллер ДМА можно презагружать только в прерывании "буфер ДМА
закончился". Соответственно два вызова прерывания, на первый символ
и на последний. Длинна строки контроллеру ДМА не известна на момент
записи первого символа. Что на строку, что на один символ будет два
прерывания, отличии от буфера по прерыванию, там на каждый символ
по прерыванию. //обработчик прерывание DMA
void DMA1_Channel2_3_IRQHandler(void);
void DMA1_Channel2_3_IRQHandler(void)
{
//if((DMA1->ISR)&DMA_ISR_TCIF2)
{
if(TxHead==TxTail)
{ //запрещаем прерывания
DMA1_Channel2->CCR=(LL_DMA_DIRECTION_MEMORY_TO_PERIPH)|(DMAprioritetTX)|
(LL_DMA_MDATAALIGN_BYTE)|(LL_DMA_PDATAALIGN_BYTE)|
(LL_DMA_MEMORY_INCREMENT)|(LL_DMA_PERIPH_NOINCREMENT)|
(LL_DMA_MODE_NORMAL)|(0)|(DMA_CCR_EN);
return;
}
//передача
DMA1->IFCR=DMA_IFCR_CTCIF2;
DMA1_Channel2->CCR=0;
DMA1_Channel2->CMAR=((unsigned long)TxFifo) + TxTail;
if(TxHead>TxTail)
{
DMA1_Channel2->CNDTR=TxHead-TxTail;
TxTail=TxHead;
}
else
{
DMA1_Channel2->CNDTR=FifoTxBuf-TxTail;
TxTail=0;
}
DMA1_Channel2->CCR=(LL_DMA_DIRECTION_MEMORY_TO_PERIPH)|(DMAprioritetTX)|
(LL_DMA_MDATAALIGN_BYTE)|(LL_DMA_PDATAALIGN_BYTE)|
(LL_DMA_MEMORY_INCREMENT)|(LL_DMA_PERIPH_NOINCREMENT)|
(LL_DMA_MODE_NORMAL)|(DMA_CCR_TCIE)|(DMA_CCR_EN);
}
return;
}
//Function: положить байт в ФИФО
//Argument: передаваемый байт
void PutFifo1(unsigned char data)
{
TxFifo[TxHead]=data;//кладем на голову
TxHead=(TxHead+1)&(FifoTxBuf-1);
DMA1_Channel2->CCR=(LL_DMA_DIRECTION_MEMORY_TO_PERIPH)|(DMAprioritetTX)|
(LL_DMA_MDATAALIGN_BYTE)|(LL_DMA_PDATAALIGN_BYTE)|
(LL_DMA_MEMORY_INCREMENT)|(LL_DMA_PERIPH_NOINCREMENT)|
(LL_DMA_MODE_NORMAL)|(DMA_CCR_TCIE)|(DMA_CCR_EN);
return;
}