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]
Скачиваний: 230
Добавлено after 3 hours 35 minutes 57 seconds: Исправил код в части установки скорости. Подбирал методом тыка. Теперь почти работает. Иногда почему-то одну букву пишет неправильно.
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 мм примерно в длину. И он заглючил. Приложил код, может кому пригодится.
Мама дорогая... Вы что курили, что начали ЗАДЕРЖКАМИ делать паузы между символами? Обычно ожидание готовности переферии выполняется проверкой регистра-статуса (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)) {}; }; };
А паузы-то я просто не убрал. Добавил их, когда не знал, что проблема в скорости передачи. В терминал тогда шел набор кракозябров и чтобы их отличать по времени появления и сравнить, я сделал паузы. Выяснилось что приходило по два байта или по три. То что готовность периферии проверяется специально предназначенными регистрами это понятно.
Про строку ясно тоже. Я так и сделаю. Хотел код попроще, пока он не работал.
Вопрос вот какой остался. Какую частоту в мануалах искать, чтобы не наугад скорость ставить?
С такими ляпами вряд-ли. Расчет BRR можно сделать дефайном в хэдере , или вы думаете что все используют тактовую 8MHz? Настройка пина на AF полагаясь на дефолтное состояние регистра всегда чревата. Выбор AF -магические цифры. При передаче проверяют не TC а TXE. Строка должна выводиться зараз и строки нультерминэйтед. Задержки в виде пустых циклов прерогатива ардуинщиков.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Тем не менее, данная конструкция так же работает. Это был самый простой набросок, пока не разобрался нормально с работой DMA. Теперь данные быстро пишутся в кольцевой буфер, обновляется позиция записи, и, возможно, запускается DMA (если не запущен; если уже работает - по прерыванию конца передачи происходит проверка - совпадают ли позиции записи и последнего чтения, и, если нет - DMA запускается снова). Так что теперь код больше похож на "Положил патрон и забыл. Либо насыпал пол цинка патронов, а DMA сам разрулит потом". Переполнения случаются, не без них.
Не то, чтобы непродумано, просто не имеет смысла заморачиваться с выводом некоторых сообщений. Да и переполнение просто не контролируется на уровне программы. Во всяком случае, не контролировалось чуть ранее. Необходимости не было в выводе лога загрузки и событий в _таких_ объёмах. А если не слишком активно писать отладочную информацию - то и в "боевом" режиме до переполнения не доходит.
Сейчас этот форум просматривают: john1770 и гости: 27
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения