Проблеммы с передачей по USART на STM32F105RBT6

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
DENIS451
Прорезались зубы
Сообщения: 213
Зарегистрирован: Вт сен 09, 2008 18:17:27

Проблеммы с передачей по USART на STM32F105RBT6

Сообщение 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)
Вложения
ЛА.png
(38.01 КБ) 361 скачивание
Терминал.png
(37.12 КБ) 428 скачиваний
Реклама
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Проблеммы с передачей по USART на STM32F105RBT6

Сообщение VladislavS »

У тебя даже ЛА есть. Неужели трудно скорость передачи посчитать, если один бит 6,42 мкс?
Реклама
DENIS451
Прорезались зубы
Сообщения: 213
Зарегистрирован: Вт сен 09, 2008 18:17:27

Re: Проблеммы с передачей по USART на STM32F105RBT6

Сообщение DENIS451 »

Дело в том что я впервые разбираюсь с низким уровнем формата Usart, а цифры не сходятся:
девять битов должны передаваться за 78us (1/115200)*9=0,000 078 125
а передаются за 58us судя по ЛА!
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Проблеммы с передачей по USART на STM32F105RBT6

Сообщение VladislavS »

И какой из этого сделан вывод?
Реклама
Эиком - электронные компоненты и радиодетали
DENIS451
Прорезались зубы
Сообщения: 213
Зарегистрирован: Вт сен 09, 2008 18:17:27

Re: Проблеммы с передачей по USART на STM32F105RBT6

Сообщение 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, флэш не трогаю, когда разберусь с приёмом,
сделаю обычный проект, посмотрю что изменится
Реклама
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: Проблеммы с передачей по USART на STM32F105RBT6

Сообщение Reflector »

HAL при настройке USART использует переменную SystemCoreClock, если BaudRate приходится задавать на треть меньше, значит видимо значение в SystemCoreClock на треть больше, разбирайся почему.
Реклама
DENIS451
Прорезались зубы
Сообщения: 213
Зарегистрирован: Вт сен 09, 2008 18:17:27

Re: Проблеммы с передачей по USART на STM32F105RBT6

Сообщение DENIS451 »

Заливка прошивки обычным образом во флэш проблему занижения таймингов не решает.
Если USART использует переменную SystemCoreClock то такое искажение можно объяснить значением SystemCoreClock в 56 мГц,
но откуда там могла взяться такая цифра я не понимаю, если кто хочет помочь выкладываю проект:
Вложения
STM32F105RBT6 + USART.rar
(760.52 КБ) 184 скачивания
Аватара пользователя
Myp3ik
Мучитель микросхем
Сообщения: 450
Зарегистрирован: Вс янв 09, 2011 23:05:37
Откуда: СССР

Re: Проблеммы с передачей по USART на STM32F105RBT6

Сообщение Myp3ik »

Код: Выделить всё

USART1->BRR = (uint16_t)((USART_CLOCK + USART_BAUDRATE / 2) / USART_BAUDRATE);
USART_CLOCK - частота тактирования модуля USART
Иван Сусанин - первый полупроводник :solder:
DENIS451
Прорезались зубы
Сообщения: 213
Зарегистрирован: Вт сен 09, 2008 18:17:27

Re: Проблеммы с передачей по USART на STM32F105RBT6

Сообщение DENIS451 »

Я же пытаюсь настраивать USART через библиотеки, я что пропустил какую то настройку?
Аватара пользователя
Myp3ik
Мучитель микросхем
Сообщения: 450
Зарегистрирован: Вс янв 09, 2011 23:05:37
Откуда: СССР

Re: Проблеммы с передачей по USART на STM32F105RBT6

Сообщение Myp3ik »

В библиотеке ошибка.

воткните то что я написал после

USART_Init(USART1, &USART_InitStructure);
Иван Сусанин - первый полупроводник :solder:
DENIS451
Прорезались зубы
Сообщения: 213
Зарегистрирован: Вт сен 09, 2008 18:17:27

Re: Проблеммы с передачей по USART на STM32F105RBT6

Сообщение 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'

****************************************************************
Если это надо самому высчитывать, проще оставить как есть написав поясняющий комментарий откуда взялось такое число.
Аватара пользователя
Myp3ik
Мучитель микросхем
Сообщения: 450
Зарегистрирован: Вс янв 09, 2011 23:05:37
Откуда: СССР

Re: Проблеммы с передачей по USART на STM32F105RBT6

Сообщение 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 стоп бит
Иван Сусанин - первый полупроводник :solder:
DENIS451
Прорезались зубы
Сообщения: 213
Зарегистрирован: Вт сен 09, 2008 18:17:27

Re: Проблеммы с передачей по USART на STM32F105RBT6

Сообщение DENIS451 »

Спасибо.

Я имел ввиду что для замеров скорости в ЛА надо использовать 9 бит, иначе не вседа есть фронт за который можно зацепиться.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Проблеммы с передачей по USART на STM32F105RBT6

Сообщение VladislavS »

[uquote="DENIS451",url="/forum/viewtopic.php?p=3560931#p3560931"]Подобрал число USART_InitStructure.USART_BaudRate = 85038;[/uquote]Что??? Подобрал? Подбирают сумочку под цвет туфелек! Программирование - точная наука.
DENIS451
Прорезались зубы
Сообщения: 213
Зарегистрирован: Вт сен 09, 2008 18:17:27

Re: Проблеммы с передачей по USART на STM32F105RBT6

Сообщение DENIS451 »

Если прописать в свойствах проекта HSE_VALUE=8000000 (частота кварца), всё начинает работать правильно.
Ответить

Вернуться в «ARM»