Например TDA7294

 Форум РадиоКот • Просмотр темы - Cимволы при передаче по USART с платы STM32F3Discovery
Форум РадиоКот
Здесь можно немножко помяукать :)



Текущее время: Пн окт 23, 2017 02:11:03



Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Cимволы при передаче по USART с платы STM32F3Discovery
СообщениеДобавлено: Вс авг 13, 2017 15:13:02 
Родился

Зарегистрирован: Вс июл 03, 2016 18:16:23
Сообщений: 13
Рейтинг сообщения: 0
Пытаюсь освоить передачу данных с контроллера при помощи USART. Код посимвольно посылает слово "Hello!".

Код:
#include "stm32f3xx.h"      // Device header.
#include "stdio.h"            // Библиотека стандартного ввода-вывода (ANSI C).
#include "string.h"            // Строки (ANSI C).

void UART3_init()
{
   // Настройка UART.
   RCC->APB1ENR |= RCC_APB1ENR_USART3EN;            // Запуск тактового генератора USART3.
   USART3->BRR = 0x9c4;                                    // Установка требуемой скорости.
   USART3->CR1 |= USART_CR1_UE;                        // Включить передатчик USART.
   USART3->CR1 |= USART_CR1_TE;                        // Включение передатчика.
   RCC->AHBENR |= RCC_AHBENR_GPIOBEN;               // Включить тактовый генератор порта.
   // Настройка выводов порта (альтернативная функция).
   GPIOB->MODER |= GPIO_MODER_MODER10_1;
   // Установка альтернативной функции USART3_TX.
   GPIOB->AFR[1] |= 0x00000700;
}

// Передача байта данных.
void UART3_TX_byte(char byte)
{
   // Ждем готовность регистра TDR к приему (Transmission Complete).
   while(!(USART3->ISR & USART_ISR_TC)) {};
   USART3->TDR = byte;                                     // Передача байта.
}



int main(void)
{
      unsigned long int i;
     UART3_init(); // Инициализация UART3
    UART3_TX_byte('H');
    UART3_TX_byte('E');
     UART3_TX_byte('L');
    UART3_TX_byte('L');
     UART3_TX_byte('O');
    UART3_TX_byte('!');
      //for(i = 0; i < 0xFFFFF; i++) {} // Пауза.
}


При срабатывании кода на виртуальный COM-порт приходят такие данные:

Изображение

Я ожидал, что будут отображаться символы слова "HELLO!". Этого не происходит. При включении кнопки ASCII на экране данных пусто. Кроме того, например, буква H имеет код 48. В принятых данных не то и отсутствуют повторяющиеся буквы L.

Пробовал ставить пауза между инициализацией и отправкой каждого символа. Заметил, что 1C 00 FC приходят разом, три байта.

Почему приходит по два-три байта, если я отправляю char? Можно ли сделать так, чтобы программа Terminal отображала символы?

Проект Keil uVision
Вложение:
Комментарий к файлу: Проект Keil uVision
MyUART.zip [321.11 KiB]
Скачиваний: 16


Добавлено after 3 hours 35 minutes 57 seconds:
Исправил код в части установки скорости. Подбирал методом тыка. Теперь почти работает. Иногда почему-то одну букву пишет неправильно.

Код:
#include "stm32f3xx.h"      // Device header.
#include "stdio.h"            // Библиотека стандартного ввода-вывода (ANSI C).
#include "string.h"            // Строки (ANSI C).

void UART3_init()
{
   // Настройка UART.
   RCC->APB1ENR |= RCC_APB1ENR_USART3EN;            // Запуск тактового генератора USART3.
   USART3->BRR = 8000000L/9600;                                    // Установка требуемой скорости.
   USART3->CR1 |= USART_CR1_UE;                        // Включить передатчик USART.
   USART3->CR1 |= USART_CR1_TE;                        // Включение передатчика.
   RCC->AHBENR |= RCC_AHBENR_GPIOBEN;               // Включить тактовый генератор порта.
   // Настройка выводов порта (альтернативная функция).
   GPIOB->MODER |= GPIO_MODER_MODER10_1;
   // Установка альтернативной функции USART3_TX.
   GPIOB->AFR[1] |= 0x00000700;
}

