stm32g431 UART на прерываниях, отказ SysTick_Handler

Кто любит RISC в жизни, заходим, не стесняемся.
Cliff
Родился
Сообщения: 17
Зарегистрирован: Ср авг 13, 2025 11:45:44

Re: stm32g431 UART на прерываниях, отказ SysTick_Handler

Сообщение Cliff »

[uquote="jcxz",url="/forum/viewtopic.php?p=4758652#p4758652"]

Код: Выделить всё

        USART1->DR = *tx_buffer++;
        if (--tx_size == 0) {
            USART1->CR1 &= ~USART1_TXEIE;           // Disable TXE interrupt
            USART1->CR1 |= USART1_TCIE;             // Enable TC interrupt
        }
Код кривой.[/uquote]

неоч понятно, чем кривой код?
Не то что бы я большой спец по сям, но конкретно с этими ++ и -- уже вроде б разобрался... Оно эквивалентно:

Код: Выделить всё

        USART1->DR = *tx_buffer;
        tx_buffer++;
        tx_size--;
        if (tx_size == 0) {
            USART1->CR1 &= ~USART1_TXEIE;           // Disable TXE interrupt
            USART1->CR1 |= USART1_TCIE;             // Enable TC interrupt
        }
Вообще, конечн, я оч не приветствую совмещение ++/-- с другими операндами. Именно из-за этой путаницы, когда сначала выполняется действие ++/--, а потом возвращается результат, а когда наоборот - возвращается результат, предшествующий этим операндам. Оно конечно там условно логично, но читаемость кода сильно лагает. Экономия строки тут на пользу не идёт.

Тут настройка прерываний выполняется после передачи крайнего байта. И типа есть вероятность ну успеть отключить прерывание до его следующего срабатывания. Но полагаю, что это возможно только на очень низких частотах проца и на высоких частотах UART, что кажется редкодостижимо. Но в таком виде имхо несколько привычнее читается, чем конструкции с проверкой предпоследнего байта.

Добавлено after 1 minute 10 seconds:
[uquote="linux_rulezz",url="/forum/viewtopic.php?p=4758813#p4758813"]Не крайнего, а последнего! Не нужно людей в заблуждение вводить![/uquote]
я авиатор, я так вижу
Реклама
Аватара пользователя
linux_rulezz
Вымогатель припоя
Сообщения: 608
Зарегистрирован: Пн сен 15, 2025 08:43:23
Откуда: Маленький СССР посреди шариатской республики

Re: stm32g431 UART на прерываниях, отказ SysTick_Handler

Сообщение linux_rulezz »

Cliff, русский язык по назначению использовать нужно, а не выдумывать идиотизмы!
"Крайний" - это первый или последний. Поэтому для конкретики и нужно говорить либо "первый", либо "последний".

Говорить "крайний" вместо "последний" - очень тревожный звоночек. Говори правильно!!!
Windows must die!
Реклама
Аватара пользователя
smacorp
Друг Кота
Сообщения: 3476
Зарегистрирован: Вт окт 22, 2013 04:37:23
Откуда: Казань

Re: stm32g431 UART на прерываниях, отказ SysTick_Handler

Сообщение smacorp »

[uquote="jcxz",url="/forum/viewtopic.php?p=4758652#p4758652"]И скорее всего - код вообще зациклится в бесконечной передаче[/uquote]
Тем не менее, код нормально работает. Было бы странным, если бы в официальный SDK вкладывали неработающие примеры.
Cliff писал(а):Тут настройка прерываний выполняется после передачи крайнего байта. И типа есть вероятность ну успеть отключить прерывание до его следующего срабатывания
Не после крайнего, а после предпоследнего. И новое прерывание USART не сможет сработать пока не закончена обработка текущего.
Cliff писал(а):Просто, применение TC тут вырезано, только факт его срабатывания остаётся
А вот тут Вы правы, после запрета TCIE там взводится флаг - я эту строку вырезал для упрощения восприятия кода.

Спасибо всем за высказывания мнений - что я хотел прояснить, я прояснил.
Платы для HLDI - установки лазерной засветки фоторезиста.
Фоторезист Ordyl Alpha 350
Жидкое олово для лужения плат (видео) - самое лучшее и только у меня.
Паяльные маски XV501T-4 и KSM-S6189 (5 цветов).
Заказ печатных плат - pcbsmac@gmail.com
Ответить

Вернуться в «ARM»