LSE 校准 STM32F4 内部 RC
问题:
此问题由客户提,户在使用 STM32F411 开发产品的时候,采用的是 HIS 作为主时钟,同时使用了
UART 与其他 MCU 进行异步通信.
客户发现部分产 UART 不能正常通信.
调研:
1. 过使用示波器来测量 UART TX 的波特率,发现误差较大,查看原理图和代码发现他们使用
HIS 作为主时钟,且没有使用 PLL 来倍频.
2. UART 直接用 HIS 作为时钟源,所以考虑通过使用 LSE 校准 STM32F411 HIS 值来使得
UART 波特率准确.
3.
我们 STM32 官方提供了基 STM32F0 HIS 校准方 AN4067(基于 STM32Cube).其基本原理如
下写的很清楚:
4. 以我们将其移植到 STM32F4 :
a. STM32F0HAL STM32F4HAL
b. 改工程器件相关的配置.
c. 去掉与 STM32F4 HIS 校准无关的文件,只保留 his.c/h
d. main.c 的主程序,初始化校准前频率测准后频率测试.
HSIFrequencyBeforeCalib 为校准前的频率值,可以在 IAR Watch 窗口查.
HSIFrequencyAfterCalib 为校准后的频率值,可以在 IAR Watch 口查看.
e. 定义使用 USE_REFERENCE_LSE __HSI2LSECALIBRATE_TEST__,使能使用
LSE HIS 功能函数.
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
#ifdef USE_REFERENCE_LSE
#define HSI_TIMx_COUNTER_PRESCALER ((uint32_t)0)
/* The signal in input capture is divided by 8 */
#define HSI_TIMx_IC_DIVIDER TIM_ICPSC_DIV8
/* The LSE is divided by 8 => LSE/8 = 32768/8 = 4096 */
#define REFERENCE_FREQUENCY ((uint32_t) 4096) /* The reference frequency
value in Hz */
/* Number of measurements in the loop */
#define HSI_NUMBER_OF_LOOPS ((uint32_t)50)
/* Connect LSE clock (through MCO) to TIMx Input Capture 1 */
#ifdef __HSI2LSECALIBRATE_TEST__
#define HSI_Timer_ConnectInput() do { \
HAL_TIMEx_RemapConfig(&TimHandle, TIM_TIM5_LSE); \
} while(0)
#else