<?xml version="1.0" encoding="UTF-8"?>        <rss version="2.0"
             xmlns:atom="http://www.w3.org/2005/Atom"
             xmlns:dc="http://purl.org/dc/elements/1.1/"
             xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
             xmlns:admin="http://webns.net/mvcb/"
             xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
             xmlns:content="http://purl.org/rss/1.0/modules/content/">
        <channel>
            <title>
									Разработка TUI через UART с прерываниями с HAL для STM32F1xx - STM32				            </title>
            <link>https://microtechnics.ru/community/stm32/razrabotka-tui-cherez-uart-s-preryvaniyami-s-hal-dlya-stm32f1xx/</link>
            <description>Обсуждение вопросов, посвященных программированию микроконтроллеров, разработке электроники и не только.</description>
            <language>ru-RU</language>
            <lastBuildDate>Sat, 11 Jul 2026 21:09:34 +0000</lastBuildDate>
            <generator>wpForo</generator>
            <ttl>60</ttl>
							                    <item>
                        <title>НА: Разработка TUI через UART с прерываниями с HAL для STM32F1xx</title>
                        <link>https://microtechnics.ru/community/stm32/razrabotka-tui-cherez-uart-s-preryvaniyami-s-hal-dlya-stm32f1xx/#post-4103</link>
                        <pubDate>Fri, 13 Feb 2026 15:09:31 +0000</pubDate>
                        <description><![CDATA[@arm-programmer OpenOCD + ST-Link]]></description>
                        <content:encoded><![CDATA[@arm-programmer OpenOCD + ST-Link]]></content:encoded>
						                            <category domain="https://microtechnics.ru/community/stm32/">STM32</category>                        <dc:creator>Aveal MT</dc:creator>
                        <guid isPermaLink="true">https://microtechnics.ru/community/stm32/razrabotka-tui-cherez-uart-s-preryvaniyami-s-hal-dlya-stm32f1xx/#post-4103</guid>
                    </item>
				                    <item>
                        <title>НА: Разработка TUI через UART с прерываниями с HAL для STM32F1xx</title>
                        <link>https://microtechnics.ru/community/stm32/razrabotka-tui-cherez-uart-s-preryvaniyami-s-hal-dlya-stm32f1xx/#post-4102</link>
                        <pubDate>Fri, 13 Feb 2026 14:23:24 +0000</pubDate>
                        <description><![CDATA[@aveal Какой отладчик вы бы рекомендовали использовать при работе с Unix (Linux, macOS)? CubeIDE не использую]]></description>
                        <content:encoded><![CDATA[@aveal Какой отладчик вы бы рекомендовали использовать при работе с Unix (Linux, macOS)? CubeIDE не использую]]></content:encoded>
						                            <category domain="https://microtechnics.ru/community/stm32/">STM32</category>                        <dc:creator>arm-programmer</dc:creator>
                        <guid isPermaLink="true">https://microtechnics.ru/community/stm32/razrabotka-tui-cherez-uart-s-preryvaniyami-s-hal-dlya-stm32f1xx/#post-4102</guid>
                    </item>
				                    <item>
                        <title>НА: Разработка TUI через UART с прерываниями с HAL для STM32F1xx</title>
                        <link>https://microtechnics.ru/community/stm32/razrabotka-tui-cherez-uart-s-preryvaniyami-s-hal-dlya-stm32f1xx/#post-4101</link>
                        <pubDate>Fri, 13 Feb 2026 10:29:27 +0000</pubDate>
                        <description><![CDATA[Приветствую!
Тут суть процессов-то не сложная, в UART выводятся данные, на выходе эти данные неверные. Посмотри просто под отладчиком, какие именно данные, почему и когда отправляются.]]></description>
                        <content:encoded><![CDATA[<p>Приветствую!</p>
<p>Тут суть процессов-то не сложная, в UART выводятся данные, на выходе эти данные неверные. Посмотри просто под отладчиком, какие именно данные, почему и когда отправляются.</p>]]></content:encoded>
						                            <category domain="https://microtechnics.ru/community/stm32/">STM32</category>                        <dc:creator>Aveal MT</dc:creator>
                        <guid isPermaLink="true">https://microtechnics.ru/community/stm32/razrabotka-tui-cherez-uart-s-preryvaniyami-s-hal-dlya-stm32f1xx/#post-4101</guid>
                    </item>
				                    <item>
                        <title>Разработка TUI через UART с прерываниями с HAL для STM32F1xx</title>
                        <link>https://microtechnics.ru/community/stm32/razrabotka-tui-cherez-uart-s-preryvaniyami-s-hal-dlya-stm32f1xx/#post-4100</link>
                        <pubDate>Fri, 13 Feb 2026 09:55:03 +0000</pubDate>
                        <description><![CDATA[Всем привет. Открыл отдельную тему для вопроса. Нужна помощь с проектом.
Занимаюсь реализацией TUI через UART на STM32F1xx с HAL. Описание функциональности:
- Неблокирующий ввод
- Заверше...]]></description>
                        <content:encoded><![CDATA[<p>Всем привет. Открыл отдельную тему для вопроса. Нужна помощь с проектом.</p>
<p>Занимаюсь реализацией TUI через UART на STM32F1xx с HAL. Описание функциональности:</p>
<p>- Неблокирующий ввод</p>
<p>- Завершение ввода при нажатии Enter</p>
<p>- При нажатии на Backspace предыдущий символ удаляется (при наличии)</p>
<p>- Видимые символы отображаются</p>
<p>Вывод также хочется реализовать через прерывания, если вызов функции был сделан не из обработчика другого прерывания (в таком случае реализуется блокирующий вывод).</p>
<p>При написании кода использую кольцевой буфер (ring/circular buffer) для хранения строк. Он представляет из себя отдельную библиотеку.</p>
<p>Вот код проекта:</p>
<div>
<pre contenteditable="false">static UART_HandleTypeDef *console_uart = NULL;
static char line_buffer;
static uint16_t line_len = 0;

// TX Buffer
static ring_buffer_t tx_buffer;
static volatile uint8_t tx_busy = 0;
static volatile uint8_t tx_byte;

// RX Buffer
static ring_buffer_t rx_buffer;
static volatile uint8_t rx_byte;
static volatile uint8_t rx_ready = 0;

static void console_rx_callback(UART_HandleTypeDef *);
static void console_tx_callback(UART_HandleTypeDef *);

uint8_t console_init(UART_HandleTypeDef *huart) {
    if (huart == NULL || console_uart != NULL) {
        return 1;
    }

    console_uart = huart;

    ring_buffer_init(&amp;tx_buffer);
    tx_busy = 0;    

    ring_buffer_init(&amp;rx_buffer);
    rx_ready = 0;

    HAL_UART_RegisterCallback(
        console_uart,
        HAL_UART_RX_COMPLETE_CB_ID,
        console_rx_callback
    );

    HAL_UART_RegisterCallback(
        console_uart,
        HAL_UART_TX_COMPLETE_CB_ID,
        console_tx_callback
    );

    HAL_UART_Receive_IT(console_uart, (uint8_t *) &amp;rx_byte, 1);
    return 0;
}

void console_print(const char *str) {
    HAL_UART_Transmit(console_uart, (uint8_t *) str, strlen(str), 10);
    // ring_buffer_write(&amp;tx_buffer, (uint8_t *) str, strlen(str));

    // if (tx_busy == 0) {
    //     tx_busy = 1;
    //     tx_byte = ring_buffer_pop(&amp;tx_buffer);
    //     HAL_UART_Transmit_IT(console_uart, &amp;tx_byte, 1);
    // }
}

void console_clear() {
    console_print("\033[2J\033[H");
}

// Берет на себя всю обработку символов: backspace, enter и echo
void console_poll() {
    while (ring_buffer_get_length(&amp;rx_buffer) &gt; 0 &amp;&amp; rx_ready == 0) {
        uint8_t ch = ring_buffer_pop(&amp;rx_buffer);
        if ((ch == '\b' || ch == 0x7F) &amp;&amp; line_len &gt; 0) {
            line_len--;
            console_print("\b \b");
        }
        else if (ch == '\r' || ch == '\n') {
            line_buffer = '\0';
            rx_ready = 1;
            console_print("\r\n");
            return;
        }
        else if (line_len &lt; CONSOLE_MAX_RX_DATA_LENGTH - 1) {
            line_buffer = ch;
            char echo = {ch, 0};
            console_print(echo);
        }
    }
}

uint8_t console_ready() {
    return rx_ready;
}

void console_read(char *buffer) {
    if (buffer == NULL || rx_ready == 0) {
        return;
    }
    
    strcpy(buffer, line_buffer);
    rx_ready = 0;
    line_len = 0;
    line_buffer = '\0';
}

static void console_tx_callback(UART_HandleTypeDef *console) {
    if (ring_buffer_get_length(&amp;tx_buffer) == 0) {
        tx_busy = 0;
    }
    else {
        tx_byte = ring_buffer_pop(&amp;tx_buffer);
        HAL_UART_Transmit_IT(console_uart, &amp;tx_byte, 1);
    }
}

static void console_rx_callback(UART_HandleTypeDef *console) {
    ring_buffer_push(&amp;rx_buffer, rx_byte);
    HAL_UART_Receive_IT(console_uart, &amp;rx_byte, 1);
}</pre>
<p>Использование в приложении примерно такое:</p>
<pre contenteditable="false">while(1) {
    console_poll();
    if (console_ready()) {
        console_read(consoleBuffer);
        // Действия с console buffer
    }
}</pre>
</div>
<p>&nbsp;</p>
<p>При подключении через утилиту screen на скорости 115200 выводит следующее (вводил просто '?'):</p>
<pre contenteditable="false">Rebooeot system
?. menu
cm&gt;&gt;
Unknoan
oy en
symenu
cm</pre>
<p>То есть вывод максимально ломаный.</p>
<p>Знающие люди, подскажите, пожалуйста, что не так с этим кодом и в чем именно проблема. Нейронки не помогают, а в DMA сейчас не планирую лезть - хочу сперва разобраться с прерываниями.</p>
<p>Благодарю за любую помощь, спасибо!</p>]]></content:encoded>
						                            <category domain="https://microtechnics.ru/community/stm32/">STM32</category>                        <dc:creator>arm-programmer</dc:creator>
                        <guid isPermaLink="true">https://microtechnics.ru/community/stm32/razrabotka-tui-cherez-uart-s-preryvaniyami-s-hal-dlya-stm32f1xx/#post-4100</guid>
                    </item>
							        </channel>
        </rss>
		