秋招|MCU+RTOS技术栈——面试八股文整理3:STM32

目录

1.单片机启动流程

2.看门狗

3.最小系统

4.ROM、RAM、Flash

5.EPROM、EEPROM

6.Bootloader与OTA


1.单片机启动流程

单片机的启动流程是指从上电或复位开始到应用用户主程序执行的一系列自动操作过程,不同架构的单片机流程略有差异,但核心逻辑相似。

首先,当单片机接通电源收到复位信号(如外部复位引脚触发、看门狗超时、软件复位指令等),硬件电路会先进行复位操作,让内部所有寄存器回到初始状态,确保系统从已知的初始条件开始运行。

接下来,单片机通常会执行一段固化在芯片内部的 “启动代码”(也叫引导程序或启动程序),这段代码由芯片厂商预先编写,存放在只读存储器(ROM 或 Flash 的特定区域)中,用户无法修改。启动代码的主要任务包括初始化关键硬件,比如配置系统时钟(从默认的低速内部时钟切换到高速外部时钟或 PLL 锁相环,以满足运行速度需求)、设置堆栈指针(为后续程序运行分配栈空间,用于函数调用和局部变量存储)、初始化数据段和 BSS 段(将程序中的全局变量和静态变量从 Flash 加载到 RAM 中,并对未初始化的变量清零)。

完成这些初始化后,启动代码会寻找用户程序的入口点(通常是 main 函数的地址),并跳转到该地址,此时单片机开始执行用户编写的主程序,启动流程结束。

对于一些支持程序下载或在线编程的单片机,启动流程中可能还会包含一段引导加载程序(Bootloader),用于检测是否需要从外部存储(如串口、SPI Flash)加载新的程序,如果不需要则继续执行上述常规启动步骤,这使得单片机可以方便地更新固件而无需专用编程器。

2.看门狗

在单片机系统中,看门狗(Watchdog Timer,简称 WDT)是一种用于监控程序运行状态、防止程序 “死机” 或进入无限循环硬件定时器,本质上是一套保障系统可靠性的 “程序异常自救机制”。单片机在运行过程中,可能会因为电磁干扰、硬件临时故障、代码漏洞(比如数组越界导致的逻辑混乱、意外触发的死循环等),使得程序脱离预设的正常执行流程,陷入 “假死” 状态,无法完成原本的控制、采集等功能,而看门狗的核心作用就是在这种情况下,强制让失控的系统重启,恢复到初始运行状态,避免长时间 “死机” 带来的设备失效或功能异常。

看门狗的工作原理围绕 “定时器计时” 和 “超时触发复位” 展开,其中关键操作是 “喂狗”。具体来说,程序启动后首先需要初始化看门狗,设定一个合适的 “超时时间”(比如几十毫秒到几秒,根据单片机型号和实际需求确定),初始化完成后,看门狗定时器会开始从 0 向上计数(或从预设值向下递减)。如果程序正常运行,就需要在定时器计数达到设定的超时时间之前,通过代码向看门狗的特定寄存器写入预设的 “喂狗指令”(比如某些单片机要求连续写入 0x55 和 0xAA),写入指令后,定时器会立即清零并重新开始计时,从而避免触发复位;但如果程序因为故障陷入失控状态,就无法按时执行 “喂狗” 操作,此时看门狗定时器会一直计数直到达到超时时间,随后会自动触发单片机的系统复位信号,强制单片机重新上电启动,让程序从初始状态重新运行,脱离失控困境。

单片机的看门狗主要分为内置和外置两种类型,内置看门狗是集成在单片机芯片内部的硬件模块,像 51 单片机、STM32、AVR 等主流型号基本都自带,它无需额外添加硬件,成本较低,且能通过软件灵活调整超时时间,适合消费电子、智能家居等大多数常规场景;外置看门狗则是独立的外部芯片(如 MAX813L、X5045 等),需要通过单片机的 I/O 口或专用引脚进行 “喂狗”,虽然会额外占用 PCB 空间和增加成本,但独立性更强,即便单片机内部核心硬件(如时钟模块)出现故障,仍能正常触发复位,因此更适合工业控制、汽车电子、医疗设备等对可靠性要求极高的场景。

3.最小系统

STM32 的最小系统是指能让 STM32 单片机正常工作的最基础电路组成。它通常由 STM32 主芯片、电源电路、复位电路、时钟电路和下载调试接口这几部分构成。

电源电路负责提供稳定的工作电压(一般为 3.3V),通过稳压芯片将外部输入的电压(如 5V)转换为单片机所需的稳定电压,同时包含滤波电容以滤除电源噪声。

复位电路用于让单片机在需要时回到初始状态,通常由复位按键、电阻和电容组成,按下按键时产生复位信号,松开后单片机重新启动。

