配置为使用外部振荡器的 STM32F3 器件上的 RCC 振荡器配置错误

Posted

技术标签:

【中文标题】配置为使用外部振荡器的 STM32F3 器件上的 RCC 振荡器配置错误【英文标题】:RCC Oscillator Configuration Error on STM32F3 device configured to use external oscillator 【发布时间】:2019-01-24 19:03:41 【问题描述】:

我一直在尝试使用 STM32F3DISCOVERY 板作为基础开发 USB HID 设备,使用 STM32CubeMX 和 HAL 库生成我的项目。

我已按照用户手册 UM1570 第 6.10.1 节使用 12MHz 外部晶体振荡器焊接了外部晶体。

配置我的系统时钟后,STM32CubeMX 会生成以下几行用于振荡器初始化:

RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL6;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

  _Error_Handler(__FILE__, __LINE__);

我的项目在 Atollic TrueStudio 中构建、上传并使用 ST-LINK 界面进行调试。我没有更改项目或调试的任何默认配置设置。调试时,会调用错误处理程序。

我在此阶段的假设是,由于为板上的 STM32F3VC 设备提供时钟所需的 HSE 旁路,无法实现时钟配置,原因我不明白。刷机后,我的电脑在连接USB User时无法识别设备,而不是USB ST-LINK接口,所以我进一步的假设是时钟配置错误,缺少USB User接口是相互关联的。

有人知道我的思维错误在哪里吗?

【问题讨论】:

HSI 和 HSE 同时打开是否有效?这当然是不必要的。建议RCC_OscInitStruct.HSIState = RCC_HSI_OFF。但是不确定这会解决您的问题。 ...查看源代码,HSIState 似乎在 OscillatorType ==RCC_OSCILLATORTYPE_HSE 时被忽略,所以不是你的问题。 您没有指定配置错误是什么。标题提示配置错误,但正文提示运行时错误。它是哪一个?当然,时钟树配置必须使 USB 外设的时钟频率恰好为 48MHz。 【参考方案1】:

错误的配置

  RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS;

编辑

检查 RCC 寄存器是否 HSE 已准备好并打开。

【讨论】:

恐怕这并不能解决问题。我在上面还注意到,我焊接并设置了运行 HSE 晶振的板,所以我认为 HSE 旁路作为设置不正确,我认为这是 STLink 控制器设置时钟信号的旁路模式STM32F303。设置旁路选项时,设置振荡器后我仍然在错误处理程序中。 @user1350065 所以在时钟初始化后检查 RCC 寄存器【参考方案2】:

我已按照 STM32F3DISCOVERY 参考手册重新焊接了我的外部振荡器无源组件。振荡器初始化不再返回到错误处理程序,因此我可以断定这是一个简单的焊接错误,HSE 晶体振荡器现在在所有总线上返回正确的值以操作 USB,验证软件设置是否正确。

【讨论】:

以上是关于配置为使用外部振荡器的 STM32F3 器件上的 RCC 振荡器配置错误的主要内容,如果未能解决你的问题,请参考以下文章

我画了一块STM32F407的板子,用了16M和32.768两个晶振,调试发现,不焊这两个晶振也能工作,这是为啥

stm32f7 时钟

STM32F407的资源

STM32F103C8T6使用内部时钟作为系统时钟

STM32 时钟系统

stm32f3发现usart没有发送