OlegPowerC (30.12.2011 22:55, просмотров: 8260)
Реализация концепции асинхронного вывода буффера в UART Мне часто приходится слать в UART строки сообщений, так вот, зачастуют делают так, готовят буфер со строкой, а потом посылают строку в функции, но выход из нее происходит только после посылки последнего байта, а это долго.
Я поступил так, готовлю строку, и вызываю функцию ее посылки, она устанавливает глобальные переменные:
1. адрес буфера
2. количество байт для посылки
3. смещение в буфере = 0
и записывает в регистр данных UART'а первый байт и тут же завершается, далее, после окончания посылки этого байта генерируется прерывание, в нем декриментируется и проверяется вторая глобальная переменная на предмет нуля, если она больше нуля то инкрементируется глобальная переменная смещения, и в регистр данных UART записывается байт по адресу буфер+смещение и обработчик прерывания завершается
все.
Пример кода для Renesas V850ES
unsigned char UART_BYTE_TO_SEND = 0;
unsigned char * UART_BUFFER;
unsigned char UART_BUFFER_OFFSETT;
Send_Buffer_To_UART(unsigned char * buffer, unsigned char len)
{
if(UART_BYTE_TO_SEND != 0)
{return;}
UART_BUFFER = buffer;
UART_BYTE_TO_SEND = len;
UART_BUFFER_OFFSETT = 0;
UC0TXL = *UART_BUFFER;
}
#pragma vector = INTUC0T_vector
__interrupt void OnUART_T(void)
{
UART_BYTE_TO_SEND--;
if(UART_BYTE_TO_SEND > 0)
{
UART_BUFFER_OFFSETT++;
UC0TXL = *(UART_BUFFER + UART_BUFFER_OFFSETT);
}
}