// Передача байта данных.
void UART3_TX_byte(char byte)
{
   // Ждем готовность регистра TDR к приему (Transmission Complete).
   while(!(USART3->ISR & USART_ISR_TC)) {};
   USART3->TDR = byte;                                     // Передача байта.
}



int main(void)
{
      unsigned long int i;
     UART3_init(); // Инициализация UART3
      for(i = 0; i < 0xFFFFF; i++) {} // Пауза.
    UART3_TX_byte('H');
      for(i = 0; i < 0xFFFFF; i++) {} // Пауза.
    UART3_TX_byte('E');
      for(i = 0; i < 0xFFFFF; i++) {} // Пауза.
     UART3_TX_byte('L');
      for(i = 0; i < 0xFFFFF; i++) {} // Пауза.
    UART3_TX_byte('L');
      for(i = 0; i < 0xFFFFF; i++) {} // Пауза.
     UART3_TX_byte('O');
      for(i = 0; i < 0xFFFFF; i++) {} // Пауза.
    UART3_TX_byte('!');
      
}


Изображение

Появился ещё вопрос. Верно ли я понимаю, что частота передачи данных соответствует частоте работы порта?

Добавлено after 27 minutes 13 seconds:
Заменил самодельный кабель на короткие китайские перемычки для Ардуино. Работает. Буквы не теряются. Видимо, длинный кабель нельзя. Я для удобства сделал 700 мм примерно в длину. И он заглючил. Приложил код, может кому пригодится.


Вложения:
MyUART.zip [321.17 KiB]
Скачиваний: 19
Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Cимволы при передаче по USART с платы STM32F3Discovery
СообщениеДобавлено: Вс авг 13, 2017 17:21:37 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Пн июл 04, 2016 17:51:22
Сообщений: 39
Откуда: Россия, Омск
Рейтинг сообщения: 0
Мама дорогая...
Вы что курили, что начали ЗАДЕРЖКАМИ делать паузы между символами?
Обычно ожидание готовности переферии выполняется проверкой регистра-статуса (USART3->SR). Это если решать проблему в лоб.
Иначе - это ожидание выносится в функцию передачи.
Далее. Может, отправлять сразу строку?
void USART_Send(char *s) {
while(*s) {
USART3_SendChar(*s);
s++;
};
};
Всё. Вся функция.
Отправляем, естественно, так:
USART_Send("Hello World!");
Ну и USART3_SendChar:
void USART3_SendChar(char c) {
USART3->DR = c;
while (!(USART3->SR & USART_SR_TC)) {};
};
};


Вернуться наверх
 Профиль  
 
От идеи до готового устройства! Нужен только EasyEDA!

Бесплатный инструмент для проектирования печатных плат - нарисуй свою плату прямо сейчас!

JLCPCB for PCB Prototyping, всего $2 за 10 печатных плат 10×10см. Доставка 2-3 дня.

LCSC Parts: Экономия до 50%, большой выбор компонентов в наличии, отправка заказа в день оплаты.

Не в сети
 Заголовок сообщения: Re: Cимволы при передаче по USART с платы STM32F3Discovery
СообщениеДобавлено: Вс авг 13, 2017 19:24:11 
Родился

Зарегистрирован: Вс июл 03, 2016 18:16:23
Сообщений: 13
Рейтинг сообщения: 0
А паузы-то я просто не убрал. Добавил их, когда не знал, что проблема в скорости передачи. В терминал тогда шел набор кракозябров и чтобы их отличать по времени появления и сравнить, я сделал паузы. Выяснилось что приходило по два байта или по три. То что готовность периферии проверяется специально предназначенными регистрами это понятно.

Про строку ясно тоже. Я так и сделаю. Хотел код попроще, пока он не работал.

Вопрос вот какой остался. Какую частоту в мануалах искать, чтобы не наугад скорость ставить?


Вернуться наверх
 Профиль  
 

