Страница 2 из 2

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

Добавлено: Вт окт 28, 2025 22:43:30
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]
я авиатор, я так вижу

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

Добавлено: Вт окт 28, 2025 23:31:20
linux_rulezz
Cliff, русский язык по назначению использовать нужно, а не выдумывать идиотизмы!
"Крайний" - это первый или последний. Поэтому для конкретики и нужно говорить либо "первый", либо "последний".

Говорить "крайний" вместо "последний" - очень тревожный звоночек. Говори правильно!!!

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

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

Спасибо всем за высказывания мнений - что я хотел прояснить, я прояснил.