Перейти к содержанию
    

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

Передаю с 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 судя по ЛА!

Терминал.png

ЛА.png

Изменено пользователем Donker

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, Donker said:

Передаю с STM32F105RBT6 байт

 

Убедитесь для начала, что тактовая частота у проца правильная и годится для этого USARTа на выбранной скорости (допустимая погрешность в пределах нормы).

 

зы Слово "Проблемы" пишется с одной М

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

по умолчанию в регистрах USART STM32 тот порядок бит, который правильно попадает в комп и данный терминал. Это безусловно. :-)

Т.е. проблема только в в скорости и настройки длины байта (в битах).

Изменено пользователем serglg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подобрал число 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, флэш не трогаю, это могло повлиять?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 minutes ago, Donker said:

Подобрал число USART_InitStructure.USART_BaudRate = 85038; что бы увидеть в ЛА тайминг 9 бит за 78us и передача от микроконтроллера на терминал заработала!

Коли работает, то тогда так и оставляйте :biggrin:

 

Если такой вариант не устраивает, то разбирайтесь с тактовой частотой проца. Ее для контроля можно вывести на соотв. внешнюю ногу и посмотреть осциллом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, Donker сказал:

это точно, иначе неправильно работали бы таймер и DWT

Это неточно, иначе правильно работал бы УАСПП :blum:.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Заливка прошивки обычным образом во флэш проблему занижения таймингов не решает.
Если USART использует переменную  SystemCoreClock то такое искажение можно объяснить значением SystemCoreClock в 56  мГц,
но откуда там могла взяться такая цифра я не понимаю, если кто хочет помочь выкладываю проект:

STM32F105RBT6 + USART.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 minutes ago, Donker said:

если кто хочет помочь выкладываю проект:

Все, кто хотели помочь, уже помогли - указали место, куда копать.

Проблемма уровня junior. Разбирайтесь дальше уже самостоятельно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 hours ago, Donker said:

если кто хочет помочь выкладываю проект:

После такой подачки и помогать расхотелось

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На другом форуме ответили - ошибка в библиотеке, можно лепить костыли кому какие нравятся:

https://radiokot.ru/forum/viewtopic.php?f=59&amp;t=160456&amp;p=3561277#p3561277

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

56 minutes ago, Donker said:

На другом форуме ответили - ошибка в библиотеке, можно лепить костыли кому какие нравятся:

Ошибка не в библиотеке, и не читайте больше этот другой форум! :)

1. Baudrate расчитывается на основе SystemCoreClock
2. SystemCoreClock зависит от HSE_VALUE.
3. HSE_VALUE должен задаваться из вне, но по дефолту имеет значение 25MHz у Вас же осцилятор на 8MHz


В свойства проекта, в препроцесор нужно добавить определение HSE_VALUE=8000000, или определить его в stm32f4xx_hal_conf.h

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо Integro!
 

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...