Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
 
ЕгорЮрьевич
0 / 0 / 0
Регистрация: 30.07.2015
Сообщений: 25
Записей в блоге: 2
#1

Обмен USART <-> ПК - ARM, Cortex, STM32 микроконтроллер

17.08.2017, 14:48. Просмотров 741. Ответов 34
Метки нет (Все метки)

Есть микроконтроллер STM32F2xx на нём есть USARTы, которые между собой общаются без искажений.
Есть компьютер который передаёт по RS485 4w сигнал на интерфейсную плату MAX3160E,
у которой если замкнуть контакты "Rx" и "Tx", она так же передаёт обратно на компьютер информацию без искажений.

Но если передавать с микроконтроллера на компьютер или наоборот, то тут какая то лажа.

Подскажите где косяк.
Что я упустил?
Скорости одинаковые
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.08.2017, 14:48
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Обмен USART <-> ПК (ARM, Cortex, STM32 микроконтроллер):

передача данных с 2 портов can и 1 usart в usart
Доброго времени суток форумчане! Пытаюсь написать код для stm32f4disko с...

usart
Начал сегодня изучать микроконтроллеры ARM, до этого использовал только AVR....

Обмен по USART PinBoard с компом.
При прошивке в МК простейшей программы обмена по порту вижу неправильные...

xmega: usart - какой глубины буфер в USART?
Взялся тут &quot;запилить&quot; на xmego32a4 мультиплексор двух rs232 в один rs485. Все...

USART
Подскажите в чем может быть дело При приеме символов по USORT изменяются...

помогите с Usart
Здрасте, я делаю АЦП(10 бит) на меге8 , отправляется пакет из 4х байтов с 2мя...

34
Rius
Эксперт .NET
4565 / 2879 / 705
Регистрация: 25.05.2015
Сообщений: 8,896
Записей в блоге: 10
Завершенные тесты: 4
18.08.2017, 12:01 #21
Лучший ответ Сообщение было отмечено ЕгорЮрьевич как решение

Решение

0x0f у вас передаётся за те же 1.5 мс. А при ваших 19200 должно быть за 0.47 мс.
Настройки тактирования проверяйте.
1
locm
18.08.2017, 12:28
  #22

Не по теме:

Цитата Сообщение от ЕгорЮрьевич Посмотреть сообщение
Увы чего нет того нет
Он стоит недорого https://ru.aliexpress.com/item/New-U...793675349.html

0
ЕгорЮрьевич
0 / 0 / 0
Регистрация: 30.07.2015
Сообщений: 25
Записей в блоге: 2
18.08.2017, 12:31  [ТС] #23
Цитата Сообщение от ЕгорЮрьевич Посмотреть сообщение
может дело все в тактировании?
Цитата Сообщение от Rius Посмотреть сообщение
Настройки тактирования проверяйте.
Спасибо.
Изучаю
По результату отпишусь.
0
alexey6689
28 / 28 / 8
Регистрация: 15.11.2012
Сообщений: 150
Завершенные тесты: 1
21.08.2017, 22:52 #24
А что у вас за плата? Или свое устройство?
В папке проекта скорее всего есть файл вида system_stm32f10x.c или что-то подобное. Посмотрите там установки для частоты тактирования. Проверьте, что везде в проекте переменная HSE_VALUE содержит значение, равное частоте вашего кварца, если он конечно есть (константа может встречаться в нескольких файлах). Если его нет, а в вышеуказанном файле объявлено, что он есть - частота, конечно, будет неверной.
Я бы предположил, что HSE_VALUE в проекте объявлена как 25000000, а кварц стоит 8000000 - отличие как раз в 3 с небольшим раза.

Добавлено через 15 секунд
А что у вас за плата? Или свое устройство?
В папке проекта скорее всего есть файл вида system_stm32f10x.c или что-то подобное. Посмотрите там установки для частоты тактирования. Проверьте, что везде в проекте переменная HSE_VALUE содержит значение, равное частоте вашего кварца, если он конечно есть (константа может встречаться в нескольких файлах). Если его нет, а в вышеуказанном файле объявлено, что он есть - частота, конечно, будет неверной.
Я бы предположил, что HSE_VALUE в проекте объявлена как 25000000, а кварц стоит 8000000 - отличие как раз в 3 с небольшим раза.

