функция отправки символа проверяет свободен ли передатчик и пустой ли сейчас буфер (очередь) и если это так то отправляет байт, иначе кладет его в буфер (очередь)
Код
__monitor void UART_PutChar(uint8_t sym)
{
if((UART2_GetFlagStatus(UART2_FLAG_TXE) == SET) && (txCount == 0))
UART2_SendData8(sym);
else
{
if (txCount < SIZE_BUF)
{
uartTxBuf[txBufTail] = sym;
txCount++;
txBufTail++;
txBufTail = txBufTail % SIZE_BUF;
}
}
}
{
if((UART2_GetFlagStatus(UART2_FLAG_TXE) == SET) && (txCount == 0))
UART2_SendData8(sym);
else
{
if (txCount < SIZE_BUF)
{
uartTxBuf[txBufTail] = sym;
txCount++;
txBufTail++;
txBufTail = txBufTail % SIZE_BUF;
}
}
}
обработчик прерывания проверяет есть ли символы в буфере (очереде) и если они есть отправляет очередной символ
Код
INTERRUPT_HANDLER(UART2_TX_IRQHandler, 20)
{
if (txCount > 0)
{
UART2_SendData8(uartTxBuf[txBufHead]);
txCount--;
txBufHead++;
if (txBufHead == SIZE_BUF)
txBufHead = 0;
}
}
{
if (txCount > 0)
{
UART2_SendData8(uartTxBuf[txBufHead]);
txCount--;
txBufHead++;
if (txBufHead == SIZE_BUF)
txBufHead = 0;
}
}
никак не могу разобраться как снимать флаг прерывания (как я понял, сам он не скидывается как у атмела) ну или что там нужно с ним сделать, ибо после разрешения прерываний сваливаюсь в обработчик.
Инициализацию делаю так:
Код
void UART_init(void)
{
UART2_DeInit();
UART2_Init((uint32_t)UART_SPEED, UART2_WORDLENGTH_8D, UART2_STOPBITS_1, UART2_PARITY_NO,
UART2_SYNCMODE_CLOCK_DISABLE, UART2_MODE_TXRX_ENABLE);
UART2_ITConfig(UART2_IT_TC, ENABLE);
UART2_ITConfig(UART2_IT_RXNE_OR, ENABLE);
UART2_Cmd(ENABLE);
enableInterrupts();
}
{
UART2_DeInit();
UART2_Init((uint32_t)UART_SPEED, UART2_WORDLENGTH_8D, UART2_STOPBITS_1, UART2_PARITY_NO,
UART2_SYNCMODE_CLOCK_DISABLE, UART2_MODE_TXRX_ENABLE);
UART2_ITConfig(UART2_IT_TC, ENABLE);
UART2_ITConfig(UART2_IT_RXNE_OR, ENABLE);
UART2_Cmd(ENABLE);
enableInterrupts();
}
извиняйте за ламерство, но как-то тяжко мне дается это дело)