基于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 我用实验室示波器采取了措施
有人遇到过这个问题吗? 任何人都有这个问题的想法吗?
非常感谢
洗礼池
答案 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 的温度范围内, 准确性降低。