Добавлено через 41 секунду
Если в вас внутренне тактирование, также измените HSE_VALUE на 8000000 - вдруг поможет.
0
ЕгорЮрьевич
0 / 0 / 0
Регистрация: 30.07.2015
Сообщений: 25
Записей в блоге: 2
22.08.2017, 14:38  [ТС] #25
Всем Спасибо!!!
Вы все были правы...
Цитата Сообщение от ЕгорЮрьевич Посмотреть сообщение
Спасибо.
Изучаю
По результату отпишусь
Изучил вопрос.
В код добавил
C
1
2
3
4
5
6
7
8
9
10
11
12
13
 // сбрасываем регистры RCC
  RCC_DeInit();
  // Включаем HSI и ожидаем, пока МК переключится на него
  RCC_HSICmd(ENABLE);
  while(!RCC_GetFlagStatus(RCC_FLAG_HSIRDY));
  // Настраиваем PLL
  RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);
  // Включаем PLL и ждем, пока МК переключится на него
  RCC_PLLCmd(ENABLE);
  while(!RCC_GetFlagStatus(RCC_FLAG_PLLRDY));
  // Включаем тактирование системной шины от PLL
  RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
  SystemCoreClockUpdate();
Всё заработало!
Помогла вот эта книжка )))
http://stm32.chrns.com/

Добавлено через 1 минуту
Цитата Сообщение от alexey6689 Посмотреть сообщение
А что у вас за плата?
NUCLEO-F207ZG

Спасибо

Добавлено через 25 минут
Хотя вот ещё эти 3-и строчки желательно добавить

C++
1
2
3
  RCC_HCLKConfig(RCC_SYSCLK_Div1);
  RCC_PCLK1Config(RCC_HCLK_Div1);
  RCC_PCLK2Config(RCC_HCLK_Div1);
Теперь неопределённости ни какой нет : )
0
locm
2126 / 854 / 112
Регистрация: 28.10.2011
Сообщений: 2,671
Записей в блоге: 6
22.08.2017, 16:01 #26
Цитата Сообщение от ЕгорЮрьевич Посмотреть сообщение
В код добавил
Умножитель включается, а коэффициент умножения не задан.
1
ЕгорЮрьевич
0 / 0 / 0
Регистрация: 30.07.2015
Сообщений: 25
Записей в блоге: 2
22.08.2017, 16:10  [ТС] #27
Цитата Сообщение от locm Посмотреть сообщение
Умножитель включается, а коэффициент умножения не задан.
я же дописал
Цитата Сообщение от ЕгорЮрьевич Посмотреть сообщение
Хотя вот ещё эти 3-и строчки желательно добавить
* RCC_HCLKConfig(RCC_SYSCLK_Div1);
* RCC_PCLK1Config(RCC_HCLK_Div1);
* RCC_PCLK2Config(RCC_HCLK_Div1);
Теперь неопределённости ни какой нет : )
Теперь выглядит так

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    // сбрасываем регистры RCC
    RCC_DeInit();
    // Включаем HSI и ожидаем, пока МК переключится на него
    RCC_HSICmd(ENABLE);
    while(!RCC_GetFlagStatus(RCC_FLAG_HSIRDY));
    // Настраиваем PLL
    RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);
    // Включаем PLL и ждем, пока МК переключится на него
    RCC_PLLCmd(ENABLE);
    
    RCC_HCLKConfig(RCC_SYSCLK_Div1);      //AHB предделитель
    RCC_PCLK1Config(RCC_HCLK_Div1);       //AРB1 предделитель
    RCC_PCLK2Config(RCC_HCLK_Div1);       //AРB2 предделитель
    
    while(!RCC_GetFlagStatus(RCC_FLAG_PLLRDY));
    // Включаем тактирование системной шины от PLL
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
    SystemCoreClockUpdate();
Или ещё что то?
0
locm
2126 / 854 / 112
Регистрация: 28.10.2011
Сообщений: 2,671
Записей в блоге: 6
22.08.2017, 16:49 #28
Цитата Сообщение от ЕгорЮрьевич Посмотреть сообщение
я же дописал
Эти строки к умножителю отношения не имеют.
Перед его включением должно быть что-то типа
C
1
RCC_PLLConfig(RCC_PLLSource_HSE, RCC_CFGR_PLLMULL12);
1
ЕгорЮрьевич
0 / 0 / 0
Регистрация: 30.07.2015
Сообщений: 25
Записей в блоге: 2
22.08.2017, 17:28  [ТС] #29
В моём случае они не используются...
Скрин из куба.
Я там PLL не использую...
эти строчки лишние...
Цитата Сообщение от ЕгорЮрьевич Посмотреть сообщение
// Включаем PLL и ждем, пока МК переключится на него
* * RCC_PLLCmd(ENABLE)
Или я ошибаюсь?

