ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
28 ноября
295966
OlegPowerC (30.12.2011 22:55, просмотров: 8250)
Реализация концепции асинхронного вывода буффера в 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); } }