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

 
 
manul78
сообщение Jan 26 2018, 07:49
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 403
Регистрация: 14-05-07
Из: Россия, г.Пенза
Пользователь №: 27 719



День добрый всем !

Для быстрого старта использую CubeMX. При генерации кода использую исключительно библиотеку Low Layer (LL)
Работал с STM32 F0, а конкретно с простейшим STM32F030F4 - всё работало как часы. Никаких проблем.
Для МК STM32F103 библиотеки LL не было, поэтому обходился шаблонами SPL и не парился.
Но вот в январе этого года вышло обновление для CubeMX, куда добавили генерацию кода LL и для STM32F103
Решил попробовать и никак. Какие-то видимо проблемы с установкой регистров GPIO при настройке USART1
Смотрю дебаггером - в установках порта не меняются биты регистра CRH порта GPIOA.
В битах MODE9 и CNF9 0x00 и 0x01 соответственно, то есть 9-я нога порта GPIOA (USART TX) сконфигурирована на ВХОД с Открытым стоком.
Процедура инициализации в LL:

Код
static void MX_USART1_UART_Init(void)
{

  LL_USART_InitTypeDef USART_InitStruct;

  LL_GPIO_InitTypeDef GPIO_InitStruct;

  /* Peripheral clock enable */
  LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_USART1);
  
  /**USART1 GPIO Configuration  
  PA9   ------> USART1_TX
  PA10   ------> USART1_RX
  */
  GPIO_InitStruct.Pin = LL_GPIO_PIN_9;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  LL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  GPIO_InitStruct.Pin = LL_GPIO_PIN_10;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_FLOATING;
  LL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  USART_InitStruct.BaudRate = 115200;
  USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B;
  USART_InitStruct.StopBits = LL_USART_STOPBITS_1;
  USART_InitStruct.Parity = LL_USART_PARITY_NONE;
  USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX;
  USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;
  LL_USART_Init(USART1, &USART_InitStruct);

  LL_USART_ConfigAsyncMode(USART1);

  LL_USART_Enable(USART1);

}


После инициализации USART - регистры USART настраиваются как надо. A вот пин 9 (TX) порта GPIOA остаётся в том-же состоянии. На ВХОД с
открытым стоком. Хотя должно быть в битах MODE9 и CNF9 0x01 и 0x02 то есть Порт А на ВЫХОД 10 Мгц и АЛЬТЕРНАТИВНЫЙ ВЫХОД Push-Pull

Что такое - не понимаю. Ради интереса открыл старый проект на STM32 F030F4 и посмотрел процедуру инициализации - она немного другая. И всё работает. Полез посмотреть драйвер для stm32f1xx_ll_gpio.c разумеется он отличается. Сильно упрощен.
Для примера привожу код процедуры инициализации USART для библиотеки LL и STM32 F0, он 100% рабочий.

Код
/* USART1 init function */
static void MX_USART1_UART_Init(void)
{

  LL_USART_InitTypeDef USART_InitStruct;

  LL_GPIO_InitTypeDef GPIO_InitStruct;

  /* Peripheral clock enable */
  LL_APB1_GRP2_EnableClock(LL_APB1_GRP2_PERIPH_USART1);
  
  /**USART1 GPIO Configuration  
  PA9   ------> USART1_TX
  PA10   ------> USART1_RX
  */
  GPIO_InitStruct.Pin = LL_GPIO_PIN_9;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
  GPIO_InitStruct.Alternate = LL_GPIO_AF_1;
  LL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  GPIO_InitStruct.Pin = LL_GPIO_PIN_10;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
  GPIO_InitStruct.Alternate = LL_GPIO_AF_1;
  LL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /* USART1 interrupt Init */
  NVIC_SetPriority(USART1_IRQn, 0);
  NVIC_EnableIRQ(USART1_IRQn);

  USART_InitStruct.BaudRate = 115200;
  USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B;
  USART_InitStruct.StopBits = LL_USART_STOPBITS_1;
  USART_InitStruct.Parity = LL_USART_PARITY_NONE;
  USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX;
  USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;
  USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16;
  LL_USART_Init(USART1, &USART_InitStruct);

  LL_USART_DisableIT_CTS(USART1);

  LL_USART_EnableOverrunDetect(USART1);

  LL_USART_EnableDMADeactOnRxErr(USART1);

  LL_USART_ConfigAsyncMode(USART1);

  LL_USART_Enable(USART1);

}


Но он более насыщенный чем для F103.

Где грабли ? Всю башку сломал....
Заранее благодарен за ответы.


UPD. Меняю в дебаггере биты настройки порта вручную - всё заработало... sad.gif






Видимо какие-то глюки в программных настройках порта. Кривая библиотека что-ли ? wacko.gif


Сообщение отредактировал manul78 - Jan 26 2018, 08:52


--------------------
" Многие вещи нам непонятны не потому, что наши понятия слабы; но потому, что сии вещи не входят в круг наших понятий." (с) К.Прутков.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


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

 


RSS Текстовая версия Сейчас: 15th July 2025 - 00:21
Рейтинг@Mail.ru


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