[Перепечатано] Как использовать логотип TXE и TC при отправке данных из USART STM32

На передающем конце USART имеется 2 регистра, один из них - регистр USART_DR, который может видеть программа, а другой - регистр сдвига, который программа не может видеть. Есть два флага, соответствующих передаче данных USART, и один - TXE = регистр передаваемых данных пуст, Другой - TC = конец передачи.

Когда данные в USART_DR передаются в регистр сдвига, устанавливается TXE. В это время регистр сдвига начинает передавать данные в линию сигнала TX по битам, но поскольку TDR стал пустым, программа может отправить следующий байт для отправки (операция USART_DR) записывается в TDR, не дожидаясь окончания передачи всех битов в регистре сдвига. Когда все биты передаются (после отправки стоп-бита), аппаратное обеспечение установит флаг TC.

  С другой стороны, когда USART только что был инициализирован и данные не были отправлены, также будет установлен флаг TXE, поскольку регистр передаваемых данных пуст. Значение TXEIE и TCIE очень просто: TXEIE позволяет генерировать прерывания, когда флаг TXE равен «1», а TCIE позволяет генерировать прерывания, когда флаг TC равен «1».

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

 

TXE - запись в регистр DR очищена

RXNE - чтение регистра DR для очистки, также может быть очищено вручную с помощью программного обеспечения

TC-- регистр DR чтения / записи очищается, или он может быть очищен вручную с помощью программного обеспечения

 

Позвольте мне сначала поговорить о ТС. Это передача завершена. Прерывание вводится после отправки байта, который называется «прерывание после отправки». Как и в исходном методе TI 8051, прерывания отправляются после отправки. Вам нужно отправить байт в функции отправки, чтобы инициировать прерывание. Функция отправки выглядит следующим образом:

/ *******
функция: режим прерывания для отправки строки. Используйте метод оценки TC. То есть для определения бита прерывания после передачи.
Ввод: первый адрес
вывода строки : нет
***
void USART_SendDataString (u8 * pData)
{
    pDataByte = pData;
 
    USART_ClearFlag (USART1, USART_FLAG_TC); // Сбрасываем флаг завершения передачи, в противном случае данные первого байта могут быть потеряны.
    
    Предоставляются пользователями сети. USART_SendData (USART1 * pte (USART1 *) * ); // Должен быть ++, в противном случае первый символ t будет отправлен дважды
}


Функция обработки прерывания выглядит следующим образом
/ ********
* Имя функции: USART1_IRQHandler
* Описание: Эта функция обрабатывает глобальный запрос прерывания USART1.
* Входные данные: Нет
* Выходные данные: Нет
* Возврат: Нет
********* /
void USART1_IRQHandler (void)
{
    if (USART_GetITStatus (USART1, USART_IT_TC) == SET)
    {
        if (* pDataByte == '\ 0') // TC необходимо прочитать SR + запись DR, чтобы очистить 0, при отправке в конец перейти к '\ 0 'Используйте if, чтобы отключить
            USART_ClearFlag (USART1, USART_FLAG_TC); // В противном случае TC всегда установлен, TCIE также открыт, что приведет к непрерывному прерыванию. Очистите его, вам не нужно отключать TCIE,
        иначе
            USART_SendData (USART1, * pDataByte ++);
    }

}

где u8 * pDataByte; является внешней переменной-указателем

в обработчике прерываний. После отправки строки вам не нужно закрывать прерывание TC, чтобы включить TCIE, вам нужно только очистить бит флага TC, этого можно избежать TC == SET вызвал многократное прерывание входа.

void USART_Config ()
{
 ........................................

 USART_ITConfig (USART1, USART_IT_TC, ENABLE); // Tramsimssion Complete, прерывание генерируется. Здесь должно быть помещено прерывание TC, в противном случае первый байт все равно будет потерян

 USART_Cmd (USART1, ENABLE); // Включить USART1
}

.................................................. ...................

Давайте поговорим об оценке TXE. То есть Tx DR Empty, регистр передачи пуст. Когда TXEIE включен, прерывание будет генерироваться, пока Tx DR пуст. Следовательно, он должен быть отключен после отправки строки, иначе это вызовет повторное прерывание ввода. Это также отличается от TC.

Функция отправки выглядит следующим образом:
/ *******
функция: отправка строки символов в режиме прерывания. Используйте метод оценки TC. То есть оцените бит прерывания после отправки.
Ввод: первый адрес
вывода строки : нет
******* /
void USART_SendDataString (u8 * pData)
{
    pDataByte = pData;
    USART_ITConfig (USART1, USART_IT_TXE, ENABLE); // Пока регистр отправки пуст, всегда будет прерывание, поэтому, если вы не отправляете данные, отключите только прерывание отправки Открывается только при отправке.
    
}

Функции обработчика прерываний:

/ ********
* Имя функции: USART1_IRQHandler
* Описание: эта функция обрабатывает глобальный запрос прерывания USART1.
* Входные данные: Нет
* Выходные данные: Нет
* Возврат: Нет
******* * /
void USART1_IRQHandler (void)
{
    if (USART_GetITStatus (USART1, USART_IT_TXE) == SET)
    {
        if (* pDataByte == '\ 0') // байты, которые должны быть отправлены в конец, равны NULL
            USART_ITConfig (USART1, USART_IT_TXE, DISABLE); // потому что они отправлены Регистр пуст, поэтому он должен быть выключен после отправки строки, в противном случае, если он пуст, он будет вводить прерывание,
        иначе
            USART_SendData (USART1, * pDataByte ++);
    }

}

В функции инициализации последовательного порта нет необходимости открывать прерывание TXE (находится в Открыть в функции отправки)

Передача из: Как использовать флаги TXE и TC, когда USART STM32 отправляет данные

Опубликовано 91 оригинальных статей · Оценено 17 · 50000+ просмотров

рекомендация

отblog.csdn.net/qq_23327993/article/details/105494939
рекомендация