Перейти к содержимому

#19. Инициализация (UART)

Как и для всех периферийных устройств 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 Pins
USART Pin Configuration

Как упоминалось ранее, 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:

  1. Инициализируем часы usart / gpio.
  2. Настроим контакты usart
  3. Настроим и включим usart1

Подключаем пины на нашей плате к плате USB to TTL:

  1. PA9 -> Rx
  2. PA10 -> Tx
  3. 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 должны читать или писать отдельные символы соответственно.

  1. Инициализируем тики таймера.
  2. Инициализируем UART.
  3. Напишем Hello World! \ N \ r » каждые 250 мсек.

Необходимо включить stm32f10x.h, stm32f10x_usart.h и uart.h в файл main.c

Проверяем проект и пробуем скомпилировать.

Добавить комментарий