Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Зачем писать на ассемблере— потому что могу
#define FifoTxBuf (256)
static unsigned char TxFifo[FifoTxBuf];//буфер для передачи данных
static unsigned short TxHead=0;//голова, байт для передачи кладем на голову
static volatile unsigned short TxTail=0;//хвост, с хвоста в UART
void AES_RNG_LPUART1_IRQHandler(void)
{//обработчик прерывания "передача закончена"
if(LPUART1->ISR & USART_ISR_TC)
{
if(TxHead==TxTail)//проверяем наличие байт в буфере
{//Данных нет, сбрасываем флаг прерывания
LPUART1->ICR=USART_ICR_TCCF;
}
else
{//данные есть, передаем, FIFO->UART
LPUART1->TDR=TxFifo[TxTail];
TxTail=(TxTail+1)&(FifoTxBuf-1);
}
}
}
void PutUart0(unsigned char data)
{
//если в TX буфере пусто и регистр передачи пуст
if(
(TxHead==TxTail)
&&
(((LPUART1->ISR)&USART_ISR_TXE)!=0)
)
{//сразу запускаем передачу
LPUART1->TDR=data;
return;
}
//если в буфере не пусто кладем в Tx буфер
TxFifo[TxHead]=data;
TxHead=(TxHead+1)&(FifoTxBuf-1);
Портирование ModBus Slave RTU/ASCII на IAR AVR v3