реклама на сайте
подробности

 
 
> Проблемы с UART в stm32F401C, Проблемы с UART в stm32F4
shtunder
сообщение Dec 20 2014, 07:16
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 24
Регистрация: 14-07-14
Пользователь №: 82 243



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

Столкнулся с такой проблемой. Запускаю 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 ( 1.98 мегабайт ) Кол-во скачиваний: 74
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 3)
seniorandre
сообщение Dec 20 2014, 13:24
Сообщение #2


Участник
*

Группа: Свой
Сообщений: 58
Регистрация: 6-07-12
Из: г.Нижний Новгород
Пользователь №: 72 651



Цитата(shtunder @ Dec 20 2014, 10:16) *
При передаче символа H получаю 88, при передаче 0xAA, получаю 0x6A.
При передаче 0xFF получаю 0xFF (но там то тупо все нули, поэтому очевидно, что должны были прийти все эти нули).

Когда принимается по USART не то, то это скорее всего проблема настройки тактирования, но у Вас вроде библиотека HAL, и если вы генерили тактирование в CubeMx, то ошибиться трудно.
Чем генерили код настройки тактирования и где он? Ну и соотв что за чип, кварц и т.п.?
Я когда веселился с этим смотрел осцилом с анализатором USART, поэтому быстро понял что ядро не на той частоте работает.
Вам в качестве теста можно вывести на какой нибудь вывод тактирование или сигнал с таймера и проверить частоту.
Успехов.
Go to the top of the page
 
+Quote Post
shtunder
сообщение Dec 21 2014, 14:04
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 24
Регистрация: 14-07-14
Пользователь №: 82 243



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

Все это настраивается в проекте 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 - Dec 21 2014, 14:04
Go to the top of the page
 
+Quote Post
seniorandre
сообщение Dec 21 2014, 18:32
Сообщение #4


Участник
*

Группа: Свой
Сообщений: 58
Регистрация: 6-07-12
Из: г.Нижний Новгород
Пользователь №: 72 651



Осталось теперь убедиться что этот код вызывается, т.к. иногда инициализация клока вызывается из startup.c, иногда надо явно вызвать в main. C IAR не работал, не могу сказать, все от реализации начальной загрузки зависит. Самый простой путь это поставить точку останова в нем и убедиться что он все таки отрабатывает. А так вроде все правильно.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 14:26
Рейтинг@Mail.ru


Страница сгенерированна за 0.01378 секунд с 7
ELECTRONIX ©2004-2016