Как и для всех периферийных устройств STM32, USART должны быть инициализированы перед использованием. Эта инициализация включает в себя настройку контактов, распределение тактовых импульсов и инициализацию устройства. Инициализация выполняется наиболее удобно с помощью библиотеки стандартного периферийного драйвера. Компонент stm32f100 в плате имеет 3 USART, которые называются USART1 — USART3.
Есть три модуля (в дополнение к общему заголовку), которые являются частью библиотеки драйверов, которые требуются для приложений USART.
#include <stm32f10x.h> #include <stm32f10x_gpio.h> #include <stm32f10x_rcc.h> #include <stm32f10x_usart.h>
Первым этапом инициализации является включение сигналов RCC (сброс и управление часами) для различных функциональных блоков, необходимых для использования USART — к ним относятся порты GPIO (порт A для USART1), компонент USART и модуль AF (альтернативная функция). Для USART1 необходим шаг настройки RCC:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA , ENABLE);
USART2 и USART3 являются периферийными устройствами «APB1», поэтому их инициализация RCC немного отличается. Обратите внимание, что различные флаги APB2 расположены вместе; также допустимо включать часы в отдельных шагах.
Когда часы включены, необходимо настроить выводы USART.
Справочные руководства по STM32 содержат ключевую информацию для настройки выводов GPIO для различных устройств. Более полная информация о конфигурации выводов доступна в техническом описании устройства.
Как упоминалось ранее, USART в STM32 способны поддерживать дополнительный режим работы — синхронный последовательный — который требует отдельного тактового сигнала (USARTx_CK), который мы не будем использовать. Кроме того, USART имеют возможность поддерживать «аппаратное управление потоком» (сигналы USARTx_RTS и USARTx_CTS). Для базовой последовательной связи мы должны настроить два контакта — USART1_Tx и USART1_Rx. Первый является выходом, «управляемым» компонентом USART («альтернативная функция» в документации по STM32), а последним является входом, который может быть сконфигурирован как плавающий или подтянутый к верху. Конфигурация контактов выполняется с помощью функций и констант, определенных в stm32f10x_gpio.h.
GPIO_InitTypeDef GPIO_InitStruct; GPIO_StructInit(&GPIO_InitStruct); // Initialize USART1_Tx GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA , &GPIO_InitStruct); // Initialize USART1_RX GPIO_InitStruct.GPIO_PIN = GPIO_Pin_10; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA , &GPIO_InitStruct);
Последним этапом инициализации является настройка USART. Мы используем стандартную инициализацию USART 9600 «бод», 8 бит данных, 1 стоповый бит, без контроля четности и без управления потоком, предоставляемые библиотечной процедурой USART_StructInit. Изменения в инициализации по умолчанию вносятся путем изменения определенных полей USART_InitStructure.1.
// see stm32f10x_usart.h USART_InitTypeDef USART_InitStructure; // Initialize USART structure USART_StructInit(&USART_InitStructure); // Modify USART_InitStructure for non-default values , e.g. // USART_InitStructure.USART_BaudRate = 38400; USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1 ,&USART_InitStructure); USART_Cmd(USART1 , ENABLE);
Код в предыдущих разделах предоставляет все основные функции, необходимые для успешного использования USART STM32.Пройдем через процесс разработки простого приложения, которое многократно отправляет строку «hello world» из STM32 на хост-компьютер.
int uart_open(USART_TypeDef* USARTx , uint32_t baud, uint32_t flags); int uart_close(USART_TypeDef* USARTx); int uart_putc(int c, USART_TypeDef* USARTx); int uart_getc(USART_TypeDef* USARTx);
Функция uart_open:
- Инициализируем часы usart / gpio.
- Настроим контакты usart
- Настроим и включим usart1
Подключаем пины на нашей плате к плате USB to TTL:
- PA9 -> Rx
- PA10 -> Tx
- GND -> GND
Нам понадобятся следующие директивы include:
#include <stm32f10x.h> #include <stm32f10x_rcc.h> #include <stm32f10x_gpio.h> #include <stm32f10x_usart.h> #include "uart.h"
Функции uart_putc и uart_getc должны читать или писать отдельные символы соответственно.
- Инициализируем тики таймера.
- Инициализируем UART.
- Напишем Hello World! \ N \ r » каждые 250 мсек.
Необходимо включить stm32f10x.h, stm32f10x_usart.h и uart.h в файл main.c
Проверяем проект и пробуем скомпилировать.