时钟电路为单片机提供工作时序,包括外部高速时钟(如 8MHz 晶振配合两个电容)和内部 RC 振荡器,外部晶振能提供更高精度的时钟信号,满足精确计时或高速外设的需求。

下载调试接口(如 SWD 接口,由 SWCLK 和 SWDIO 两根线组成)用于程序的下载和在线调试,方便开发者将编写好的程序烧录到单片机中,并进行运行状态的调试。

这些部分共同协作,确保 STM32 单片机能够正常上电、启动、运行程序并支持开发调试,是构建任何基于 STM32 的电子系统的基础。

4.ROM、RAM、Flash

在单片机(如 STM32)及各类电子系统中,ROM、RAM、Flash 都是核心存储部件,但它们的存储特性、用途和工作原理差异很大,分别对应不同的功能需求。

ROM(只读存储器,Read-Only Memory)是一种断电后数据不会丢失的 “非易失性存储”,早期的 ROM 数据由厂商在生产时固化,用户无法修改,主要用来存放单片机的启动代码、基础驱动程序等固定不变的内容,比如早期 51 单片机里的引导程序就存在 ROM 中。不过现在常见的是 “可擦写 ROM”(如 EPROM、EEPROM),用户可以通过专用工具修改数据,但擦写次数有限(通常上万次),且擦写速度较慢,所以更多用于存储少量需要长期保存、很少修改的信息,比如设备参数、校准数据等。

RAM(随机存取存储器,Random Access Memory)则是 “易失性存储”,断电后数据会立即丢失,它的特点是读写速度极快,能高效配合 CPU 进行数据交换,主要用途是临时存放程序运行时的动态数据 —— 比如程序中的局部变量、函数调用时的栈数据、实时采集的传感器数据等。CPU 在执行程序时,会把需要频繁操作的数据从 Flash 或 ROM 加载到 RAM 中,因为 RAM 的读写速度远快于非易失性存储,能大幅提升程序运行效率,但由于断电失数据的特性,它无法长期保存信息,每次上电后都需要重新从其他存储中加载数据。

Flash(闪存)是目前单片机中最常用的 “非易失性存储”,兼具了 ROM 的断电保数据特性和接近 RAM 的读写便捷性(但速度仍慢于 RAM),它的擦写次数比 EEPROM 更多(通常可达 10 万次以上),且存储容量更大,成本相对较低。在 STM32 等现代单片机中,Flash 主要用来存放用户编写的应用程序(比如控制逻辑、算法代码),单片机上电后会从 Flash 中读取程序指令并执行;同时,Flash 也能用来存储需要长期保存、偶尔修改的大量数据,比如日志信息、配置文件等。不过 Flash 的擦写有 “按块擦除” 的特点(不能像 RAM 那样单个字节随意修改),所以在写入数据时需要配合特定的驱动程序来管理擦写操作。

简单来说,三者的核心区别可以概括为:ROM(含 EEPROM)适合存少量、长期不变或极少修改的数据;RAM 适合存程序运行时临时用、高速读写的数据;Flash 则适合存大量的程序代码和需要长期保存、偶尔修改的数据,三者协同工作,共同支撑单片机的正常运行。

5.EPROM、EEPROM

EPROM(可擦除可编程只读存储器)和 EEPROM(电可擦除可编程只读存储器)都是可擦写的非易失性存储设备,断电后数据不会丢失,常用于存储需要长期保存且可能偶尔修改的信息,但两者在擦除方式、操作便捷性和应用场景上有明显区别。

EPROM 的擦除需要通过紫外线照射芯片表面的透明窗口来完成,整个过程通常需要几分钟,且擦除时必须将芯片从电路板上取下,操作繁琐,适合早期对存储修改需求较少的场景,比如早期单片机中的固定程序存储。

EEPROM 则改进了擦除方式,可通过电信号直接擦除和改写数据,无需物理拆卸芯片,甚至能在系统运行中在线修改(即 “在系统编程”),擦写速度也更快(毫秒级),虽然存储容量通常小于 EPROM,且擦写次数相对有限(一般几万到几十万次),但因其操作便捷性,在现代电子设备中应用更广泛,比如用于存储设备参数、校准数据、用户设置等需要灵活修改的少量信息,像智能仪表的配置参数、汽车电子中的故障码存储等场景常能见到它的身影。

6.Bootloader与OTA

