🙌Домашняя страница программиста Акинаяма 😂oi Игрок на пенсии, увлекается Java, большими данными, микроконтроллерами и Интернетом вещей, любит технологии, технологии не виноваты. 🎉Добро пожаловать, подписывайтесь🔎Мне нравится👍Собрать⭐️Оставить сообщение📝
Во-первых, разъясним понятие о коммуникационной шине и протоколе связи в MCU. Коммуникационная шина — это физический интерфейс, используемый для подключения различных периферийных устройств и модулей. Он может передавать данные и управлять информацией. Протокол связи относится к правилам и соглашениям, которым следуют при передаче данных по коммуникационной шине, чтобы обеспечить правильный обмен информацией между различными устройствами. Мы также можем назвать его протоколом коммуникационной шины.
В этой серии статей в основном объясняются следующие протоколы шины, которые читатели могут выбрать в соответствии со своими потребностями:
UART: универсальный асинхронный приемник/передатчик, универсальный асинхронный приемник и передатчик. USART: универсальный синхронный/асинхронный приемник/передатчик, универсальный синхронный/асинхронный последовательный приемник/передатчик.
UART — это общий протокол асинхронной последовательной связи, который использует стартовые биты, биты данных, проверочные биты и стоповые биты для передачи данных. При связи UART данные передаются с фиксированной скоростью передачи. Передающая и принимающая стороны должны заранее согласовать такие параметры, как скорость передачи данных, биты данных, контрольные биты и стоповые биты. UART обычно используется для подключения микроконтроллеров, датчиков, периферийных устройств и т. д., а также широко используется в последовательной связи в компьютерных системах.
USART — более сложный протокол последовательной связи, поддерживающий как синхронные, так и асинхронные методы передачи данных. В отличие от UART, USART может выбирать синхронный или асинхронный режим связи и предоставляет больше возможностей управления, таких как аппаратное управление потоком, двусторонняя связь и т. д. USART обычно используется в сценариях, требующих высокой скорости передачи данных, двусторонней связи или более гибкого управления.
UART:
В процессе отправки скорость передачи данных отправителя и получателя должна быть согласованной. Чтобы уменьшить накопленную ошибку, максимум 1 байт, то есть максимальное количество отправляемых битов данных, составляет 8 бит.
USART поддерживает синхронный режим, поэтому для USART требуется сигнал синхронизации USART_CK. Как правило, синхронные сигналы редко используются в микроконтроллерах, поэтому USART и UART используются одинаково, оба используют асинхронный режим.
Существуют некоторые различия в аппаратных соединениях между USART и UART, главным образом потому, что USART поддерживает синхронную связь, а UART — нет. Вот как подключено их оборудование:
В общем, основная разница в аппаратном соединении между UART и USART заключается в том, нужно ли подключать линию синхронизации.
Очевидно, что при одинаковых других параметрах полнодуплексная передача происходит быстрее и эффективнее полудуплексной.
Конкретный пример (MCU — STM32F103)
#include "bsp_usart.h"
/**
* @brief Конфигурация Вложенный векторный контроллер прерываний NVIC
* @param никто
* @retval никто
*/
static void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Выбор группы вложенных векторных контроллеров прерываний */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
/* КонфигурацияUSART — источник прерываний */
NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ;
/* Кража приоритета*/
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
/* подприоритет */
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
/* Включить прерывания */
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
/* Инициализация конфигурации NVIC */
NVIC_Init(&NVIC_InitStructure);
}
/**
* @brief USART GPIO Конфигурация,Рабочие параметры Конфигурация * @param никто
* @retval никто
*/
void USART_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
// Включите часы последовательного порта GPIO.
DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);
// Включите часы периферийного устройства последовательного порта.
DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);
// Будет ли USART GPIO Tx — это режим двухтактного мультиплексирования.
GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);
// Будет ли USART Конфигурация GPIO Rx находится в режиме плавающего ввода.
GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);
// Рабочие параметры Конфигурация последовательного порта
// Конфигурация
USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;
// Конфигурация Длина слова данных иглы
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
// Конфигурацияостанавливаться Кусочек
USART_InitStructure.USART_StopBits = USART_StopBits_1;
// Конфигурацияпроверять Кусочек
USART_InitStructure.USART_Parity = USART_Parity_No ;
// Конфигурация аппаратного управления потоком данных
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
// Конфигурация рабочего режима, отправка и получение одновременно
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
// Завершите инициализацию последовательного порта. Конфигурация.
USART_Init(DEBUG_USARTx, &USART_InitStructure);
// Уровень приоритета прерывания последовательного порта Конфигурация
NVIC_Configuration();
// Включить прерывание приема последовательного порта
USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE);
// Включить последовательный порт
USART_Cmd(DEBUG_USARTx, ENABLE);
// Очистить флаг завершения отправки
//USART_ClearFlag(USART1, USART_FLAG_TC);
}
/***************** отправить персонажа **********************/
void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch)
{
/* Отправить один байт данных в USART */
USART_SendData(pUSARTx,ch);
/* Ожидание отправки данных. Регистр пуст. */
while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
}
/***************** Отправить строку **********************/
void Usart_SendString( USART_TypeDef * pUSARTx, char *str)
{
unsigned int k=0;
do
{
Usart_SendByte( pUSARTx, *(str + k) );
k++;
} while(*(str + k)!='\0');
/* Дождитесь завершения отправки */
while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET)
{}
}
/***************** Отправьте 16-значный номер **********************/
void Usart_SendHalfWord( USART_TypeDef * pUSARTx, uint16_t ch)
{
uint8_t temp_h, temp_l;
/* Уберите верхние восемь цифр */
temp_h = (ch&0XFF00)>>8;
/* Удалить младшие восемь бит */
temp_l = ch&0XFF;
/* Отправить старшие восемь битов */
USART_SendData(pUSARTx,temp_h);
while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
/* Отправить младшие восемь битов */
USART_SendData(pUSARTx,temp_l);
while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
}
///Перенаправление функции библиотеки c printf на последовательный порт. Функцию printf можно использовать после перенаправления.
int fputc(int ch, FILE *f)
{
/* Отправьте байтовые данные в последовательный порт */
USART_SendData(DEBUG_USARTx, (uint8_t) ch);
/* Ожидание завершения отправки */
while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);
return (ch);
}
///Перенаправляем функцию библиотеки c scanf на последовательный порт. После перезаписи вы можете использовать scanf, getchar и другие функции.
int fgetc(FILE *f)
{
/* Ожидание ввода данных последовательного порта */
while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_RXNE) == RESET);
return (int)USART_ReceiveData(DEBUG_USARTx);
}
Если эта статья была для вас полезна, пожалуйста, поддержите блогера трижды!