秋招|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
英文地址,請注明出處:http://en.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…