usart stm32 cmsis настройка и примеры кода

0
12

Usart stm32 cmsis

Микроконтроллеры STM32 широко используются в различных проектах благодаря своей гибкости и производительности. Одним из ключевых интерфейсов, которые поддерживают эти устройства, является USART (Universal Synchronous/Asynchronous Receiver/Transmitter). Этот интерфейс позволяет организовать как асинхронную, так и синхронную передачу данных, что делает его незаменимым для обмена информацией с другими устройствами.

В данной статье мы рассмотрим, как настроить USART на микроконтроллере STM32 с использованием библиотеки CMSIS. CMSIS (Cortex Microcontroller Software Interface Standard) – это стандарт, разработанный ARM для унификации работы с периферией микроконтроллеров. Мы разберем основные этапы настройки, включая конфигурацию тактирования, настройку регистров и обработку прерываний, а также приведем примеры кода для передачи и приема данных.

Примеры кода будут представлены для работы в среде разработки STM32CubeIDE, что позволит вам быстро адаптировать их под свои задачи. Мы также рассмотрим типичные ошибки, которые могут возникнуть при настройке USART, и способы их устранения. Этот материал будет полезен как начинающим разработчикам, так и опытным инженерам, которые хотят глубже разобраться в работе USART на STM32.

Настройка USART в STM32 через CMSIS

Для настройки USART в STM32 с использованием CMSIS необходимо выполнить несколько шагов. Сначала включите тактирование соответствующего периферийного модуля. Например, для USART2 на STM32F4xx используйте следующий код:

RCC->APB1ENR |= RCC_APB1ENR_USART2EN;

Затем настройте GPIO-пины для работы с USART. Убедитесь, что выбранные пины поддерживают альтернативные функции. Например, для TX и RX на USART2:

GPIOA->MODER |= GPIO_MODER_MODE2_1 | GPIO_MODER_MODE3_1; // PA2 и PA3 в режиме альтернативной функции
GPIOA->AFR[0] |= (7 << GPIO_AFRL_AFSEL2_Pos) | (7 << GPIO_AFRL_AFSEL3_Pos); // Выбор AF7 для USART2

Далее настройте параметры USART, такие как скорость передачи данных, количество бит данных, стоп-биты и контроль четности. Например, для скорости 9600 бод:

USART2->BRR = SystemCoreClock / 9600; // Установка бодрейта
USART2->CR1 |= USART_CR1_TE | USART_CR1_RE; // Включение передатчика и приемника
USART2->CR1 |= USART_CR1_UE; // Включение USART

Для передачи данных используйте регистр данных USART. Например, отправка символа:

while (!(USART2->SR & USART_SR_TXE)); // Ожидание готовности передатчика
USART2->DR = 'A'; // Отправка символа 'A'

Для приема данных проверьте флаг RXNE в регистре состояния:

while (!(USART2->SR & USART_SR_RXNE)); // Ожидание приема данных
char receivedData = USART2->DR; // Чтение принятого символа

Таким образом, настройка USART через CMSIS позволяет гибко управлять параметрами передачи данных и интегрировать USART в ваши проекты на STM32.

Примеры кода для работы с USART

Для настройки USART в STM32 с использованием CMSIS можно использовать следующий пример кода. Сначала необходимо включить тактирование USART и GPIO:

RCC->APB2ENR |= RCC_APB2ENR_USART1EN;  // Включение тактирования USART1
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;   // Включение тактирования GPIOA

Далее настраиваем GPIO для работы с USART. Например, для USART1 на пинах PA9 (TX) и PA10 (RX):

GPIOA->MODER &= ~(GPIO_MODER_MODER9 | GPIO_MODER_MODER10);  // Сброс режима пинов
GPIOA->MODER |= (2 << GPIO_MODER_MODER9_Pos) | (2 << GPIO_MODER_MODER10_Pos);  // Альтернативный режим
GPIOA->AFR[1] |= (7 << GPIO_AFRH_AFSEL9_Pos) | (7 << GPIO_AFRH_AFSEL10_Pos);  // Выбор альтернативной функции

Теперь настраиваем USART. Устанавливаем скорость передачи, количество бит данных, стоп-биты и включаем передатчик и приемник:

USART1->BRR = 0x683;  // Скорость передачи 9600 бод при тактовой частоте 16 МГц
USART1->CR1 &= ~USART_CR1_M;  // 8 бит данных
USART1->CR2 &= ~USART_CR2_STOP;  // 1 стоп-бит
USART1->CR1 |= USART_CR1_TE | USART_CR1_RE;  // Включение передатчика и приемника
USART1->CR1 |= USART_CR1_UE;  // Включение USART

Для отправки данных через USART можно использовать следующую функцию:

void USART_SendChar(USART_TypeDef* USARTx, char ch) {
while (!(USARTx->ISR & USART_ISR_TXE));  // Ожидание готовности передатчика
USARTx->TDR = ch;  // Отправка символа
}

Для приема данных можно использовать аналогичную функцию:

char USART_ReceiveChar(USART_TypeDef* USARTx) {
while (!(USARTx->ISR & USART_ISR_RXNE));  // Ожидание приема данных
return USARTx->RDR;  // Возврат принятого символа
}

Эти примеры кода позволяют настроить и использовать USART для простой передачи и приема данных в STM32 с использованием CMSIS.