Bootloader 是嵌入式系统中在应用程序运行之前执行的一段引导程序,相当于系统的 “启动管家”,主要负责初始化硬件、准备运行环境,并最终将控制权转交给用户应用程序。在 STM32 等单片机中,Bootloader 通常分为两种:一种是芯片出厂时固化在系统存储器中的 “内置 Bootloader”,由芯片厂商(如 ST 公司)编写,用户无法修改,它支持通过串口、SPI、I2C 等外设接口接收程序数据,实现对主 Flash 的编程(即 ISP 下载),方便用户在没有专用编程器的情况下更新固件;另一种是用户自定义的 Bootloader,由开发者根据需求编写并烧录到主 Flash 的特定区域,这类 Bootloader 可以实现更灵活的功能,比如从 SD 卡、以太网或无线模块读取程序镜像进行升级(即 OTA 升级),或者对应用程序进行校验、加密保护等。

Bootloader 的工作流程通常包括几个阶段:

  1. 首先进行最基础的硬件初始化,如配置时钟、初始化关键外设(如用于通信的串口)和设置堆栈;
  2. 然后根据预设的触发条件(如特定按键按下、收到升级指令)判断是否需要执行升级操作,若需要则通过相应接口接收新的程序数据并写入 Flash;
  3. 若无需升级,则跳转到用户应用程序的起始地址,将系统控制权移交,之后 Bootloader 的使命完成,应用程序开始运行。

这种分层启动的设计,既保证了系统能够可靠启动,又为程序更新和功能扩展提供了便利,是嵌入式系统中实现固件升级和系统管理的重要机制。

OTA 是一种具体的程序更新方式,指通过无线通信(如 Wi-Fi、蓝牙、蜂窝网络等)远程传输新的固件镜像,让设备无需物理连接(如用数据线接电脑)就能完成升级。

在实际应用中,OTA 的实现依赖于 Bootloader:设备运行时,应用程序若收到远程的 OTA 升级指令,会将新固件暂时存放在存储区(如 Flash 的特定分区),然后触发系统复位;复位后 Bootloader 启动,检测到存储区有新固件,便执行擦除旧程序、写入新程序的操作,完成后再跳转到新程序运行。这里的 Bootloader 需要被设计为支持从存储区读取新固件并处理升级逻辑,而 OTA 则解决了 “如何将新固件传到设备” 的问题,两者结合让嵌入式设备(如物联网传感器、智能家居设备)的远程升级成为可能,大幅降低了维护成本。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/95674.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/95674.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在 CentOS 9 上安装 Docker 的完整指南

1.准备安装环境(1)禁用防火墙与SELinux[rootlocalhost ~]# systemctl disable --now firewalld.service Removed "/etc/systemd/system/multi-user.target.wants/firewalld.service". Removed "/etc/systemd/system/dbus-org.fedoraproj…

如何实现外语播客的中文同传?

Bayt播客可以将任何语言的外语播客(英文播客、日文播客、韩文播客等)转换成中文音频收听,实现同声传译。并且还提供中文和原文的双语字幕。帮助你跨越语言障碍,收听高质量外语内容 核心功能: 1、所有语言的播客均可转…

Spring Cloud ------ Gateway

一、什么是网关 经常面试的人肯定知道,在去公司面试时,通常不会直接去面试官那里面试,而是先去前台进行询问面试官的所在地,并进行一些相关登记。而网关对于一个微服务项目来说,就类似于一个前台,打到微服…

Go初级之九:Select 与并发控制

