STM32L4xx USART低温

时间:2018-10-11 08:25:31

标签: stm32 temperature usart

基于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();

}

编辑: 我做了一次有趣的测试: 我已经配置了PWM(使用timer2的通道3和4)。 PWM产生375Hz频率。 将电子板放入冰箱后,在-18°C下PWM降至345Hz 我用实验室示波器采取了措施

有人遇到过这个问题吗? 任何人都有这个问题的想法吗?

非常感谢

洗礼池

2 个答案:

答案 0 :(得分:1)

UART对时钟变化非常敏感,特别是如果您一次性发送更多数据时。

您需要使用温度稳定性良好的晶体振荡器,或者发送非常小的数据块,或者检查内部温度传感器并相应地更改波特率设置

答案 1 :(得分:1)

假设您将USART用作UART:

如果您具有准确的参考频率(例如LSE),则可以根据温度执行RC校准,请参见RCC_ICSCR寄存器。内部温度传感器可用。

application note显示了如何校准内部RC。

  

在30°C时,HSI16振荡器的精度为±0.5%,MSI   振荡器的精度为±0.6%,而HSI48振荡器的精度为   精度为±4%。但是在 -40°C至105°C 的温度范围内,   准确性降低。