STM32L4xx USART Низкая температура - PullRequest
0 голосов
/ 11 октября 2018

У меня проблема с электронной платой на основе микроконтроллера TSM32L4xx.Я использую драйвер HAL для инициализации всех периферийных устройств.Я использую USART3 для связи в RS232 с компьютером. Когда микроконтроллер поднимается ниже -6 ° C (в заморозке), передача на микроконтроллере работает, но не прием (прерывание не повышается).USART инициализируется с помощью SYSCLOCK:

void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
    [...]
    USARTx_RCC_CONFIG(RCC_USART3CLKSOURCE_SYSCLK);
    [...]
}

Я прочитал, что при 0 ° C PLL может перестать работать, но я им не пользуюсь ...

Вот мои системные часыинициализация:

void InitSystemClock(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;
  RCC_PeriphCLKInitTypeDef PeriphClkInit;


  RCC_OSCILLATORTYPE_MSI|RCC_OSCILLATORTYPE_LSE;
  RCC_OscInitStruct.OscillatorType      =   RCC_OSCILLATORTYPE_HSI
                                      | RCC_OSCILLATORTYPE_MSI
                                      | RCC_OSCILLATORTYPE_LSE;
  RCC_OscInitStruct.LSEState            = RCC_LSE_ON;
  RCC_OscInitStruct.MSIState            = RCC_MSI_ON;
  RCC_OscInitStruct.MSICalibrationValue = 0;
  RCC_OscInitStruct.MSIClockRange       = CLOCK_RANGE;
  RCC_OscInitStruct.HSIState            = RCC_HSI_OFF;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.PLL.PLLState        = RCC_PLL_OFF;
  HAL_RCC_OscConfig(&RCC_OscInitStruct);


  RCC_ClkInitStruct.ClockType           = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                                     |         RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource        = RCC_SYSCLKSOURCE_MSI;
  RCC_ClkInitStruct.AHBCLKDivider       = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider      = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider      = RCC_HCLK_DIV1;
  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0);


  PeriphClkInit.PeriphClockSelection    = RCC_PERIPHCLK_RTC;
  PeriphClkInit.RTCClockSelection       = RCC_RTCCLKSOURCE_LSE;
  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);


  __HAL_RCC_PWR_CLK_ENABLE();


  HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);

  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

  DWT->CTRL |= 1;   //CYCCNTENA
  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

  /* SysTick_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);

    /* GPIO Ports Clock Enable */
    __GPIOA_CLK_ENABLE();
    __GPIOB_CLK_ENABLE();
    __GPIOC_CLK_ENABLE();
    __GPIOD_CLK_ENABLE();
    __GPIOE_CLK_ENABLE();

}

Редактировать: Я сделал интересный тест: я настроил ШИМ (используя таймер 2 канала 3 и 4).ШИМ генерирует частоту 375 Гц.После помещения электронной платы в морозильник, снижение ШИМ до 345 Гц при -18 ° C. Я провел измерения с помощью лабораторного осциллографа

Кто-нибудь сталкивался с этой проблемой?Кто-нибудь имеет представление об этой проблеме?

Большое спасибо заранее,

Батист

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Если вы используете USART в качестве UART:

Если у вас есть точная эталонная частота, такая как LSE, вы можете выполнить калибровку RC в соответствии с температурой, см. Регистр RCC_ICSCR.Имеется внутренний датчик температуры.

В этой инструкции по применению показано, как калибровать внутренние RC.

При 30 ° C генератор HSI16 обладает точностью± 0,5%, генератор MSI имеет точность ± 0,6%, а генератор HSI48 имеет точность ± 4%.Но в диапазоне температур от -40 ° C до 105 ° C точность уменьшается.

0 голосов
/ 11 октября 2018

UART очень чувствительны к изменениям часов, особенно если вы отправляете больше данных за один раз.

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

...