【marlin学习】STM32 Flash 被锁,如何在PlatformIO中更改外部晶振频率值?

本文介绍了在STM32新板子上遇到的程序运行错误,该错误源于时钟配置不匹配。作者发现平台IO不像STM32Cube那样提供图形化配置时钟,并且通用的hal_conf_default.h文件不适宜直接修改。为了解决问题,作者建议在对应板子的variant.h文件中重新定义时钟配置,避免影响其他工程。此外,还探讨了通过重载“SystemClock_Config”函数进行时钟配置的可能性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述: 程序在开发板上可以正常运行,在新作的板子上无法正常运行。
新板子只要烧录该程序,就会频繁报错“Error: timed out while waiting for target halted”,之后再也无法擦除和修改程序。只能通过修改bootloader模式重新擦除和修改程序。
经查找发现,程序配置的外部晶振值与开发板一致,但是与新作的板子不一致,从而导致新作的板子时钟超频Flash被锁。

解决方法: 需要修改工程内的时钟配置信息。

问题描述: platformIO 不像 STM32Cube 可以图形化配置时钟,也没有明显的配置头文件可以直接修改HSE_VALUE,如何修改stm32+Arduino工程的时钟配置 ?

探索解决方法:

  • 1.stm32 arduino 是在哪里配置时钟的?又是在哪里定义HSE_VALUE 的?
    每块板子的时钟配置都会有差异,查找发现,该时钟配置是在对应板子下的“variant.cpp”文件内。
    在这里插入图片描述
    查找发现,该工程调用了一个共用的库“framework-arduinostm32“,这个是platformIO在建立工程的时候自动下载的库文件。
    具体文件如图所示:
    在这里插入图片描述

  • 2.是否直接修改 hal_conf_default.h 文件的宏定义值就可以解决问题呢?
    实际测试可以解决该问题(注意,如果只更改HSE_VALUE,没有变更PLLM: Division factor for PLL VCO input clock,那么系统的时钟也是不正确的,所以要注意这两个值同时改)。
    很显然,被修改的这个是一个共用的文件,共享给多个不同的工程使用;如果我随意更改他,那么我的其他工程也会受到影响,牵一发而动全身,显然这种做法并不可行。

  • 3.那该如何修改这个宏定义,才能够在不需要改动 hal_conf_default.h 文件的情况下,又可以让该工程正常运行?
    正确做法是重新定义,而不是直接修改。
    PlatformIO建立工程的时候,会根据选择的board而调用对应的variant文件。因此,针对与这块新板子而言,应该直接将宏定义放在对应板子的variant.h文件中。
    在这里插入图片描述
    4.有没有更好的方法来解决这个时钟配置的问题?
    同一块板子,不同的工程,有可能会应用不同的时钟频率要求,是否可以Overload “SystemClock_Config”函数来重新配置时钟呢?

<think>好的,用户想了解STM32F407ZGT6的晶振配置方法和相关教程或数据手册。首先,我需要回忆一下STM32F4系列的时钟系统结构。STM32F407的时钟树比较复杂,涉及多个时钟源,比如内部RC振荡器、外部晶振(HSE和LSE)以及PLL配置。用户提到的参考引用中,引用[1]提到了时钟树的结构,应该参考《STM32F4xx中文参考手册》的6.2章节,所以需要确认手册中的具体内容。 接下来,用户可能需要知道如何配置HSE(外部高速晶振)和LSE(外部低速晶振)。通常,HSE用于系统主时钟,而LSE用于RTC。配置步骤包括使能相应的时钟源,设置PLL参数,然后切换到外部时钟源。需要查看引用[3]中的寄存器配置,比如USART的波特率设置,这可能与系统时钟频率有关,因此正确的时钟配置对串口通信很重要。 用户可能还需要实际的代码示例,比如使用标准外设库或者HAL库配置晶振的步骤。例如,在SystemInit函数中初始化时钟,配置RCC相关的寄存器。另外,RT-Thread的env工具配置工程(如引用[2]提到的)可能涉及时钟配置,这部分可以通过RT-Thread的文档或社区获取信息。 还要注意常见问题,比如晶振不起振的可能原因,如电路设计问题、负载电容不匹配等。需要提醒用户检查硬件连接和软件配置是否正确。数据手册和参考手册是关键资源,必须引导用户查阅这些文档以获取准确信息。 总结回答的结构:先介绍时钟系统,再分步骤说明HSE和LSE的配置方法,提供代码示例,推荐参考资料,最后常见问题。确保使用正确的LaTeX格式,比如时钟频率使用$8\ \text{MHz}$,并引用相关文献。</think>### STM32F407ZGT6晶振配置方法 #### 1. **时钟系统概述** STM32F407ZGT6的时钟系统由多个时钟源构成,包括: - **内部高速时钟(HSI)**:频率为$16\ \text{MHz}$,精度较低 - **外部高速晶振(HSE)**:通常接$8\ \text{MHz}$晶体,用于主系统时钟 - **外部低速晶振(LSE)**:通常接$32.768\ \text{kHz}$晶体,专供RTC使用 - **相环(PLL)**:用于倍频HSE或HSI以生成更高频率[^1] #### 2. **HSE配置步骤(以$8\ \text{MHz}$晶振为例)** 1. **硬件连接**:晶振接OSC_IN(PH0)和OSC_OUT(PH1)引脚,并联$20\ \text{pF}$负载电容 2. **寄存器配置**: ```c RCC->CR |= RCC_CR_HSEON; // 使能HSE while(!(RCC->CR & RCC_CR_HSERDY)); // 等待HSE就绪 RCC->CFGR |= RCC_CFGR_PLLSRC_HSE; // PLL时钟源选择HSE RCC->PLLCFGR = (8<<0) | (336<<6) | (2<<16) | (7<<24); // PLL_M=8, N=336, P=2, Q=7 RCC->CR |= RCC_CR_PLLON; // 使能PLL while(!(RCC->CR & RCC_CR_PLLRDY)); // 等待PLL定 RCC->CFGR |= RCC_CFGR_SW_PLL; // 切换系统时钟到PLL ``` 3. **最终输出**:系统时钟可达$168\ \text{MHz}$(计算公式:$\frac{8\text{MHz} \times 336}{8 \times 2} = 168\text{MHz}$)[^3] #### 3. **LSE配置(RTC时钟)** ```c RCC->APB1ENR |= RCC_APB1ENR_PWREN; // 使能电源接口时钟 PWR->CR |= PWR_CR_DBP; // 解除备份域写保护 RCC->BDCR |= RCC_BDCR_LSEON; // 使能LSE while(!(RCC->BDCR & RCC_BDCR_LSERDY)); // 等待LSE就绪 RCC->BDCR |= RCC_BDCR_RTCSEL_LSE; // 选择LSE作为RTC时钟源 ``` #### 4. **关键数据手册** 1. **《STM32F4xx中文参考手册》**:第6.2章详细描述时钟树结构 2. **《STM32F407ZGT6数据手册》**:包含引脚定义和电气特性 3. **应用笔记AN2867**:晶振设计指南(ST官网可下载) #### 5. **常见问题** - **晶振不起振**:检查负载电容(公式:$C_L = \frac{C_1 \times C_2}{C_1 + C_2} + C_{stray}$) - **时钟配置错误**:使用STM32CubeMX工具可自动生成初始化代码 - **低功耗模式**:需特别注意时钟门控配置
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值