STM32L4xx USART低温
我有一个基于TSM32L4xx微控制器的电子板的问题。 我正在为所有外设初始化使用HAL驱动程序。 我使用USART3通过RS232与计算机通信 当微控制器上升到-6°C以下时(在冻结状态下),微控制器上的传输工作,但接收不工作(中断不会上升)。 USART使用SYSCLOCK进行初始化: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
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
我用实验室示波器测量
有人遇到过这个问题吗?
有人知道这个问题吗
非常感谢您的光临
BaptisteUART对时钟变化非常敏感,尤其是当您一次性发送更多数据时
您需要使用具有良好温度稳定性的晶体振荡器,或发送非常小的数据块,或检查内部温度传感器,并相应地更改波特率设置,假设您将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作为系统时钟。