来源于粉丝提问:
单片机上电后,初始运行频率通常依赖内部振荡器,而非外部晶振。
其设计目的是提供快速启动的时钟信号,尽管精度较低可能在5%-50%范围内波动,具体取决于温度和电源电压。
但是,确保单片机能从复位向量开始执行代码,包括后续配置外部晶振以获得更稳定、精确的时钟。
对于大多数单片机,特别是基于ARM Cortex-M架构的MCU(如STM32系列),在初始化代码中,通常会执行以下步骤来从内部RC振荡器切换到外部晶振:
启用外部高速时钟(HSE);
等待HSE稳定;
配置PLL(锁相环)以获得所需的系统时钟频率;
切换系统时钟源到PLL或直接使用HSE;
配置各种时钟分频器。
这样的设计确保单片机在没有外部时钟源或外部时钟源失效的情况下仍能正常启动。
值得注意的是,外部晶振从启动到稳定通常需要一定时间,这个过程可能需要几毫秒甚至更长。
在这段时间内,如果没有内部振荡器提供时钟,处理器将无法执行任何指令。
以下这个项目就是这个原因:硬件看门狗导致MCU启动时间慢
客户的需求是:在KL15电压上电后,MCU需要在200ms内发送出第一包CAN报文数据。
然而,实际测试结果显示,软件需要360ms才能发送出第一包数据。
最终测试发现,表面上看似外部晶振起振慢,实际上是由于看门狗在启动阶段一直拉低MCU的RESET脚,从而影响了外部晶振的起振速度,导致MCU一直办法正常工作。
希望这个解释能帮助你理解单片机的启动时钟机制。这是一个嵌入式开发中非常基础且重要的概念。