Не в сети
 Заголовок сообщения: Re: Cимволы при передаче по USART с платы STM32F3Discovery
СообщениеДобавлено: Вс авг 13, 2017 20:10:20 
Собутыльник Кота
Аватар пользователя

Карма: 11
Зарегистрирован: Пн июл 28, 2008 23:12:01
Сообщений: 2564
Рейтинг сообщения: 0
Приложил код, может кому пригодится.

С такими ляпами вряд-ли.
Расчет BRR можно сделать дефайном в хэдере , или вы думаете что все используют тактовую 8MHz?
Настройка пина на AF полагаясь на дефолтное состояние регистра всегда чревата.
Выбор AF -магические цифры.
При передаче проверяют не TC а TXE.
Строка должна выводиться зараз и строки нультерминэйтед.
Задержки в виде пустых циклов прерогатива ардуинщиков.

Добавлено after 5 minutes 57 seconds:
Ну и USART3_SendChar:
void USART3_SendChar(char c) {
USART3->DR = c;
while (!(USART3->SR & USART_SR_TC)) {};
};
};


Бред не несите.


Вернуться наверх
 Профиль  
 

Не в сети
 Заголовок сообщения: Re: Cимволы при передаче по USART с платы STM32F3Discovery
СообщениеДобавлено: Пн авг 14, 2017 08:47:26 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 21
Зарегистрирован: Сб май 14, 2011 22:16:04
Сообщений: 1986
Откуда: г. Чайковский
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Лучше всего - это DMA использовать, сказал камню откуда и сколько и дальше забота камня.

_________________
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Cимволы при передаче по USART с платы STM32F3Discovery
СообщениеДобавлено: Вт авг 15, 2017 19:25:16 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Пн июл 04, 2016 17:51:22
Сообщений: 39
Откуда: Россия, Омск
Рейтинг сообщения: 0
Бред не несите.


Тем не менее, данная конструкция так же работает.
Это был самый простой набросок, пока не разобрался нормально с работой DMA.
Теперь данные быстро пишутся в кольцевой буфер, обновляется позиция записи, и, возможно, запускается DMA (если не запущен; если уже работает - по прерыванию конца передачи происходит проверка - совпадают ли позиции записи и последнего чтения, и, если нет - DMA запускается снова).
Так что теперь код больше похож на "Положил патрон и забыл. Либо насыпал пол цинка патронов, а DMA сам разрулит потом".
Переполнения случаются, не без них.


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Cимволы при передаче по USART с платы STM32F3Discovery
СообщениеДобавлено: Ср авг 16, 2017 14:19:12 
Собутыльник Кота
Аватар пользователя

Карма: 11
Зарегистрирован: Пн июл 28, 2008 23:12:01
Сообщений: 2564
Рейтинг сообщения: 0
Тем не менее, данная конструкция так же работает.


TC для потоковых транзакций, изучите RM на досуге...


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Cимволы при передаче по USART с платы STM32F3Discovery
СообщениеДобавлено: Ср авг 16, 2017 16:31:23 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 21
Зарегистрирован: Сб май 14, 2011 22:16:04
Сообщений: 1986
Откуда: г. Чайковский
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
AlanDrakes писал(а):
Переполнения случаются, не без них.
Ну неее, значит где-то что-то не додумано. Хотя в каких-то задачах, в принципе, это может быть допустимым.

_________________
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Cимволы при передаче по USART с платы STM32F3Discovery
СообщениеДобавлено: Ср авг 16, 2017 18:08:12 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Пн июл 04, 2016 17:51:22
Сообщений: 39
Откуда: Россия, Омск
Рейтинг сообщения: 0
Не то, чтобы непродумано, просто не имеет смысла заморачиваться с выводом некоторых сообщений. Да и переполнение просто не контролируется на уровне программы. Во всяком случае, не контролировалось чуть ранее.
Необходимости не было в выводе лога загрузки и событий в _таких_ объёмах. А если не слишком активно писать отладочную информацию - то и в "боевом" режиме до переполнения не доходит.


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 



Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y