Например TDA7294

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





Текущее время: Вт апр 16, 2024 21:43:22

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



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

Зарегистрирован: Вс июл 03, 2016 17: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]
Скачиваний: 229


Добавлено 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]
Скачиваний: 249
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Cимволы при передаче по USART с платы STM32F3Discovery
СообщениеДобавлено: Вс авг 13, 2017 16:21:37 
Нашел транзистор. Понюхал.
Аватар пользователя

Карма: 5
Рейтинг сообщений: 21
Зарегистрирован: Пн июл 04, 2016 16:51:22
Сообщений: 196
Откуда: Россия, Омск
Рейтинг сообщения: 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)) {};
};
};


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

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

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

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


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: Cимволы при передаче по USART с платы STM32F3Discovery
СообщениеДобавлено: Вс авг 13, 2017 19:10:20 
Друг Кота
Аватар пользователя

Карма: 30
Рейтинг сообщений: 155
Зарегистрирован: Пн июл 28, 2008 22:12:01
Сообщений: 3604
Рейтинг сообщения: 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)) {};
};
};


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


Вернуться наверх
 
Организация питания на основе надежных литиевых аккумуляторов EVE и микросхем азиатского производства

Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.

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

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

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


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Cимволы при передаче по USART с платы STM32F3Discovery
СообщениеДобавлено: Вт авг 15, 2017 18:25:16 
Нашел транзистор. Понюхал.
Аватар пользователя

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


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


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

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


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


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

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

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


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

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


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

Часовой пояс: UTC + 3 часа


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

Сейчас этот форум просматривают: Юрий48 и гости: 17


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

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


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