То что касается
Цитата Сообщение от locm Посмотреть сообщение
RCC_PLLConfig(RCC_PLLSource_HSE, RCC_CFGR_PLLMULL12);
у меня STM32F207xx
там эта функция выглядит так
C
1
2
3
4
5
6
7
8
9
10
11
12
void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t PLLM, uint32_t PLLN, uint32_t PLLP, uint32_t PLLQ)
{
  /* Check the parameters */
  assert_param(IS_RCC_PLL_SOURCE(RCC_PLLSource));
  assert_param(IS_RCC_PLLM_VALUE(PLLM));
  assert_param(IS_RCC_PLLN_VALUE(PLLN));
  assert_param(IS_RCC_PLLP_VALUE(PLLP));
  assert_param(IS_RCC_PLLQ_VALUE(PLLQ));
 
  RCC->PLLCFGR = PLLM | (PLLN << 6) | (((PLLP >> 1) -1) << 16) | (RCC_PLLSource) |
                 (PLLQ << 24);
}
Я если честно тупо не понял как задавать PLLM, PLLN, PLLP, PLLQ.
Пробовал числом обмен шёл криво.
0
Миниатюры
Обмен USART <-> ПК  
locm
2126 / 854 / 112
Регистрация: 28.10.2011
Сообщений: 2,671
Записей в блоге: 6
22.08.2017, 17:39 #30
Цитата Сообщение от ЕгорЮрьевич Посмотреть сообщение
Я там PLL не использую
В вашем коде есть строки
Цитата Сообщение от ЕгорЮрьевич Посмотреть сообщение
C
1
2
3
4
5
 // Включаем PLL и ждем, пока МК переключится на него
 RCC_PLLCmd(ENABLE);
 while(!RCC_GetFlagStatus(RCC_FLAG_PLLRDY));
 // Включаем тактирование системной шины от PLL
 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
Вы все таки используете умножитель.
1
ЕгорЮрьевич
0 / 0 / 0
Регистрация: 30.07.2015
Сообщений: 25
Записей в блоге: 2
22.08.2017, 17:43  [ТС] #31
Нет без
C
1
RCC_PLLCmd(ENABLE);
Не работает.

Добавлено через 1 минуту
Эх.... буду дальше читать....
Спасибо
0
locm
2126 / 854 / 112
Регистрация: 28.10.2011
Сообщений: 2,671
Записей в блоге: 6
22.08.2017, 17:46 #32
Цитата Сообщение от ЕгорЮрьевич Посмотреть сообщение
Я если честно тупо не понял как задавать PLLM, PLLN, PLLP, PLLQ.
Посмотрите на скрине куба в вашем сообщении, в области настройки умножителя есть метки /M, *N, *P, /Q. Впишите в вызов функции те же числа что в соответствующих полях куба.

Добавлено через 1 минуту
Цитата Сообщение от ЕгорЮрьевич Посмотреть сообщение
Нет без
C
1
RCC_PLLCmd(ENABLE);
Не работает.
Вероятно потому что выбираете источником тактирования умножитель.
C
1
2
// Включаем тактирование системной шины от PLL
 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
1
ЕгорЮрьевич
0 / 0 / 0
Регистрация: 30.07.2015
Сообщений: 25
Записей в блоге: 2
22.08.2017, 18:02  [ТС] #33
Цитата Сообщение от locm Посмотреть сообщение
Посмотрите на скрине куба в вашем сообщении, в области настройки умножителя есть метки /M, *N, *P, /Q. Впишите в вызов функции те же числа что в соответствующих полях куба.
Что они на кубе я понимаю... но как их правильно задать?

я пиал
C
1
RCC_PLLConfig(RCC_PLLSource_HSI, 1, 1, 1, 1);
До обмена не доходило
зацикливалось тут
C
1
while(!RCC_GetFlagStatus(RCC_FLAG_PLLRDY));
Добавлено через 13 минут