在Go语言中,select语句是处理并发编程的核心工具之一。它让我们能够优雅地管理多个通道操作,实现高效的并发控制。 1. Select 语句基础 1.1 Select 的基本语法 package mainimport ("fmt""time" )func main() {ch1 : make(chan stri…

使用 Acme.sh 获取和管理免费 SSL 证书

Acme.sh 是一个开源的 Shell 脚本工具,支持从 Let’s Encrypt 等证书颁发机构获取免费的 SSL/TLS 证书。它支持多种验证方式,并能自动续期证书,适合个人网站或企业使用。 目标 同时支持,主域名和泛域名 安装 Acme.sh获取源码 git …

docker-compose跨节点部署Elasticsearch 9.X集群

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 系列文章目录 前言 一、环境准备 二、遇到的问题与分析 三、配…

【面试场景题】spring应用启动时出现内存溢出怎么排查

文章目录一、定位 OOM 类型二、基础排查:调整 JVM 参数与日志三、堆内存溢出(Heap Space)排查1. 分析堆转储文件2. 典型场景与解决四、元空间溢出(Metaspace)排查1. 分析类加载情况2. 典型场景与解决五、直接内存溢出&…

2025年经济学专业女生必考证书指南:打造差异化竞争力

在数字经济快速发展的2025年,经济学专业女生面临着诸多机遇与挑战。单纯的理论知识已经难以满足职场需求,企业更看重解决实际问题的能力,特别是将数据转化为商业洞察的专业技能。各类专业资质认证可以成为系统提升能力的途径之一,…

【CAN通信】AUTOSAR架构下TC3xx芯片是如何将一帧CAN报文接收上来的

目录 前言 正文 1.背景介绍 2.CAN报文硬件原理 3.CAN接收软件实现 3.1. vCan_30_Mcan_Interrupt 3.2. vCan_30_Mcan_RxInterrupt 3.3. vCan_30_Mcan_RxBasicCanHandling 4.总结 前言 在《【CAN通信】AUTOSAR架构下TC3xx芯片是如何将一帧CAN报文发送出去的》一文中我们…

STM32H750 RTC介绍及应用

第十一章 RTC介绍及应用 1. RTC 简介 RTC(Real-Time Clock,实时时钟)是 STM32H750VBT6 中用于提供日历和时钟功能的低功耗外设,即使主电源关闭,只要 VBAT(备份电源)供电,RTC 仍能持续…

飞网自适应通信:IPv4 与 IPv6 环境下的高效互联

一、网络连接的难题与飞网的解决方案 在日常生活中,我们常常会碰到这样的场景:在家用手机访问公司电脑里的重要文件,或者远程连接家里的NAS设备查看照片和视频。这些操作都需要设备之间建立起安全又稳定的连接。然而,现实中的网络…

拉格朗日多项式

最近打的几个比赛没意思,不是不会就是不会。不过比赛完后看到别人的WP,感觉受益匪浅。先看一个多项式:当输入Xi时会得到一个Si,要求输入一定数量的xi 来求[c] 当可以输入的x个数与c的个数相同时,可以用矩阵直接求解。(…

Vue3 + TypeScript 实现文件拖拽上传

应用效果&#xff1a;实例代码&#xff1a;CommonApplyBasicInfoForm.vue<script setup lang"ts" name"CommonApplyBasicInfoForm"> ...... // 选择文件列表 const selectedFiles ref<FileList | null>(null); // 通过 FormData 对象实现文件…

2025全国大学生数学建模C题保姆级思路模型(持续更新):NIPT 的时点选择与胎儿的异常判定

2025全国大学生数学建模C题保姆级思路模型&#xff08;持续更新&#xff09;&#xff1a;NIPT 的时点选择与胎儿的异常判定&#xff0c;完整持续更新内容见文末名片 胎儿遗传信息检测与临床决策数学建模分析讲义 问题一&#xff1a;Y染色体浓度的影响因素探索——线性回归的“侦…

【笔记】Software Engineering at Google

聚焦核心原则&#xff0c;挑取最让我眼前一亮的实践点&#xff0c;特别是那些能直接启发或解决我当前工作中痛点的部分。0. 序言 最近集中精力速读了关于 ​Google 软件工程实践​ 的诸多资料&#xff08;包括官方出版物、工程博客、技术演讲以及社区讨论&#xff09;。面对 G…

无人机防风技术难点解析

防风防御模块的技术难点主要体现在以下几个方面风场感知与精准建模1.复杂风场的实时感知&#xff1a;风&#xff0c;尤其是近地面的风&#xff0c;常常是无规则、瞬息万变的阵风、湍流或风切变。无人机需要通过各种传感器&#xff08;如空速计、惯性测量单元&#xff08;IMU&am…

HarmonyOS 应用开发深度解析:ArkTS 声明式 UI 与精细化状态管理

好的&#xff0c;请看这篇关于 HarmonyOS 应用开发中声明式 UI 状态管理的技术文章。 HarmonyOS 应用开发深度解析&#xff1a;ArkTS 声明式 UI 与精细化状态管理 引言 随着 HarmonyOS 4、5 的广泛应用和 HarmonyOS NEXT 的发布&#xff0c;基于 API 12 及以上的应用开发已成为…

机器学习入门,第一个MCP示例

前面我们已经搭建了属于自己的AI大模型&#xff1a;详情见 https://blog.csdn.net/hl_java/article/details/150591424?spm1001.2014.3001.5501 近期MCP概念这么火&#xff0c;那么它到底是什么呢&#xff0c;借一个例子为你讲解 第一步&#xff1a;理解MCP的核心价值 MCP (Mo…

flutter 中间组件自适应宽度

使用Flexible IntrinsicWidth Row(children: [Text(第一个text),IntrinsicWidth(child: ConstrainedBox(constraints: BoxConstraints(maxWidth: 200), // 最大宽度限制child: Text(中间的text可能很长也可能很短,overflow: TextOverflow.ellipsis,maxLines: 1,),),),Text(第三…

TDengine 时间函数 DAYOFWEEK 用户手册

DAYOFWEEK 函数使用手册 函数描述 DAYOFWEEK 函数用于返回指定日期是一周中的第几天。该函数遵循标准的星期编号约定&#xff0c;返回值范围为 1-7&#xff0c;其中&#xff1a; 1 星期日 (Sunday)2 星期一 (Monday)3 星期二 (Tuesday)4 星期三 (Wednesday)5 星期四 (T…