Donker 0 31 января, 2019 Опубликовано 31 января, 2019 (изменено) · Жалоба Передаю с STM32F105RBT6 байт: Цитата USART_SendData(USART1,0x31); на терминал Bray Terminal v1.9, а приходит байт 0xC8 (это 0x31 задом на перёд) а иногда вообще 0xC9 (см. Терминал.png). настройка USART: //---------------------------------------------------------------------------------------- //* Enable USART1 clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); /* NVIC Configuration */ NVIC_InitTypeDef NVIC_InitStructure; /* Enable the USARTx Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* Configure the USART1 */ USART_InitTypeDef USART_InitStructure; /* USART1 configuration ------------------------------------------------------*/ /* USART1 configured as follow: - BaudRate = 115200 baud - Word Length = 8 Bits - One Stop Bit - No parity - Hardware flow control disabled (RTS and CTS signals) - Receive and transmit enabled - USART Clock disabled - USART CPOL: Clock is active low - USART CPHA: Data is captured on the middle - USART LastBit: The clock pulse of the last data bit is not output to the SCLK pin */ 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_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); /* Enable USART1 */ USART_Cmd(USART1, ENABLE); /* Enable the USART1 Receive interrupt: this interrupt is generated when the USART1 receive data register is not empty */ USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //---------------------------------------------------------------------------------------- Пишу в Keil 5.26. Можно ли изменить направление байта на стороне микроконтроллера? Можно ли изменить направление байта на стороне Bray Terminal v1.9? Нормальные ли тайминги для выбранной скорости 115200 (см. ЛА.png)? девять битов должны передаваться за 78us (1/115200)*9=0,000 078 125 а передаются за 58us судя по ЛА! Пишу в Keil 5.26. Можно ли изменить направление байта на стороне микроконтроллера? Можно ли изменить направление байта на стороне Bray Terminal v1.9? Нормальные ли тайминги для выбранной скорости 115200 (см. ЛА.png)? девять битов должны передаваться за 78us (1/115200)*9=0,000 078 125 а передаются за 58us судя по ЛА! Изменено 31 января, 2019 пользователем Donker Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 19 31 января, 2019 Опубликовано 31 января, 2019 · Жалоба 1 hour ago, Donker said: Передаю с STM32F105RBT6 байт Убедитесь для начала, что тактовая частота у проца правильная и годится для этого USARTа на выбранной скорости (допустимая погрешность в пределах нормы). зы Слово "Проблемы" пишется с одной М Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
serglg 0 31 января, 2019 Опубликовано 31 января, 2019 (изменено) · Жалоба по умолчанию в регистрах USART STM32 тот порядок бит, который правильно попадает в комп и данный терминал. Это безусловно. :-) Т.е. проблема только в в скорости и настройки длины байта (в битах). Изменено 31 января, 2019 пользователем serglg Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aleksandr Baranov 1 31 января, 2019 Опубликовано 31 января, 2019 · Жалоба 0x31 задом наперед - это 0x8C, а 0xC8 - это инверсия 0x31 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Donker 0 31 января, 2019 Опубликовано 31 января, 2019 · Жалоба Подобрал число USART_InitStructure.USART_BaudRate = 85038; что бы увидеть в ЛА тайминг 9 бит за 78us и передача от микроконтроллера на терминал заработала! APB2 у меня настроена на 36мГц основная частота 72мГц (это точно, иначе неправильно работали бы таймер и DWT) Вот функция настройки основного тактирования: Спойлер void clock_ini(void) //настройка тактирования { ErrorStatus HSEStartUpStatus; /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------------*/ RCC_DeInit(); /* Системный RESET RCC (делать не обязательно, но полезно на этапе отладки) */ RCC_HSEConfig( RCC_HSE_ON); /* Включаем HSE (внешний кварц) */ HSEStartUpStatus = RCC_WaitForHSEStartUp(); /* Ждем пока HSE будет готов */ if (HSEStartUpStatus == SUCCESS) /* Если с HSE все в порядке */ { /* Следующие две команды касаются исключительно работы с FLASH. Если вы не собираетесь использовать в своей программе функций работы с Flash, FLASH_PrefetchBufferCmd( ) та FLASH_SetLatency( ) можно закомментировать */ //FLASH_PrefetchBufferCmd( FLASH_PrefetchBuffer_Enable); /* Включаем Prefetch Buffer */ /* FLASH Latency. Рекомендовано устанавливать: FLASH_Latency_0 - 0 < SYSCLK? 24 MHz FLASH_Latency_1 - 24 MHz < SYSCLK ? 48 MHz FLASH_Latency_2 - 48 MHz < SYSCLK ? 72 MHz */ FLASH_SetLatency( FLASH_Latency_2); RCC_HCLKConfig( RCC_SYSCLK_Div1); /* HCLK = SYSCLK */ /* Смотри на схеме AHB Prescaler. Частота не делится (RCC_SYSCLK_Div1) */ RCC_PCLK2Config( RCC_HCLK_Div1); /* PCLK2 = HCLK */ /* Смотри на схеме APB2 Prescaler. Частота не делится (RCC_HCLK_Div1) */ RCC_PCLK1Config( RCC_HCLK_Div2); /* PCLK1 = HCLK/2 */ /* Смотри на схеме APB1 Prescaler. Частота делится на 2 (RCC_HCLK_Div2) потому что на выходе APB1 должно быть не более 36МГц (смотри схему) */ /* PLLCLK = 8MHz * 9 = 72 MHz */ /* Указываем PLL от куда брать частоту (RCC_PLLSource_HSE_Div1) и на сколько ее умножать (RCC_PLLMul_9) */ /* PLL может брать частоту с кварца как есть (RCC_PLLSource_HSE_Div1) или поделенную на 2 (RCC_PLLSource_HSE_Div2). Смотри схему */ //RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); RCC_PLLConfig(RCC_PLLSource_PREDIV1 , RCC_PLLMul_9); RCC_PLLCmd( ENABLE); /* Включаем PLL */ while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) {} /* Ждем пока PLL будет готов */ RCC_SYSCLKConfig( RCC_SYSCLKSource_PLLCLK); /* Переключаем системное тактирование на PLL */ while (RCC_GetSYSCLKSource() != 0x08) {} /* Ждем пока переключиться */ } else /* Проблемы с HSE. Тут можно написать свой код, если надо что-то делать когда микроконтроллер не смог перейти на работу с внешним кварцом */ { while (1) {} /* Пока тут заглушка - вечный цикл*/ } } Этот проект тестовый, поэтому я использую загрузку прошивки в RAM, флэш не трогаю, это могло повлиять? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 19 31 января, 2019 Опубликовано 31 января, 2019 · Жалоба 9 minutes ago, Donker said: Подобрал число USART_InitStructure.USART_BaudRate = 85038; что бы увидеть в ЛА тайминг 9 бит за 78us и передача от микроконтроллера на терминал заработала! Коли работает, то тогда так и оставляйте Если такой вариант не устраивает, то разбирайтесь с тактовой частотой проца. Ее для контроля можно вывести на соотв. внешнюю ногу и посмотреть осциллом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 123 31 января, 2019 Опубликовано 31 января, 2019 · Жалоба 1 час назад, Donker сказал: это точно, иначе неправильно работали бы таймер и DWT Это неточно, иначе правильно работал бы УАСПП . Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Donker 0 31 января, 2019 Опубликовано 31 января, 2019 · Жалоба Заливка прошивки обычным образом во флэш проблему занижения таймингов не решает. Если USART использует переменную SystemCoreClock то такое искажение можно объяснить значением SystemCoreClock в 56 мГц, но откуда там могла взяться такая цифра я не понимаю, если кто хочет помочь выкладываю проект: STM32F105RBT6 + USART.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 19 31 января, 2019 Опубликовано 31 января, 2019 · Жалоба 16 minutes ago, Donker said: если кто хочет помочь выкладываю проект: Все, кто хотели помочь, уже помогли - указали место, куда копать. Проблемма уровня junior. Разбирайтесь дальше уже самостоятельно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Integro 0 31 января, 2019 Опубликовано 31 января, 2019 · Жалоба 3 hours ago, Donker said: если кто хочет помочь выкладываю проект: После такой подачки и помогать расхотелось Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A.Lex 0 1 февраля, 2019 Опубликовано 1 февраля, 2019 · Жалоба Сделайте тестовый проект в Cube. Сравните регистры Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Donker 0 1 февраля, 2019 Опубликовано 1 февраля, 2019 · Жалоба На другом форуме ответили - ошибка в библиотеке, можно лепить костыли кому какие нравятся: https://radiokot.ru/forum/viewtopic.php?f=59&t=160456&p=3561277#p3561277 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Integro 0 1 февраля, 2019 Опубликовано 1 февраля, 2019 · Жалоба 56 minutes ago, Donker said: На другом форуме ответили - ошибка в библиотеке, можно лепить костыли кому какие нравятся: Ошибка не в библиотеке, и не читайте больше этот другой форум! :) 1. Baudrate расчитывается на основе SystemCoreClock 2. SystemCoreClock зависит от HSE_VALUE. 3. HSE_VALUE должен задаваться из вне, но по дефолту имеет значение 25MHz у Вас же осцилятор на 8MHz В свойства проекта, в препроцесор нужно добавить определение HSE_VALUE=8000000, или определить его в stm32f4xx_hal_conf.h Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Donker 0 1 февраля, 2019 Опубликовано 1 февраля, 2019 · Жалоба Спасибо, попробую. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Donker 0 3 февраля, 2019 Опубликовано 3 февраля, 2019 · Жалоба Спасибо Integro! Только сейчас смог проверить, если прописать в свойствах проекта HSE_VALUE=8000000 (частота кварца), всё начинает работать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться