Страница 1 из 1
Проблеммы с передачей по USART на STM32F105RBT6
Добавлено: Ср янв 30, 2019 20:36:09
DENIS451
Передаю с 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)
Re: Проблеммы с передачей по USART на STM32F105RBT6
Добавлено: Чт янв 31, 2019 06:24:00
VladislavS
У тебя даже ЛА есть. Неужели трудно скорость передачи посчитать, если один бит 6,42 мкс?
Re: Проблеммы с передачей по USART на STM32F105RBT6
Добавлено: Чт янв 31, 2019 10:28:13
DENIS451
Дело в том что я впервые разбираюсь с низким уровнем формата Usart, а цифры не сходятся:
девять битов должны передаваться за 78us (1/115200)*9=0,000 078 125
а передаются за 58us судя по ЛА!
Re: Проблеммы с передачей по USART на STM32F105RBT6
Добавлено: Чт янв 31, 2019 12:11:02
VladislavS
И какой из этого сделан вывод?
Re: Проблеммы с передачей по USART на STM32F105RBT6
Добавлено: Чт янв 31, 2019 17:19:49
DENIS451
Подобрал число 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, флэш не трогаю, когда разберусь с приёмом,
сделаю обычный проект, посмотрю что изменится
Re: Проблеммы с передачей по USART на STM32F105RBT6
Добавлено: Чт янв 31, 2019 17:59:53
Reflector
HAL при настройке USART использует переменную SystemCoreClock, если BaudRate приходится задавать на треть меньше, значит видимо значение в SystemCoreClock на треть больше, разбирайся почему.
Re: Проблеммы с передачей по USART на STM32F105RBT6
Добавлено: Чт янв 31, 2019 20:37:44
DENIS451
Заливка прошивки обычным образом во флэш проблему занижения таймингов не решает.
Если USART использует переменную SystemCoreClock то такое искажение можно объяснить значением SystemCoreClock в 56 мГц,
но откуда там могла взяться такая цифра я не понимаю, если кто хочет помочь выкладываю проект:
Re: Проблеммы с передачей по USART на STM32F105RBT6
Добавлено: Чт янв 31, 2019 20:56:41
Myp3ik
Код: Выделить всё
USART1->BRR = (uint16_t)((USART_CLOCK + USART_BAUDRATE / 2) / USART_BAUDRATE);
USART_CLOCK - частота тактирования модуля USART
Re: Проблеммы с передачей по USART на STM32F105RBT6
Добавлено: Чт янв 31, 2019 21:04:28
DENIS451
Я же пытаюсь настраивать USART через библиотеки, я что пропустил какую то настройку?
Re: Проблеммы с передачей по USART на STM32F105RBT6
Добавлено: Чт янв 31, 2019 21:06:35
Myp3ik
В библиотеке ошибка.
воткните то что я написал после
USART_Init(USART1, &USART_InitStructure);
Re: Проблеммы с передачей по USART на STM32F105RBT6
Добавлено: Чт янв 31, 2019 21:19:50
DENIS451
Это у вас код от какого микроконтроллера?
Такие дефайны из main.cpp не видны:
user/main.cpp(364): error: use of undeclared identifier 'USART_CLOCK'
user/main.cpp(364): error: use of undeclared identifier 'USART_BAUDRATE'
****************************************************************
Если это надо самому высчитывать, проще оставить как есть написав поясняющий комментарий откуда взялось такое число.
Re: Проблеммы с передачей по USART на STM32F105RBT6
Добавлено: Чт янв 31, 2019 22:08:25
Myp3ik
Код: Выделить всё
#define USART_BAUDRATE ((uint32_t)1000000)
#define USART_CLOCK ((uint32_t)48000000)
USART1->BRR = (uint16_t)((USART_CLOCK + USART_BAUDRATE / 2) / USART_BAUDRATE);
USART_CLOCK может быть другой. Это частота шины APB2.
Добавлено after 22 minutes 20 seconds:
Кстати, в кадре UART, при ваших настройках 10 бит - Старт бит -> 8 бит данных -> 1 стоп бит
Re: Проблеммы с передачей по USART на STM32F105RBT6
Добавлено: Пт фев 01, 2019 07:41:34
DENIS451
Спасибо.
Я имел ввиду что для замеров скорости в ЛА надо использовать 9 бит, иначе не вседа есть фронт за который можно зацепиться.
Re: Проблеммы с передачей по USART на STM32F105RBT6
Добавлено: Пт фев 01, 2019 07:56:01
VladislavS
[uquote="DENIS451",url="/forum/viewtopic.php?p=3560931#p3560931"]Подобрал число USART_InitStructure.USART_BaudRate = 85038;[/uquote]Что??? Подобрал? Подбирают сумочку под цвет туфелек! Программирование - точная наука.
Re: Проблеммы с передачей по USART на STM32F105RBT6
Добавлено: Вс фев 03, 2019 23:00:28
DENIS451
Если прописать в свойствах проекта HSE_VALUE=8000000 (частота кварца), всё начинает работать правильно.