STM32L4xx USART低温

STM32L4xx USART低温,stm32,temperature,usart,Stm32,Temperature,Usart,我有一个基于TSM32L4xx微控制器的电子板的问题。 我正在为所有外设初始化使用HAL驱动程序。 我使用USART3通过RS232与计算机通信 当微控制器上升到-6°C以下时(在冻结状态下),微控制器上的传输工作,但接收不工作(中断不会上升)。 USART使用SYSCLOCK进行初始化: void HAL_UART_MspInit(UART_HandleTypeDef *huart) { [...] USARTx_RCC_CONFIG(RCC_USART3CLKSOURCE_S

我有一个基于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(使用定时器2通道3和4)。 PWM产生375Hz的频率。 将电子板放入冷冻柜后,PWM在-18°C时降至345Hz 我用实验室示波器测量

有人遇到过这个问题吗? 有人知道这个问题吗

非常感谢您的光临


Baptiste

UART对时钟变化非常敏感,尤其是当您一次性发送更多数据时


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

如果您有准确的参考频率,如LSE,您可以根据温度执行RC校准,请参阅
RCC\u ICSCR
寄存器。内部温度传感器可用

这显示了如何校准内部RCs

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


你的钟源是什么?如果是RC温度,可能会导致其漂移,USART无法同步。你好,科林,我已经用系统时钟初始化功能更新了我的帖子。谢谢您是否使用µC支持的低功耗模式?你好,Hugo,不,我不使用低功耗模式。我用一个新测试的结果更新了我的第一篇文章。ThanksIt听起来确实像内部RC随温度变化。也许可以考虑使用外部晶体,tcxo或ocxo作为系统时钟。