Воскресенье, 19.11.2017, 09:29


Главная
Регистрация
Вход
Приветствую Вас Гость | RSS  
Меню сайта

Категории раздела
Уроки по программированию stm32f1xx [8]
Данный раздел не имеет отношения к WoW. :-) Он создан для написания статей по программированию stm32f1xx, как памятка, чтоб не забывать что и где писать.
Уроки по программированию stm32f4xx [13]

Форма входа

Главная » Статьи » Уроки по программированию stm32fxxx » Уроки по программированию stm32f1xx

Урок 6: USART на StdPeriph
В данном уроке мы не будем подробно рассматривать сам интерфейс UART. Подразумевается, что вы его и так хорошо знаете. Если это не так, то можете почитать про него скажем тут.
Программирование UART в STM32 происходит по тому же алгоритму, что и раньше:

0) Подключить USART в StdPeriph.
1) Включаем тактирование порта, на который выведен UART.
2) Инициализируем выводы UART на работу в альтернативном режиме.
3) Включаем тактирование UART.
4) Инициализируем UART.
5) Разрешаем глобальные прерывания прерывания.
6) Разрешаем прерывания от UART.
7) Включаем работу UART.

На этом инициализация заканчивается.

Пройдёмся по всему по порядку.
0) Для подключения надо просто расскоментировать строку #include "stm32f10x_usart.h" в файле stm32f10x_conf.h

1) Включение тактирования порта вам должно быть знакомо:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

2) Настройка портов имеет только оду тонкость. Нужно настроить вывод TX (передача) как выход Push/Pull, а RX (приём) как вход с открытым коллектором.

//Настраиваем порт на выход Push/Pull
PORTA_init_struct.GPIO_Pin = GPIO_Pin_9;
PORTA_init_struct.GPIO_Speed = GPIO_Speed_50MHz;
PORTA_init_struct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &PORTA_init_struct);

//Настраиваем порт на вход с открытым коллектором
PORTA_init_struct.GPIO_Pin = GPIO_Pin_10;
PORTA_init_struct.GPIO_Speed = GPIO_Speed_50MHz;
PORTA_init_struct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &PORTA_init_struct);

3) Включение тактирования UART делается аналогично:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

APB2PeriphClockCmd - Список устройств, которые включаются этой функцией можно найти в файле stm32f10x_rcc.h.

4) Собственно сама инициализация:
Для инициализации с помощью библиотеки StdPeriph как обычно надо..

Извините, потом допишу статью как надо.

Вот код:

USART_InitTypeDef USART_InitStructure;

// конфигурируем USART1
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

USART_Init(USART1, &USART_InitStructure);

5) NVIC_EnableIRQ(USART1_IRQn);

6) разрешаем прерывания по приёму USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

7) USART_Cmd(USART1, ENABLE);

Функция прерывания от UART, которая возвращает принятый байт. Только тут стоит учитывать 2 момента:
1) Флаг прерывания зачастую аппаратно не сбрасывается.
2) У USART все прерывания вызывают одну и ту же функцию.
Т.е. нам надо различать различные прерывания и самим сбрасывать флаг прерывания. В итоге функция, вызываемая USART выглядит так:
void USART1_IRQHandler(void)
{
// Обработка события RXNE
if ( USART_GetITStatus(USART1, USART_IT_RXNE) )
{
USART_ClearITPendingBit(USART1, USART_IT_RXNE);

//Сюда пишется, что должно произойти приёме одного байта
USART_SendData(USART1, USART_ReceiveData(USART1));
};

// Обработка события TXE
if ( USART_GetITStatus(USART1, USART_IT_TXE) )
{
USART_ClearITPendingBit(USART1, USART_IT_TXE);

//Сюда пишется, что должно произойти после передачи байта.

};

}
}

И последнее, перед посылкой ожидайте отправки предыдущего байта с помощью строки:
while (!USART_GetFlagStatus(USART1, USART_SR_TXE)) {}

Т.е. выглядит это так:

//-------------------------------------------------------------------------------------
//Функция отправляющая байт в UART
//-------------------------------------------------------------------------------------
void send_to_uart(uint8_t data)
{
while(!(USART1->SR & USART_SR_TC)); //Ждем пока бит TC в регистре SR станет 1
USART1->DR=data; //Отсылаем байт через UART
}
Категория: Уроки по программированию stm32f1xx | Добавил: Korvin (25.07.2012)
Просмотров: 7542 | Комментарии: 7 | Рейтинг: 3.7/3
Всего комментариев: 6
0
6  
Спасибо большое, за отличную статью!

0
1  
Помогите с инициализацией синхронного юарта.
контролер должен быть мастером, синхронизация по ниспадающему фронту, 8 бит, паритет по нечетному, скорость любая на свой вкус от 600 до 9600 (желательно с пояснением как изменить)
Спасибо

0
2  
Например так:
USART_InitStructure.USART_BaudRate = 9600;//Скорость Уарта
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//Длина слова
USART_InitStructure.USART_StopBits = USART_StopBits_1;//Количество стоп бит
USART_InitStructure.USART_Parity = USART_Parity_Odd;//Проверка по нечётности
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//Приём и передача.
//Если Вам нужен синхронный УАРТ, то, наверное, Вам требуется аппаратный контроль потока. Если не надо, то поставьте USART_HardwareFlowControl_None.
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_RTS_CTS;

Остальное, как описано в примере. Уточните Ваш микроконтроллер. Возможно у Вас не stm32f1xx.

0
3  
f100c4

а где указывается что режим синхронный?

0
4  
а еще по какому фронту синхронизироваться, по ниспадающему или по нарастающему?

1
5  
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_RTS_CTS;
 Эта настройка определяет синхронный режим. Но он работает, если вы используете эти выводы. Если Вы их не используете, то режим всё равно будет асинхронный, а использование этих выводов надо отключить.
Синхронизация происходит по уровням сигнала автоматически. Вы наверное путаете USART со SPI.

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Поиск

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Copyright MyCorp © 2017