Подскажите пожалуйста, можно ли нижеприведенной командой выставить необходимую мне скорость порта, например 1382400 ? ( или может каким другими способами? )
stty -F /dev/ttyS3 1500000
Команда позволяет выставить 460800, 921600, 1000000, 1500000, а вот на значения между 1000000 - 1500000: выдает ошибку
stty: invalid argument ‘1382400’
У меня подозрение, что моя связка по UART SK-T507-SODIMM + Микроконтроллер почему-то нестабильно работает на максимальной скорости 1500000, хотелось бы немного снизить.
При этом связка по UART ПК на Windows + Микроконтроллер на скорости 1500000 - работает без сбоев.
mount -t debugfs none /sys/kernel/debug
cat /sys/kernel/debug/clk/clk_summary
apb2 переключился на другой источник pll-periph0 но частоту выставил не 80 а 75 МГц
pll-periph0 5 5 0 600000000 0 0 50000 Y deviceless no_connection_id
spi1 0 0 0 25000000 0 0 50000 N 5011000.spi mod
deviceless no_connection_id
apb2 1 1 0 75000000 0 0 50000 Y deviceless no_connection_id
так что вычислять особого смысла нет - надо просто подогнать, возможно и так будет нормально, потому что у самого уарта есть еще свои внутренние делители и он в драйвере подстраивается под частоту от которой тактируется сам, чем выше частота источника тем ему проще подстроиться.
Все сработало. Надеюсь теперь смогу подобрать работающую частоту.
Для отладки и подбора нужных значений я использовал способ менять файл DTB прямо на целевой ОС, без необходимости компилировать изменения в файле DTS на другом ПК.
Для этого на целевой ОС:
- установить device-tree-compiler
apt-get install device-tree-compiler
- извлечь файл DTS (дерева устройств) из файла .DTB (blob-файл дерева устройств)
вы не первый кто хочет использовать UART на высокой скорости, и как у всех скорей всего возникнут проблемы с потерей данных, поэтому на всякий случай добавил описание как пропатчить ядро для работы в реалтайме для t507
По вашей инструкции получилось собрать вариант ядра с PREEMPT_RT.
Но в итоге без него тоже получилось работать на скорости 2083333:
- частота APB2 = 100 МГц
- в коде своей программы настроить скорость и параметры порта, вот пример ф-ии:
int open_serial_port(int baudRate) {
// Открываем порт в режиме чтения-записи без блокировки
int fd = open("/dev/ttyS1", O_RDWR | O_NOCTTY | O_NONBLOCK);
if (fd == -1) {
printf("Failed to open serial port");
return -1;
}
// Настраиваем структуру termios
struct termios2 tty;
if (ioctl(fd, TCGETS2, &tty) != 0) {
close(fd);
printf("Failed to get terminal attributes");
return -1;
}
// Устанавливаем нестандартную скорость
tty.c_cflag &= ~CBAUD; // Очищаем флаги скорости
tty.c_cflag |= BOTHER; // Разрешаем нестандартную скорость
tty.c_ispeed = baudRate; // Входная скорость
tty.c_ospeed = baudRate; // Выходная скорость
// Дополнительные настройки (8N1, без контроля потока)
tty.c_cflag &= ~PARENB; // Бит чётности отключён
tty.c_cflag &= ~CSTOPB; // 1 стоп-бит
tty.c_cflag &= ~CSIZE; // Очищаем биты размера данных
tty.c_cflag |= CS8; // 8 бит данных
tty.c_cflag &= ~CRTSCTS; // Отключаем аппаратный контроль потока
tty.c_cflag |= CREAD | CLOCAL; // Включаем приёмник и игнорируем управляющие линии