C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    RCC_DeInit(); // сбрасываем регистры RCC    
    RCC_HSICmd(ENABLE); // Включаем HSI
    while(!RCC_GetFlagStatus(RCC_FLAG_HSIRDY)); //ожидаем, пока МК переключится на HSI
    RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);  // конфигурируем SYSCLK
 
//    RCC_PLLCmd(ENABLE); // Включаем PLL ....
    
    RCC_HCLKConfig(RCC_SYSCLK_Div1);      //AHB предделитель
    RCC_PCLK1Config(RCC_HCLK_Div1);       //AРB1 предделитель
    RCC_PCLK2Config(RCC_HCLK_Div1);       //AРB2 предделитель
    
    while(!RCC_GetFlagStatus(RCC_SYSCLKSource_HSI)); // ожидание готовности HSI
    
    RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);// Включаем тактирование системной шины от HSI
    SystemCoreClockUpdate();
Вот так правильно, как я понимаю...
Все косяки поправил
Работает

Спасибо
0
locm
2126 / 854 / 112
Регистрация: 28.10.2011
Сообщений: 2,671
Записей в блоге: 6
22.08.2017, 19:38 #34
Цитата Сообщение от ЕгорЮрьевич Посмотреть сообщение
Что они на кубе я понимаю... но как их правильно задать?
я пиал
C
1
RCC_PLLConfig(RCC_PLLSource_HSI, 1, 1, 1, 1);
Посмотрите что на скрине в кубе http://www.cyberforum.ru/arm/thread2028430-page2.html#post10704352
Там везде единицы, или цифры 16, 192, 2 и 4 соответственно?

Цитата Сообщение от ЕгорЮрьевич Посмотреть сообщение
Вот так правильно, как я понимаю
Вы просто пустили тактирование в обход умножителя.

Цитата Сообщение от ЕгорЮрьевич Посмотреть сообщение
Все косяки поправил
Цитата Сообщение от ЕгорЮрьевич Посмотреть сообщение
C
1
while(!RCC_GetFlagStatus(RCC_SYSCLKSource_HSI));
Функция RCC_GetFlagStatus точно принимает в качестве параметра RCC_SYSCLKSource_HSI?

В коде два раза повторяется строка RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI); но комментарии разные.
1
ЕгорЮрьевич
0 / 0 / 0
Регистрация: 30.07.2015
Сообщений: 25
Записей в блоге: 2
23.08.2017, 11:18  [ТС] #35
Цитата Сообщение от locm Посмотреть сообщение
комментарии разные
Благодарю Вас
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    RCC_DeInit(); // сбрасываем регистры RCC    
    RCC_HSICmd(ENABLE); // Включаем HSI
    while(!RCC_GetFlagStatus(RCC_FLAG_HSIRDY)); //ожидаем, пока МК переключится на HSI
    RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);       //Функция выбора системных часов. Выбирает в качестве источника HSI
 
 
    RCC_PLLConfig(RCC_PLLSource_HSI, 6, 270, 6, 4);       //Настройка PLL
    RCC_PLLCmd(ENABLE);// Включаем PLL и ждем, пока МК переключится на него
 
    RCC_HCLKConfig(RCC_SYSCLK_Div1);      //AHB предделитель
    RCC_PCLK1Config(RCC_HCLK_Div2);       //AРB1 предделитель
    RCC_PCLK2Config(RCC_HCLK_Div2);       //AРB2 предделитель
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);       //Функция выбора системных часов. Выбирает в качестве источника PLL
  
    while(!RCC_GetFlagStatus(RCC_FLAG_PLLRDY)); // Включаем тактирование системной шины от HSI
    SystemCoreClockUpdate();
Сейчас и эта фунуция работает.
Всё из за не внимательности

Добавлено через 33 минуты
Цитата Сообщение от ЕгорЮрьевич Посмотреть сообщение
Всё из за не внимательности
невнимательности
0
23.08.2017, 11:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.08.2017, 11:18
Привет! Вот еще темы с решениями:

HC-SR04 и USART
Здравствуйте. Помогите пожалуйста, делаю проект мини-робота с УЗ- датчиком...

ATmega164P и USART
Доброго времени суток! Продолжу тут тему, начатую вчера в jabberе. Суть...

USART + DMA
Всем привет. stm32f103c8 Использую USORT + DMA, Channel4 - TX Channel5 -...

СХЕМОТЕХНИКА и USART
Сейчас осваиваю USORT. Асинхронный режим. Есть плата STM32VLDyscovery ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru