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

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

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

Сообщение VladislavS »

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

Сообщение DENIS451 »

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

Сообщение VladislavS »

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

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

Сообщение Reflector »

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

Сообщение DENIS451 »

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

Сообщение Myp3ik »

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

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

Сообщение DENIS451 »

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

Сообщение Myp3ik »

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

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

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

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

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

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

Сообщение DENIS451 »

Спасибо.

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

Сообщение VladislavS »

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

Сообщение DENIS451 »

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

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