STM32L4xx USART 低温
STM32L4xx USART Low temperature
我在使用基于 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 的频率。
将电子板放入冰箱后,PWM 在-18°C 下降至 345Hz
我用实验室示波器测量
有人遇到过这个问题吗?
有人知道这个问题吗?
非常感谢,
巴蒂斯特
UART 对时钟变化非常敏感,尤其是当您一次性发送更多数据时。
您需要使用 crystal 具有良好温度稳定性的振荡器或发送非常小的数据块或检查内部温度传感器并相应地更改波特设置
假设您将 USART 用作 UART:
如果有LSE等准确的参考频率,可以根据温度进行RC校准,见RCC_ICSCR
寄存器。提供内部温度传感器。
此 application note 展示了如何校准内部 RC。
At 30°C, the HSI16 oscillator has an accuracy of ±0.5%, the MSI
oscillator has an accuracy of ± 0.6% and the HSI48 oscillator has an
accuracy of ±4%. But in the temperature range of -40°C to 105°C, the
accuracy decreases.
我在使用基于 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 的频率。 将电子板放入冰箱后,PWM 在-18°C 下降至 345Hz 我用实验室示波器测量
有人遇到过这个问题吗? 有人知道这个问题吗?
非常感谢,
巴蒂斯特
UART 对时钟变化非常敏感,尤其是当您一次性发送更多数据时。
您需要使用 crystal 具有良好温度稳定性的振荡器或发送非常小的数据块或检查内部温度传感器并相应地更改波特设置
假设您将 USART 用作 UART:
如果有LSE等准确的参考频率,可以根据温度进行RC校准,见RCC_ICSCR
寄存器。提供内部温度传感器。
此 application note 展示了如何校准内部 RC。
At 30°C, the HSI16 oscillator has an accuracy of ±0.5%, the MSI oscillator has an accuracy of ± 0.6% and the HSI48 oscillator has an accuracy of ±4%. But in the temperature range of -40°C to 105°C, the accuracy decreases.