Микроконтроллеры 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.