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

Проблемы с UART в stm32F401C

Всем доброго времени суток!

 

Столкнулся с такой проблемой. Запускаю UART, передаю биты, но увы и ах.. Комп принимает биты, но какие-то другие. Не могу понять в чем дело.

 

Код по инициализации и передаче символа, прикрепил.

 

При передаче символа H получаю 88, при передаче 0xAA, получаю 0x6A.

При передаче 0xFF получаю 0xFF (но там то тупо все нули, поэтому очевидно, что должны были прийти все эти нули).

 

P.S. При работе stm32 L0 избавиться ерунды помог system_clock_config, который просто взял из примера.

 

P.S. МК stm32 f401C

 

#include "stm32f4xx_hal.h"


void INIT_GPIO(void);
void INIT_UART(void);
void SEND_DATA_UART(uint8_t data);


GPIO_InitTypeDef GPIO;
UART_HandleTypeDef UART;



int main()
{
  HAL_Init();
  
  INIT_GPIO();
  INIT_UART();
  
  while(1)
  {
    // Проверка UART

    SEND_DATA_UART('H');
  }
}


void INIT_GPIO()
{
  __GPIOB_CLK_ENABLE();
  //UART
  GPIO.Pin = (GPIO_PIN_6) | (GPIO_PIN_7);
  GPIO.Mode = GPIO_MODE_AF_PP;
  GPIO.Alternate = GPIO_AF7_USART1;
  HAL_GPIO_Init(GPIOB, &GPIO);
}

void INIT_UART()
{
  __USART1_CLK_ENABLE();
  UART.Instance = USART1;
  UART.Init.Mode = UART_MODE_TX_RX;
  UART.Init.BaudRate = 9600;
  UART.Init.WordLength = UART_WORDLENGTH_8B;
  UART.Init.Parity = UART_PARITY_NONE;
  UART.Init.StopBits = USART_STOPBITS_1;
  HAL_UART_Init(&UART); 
}

//Функция отправляющая байт в UART
void SEND_DATA_UART(uint8_t data)
{
  //Если TC=1, то передача завершена и можно опять что-то записывать в регистр данных USART_DR
  while(!(USART1->SR & USART_SR_TC));
  //Отсылаем байт через UART
  USART1->DR = data;
}

 

Изначально инициализировал ножки так:

void INIT_GPIO()
{
  __GPIOA_CLK_ENABLE();
  //UART
  GPIO.Pin = (GPIO_PIN_9) | (GPIO_PIN_10);
  GPIO.Mode = GPIO_MODE_AF_PP;
  GPIO.Alternate = GPIO_AF7_USART1;
  HAL_GPIO_Init(GPIOA, &GPIO);
}

Но там на осциллографе увидел, что фронты имеют вид, как-будто бы к этим пинам подключили конденсатор. Залез в схематику, действительно так и есть.

Спрашивается зачем там емкость? Что разработчики туда закладывали?

 

P.S. Советы типа поменяйте baudrate не катят. Т.к. уже перепробовал всевозможные(адекватные) настройки (не только baudrate).

MCU_Datasheet.pdf

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


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

При передаче символа H получаю 88, при передаче 0xAA, получаю 0x6A.

При передаче 0xFF получаю 0xFF (но там то тупо все нули, поэтому очевидно, что должны были прийти все эти нули).

Когда принимается по USART не то, то это скорее всего проблема настройки тактирования, но у Вас вроде библиотека HAL, и если вы генерили тактирование в CubeMx, то ошибиться трудно.

Чем генерили код настройки тактирования и где он? Ну и соотв что за чип, кварц и т.п.?

Я когда веселился с этим смотрел осцилом с анализатором USART, поэтому быстро понял что ядро не на той частоте работает.

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

Успехов.

 

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


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

Чем генерили код настройки тактирования и где он?

Все это настраивается в проекте IAR. Я настроил на 84 МГц. (В datasheet, вроде написано, что он на 84МГц).

 

Ну и соотв что за чип, кварц и т.п.?

Из datasheet:

1) STM32F401VCT6 microcontroller featuring 256 KB of Flash memory, 64 KB of RAM in

an LQFP100 package

2) Вроде там 84 МГц

3) System_Clock_Config с помощью PLL работает от 8МГц кварца.

Вот код для

/**
  * @brief  System Clock Configuration
  *         The system Clock is configured as follow : 
  *            System Clock source            = PLL (HSE)
  *            SYSCLK(Hz)                     = 84000000
  *            HCLK(Hz)                       = 84000000
  *            AHB Prescaler                  = 1
  *            APB1 Prescaler                 = 2
  *            APB2 Prescaler                 = 1
  *            HSE Frequency(Hz)              = 8000000
  *            PLL_M                          = 8
  *            PLL_N                          = 336
  *            PLL_P                          = 4
  *            PLL_Q                          = 7
  *            VDD(V)                         = 3.3
  *            Main regulator output voltage  = Scale2 mode
  *            Flash Latency(WS)              = 2
  * @param  None
  * @retval None
  */
static void SystemClock_Config(void)
{
  RCC_ClkInitTypeDef RCC_ClkInitStruct;
  RCC_OscInitTypeDef RCC_OscInitStruct;

  /* Enable Power Control clock */
  __PWR_CLK_ENABLE();
  
  /* The voltage scaling allows optimizing the power consumption when the device is 
     clocked below the maximum system frequency, to update the voltage scaling value 
     regarding system frequency refer to product datasheet.  */
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);
  
  /* Enable HSE Oscillator and activate PLL with HSE as source */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = 8;
  RCC_OscInitStruct.PLL.PLLN = 336;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;
  RCC_OscInitStruct.PLL.PLLQ = 7;
  if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 
     clocks dividers */
  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;  
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;  
  if(HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
}

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

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


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

Осталось теперь убедиться что этот код вызывается, т.к. иногда инициализация клока вызывается из startup.c, иногда надо явно вызвать в main. C IAR не работал, не могу сказать, все от реализации начальной загрузки зависит. Самый простой путь это поставить точку останова в нем и убедиться что он все таки отрабатывает. А так вроде все правильно.

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


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

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

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

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

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

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

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

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

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

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